记一次给 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.phpboot 方法添加了

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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!