当我有两个路由指向同一个动作时,我看到了Laravel 4的一个问题,一个路由在一个组中,另一个路由在routes.php文件中只是“松散”。
<?php
// Routes.php
Route::group(array('domain' => '{subdomain}.domain.com'), function()
{
Route::get('profile/{id}/{name}', 'ProfileController@index');
});
Route::get('profile/{id}/{name}', 'ProfileController@index');
// Template.blade.php
<a href="{{ URL::action('ProfileController@index', array(123, 'JimSmith')) }}">Jim Smith</a>
模板链接到:currentsubdomain.domain.com/profile/%7Bid%7D/%7Bname%7D
,而不是分别交换123和JimSmith的ID和名称的预期行为。
如果我注释掉第一条路径(组内的路由),则代码按预期工作。为什么添加此附加路由会破坏URL生成?有办法解决这个问题吗?我错过了一些明显的东西吗?
P.S。对于那些想知道为什么我需要在两个地方使用这条路线的人来说,我可以选择使用URL::action('ProfileController@index' array('subdomain' => 'james', 'id' => 123, 'name' => 'JimSmith');
答案 0 :(得分:3)
问题是你没有路由的名称/别名,所以它默认为它遇到的第一个。
考虑这个替代路线结构:
Route::group(array('domain' => '{subdomain}.domain.com'), function() {
Route::get('profile/{id}/{name}', [
'as' => 'tenant.profile.index',
'uses' => 'ProfileController@index'
]);
});
Route::get('profile/{id}/{name}', [
'as' => 'profile.index',
'uses' => 'ProfileController@index'
]);
现在你已经命名了这些路线,你可以这样做:
{{ URL::route('profile.index', [123, 'jSmith']) }}
或者:
{{ URL::route('tenant.profile.index', ['subdomain', 123, 'jSmith']) }}
作为一个额外的附加功能,您只能将此路由定义一次,然后在所有控制器方法中使用以下内容:
public function index($subdomain = null, $id, $name) { }
然后,您只需将www
作为子域名传递,并在某个地方使用某些代码从特定操作中对www.domain.com域名进行折扣。
多租户(如果这确实是你所追求的)并不容易和直接,但有一些方法用于解决某些部分。我实际上正在计划编写有关它的教程,但是现在我希望这有点帮助。