Lumen扩展路由 实现Laravel资源路由

分析底层代码

文件1 bootstrap/app.php:
$app = new Laravel\Lumen\Application(
    dirname(__DIR__)
);

文件2
vendor/laravel/lumen-framework/src/Application.php
// 启动路由服务
use Laravel\Lumen\Routing\Router;
public function bootstrapRouter()
{
  $this->router = new Router($this);
 // 把这个重写就行了
}

app/bootstrap 可以随便改,

Laravel\Lumen\ApplicationLaravel\Lumen\Routing\Router 都属于 vendor文件夹,直接改是不可能的,所以只能继承重写。

重写路由

编辑composer.json的 psr-4

添加"Bootstrap\\": "bootstrap/"

       "psr-4": {
            "App\\": "app/",
            "Bootstrap\\": "bootstrap/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        },

composer dump-autoload 重新加载映射。

(你也可以选择放在app目录,这样就可以不用改 psr-4 了)

创建bootstrap/Application.php

<?php
namespace Bootstrap;

use Laravel\Lumen\Application as BaseApplication;
use Laravel\Lumen\Routing\Router as BaseRouter;

class Application extends BaseApplication
{
    public function bootstrapRouter()
    {
       // 改变路由的类
        $this->router = new Router($this);
    }
}

创建Bootstrap/Router.php

<?php

namespace Bootstrap;

use Laravel\Lumen\Routing\Router as BaseRouter;

class Router extends BaseRouter
{
    public function resources($path, $controller): void
    {
        $routes = [
            ['get', $path, "{$controller}@index"],
            ['get', "{$path}/create", "{$controller}@create"],
            ['post', "{$path}", "{$controller}@store"],
            ['get', "{$path}/{id}", "{$controller}@show"],
            ['get', "{$path}/{id}/edit", "{$controller}@edit"],
            ['put', "{$path}/{id}", "{$controller}@update"],
            ['delete', "{$path}", "{$controller}@destroy"],
        ];


        foreach ($routes as $route) {
            $this->{$route[0]}($route[1], $route[2]);
        }
    }
}

修改bootstrap/app.php

/*
$app = new Laravel\Lumen\Application(
    dirname(__DIR__)
);
*/

$app = new \Bootstrap\Application(
 dirname(__DIR__)
);

此时:

get_class(
 app('router')
);
// Bootstrap\Router

$router->resource('')

你也可以在web.php/api.php
$router->resources('path','controller');

Ps

本来想实现
Route::post('url', 'Controller@method')->name('url.name');

结果发现 lumen 没有,所以想自己扩展个的。

重写了路由之后,又发现addRoute 返回的是 void ….

所以Route::post('url', 'Controller@method') 返回的是 null,
都已经是null 了,没辙,干脆水篇文章。

当作一个改底层代码的思路吧。

其他方式

Route::post('url', [
  'uses' => 'Controller@method',
  'as' => 'as name',
  'permission' => '权限表识'
]);


dd(
    $request->route()[1]
);
 [ 
 "uses" => "***@***"
  "permission" => "权限表识" 
  ]
本作品采用《CC 协议》,转载必须注明作者和本文链接
专心学习不瞎搞
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
87
粉丝
105
喜欢
480
收藏
717
排名:109
访问:8.7 万
私信
所有博文
社区赞助商