【问题标题】:override laravel 5.7 autodiscovered package routes覆盖 laravel 5.7 自动发现的包路由
【发布时间】:2019-02-16 12:23:56
【问题描述】:

我无法让用户覆盖我的包裹路线。因为包是自动发现的,所以我无法为此执行usual fix

想要的结果是,如果用户在 routes->web.php 中定义了路由“/home”,并且在我的包的 routes.php 文件中我也有“/home”,则使用 web.php 版本。

让我知道我需要查看哪些其他代码来解决这个问题!

包服务商:

no longer relevant

解决方案:

要以我想要的方式解决此问题(不破坏自动发现),您需要检查路由中通常会覆盖用户路由的其他路由。例如,这里有路由'/{slug}'的这个函数通常会破坏用户的web.php路由,如'/userroute'。

我的解决方法是这样的。

public function page($slug){
    $route = $slug;
    $routes = Route::getRoutes();
    foreach($routes as $r){
      if($r->uri() == $route){
        $name = $r->getActionName();
        if(isset($name)){
          return \App::call('\\'.$name);
        }
      }
    }
    //add route code after

我们需要直接调用路由,以阻止无休止的重定向发生。这对我来说很有效,因为我可以控制用户可以在他的 web.php 文件中覆盖哪些包路由,但是我确信必须有更快的方法来实现这一切。

【问题讨论】:

  • 我已经通过创建一条捕获所有路线并寻找具有匹配名称的任何其他路线来解决此问题。
  • 您介意用您的解决方法代码更新您的问题吗?我有完全相同的问题。我最好的解决方案是使用dont-discover 功能并指导其他开发人员在App\Providers\RouteServiceProvider 之后手动添加我的服务提供商。谢谢。
  • 问题已更新!我希望它会有所帮助。

标签: laravel laravel-5


【解决方案1】:

您可以将 dont-discover 节点添加到您的 composer.json 文件中以从自动发现中排除包。

"extra": {
  "laravel": {
    "providers": [
      "WindfallInc\\Woodpecker\\WoodpeckerServiceProvider"
    ],
    "dont-discover": [
        "windfallinc/woodpecker"
    ]
  }
}

Taylor 在 Medium 上添加自动发现功能时谈到了此功能。 https://medium.com/@taylorotwell/package-auto-discovery-in-laravel-5-5-ea9e3ab20518

【讨论】:

  • 我正在寻找一种方法来覆盖,但不会删除包发现带来的“即插即用”功能。如果您设置了不发现,则用户将需要手动添加服务提供者。如果用户把它放在错误的地方,这可能会导致完全相同的问题。
  • 我认为你作为包的创建者不应该使用dont-discover,但是安装你的包的人应该在主要的@987654326中使用dont-discover @他们的项目:stackoverflow.com/questions/50219976/…
猜你喜欢
  • 2016-09-30
  • 2017-11-27
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2013-07-09
  • 2013-08-06
  • 2017-02-15
  • 2017-05-16
相关资源
最近更新 更多