Laravel资源:如何定义关键参数的名称?

时间:2016-03-14 14:19:04

标签: laravel laravel-routing

使用.jumbotron{ background-color: lightyellow; } ul{ background-color: lightgrey; } ul.nav-pills li.active a{ border-top: 3px solid; border-radius: 2px; } ul.nav-pills li:hover a{ border-top: 3px solid light blue; } ul.nav-pills li a{ background-color: #eee; margin-right: 0; } ul.nav-pills li a{ background-color: lightyellow; margin-right: 0; } 定义资源时,定义了以下路由:Route::resource('recipe', 'RecipeController');,一旦定义了所有资源,就会出现以下情况:

  • /photo/{photo}/edit
  • /recipes/{recipes}/edit
  • /allergens/{allergens}/edit

因为我的所有记录都使用/ingredients/{ingredients}/edit作为主键(MongoDB),所以我想改为id,如下所示:

  • {id}
  • /recipes/{id}/edit
  • /allergens/{id}/edit

我在/ingredients/{id}/edit课程中挖了但是我没有看到如何指定这个。

当我使用Router创建表单时,我会收到Form::model($record)之类的操作,因为/recipes/{recipes}recipes的属性。

如何将参数的名称定义为$record而不是idrecipesallergens

3 个答案:

答案 0 :(得分:3)

要更改Route::resource的参数名称,您需要自定义ResourceRegistrar实施。

以下是您如何以最短的方式实现这一目标:

// AppServiceProvider (or anywhere you like)
public function register()
{
  $this->app->bind('Illuminate\Routing\ResourceRegistrar', function ($app) {

    // *php7* anonymous class for brevity,
    // feel free to create ordinary `ResourceRegistrar` class instead
    return new class($app['router']) extends \Illuminate\Routing\ResourceRegistrar 
    {

      public function register($name, $controller, array $options = [])
      {
        if (str_contains($name, '/')) {
          return parent::register($name, $controller, $options);
        }

        // ---------------------------------
        // this is the part that we override
        $base = array_get($options, 'param', $this->getResourceWildcard(last(explode('.', $name))));
        // ---------------------------------

        $defaults = $this->resourceDefaults;

        foreach ($this->getResourceMethods($defaults, $options) as $m) {
          $this->{'addResource'.ucfirst($m)}($name, $base, $controller, $options);
        }
      }
    };
  });
}

现在您的路线将如下所示:

Route::resource('users', 'UsersController', ['param' => 'some_param'])
/users/{some_param}

// default as fallback
Route::resource('users', 'UsersController')
/users/{users}

请注意,这种方式不适用于嵌套资源,因此它们会混合使用默认行为和自定义行为,如下所示:

Route::resource('users.posts', 'SomeController', ['param' => 'id'])
/users/{users}/posts/{id}

答案 1 :(得分:0)

您可以将您的ID传递给您不需要将参数{recipes}更改为{id}的路线,因为参数只是一个占位符。

所以

 public function edit($recipes){
    // code goes hr
 }

与此相同

 public function edit($id){
    // code goes hr
 }

此路线/recipes/{recipes}/edit

答案 2 :(得分:0)

我知道这是4岁的问题,但对于任何使用谷歌搜索的人而言;您可以传递第三个参数来覆盖键命名:

Route::resource('ingredients', 'IngredientController', ['parameters' => ['ingredients' => 'id']]);

Route::resource('ingredients', 'IngredientController')->parameters(['ingredients' => 'id']);