【问题标题】:Laravel rename routing resource path namesLaravel 重命名路由资源路径名
【发布时间】:2015-03-04 13:38:39
【问题描述】:

我们能否像在 Ruby on Rails 中一样在 Laravel 中重命名路由资源路径名称?

当前

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

.. 我想要这样的;

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

我想这样做是为了本地化。


Ruby on Rails 的示例;

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

【问题讨论】:

    标签: php laravel laravel-4 laravel-routing


    【解决方案1】:

    我知道这是一个老问题。我只是出于历史目的发布此答案:

    Laravel 现在可以本地化资源。 https://laravel.com/docs/5.5/controllers#restful-localizing-resource-uris

    本地化资源 URI 默认情况下,Route::resource 将创建 使用英语动词的资源 URI。如果您需要本地化创建 和编辑动作动词,你可以使用 Route::resourceVerbs 方法。 这可以在您的 AppServiceProvider 的 boot 方法中完成:

    use Illuminate\Support\Facades\Route;
    
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    
    public function boot() {
        Route::resourceVerbs([
            'create' => 'crear',
            'edit' => 'editar',
        ]); } 
    

    一旦动词被自定义,资源路由注册,例如 Route::resource('fotos', 'PhotoController') 将 生成以下 URI:

    /fotos/crear
    
    /fotos/{foto}/editar
    

    【讨论】:

      【解决方案2】:

      我也遇到了同样的问题。并设法重新创建某种自定义资源路由方法。它可能会好很多,但现在它就像一个魅力。

      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')
              ]
          ];
      }
      }
      

      在 routes.php 中这样使用:

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

      第一个参数用于命名路由,第二个参数是控制器,第三个参数是路由本身。

      在 view/lang/{language}/route.php 文件中是这样的:

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

      结果如下:

      【讨论】:

        【解决方案3】:

        您无法更改资源网址。
        为此,您需要根据需要定义/创建每条路线

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

        如果您需要一种以上的语言,您可以使用 trans 辅助函数,它是 Lang::get 方法的别名

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

        【讨论】:

        • 感谢飞利浦,但您可以使用它重命名方法。我想重命名网址。
        • @tgezginis 抱歉,我以为您想更改名称。现在修正我的答案。
        【解决方案4】:

        它不是很漂亮,但是您可以定义多个使用相同控制器功能的路由。例如:

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

        唯一(明显的缺点)是您的路线很快就会变得非常混乱。 app/config/app.php 中有一个设置,您可以在其中设置/更改您的语言环境,并且可以将其与过滤器结合使用以使用路由,然后根据当前本地/语言对这些路由进行分组,但这会需要更多研究。

        据我所知,没有办法即时重命名资源路线,但如果你有创意,你就能想出办法。祝你好运!

        【讨论】:

          【解决方案5】:

          这在 Laravel 中是不可能的,因为它们按照约定使用代码而不是配置。资源使用 RESTfull 实现

          因此你必须遵守的约定

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

          【讨论】:

          • 您不能使用资源并手动定义路由(或编写自己的方法来做同样的事情(请查看 Route 的源代码以获取灵感;-))
          • 恐怕这不再正确,请参阅(现在)接受的答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-30
          • 2017-08-22
          • 1970-01-01
          • 2017-02-12
          • 1970-01-01
          • 2023-03-16
          • 2013-11-16
          相关资源
          最近更新 更多