在 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::get
、Route::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的主要内容,如果未能解决你的问题,请参考以下文章