Php Laravel 4,组前缀要求更改路由名称。真正地
因此,我一直在开发一个应用程序,它位于域根上,现在必须在/admin上工作。所以像Php Laravel 4,组前缀要求更改路由名称。真正地,php,laravel,laravel-4,Php,Laravel,Laravel 4,因此,我一直在开发一个应用程序,它位于域根上,现在必须在/admin上工作。所以像domain.com/[resource]这样的URL现在应该是domain.com/admin/[resource]。我以前并不认为这很好,因为我认为这必须是一个非常容易解决拉雷维尔。毕竟,这是不硬编码路线的主要原因之一,对吗 因此,我的routes.php文件类似于: Route::group(['before' => 'auth'], function() { Route::resource('
domain.com/[resource]
这样的URL现在应该是domain.com/admin/[resource]
。我以前并不认为这很好,因为我认为这必须是一个非常容易解决拉雷维尔。毕竟,这是不硬编码路线的主要原因之一,对吗
因此,我的routes.php文件类似于:
Route::group(['before' => 'auth'], function() {
Route::resource('books', 'BooksController');
... more resources here ...
});
查看文档时,我发现'prefix'=>'admin'
可以做到这一点:
Route::group(['prefix' => 'admin', 'before' => 'auth'], function() {
Route::resource('books', 'BooksController');
... more resources here ...
});
但事实证明,每个路由名称都从
books.{action}
更改为admin.books.{action}
,这需要我更改整个应用程序。Regexing将是危险的,手动执行将是令人讨厌的。拉威尔本该帮你的!还是我遗漏了什么?这是未经测试的,但在查看文档后,似乎可以手动设置它们的名称。我假设Laravel会自动将名称空间分组到资源控制器路由,以避免名称冲突,但您可以覆盖该路由,以避免返回应用程序的其余部分(只是要小心将来的名称冲突):
较短的方法: 只需在
routes.php
文件的顶部定义一个快速方法,即可缩短创建路由名称数组的重复任务。仍然不是最好的解决方案,但我相信这是你能做的唯一一件事
function createRouteNames($resource) {
$names = array();
$types = ['index', 'create', 'store', 'show', 'edit', 'update', 'destroy'];
foreach($types as $type) {
$names[$type] = $resource . '.' . $type;
}
return $names;
}
Route::resource('books', 'BooksController', ['names' => createRouteNames('books')]);
注意:
[]==array()
并且在旧的PHP上可能不受支持,这意味着您可能需要用旧的语法替换它们。这不是不合理的行为。它通过为路由命名空间,防止管理员“用户”资源与公共“用户”资源冲突。我同意应该有更多的控制权,但相反的行为是不好的。它确实有效。然而,这是一个相当丑陋的解决方案。它使我的routes.php文件大约大10倍@Mauro使用一个函数来查看我的更新,该函数为您的资源控制器创建这个名称数组。哈哈,我确实想到了这一点。但是我更喜欢long routes.php文件。这并不总是与文件的长度有关,而是与复杂性有关。我正在努力使文件易于阅读给其他人,包括一个函数将过于复杂。不过非常感谢你的方法。我会再等一会儿,然后再把你的答案记为正确答案。没问题,我同意你的观点。也许值得将它们拆分为一个目录,其中包含多个路由文件(针对每个组),所有这些文件都将包含在主routes.php
?呸,我就这样不说了。我只是希望拉威尔能有一个更整洁的方式。比如用通配符命名整个资源的路由,比如books.{action}
或其他。
function createRouteNames($resource) {
$names = array();
$types = ['index', 'create', 'store', 'show', 'edit', 'update', 'destroy'];
foreach($types as $type) {
$names[$type] = $resource . '.' . $type;
}
return $names;
}
Route::resource('books', 'BooksController', ['names' => createRouteNames('books')]);