记一次给 Laravel 5.3 的 Route 动手术
一个项目,架构是
Laravel 5.3
,在重构路由绑定权限的过程中,手记如下:
期望实现效果
Route::get('/test', 'TestController@index')->name('test')->permission(['admin', 'agent']); //在添加路由时候,就绑定入相应的权限
添加单个路由继承 (就是 Route::get()
等方法返回回来的对象,需要扩展下,Laravel 5.3 的 Illuminate\Routing\Route
不支持 Macroable
。)
<?php
namespace App\Routing;
class Route extends \Illuminate\Routing\Route
{
/**
* 给路由注册权限
*
* @param string|array $permissions
* @return self|static|$this
*/
public function permission($permissions)
{
// ...
}
}
添加假面路由 Route::class
的继承
<?php
namespace App\Routing;
class Router extends \Illuminate\Routing\Router
{
/**
* Create a new Route object.
* 必须覆盖此方法,否则::get/::post...创建出的路由将会是 Illuminate\Routing\Route 而不是 App\Routing\Route
*
* @param array|string $methods
* @param string $uri
* @param mixed $action
* @return \App\Routing\Route
*/
protected function newRoute($methods, $uri, $action)
{
$route = (new Route($methods, $uri, $action))
->setRouter($this)
->setContainer($this->container);
$route->url = $uri;
return $route;
}
}
以上OK后,
研究 Route
假面得知,其在容器中的标识符为 router
,
于是我在 app/Providers/AppServiceProvider.php
的 boot
方法添加了
app()->alias('router', \App\Routing\Router::class);
但是在 tinker
中验证,发现
php artisan tinker
> get_class(app('router'))
> "Illuminate\Routing\Router`
才想起 Applicaiton
容器在初始化时候就会注册路由。已经轮不到 App\Providers\AppServiceProvider
来替换绑定。
突然想起,bootstrap/app.php
绑定了不少别名,
于是,我把它挪到了 bootstrap/app.php
下。
正常了。
本作品采用《CC 协议》,转载必须注明作者和本文链接