在 Laravel 中添加前缀路由名称而不添加前缀 URI

Posted

技术标签:

【中文标题】在 Laravel 中添加前缀路由名称而不添加前缀 URI【英文标题】:Prefix route name without prefixing URI in Laravel 【发布时间】:2014-09-29 06:22:03 【问题描述】:

我有两个命名空间'Front''Admin'。对于'Admin' 命名空间,所有路径都以admin.conrtoller.action 为前缀是可以的,但对于'Front',我希望有前缀路由名称而没有前缀URI。

Route::group(array('namespace' => 'Front'), function()

    Route::resource('franchising', 'FranchisingController', array('only' => array('index')));
);

这会生成我franchising.index 根名称和get 'franchising' URI。如何使该组中的所有资源生成类似 front.franchising.index 的路由名称,但保持当前 URI 不变(即不以 front/ 为前缀)。

我使用 Laravel 4.2。

【问题讨论】:

【参考方案1】:

只需将前缀设置为无:

Route::group(array('namespace' => 'Front', 'prefix'=>''), function()

更新:

您应该能够扩展 Route 类并覆盖这一功能:

class MyRoute extends \Laravel\Routing\Route 
    /**
     * Add a prefix to the route URI.
     *
     * @param  string  $prefix
     * @return \Illuminate\Routing\Route
     */
    public function prefix($prefix)
    
        $this->uri = trim($this->uri, '/'); // removed the prefix from this line

        return $this;
    

然后用它代替正常的路由:

MyRoute::group(array('namespace' => 'Front'), function()

更新:

扩展可能需要是

use Illuminate\Support\Facades\Route;

class MyRoute extends Route 

【讨论】:

这没有任何改变。我希望路径名具有前缀,但不希望 URI 具有前缀。 这将破坏路由前缀的整体使用方式,并使手动定义路由变得更加困难。但是,如果需要这种行为,那么这可能就是答案。 是的,所以你只能在你想以这种方式“中断”的路线上使用它......你仍然可以将普通的 Route 类用于任何其他路线 'Breaking' 方法不好。如我所见,答案是“不可能开箱即用”。 我试图扩展 Route 类,但由于某种原因,我得到了未知方法错误或未知类错误 :( 扩展路由类似乎是一件棘手的事情。【参考方案2】:

路由前缀主要是给路径加前缀。事实上,它还为路由名称添加前缀,这只是使用 Route::resource() 时的一种附加行为。

编辑

在开箱即用的 Laravel 中,使用 prefix 路由组参数绝对不可能使用实际前缀。

Route::resource()Route::controller() 只是适用于少量实际用例的快捷方式。它们绝对不是适合所有事情的工具。如果需要对路由进行更多控制,建议使用Route::getRoute::post 等手动指定路由。

【讨论】:

所以不能给组内的所有路由名称加上前缀而不加路径前缀? 是的,我知道我可以使用带有更多参数的 Route::get 等,但很遗憾,因为这种方法不像资源那么干燥,它会立即生成所需的路由名称。【参考方案3】:

只是为了给至少使用 Laravel 5.4 的新手提供一个更新的答案,我不确定它是什么时候引入的,但是你现在可以在定义路由时传递数组选项 'as' 来为所有路由名称添加前缀而不影响URI 或命名空间。

例如,我从全新的 laravel 安装开始,将创建 Franchising 模型。

php artisan make:model Franchising

这需要Front 控制器和Admin 控制器都可以访问。

php artisan make:controller --resource --model='Franchising' 'Front\FranchisingController'
php artisan make:controller --resource --model='Franchising' 'Admin\FranchisingController'

这将创建以下文件:

app/
├── ...
├── Franchising.php
├── Http
│   ├── Controllers
│   │   ├── Admin
│   │   │   └── FranchisingController.php
│   │   ├── ...
│   │   └── Front
│   │       └── FranchisingController.php
│   └── ...
└── ...

使用'as' 选项创建资源路由以定义路由名称前缀。

Route::resource(
    'franchising',
    'Front\FranchisingController',
    ['as' => 'front']
);

Route::resource(
    'admin/franchising',
    'Admin\FranchisingController',
    ['as' => 'admin']
);

您可以使用工匠查看所有路线:

php artisan route:list
+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+
| Method    | URI                                  | Name                      | Action                                                   |
+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+
| GET|HEAD  | admin/franchising                    | admin.franchising.index   | App\Http\Controllers\Admin\FranchisingController@index   |
| POST      | admin/franchising                    | admin.franchising.store   | App\Http\Controllers\Admin\FranchisingController@store   |
| GET|HEAD  | admin/franchising/create             | admin.franchising.create  | App\Http\Controllers\Admin\FranchisingController@create  |
| GET|HEAD  | admin/franchising/franchising      | admin.franchising.show    | App\Http\Controllers\Admin\FranchisingController@show    |
| PUT|PATCH | admin/franchising/franchising      | admin.franchising.update  | App\Http\Controllers\Admin\FranchisingController@update  |
| DELETE    | admin/franchising/franchising      | admin.franchising.destroy | App\Http\Controllers\Admin\FranchisingController@destroy |
| GET|HEAD  | admin/franchising/franchising/edit | admin.franchising.edit    | App\Http\Controllers\Admin\FranchisingController@edit    |
| GET|HEAD  | franchising                          | front.franchising.index   | App\Http\Controllers\Front\FranchisingController@index   |
| POST      | franchising                          | front.franchising.store   | App\Http\Controllers\Front\FranchisingController@store   |
| GET|HEAD  | franchising/create                   | front.franchising.create  | App\Http\Controllers\Front\FranchisingController@create  |
| GET|HEAD  | franchising/franchising            | front.franchising.show    | App\Http\Controllers\Front\FranchisingController@show    |
| PUT|PATCH | franchising/franchising            | front.franchising.update  | App\Http\Controllers\Front\FranchisingController@update  |
| DELETE    | franchising/franchising            | front.franchising.destroy | App\Http\Controllers\Front\FranchisingController@destroy |
| GET|HEAD  | franchising/franchising/edit       | front.franchising.edit    | App\Http\Controllers\Front\FranchisingController@edit    |
+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+

现在,对于您的特定用例,我注意到您只在前端控制器上使用了一条路由,因此与其使用这种通用解决方案,不如简单地定义一条路由。

Route::name('front.franchising.index')
     ->get('franchising', 'Front\FranchisingController@index');

Route::resource(
    'admin/franchising',
    'Admin\FranchisingController',
    ['as' => 'admin']
);

生成这些路由:

+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+
| Method    | URI                                  | Name                      | Action                                                   |
+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+
| GET|HEAD  | admin/franchising                    | admin.franchising.index   | App\Http\Controllers\Admin\FranchisingController@index   |
| POST      | admin/franchising                    | admin.franchising.store   | App\Http\Controllers\Admin\FranchisingController@store   |
| GET|HEAD  | admin/franchising/create             | admin.franchising.create  | App\Http\Controllers\Admin\FranchisingController@create  |
| GET|HEAD  | admin/franchising/franchising      | admin.franchising.show    | App\Http\Controllers\Admin\FranchisingController@show    |
| PUT|PATCH | admin/franchising/franchising      | admin.franchising.update  | App\Http\Controllers\Admin\FranchisingController@update  |
| DELETE    | admin/franchising/franchising      | admin.franchising.destroy | App\Http\Controllers\Admin\FranchisingController@destroy |
| GET|HEAD  | admin/franchising/franchising/edit | admin.franchising.edit    | App\Http\Controllers\Admin\FranchisingController@edit    |
| GET|HEAD  | franchising                          | front.franchising.index   | App\Http\Controllers\Front\FranchisingController@index   |
+-----------+--------------------------------------+---------------------------+----------------------------------------------------------+

【讨论】:

以上是关于在 Laravel 中添加前缀路由名称而不添加前缀 URI的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 使用 Route::resource 生成路由需要添加前缀 /admin/

没有前缀名称的 Laravel 路由

Laravel路线中包含文件夹名称

laravel 路由参数的默认值怎么设置

带有动态前缀的 Laravel 动态路由

为某些变量添加前缀而不触及其他变量?