记一次给 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 协议》,转载必须注明作者和本文链接
www.anquanssl.com 安全SSL
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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