Laravel资源控制器的命名路由

86

在 Laravel 4.2 中,是否可以为资源控制器路由分配名称?我的路由定义如下:

Route::resource('faq', 'ProductFaqController');

我尝试向路由添加一个名称选项,就像这样:

Route::resource('faq', 'ProductFaqController', array("as"=>"faq"));

然而,当我访问 /faq 路径并在视图中添加 {{ Route::currentRouteName() }},它返回的是 faq.faq.index 而不仅仅是 faq

12个回答

232
当您使用资源控制器路由时,它会自动为每个创建的单独路由生成名称。 Route::resource() 实际上是一个助手方法,它会为您生成单独的路由,而不需要手动定义每个路由。
您可以通过在终端/控制台中键入 php artisan routes(Laravel 4)或 php artisan route:list(Laravel 5)来查看生成的路由名称。 您还可以在资源控制器文档页面(Laravel 4.x | Laravel 5.x)上看到生成的路由名称类型。
有两种方法可以修改资源控制器生成的路由名称:
  1. 作为第三个参数 $options 数组的一部分提供一个 names 数组,其中每个键都是资源控制器方法(index、store、edit等),值是您想要给出的路由名称。
Route::resource('faq', 'ProductFaqController', [
    'names' => [
        'index' => 'faq',
        'store' => 'faq.new',
        // etc...
    ]
]);
  • 使用as选项来为每个路由名称定义前缀。

  • Route::resource('faq', 'ProductFaqController', [
        'as' => 'prefix'
    ]);
    

    这将为您提供诸如prefix.faq.indexprefix.faq.store等路由。


    嗨,我喜欢这个解决方案,但我想用控制器路由来实现它。有没有办法做到像这样:Route::controller('/', 'HomeController', ['names' => ['home.index' => 'getIndex']]); - Anderson Silva
    1
    @AndersonNunesdaSilva 这个解决方案与此非常相似,并且在文档中有描述(http://laravel.com/docs/5.0/controllers#implicit-controllers)。 - Aken Roberts
    @Aken Roberts 或许你可以帮我一下。看看这个链接:https://stackoverflow.com/questions/49594340/how-can-i-implement-resource-controllers-if-i-use-many-get-on-the-laravel - moses toh
    我不知道 as 关键字,谢谢。这是最简洁的解决方案。 - JalalJaberi

    42

    如果使用 Laravel 5.5+ 的答案查找者找到了这个页面:

    Route::namespace('Admin')->prefix('admin')->name('admin.')->group(function () {
    
        Route::resource('users','UserController');
    
    });
    
    这些选项将对Resource产生以下结果:
    • namespace()将控制器命名空间设置为\ Admin \ UserController

    • prefix()将请求URI设置为/admin/users

    • name()将路由名称访问器设置为route('admin.users.index')

    name()中,点(DOT)是有意的,这不是一个打字错误。

    如果这适用于Laravel 5.5之前的任何版本,请在评论中告知其他人,我将更新我的答案。

    更新:

    Taylor接受了我的PR以在5.5中正式记录此内容:

    https://laravel.com/docs/5.5/routing#route-group-name-prefixes


    更新LARAVEL 8

    在Laravel 8中,路由配置中使用namespace已被弃用,默认的namespace包装程序已从Laravel的标准配置中删除。 这种变化使得控制器名称空间与分组路由无需考虑,取消注册路由时的namespace要求,使组织控制器和路由更加自由。

    在Laravel 8中,使用对静态类名的自引用,原始示例现在如下所示:

    
    use \App\Http\Controllers\Admin\{
        UserController,
        ProductController,
        AnotherController,
    }
    
    Route::prefix('admin')->name('admin.')->group(function () {
    
        Route::resource('users', UserController::class);
    
        Route::resource('products', ProductController::class);
    
        Route::resource('another', AnotherController::class);
    
    });
    
    

    也许你可以帮我。看看这个链接:https://stackoverflow.com/questions/49594340/how-can-i-implement-resource-controllers-if-i-use-many-get-on-the-laravel - moses toh

    31

    我不知道laravel 4.2是否可用(我在5.7中进行了测试),但您可以使用names更改由资源生成的所有路由的名称

    Route::resource('faq', 'ProductFaqController', ['names' => 'something']);
    

    结果将是这样

    something.index
    

    而且您不需要指定每条路线


    3
    这是一个非常被低估的答案。 - Albert221
    你在哪里找到这个答案?是在文档中吗? - Abid Khairy

    8

    使用 Laravel 5.5 之后的所有更新

    Route::resource('faqs', 'FaqController', ['as' => 'faqs']);
    

    如果在上面的代码中不使用['as' => 'faqs'],那么它也可以正常工作。

    [更新]

    重要的是要记住这将适用于“resource

    例如:

    Route::resource('admin/posts/tags', 'PostTagController', ['as' => 'posts']);
    

    并且结果将会是这样的。
     POST      | admin/posts/tags                  | posts.tags.store
     GET|HEAD  | admin/posts/tags                  | posts.tags.index
     GET|HEAD  | admin/posts/tags/create           | posts.tags.create
     DELETE    | admin/posts/tags/{tag}            | posts.tags.destroy
     PUT|PATCH | admin/posts/tags/{tag}            | posts.tags.update
     GET|HEAD  | admin/posts/tags/{tag}            | posts.tags.show
     GET|HEAD  | admin/posts/tags/{tag}/edit       | posts.tags.edit
    

    5

    在 Laravel 8 中的测试结果:

    你可以通过传递可选参数来定义资源路由的名称,例如:

    use App\Http\Controllers\UsersController;
    
    Route::resource('reservations', UsersController::class, ['names' => 'users']);
    

    上面的示例定义了如users.indexusers.store等路由。

    您还可以将路由名称传递为:

    Route::resource('reservations', UsersController::class, ['names' => 'admin.users']);
    

    将使用前缀为admin的路由进行定义,例如:admin.users.indexadmin.users.store


    就我个人而言,这不会生成正确的路由。例如,显示路由被生成为| GET | HEAD | admin/clients/ {} --> 空花括号会带来问题。 - Makamu Evans

    4
    使用 Laravel 5.5。
    Route::resource('admin/posts/tags', 'PostTagController', ['as' => 'posts']);
    

    重要的是要记住"资源"。
    例如,我从我的项目发送了一些东西:
    Route::resource('admin/posts/tags', 'PostTagController', ['as' => 'posts']);
    

    4

    在 Laravel 8 中

    Route::resource('product', 
        App\Http\Controllers\API\Admin\ProductController::class, [
        'names' => [
            'index' => 'admin.product.index', 
            'store' => 'admin.product.store', 
            'update' => 'admin.product.update', 
            'destroy' => 'admin.product.delete'
        ]
    ])->except(['edit', 'create']);
    

    1

    Route::resource('articles','ArticleController', ['names' => 'xyz'])

    路由::资源('文章','文章控制器',['名称' => 'xyz'])

    1
    Route::resource('nice-books', BookController::class)->names('books');
    

    在这行中,->names('books') 用作 BookController 资源路由的 books 名称前缀。
    示例效果:route('books.index') -> GET /nice-books

    你应该添加解释。 - Super Kai - Kazuya Ito
    @SuperKai-KazuyaIto已添加。现在一切清楚了吗? - erbelion

    -1

    在 Laravel 5.7 中,您无需在资源中设置名称,我已经测试过了。它会从 URL 自动生成路由名称。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接