覆盖laravel 5.7自动发现的包路由

覆盖laravel 5.7自动发现的包路由,laravel,laravel-5,Laravel,Laravel 5,我无法允许用户覆盖我的包路由。由于软件包是自动发现的,因此我无法为此执行以下操作 如果在routes->web.php中有用户定义了route'/home',并且在我的包的routes.php文件中也有'/home',则会使用web.php版本 让我知道我需要看什么其他代码来解决这个问题 套餐服务提供商: no longer relevant 解决方案: 要以我预期的方式解决此问题,(在不中断自动发现的情况下),您需要检查路由中通常覆盖用户路由的其他路由。例如,这里的这个函数有一个路由“/{s

我无法允许用户覆盖我的包路由。由于软件包是自动发现的,因此我无法为此执行以下操作

如果在routes->web.php中有用户定义了route'/home',并且在我的包的routes.php文件中也有'/home',则会使用web.php版本

让我知道我需要看什么其他代码来解决这个问题

套餐服务提供商:

no longer relevant
解决方案:

要以我预期的方式解决此问题,(在不中断自动发现的情况下),您需要检查路由中通常覆盖用户路由的其他路由。例如,这里的这个函数有一个路由“/{slug}”,它通常会断开一个users 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文件中覆盖哪些包路由,但是我确信必须有一种更快的方法来实现这一切。

您可以在composer.json文件中添加一个dont discover节点,以将包排除在自动发现之外

"extra": {
  "laravel": {
    "providers": [
      "WindfallInc\\Woodpecker\\WoodpeckerServiceProvider"
    ],
    "dont-discover": [
        "windfallinc/woodpecker"
    ]
  }
}
Taylor在Medium上添加自动发现功能时谈到了这一功能。

不过,我正在寻找一种覆盖的方法,而不删除package discovery带来的“即插即用”功能。如果设置了“不发现”,则用户需要手动添加服务提供商。如果用户将其放置在错误的位置,则可能会导致完全相同的问题。我认为作为包创建者的您不应该使用
dont discover
,但是安装您的软件包的人应该使用他们项目的主
composer.json
中的
dont discover
:我已经通过创建一个全面的路由并查找任何其他具有匹配名称的路由解决了这个问题。您介意用您的解决方案代码更新您的问题吗?我也有同样的问题。我拥有的最佳解决方案是使用
dont discover
功能,并教育其他开发人员在
App\Providers\RouteServiceProvider
之后手动添加我的服务提供商。谢谢。问题更新了!我希望这会有帮助。