larakit / lk-route
[Larakit] 路由管理
Requires
This package is auto-updated.
Last update: 2024-09-16 00:56:44 UTC
README
[LarakitRoute]
此工具解决的问题
- 不需要在脑海中保持路由和组结构的结构,通过在IDE中使用代码自动完成
数组既方便又简单。但每次都去查阅文档会浪费工作时间
Route::group(['middleware' => 'auth'], function () { Route::get('/', function () { // Uses Auth Middleware }); Route::get('user/profile', function () { // Uses Auth Middleware }); });
让我们看看这个包容易且优雅地实现的一些典型需求
### 添加“关于我们”的普通页面 将路由添加到 ./app/Http/routes.php
\Larakit\Route\Route::item('about') ->put();
在控制台查看路由列表
php artisan route:list
创建控制器 "App\Http\Controllers\AboutController" 并再次运行命令 php artisan route:list
一切都很好,但我们想使这个页面只能通过GET方法访问
### 限制可用的方法
\Larakit\Route\Route::item('about') ->put('get');
请注意,控制器名称、命名空间和控制器方法名称是自动基于路由名称生成的,但也可以手动修改。
### 修改命名空间 默认情况下,命名空间是从 App::getNamespace() 获取的。但可以在组级别修改它
\Larakit\Route\Route::item('about') ->setNamespace('Qwerty') ->put('get');
从获得的异常中可以立即看出预期的控制器命名空间是什么 - 创建它,一切就正常工作了。
### 修改控制器名称
\Larakit\Route\Route::item('about') ->setNamespace('Qwerty') ->setController('AboutPage') ->put('get');
同样也可以设置回调函数
\Larakit\Route\Route::item('about') ->setUses(function(){ return 'Callback Text!'; }) ->put('get');
### 修改域名 如果你在同一个项目中使用多个域名,例如
habrahabr.ru
<username>.habrahabr.ru
则可以设置路由仅在该域下可用
\Larakit\Route\Route::item('about') ->setDomain('habrahabr.ru') ->setUses(function(){ return 'Callback Text!'; }) ->put('get');
或者这样
\Larakit\Route\Route::item('about') ->setDomain('*.habrahabr.ru') ->setUses(function(){ return 'Callback Text!'; }) ->put('get'); \Larakit\Route\Route::item('about_groove') ->setDomain('groove.habrahabr.ru') ->setUses(function(){ return 'About Groove!'; }) ->put('get');
### 创建相关联的路由组 我们将尝试为管理员创建一组路由,用于管理用户。最终应该得到以下结构
/admincp/users/
/admincp/users/add/
/admincp/users/123/
/admincp/users/123/edit
/admincp/users/123/delete
建议:用点号按斜杠分割路由名称
\Larakit\Route\Route::item('admin.users') //добавим страницу со списком пользователей ->put();
我们可以看到自动生成的URL不符合要求,我们可以修复它(它将自动适用于所有嵌套在组中的页面)
$group = \Larakit\Route\Route::item('admin.users') //изменим базовый URL ->setBaseUrl('admincp/users'); #/admincp/users/ $group->put();
注册添加用户页面
$group = \Larakit\Route\Route::item('admin.users') //изменим базовый URL ->setBaseUrl('admincp/users'); #/admincp/users/ $group->put(); #/admincp/users/add $group ->addSegment('add') ->put();
我们将使在GET请求下请求此路由时返回一个带有添加用户表单的页面,而POST请求则尝试验证和保存用户。
而且,这个功能将分布在不同的控制器方法中。
$group = \Larakit\Route\Route::item('admin.users') //изменим базовый URL ->setBaseUrl('admincp/users'); #/admincp/users/ $group->put(); #/admincp/users/add $group ->addSegment('add') ->setAction('create') ->put('get') ->addSegment('add') ->setAction('store') ->put('post');
继续!添加用户页面输出
$group = \Larakit\Route\Route::item('admin.users') //изменим базовый URL ->setBaseUrl('admincp/users'); #/admincp/users/ $group->put(); #/admincp/users/add $group ->addSegment('add') ->setAction('create') ->put('get') ->addSegment('add') ->setAction('store') ->put('post'); #/admincp/users/{user_id} $group //сделаем сброс добавленного сегмента "add" чтобы начать формировать новую ветку от базового URL ->clearSegments() ->addSegment('{user_id}') //зададим паттерн для этого параметра только этого роута //->addPattern('user_id', '[a-z0-9]+') //true означает проверку на целое число (как самое часто употребляемое) ->addPattern('user_id', true) ->put('get');
自动会检查参数id是否为整数
但我们希望检查是否存在具有该标识符的模型。为此,在组级别添加模型并描述它。
//проверка на наличие пользователя с таким идентификатором Route::model('user_id', \App\User::class, function ($id) { throw new \Illuminate\Database\Eloquent\ModelNotFoundException('User with ID='.$id.' not found!'); }); $group = \Larakit\Route\Route::item('admin.users') //изменим базовый URL ->setBaseUrl('admincp/users'); #/admincp/users/ $group->put(); #/admincp/users/add $group ->addSegment('add') ->setAction('create') ->put('get') ->addSegment('add') ->setAction('store') ->put('post'); #/admincp/users/{user_id} $group //сделаем сброс последнего добавленного сегмента "add" чтобы начать формировать новую ветку от /admincp/users/ ->popSegment() ->addSegment('{user_id}') //зададим паттерн для этого параметра только этого роута //->addPattern('user_id', '[a-z0-9]+') ->addPattern('user_id', true) ->put('get');
添加剩余的方法
//проверка на наличие пользователя с таким идентификатором Route::model('user_id', \App\User::class, function ($id) { throw new \Illuminate\Database\Eloquent\ModelNotFoundException('User with ID='.$id.' not found!'); }); $group = \Larakit\Route\Route::item('admin.users') //изменим базовый URL ->setBaseUrl('admincp/users'); #/admincp/users/ $group->put(); #/admincp/users/add $group ->addSegment('add') ->setAction('create') ->put('get') ->addSegment('add') ->setAction('store') ->put('post'); #/admincp/users/{user_id} $group //сделаем сброс последнего добавленного сегмента "add" чтобы начать формировать новую ветку от /admincp/users/ ->popSegment() ->addSegment('{user_id}') //зададим паттерн для этого параметра только этого роута //->addPattern('user_id', '[a-z0-9]+') ->addPattern('user_id', true) ->put('get'); #/admincp/users/{user_id}/edit $group ->addSegment('edit') ->setAction('update') ->put('get') ->addSegment('edit') ->setAction('store') ->put('post'); #/admincp/users/{user_id}/delete $group //сделаем сброс последнего добавленного сегмента "edit" чтобы начать формировать новую ветку от /admincp/users/{user_id}/ ->popSegment() ->addSegment('delete') ->put('delete');
### 参数化的路由
创建一个路由,以便从带有UTM标记的上下文广告中跳转。
在添加路由参数时,遵循以下规则
- 首先传递参数名称,如果它不是必需的,则在后面添加一个问号,例如 'param_name?'
- 然后传递验证规则(正则表达式)
/{utm_source}/{utm_medium}/{utm_campaign}/{utm_term}/{utm_content}
$group = \Larakit\Route\Route::item('utm') ->setController('Utm') //Источник кампании - utm_source //Источник перехода: google, yandex, newsletter и т.п. ->addSegment('{utm_source}') ->addPattern('utm_source', '(google|yandex|newsletter)') //Канал кампании - utm_medium //Тип трафика: cpc, ppc, banner, email и т.п. ->addSegment('{utm_medium}') ->addPattern('utm_medium', '[\w-\d]+') //Название кампании - utm_campaign //впишем сюда ID компании из местной CRM (целое число) //можно было вручную вписать "'[0-9]+'", но "true" короче и чаще всего используется ->addSegment('{utm_campaign}') ->addPattern('utm_campaign', true) //Ключевое слово - utm_term //(не обязательное поле, без валидации) ->addSegment('{utm_term?}') //Содержание кампании - utm_content //(не обязательное поле, без валидации) ->addSegment('{utm_content?}') ->put();
### 扩展的路由 为了使路由 about.html 和 data.json 可用,需要在 put() 方法中将扩展名作为第二个非必需参数传递
\Larakit\Route\Route::item('about') ->put('get', 'html'); \Larakit\Route\Route::item('data') ->setUses(function(){ return [ [ 'name' => 'Toyota', ], [ 'name' => 'Nissan', ], ]; }) ->put('get', 'json');
就这样,我们轻松地实现了所有目标,并摆脱了记住Laravel5路由构建原理的需要