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

db2dz4w8  于 2023-03-04  发布在  其他
关注(0)|答案(3)|浏览(105)

使用Route::resource('recipe', 'RecipeController');等定义资源时,将定义以下路由:/photo/{photo}/edit,一旦你定义了所有的资源,你就会得到这样的结果:

  • /recipes/{recipes}/edit
  • /allergens/{allergens}/edit
  • /ingredients/{ingredients}/edit

因为我的所有记录都使用id作为主键(MongoDB),所以我希望使用{id}作为主键,如下所示:

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

我深入研究了Router类,但我不知道如何指定它。
此外,当我用Form::model($record)创建表单时,我会得到类似/recipes/{recipes}的操作,因为recipes$record的属性。
如何将 key 参数的名称定义为id,而不是recipesallergensingredients

gorkyyrv

gorkyyrv1#

我知道这是4岁的问题,但任何人谁是谷歌;您可以传递第三个参数来覆盖键命名:
Route::resource('ingredients', 'IngredientController', ['parameters' => ['ingredients' => 'id']]);
或者
Route::resource('ingredients', 'IngredientController')->parameters(['ingredients' => 'id']);
参见文档

4nkexdtk

4nkexdtk2#

为了更改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}
7gcisfzg

7gcisfzg3#

您可以将您的id传递给不需要将参数{recipes}更改为{id}的路由,因为这些参数只是占位符。
所以

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

和这个一样

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

对于此路由/recipes/{recipes}/edit

相关问题