Laravel rename routing resource path names

最后都变了- 提交于 2019-12-11 07:51:47

问题


Can we rename routing resource path names in Laravel like in Ruby on Rails?

Current

/users/create  ->  UsersController@create
/users/3/edit  ->  UsersController@edit

.. I want like this;

/users/yeni  ->  UsersController@create
/users/3/duzenle  ->  UsersController@edit

I want to do this for localization.


Example from Ruby on Rails;

scope(path_names: { new: "ekle" }) do
  resources :users
end

回答1:


I know this is an old question. I'm just posting this answer for historical purposes:

Laravel now has the possibility to localize the resources. https://laravel.com/docs/5.5/controllers#restful-localizing-resource-uris

Localizing Resource URIs By default, Route::resource will create resource URIs using English verbs. If you need to localize the create and edit action verbs, you may use the Route::resourceVerbs method. This may be done in the boot method of your AppServiceProvider:

use Illuminate\Support\Facades\Route;

/**
 * Bootstrap any application services.
 *
 * @return void
 */

public function boot() {
    Route::resourceVerbs([
        'create' => 'crear',
        'edit' => 'editar',
    ]); } 

Once the verbs have been customized, a resource route registration such as Route::resource('fotos', 'PhotoController') will produce the following URIs:

/fotos/crear

/fotos/{foto}/editar



回答2:


It ain't pretty, but you could define multiple routes that use the same controller function. For example:

Route::get("user/create", "UsersController@create");
Route::get("user/yeni", "UsersController@create");

The only (glaringly obvious downside) being that you're routes will get quite cluttered quite quickly. There is a setting in app/config/app.php where you can set/change your locale, and it could be possible to use that in conjunction with a filter to use the routes and then group those routes based on the current local/language, but that would require more research.

As far as I know, there isn't a way to rename resource routes on the fly, but if you get creative you can figure something out. Best of luck!




回答3:


You can't change the resource url's.
For this you will need to define/create each route according your needs

Route::get("user/yeni", "UsersController@create");

and if you need more than one languages you can use the trans helper function, which is an alias for the Lang::get method

Route::get('user/'.trans('routes.create'), 'UsersController@create');



回答4:


I just had the same issue. And managed to recreate some sort of custom resource route method. It probably could be a lot better, but for now it works like a charm.

namespace App\Helpers;

use Illuminate\Support\Facades\App;

class RouteHelper
{
    public static function NamedResourceRoute($route, $controller, $named, $except = array())
    {
        $routes = RouteHelper::GetDefaultResourceRoutes($route);
        foreach($routes as $method => $options) {
            RouteHelper::GetRoute($route, $controller, $method, $options['type'], $options['name'], $named);
        }
    }

    public static function GetRoute($route, $controller, $method, $type, $name, $named) {
        App::make('router')->$type($named.'/'.$name, ['as' => $route.'.'.$method, 'uses' => $controller.'@'.$method]);
    }
    public static function GetDefaultResourceRoutes($route) {
       return [
        'store' => [
            'type' => 'post',
            'name' => ''
        ],
        'index' => [
            'type' => 'get',
            'name' => ''
        ],
        'create' => [
            'type' => 'get',
            'name' => trans('routes.create')
        ],
        'update' => [
            'type' => 'put',
            'name' => '{'.$route.'}'
        ],
        'show' => [
            'type' => 'get',
            'name' => '{'.$route.'}'
        ],
        'destroy' => [
            'type' => 'delete',
            'name' => '{'.$route.'}'
        ],
        'edit' => [
            'type' => 'get',
            'name' => '{'.$route.'}/'.trans('routes.edit')
        ]
    ];
}
}

Use it like this in the routes.php:

\App\Helpers\RouteHelper::NamedResourceRoute('recipes', 'RecipeController', 'recepten');

Where the first parameter is for the named route, second the controller and third the route itself.

And something like this to the view/lang/{language}/route.php file:

'edit' => 'wijzig',
'create' => 'nieuw'

This results in something like this:




回答5:


This is not possible in Laravel as they use code by convention over configuration. A resources uses the RESTfull implementation

Therefore you have to stick to the convention of

GET   /news/create
POST  /news
GET   /news/1
GET   /news/1/edit
...


来源:https://stackoverflow.com/questions/27806257/laravel-rename-routing-resource-path-names

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!