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\Application
和 Laravel\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 协议》,转载必须注明作者和本文链接