Laravel 4,组前缀需要更改路由名称。真?

时间:2014-05-14 18:37:30

标签: php laravel laravel-4

所以我一直在研究一个生活在域根目录上的应用程序,现在必须处理/ admin。因此,domain.com/[resource]等网址现在应为domain.com/admin/[resource]。之前我没想过这么好,因为我认为这对Laravel来说非常简单。毕竟,这是没有硬编码路线的主要原因之一,对吧?

所以我的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应该帮助这个!或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

这是未经测试的,但在查看resource controllers的文档后,似乎您可以手动设置其名称。我假设Laravel自动命名空间分组资源控制器路由以避免名称冲突,但是您可以覆盖它以避免返回应用程序的其余部分(只是要注意将来的名称冲突):

Route::resource(
    'books',
    'BooksController',
    array(
        'names' => array(
            'index'   => 'photo.index',
            'create'  => 'photo.create',
            'store'   => 'photo.store',
            'show'    => 'photo.show',
            'edit'    => 'photo.edit',
            'update'  => 'photo.update',
            'destroy' => 'photo.destroy',
        )
    )
);

更短的方法:

只需在routes.php文件的顶部定义一个快速方法,即可缩短创建路径名数组的重复性任务。仍然不是最好的解决方案,但我相信它是唯一可以解决Laravel如何设置的问题。

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可能不支持,这意味着您可能需要使用旧语法替换它们。