larakit/lk-route

[Larakit] 路由管理

1.0.0 2016-06-14 17:17 UTC

This package is auto-updated.

Last update: 2024-09-16 00:56:44 UTC


README

Total Downloads Latest Stable Version Latest Unstable Version License

[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

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3333652f3036362f6536342f33336530363665363465633834626361393061656637653165613731333138652e706e67

创建控制器 "App\Http\Controllers\AboutController" 并再次运行命令 php artisan route:list

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3732302f3332332f3363652f37323033323333636530363434303064386561323032323966643430613934362e706e67

一切都很好,但我们想使这个页面只能通过GET方法访问

### 限制可用的方法

\Larakit\Route\Route::item('about')
    ->put('get');

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3362652f3034612f3166632f33626530346131666338656334636565626466396637353965383363393535622e706e67

请注意,控制器名称、命名空间和控制器方法名称是自动基于路由名称生成的,但也可以手动修改。

### 修改命名空间 默认情况下,命名空间是从 App::getNamespace() 获取的。但可以在组级别修改它

\Larakit\Route\Route::item('about')
    ->setNamespace('Qwerty')
    ->put('get');

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f6639622f3533652f3366622f66396235336533666233316534386462613038613763666133336565383436372e706e67

从获得的异常中可以立即看出预期的控制器命名空间是什么 - 创建它,一切就正常工作了。

### 修改控制器名称

\Larakit\Route\Route::item('about')
    ->setNamespace('Qwerty')
    ->setController('AboutPage')
    ->put('get');

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f6632372f3537652f6330372f66323735376563303731613134336266626233363561633362323463306464342e706e67

同样也可以设置回调函数

\Larakit\Route\Route::item('about')
    ->setUses(function(){
        return 'Callback Text!';
    })
    ->put('get');

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f6632652f3764662f6666642f66326537646666666465643634373063396234353964626263363736346533652e706e67

### 修改域名 如果你在同一个项目中使用多个域名,例如

habrahabr.ru
<username>.habrahabr.ru

则可以设置路由仅在该域下可用

\Larakit\Route\Route::item('about')
    ->setDomain('habrahabr.ru')
    ->setUses(function(){
        return 'Callback Text!';
    })
    ->put('get');

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3062352f6361392f6233652f30623563613962336534623734363862396637373935353232346438386166622e706e67

或者这样

\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');

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f6561352f6332642f3366372f65613563326433663733376334353733623138653564656364306564633330372e706e67

### 创建相关联的路由组 我们将尝试为管理员创建一组路由,用于管理用户。最终应该得到以下结构

/admincp/users/
/admincp/users/add/
/admincp/users/123/
/admincp/users/123/edit
/admincp/users/123/delete

建议:用点号按斜杠分割路由名称

\Larakit\Route\Route::item('admin.users')
    //добавим страницу со списком пользователей
    ->put();

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3930302f6366382f3730332f39303063663837303332356234646236623135343966346464333635663564372e706e67

我们可以看到自动生成的URL不符合要求,我们可以修复它(它将自动适用于所有嵌套在组中的页面)

$group = \Larakit\Route\Route::item('admin.users')
    //изменим базовый URL
    ->setBaseUrl('admincp/users');

#/admincp/users/
$group->put();

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3363362f3236332f6665362f33633632363366653662643634313435623436653036626533353235653238342e706e67

注册添加用户页面

$group = \Larakit\Route\Route::item('admin.users')
    //изменим базовый URL
    ->setBaseUrl('admincp/users');

#/admincp/users/
$group->put();

#/admincp/users/add
$group
    ->addSegment('add')
    ->put();

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3535642f6635652f3631342f35356466356536313438653634323262396639663333653432326666383830352e706e67

我们将使在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');

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3735612f3664642f3636302f37356136646436363066663934356461396336623438616139306366373365652e706e67

继续!添加用户页面输出

$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');

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3835372f3438392f3730632f38353734383937306362343334383464383032366633353466333264306661652e706e67

自动会检查参数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');

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3264312f3230372f3332372f32643132303733323762326534313537396238313337663939393236643565662e706e67

### 参数化的路由

创建一个路由,以便从带有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();

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3365332f6438362f6635662f33653364383666356666373034346532396538356336393732313630326565372e706e67

### 扩展的路由 为了使路由 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');

68747470733a2f2f686162726173746f726167652e6f72672f66696c65732f3537372f3163612f6664632f35373731636166646361333734356537616134333837353435323965356263322e706e67

就这样,我们轻松地实现了所有目标,并摆脱了记住Laravel5路由构建原理的需要