Php 扩展Laravel路由器

Php 扩展Laravel路由器,php,laravel,router,Php,Laravel,Router,我实现了一个角色/权限系统。现在我想给Laravel router添加一个方法,这样我可以制作如下内容: Route::get('sales', 'SaleController@index')->allow('Salesman'); 我知道我可以使用@can('saller')(视图)和$user->can('saller')(控制器),但我发现我尝试这样做的方式非常可读,因为我可以在路由文件中看到所有角色权限访问。当您使用facade生成路由时。这应该很容易。facade可以在conf

我实现了一个角色/权限系统。现在我想给Laravel router添加一个方法,这样我可以制作如下内容:

Route::get('sales', 'SaleController@index')->allow('Salesman');

我知道我可以使用
@can('saller')
(视图)
$user->can('saller')
(控制器),但我发现我尝试这样做的方式非常可读,因为我可以在路由文件中看到所有角色权限访问。

当您使用facade生成路由时。这应该很容易。facade可以在
config/app.php
数组中被否决

您可以生成自己的,并用自己的替换本地的。事实上,这是一个错误。为了实现功能,您需要依次扩展和覆盖以下内容:

  • 门面
  • 路由器::新路由

通过扩展最后一个类并在路由器的
newRoute
方法中返回它们,您将能够推翻Laravel的逻辑。

您可以重写路由器类,然后将其注册到服务容器中,供
Route
facade使用

更清楚地说:

  • 编写一个扩展Laravel路由器的类(我认为
    router
    class)。要找到它,请打开
    路由
    门面,然后找到它的服务提供商。从那里,应该很容易找到路由器类
  • 编写一个覆盖该路由器的类。确保扩展以前找到的类
  • 编写覆盖路由器服务的服务提供程序。实际上,这意味着用您在
    Route
    facade中找到的相同密钥名注册您的服务

应该是这样。您的服务现在由
Route
facade自动选择。

在完成了您所说的一切之后,我得到了这个例外:App\Providers\RouteServiceProvider::boot(App\Router$Router)的声明应该与light\Foundation\Support\Providers\RouteServiceProvider::boot(light\Routing\Router$Router)兼容您可能正在从Laravel扩展您的提供商。这是不必要的,可能会导致类似的问题。只要阅读Laravel在该提供者中所做的工作(
RouteServiceProvider
),就可以让您的服务也像这样。但是,用您自己的路由器替换
路由器
。我不会扩展提供程序。我正在扩展laravel router。但错误表明,
App\Providers\RouteServiceProvider::boot(App\router$router)的声明应该与light\Foundation\Support\Providers\RouteServiceProvider::boot(light\Ro)兼容‌​uting\Router$Router)
这意味着
App\Providers\RouteServiceProvider
正在扩展
light\Foundation\Support\Providers\RouteServiceProvider
,它们的
boot
方法的签名不相同