2016-03-14 69 views
1

當你定義一個Route::resource('recipe', 'RecipeController');資源,除其他外,以下路線定義:/photo/{photo}/edit,一旦你定義了所有的資源,你有這樣的事情:Laravel資源:如何定義關鍵參數的名稱?

  • /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的一個屬性。

我如何定義關鍵參數對id而不是recipesallergensingredients名字?

+0

那麼你關心的路線或實際上是表單生成器? –

+0

我更關心路線,我希望他們遵循相同的模式。例如'{資源}/{編號} /編輯' – olvlvl

+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} 
+0

我希望能像這樣簡單:https://github.com/ICanBoogie/Routing#defining-resource-routes-using-routemaker with'OPTION_ID_NAME',但是你的代碼會很好。非常感謝Jared! – olvlvl

0

由於參數只是一個佔位符,您可以將您的ID傳遞給您不需要的路由,將參數{recipes}更改爲{id}。

所以

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

是一樣的,因爲這

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

這條路/recipes/{recipes}/edit

+0

感謝您的回答,問題同樣在'Form :: model'中,因爲'recipes'屬性在記錄中不可用,所以我最終使用'/ recipes/{recipes}'路線。我更新了我原來的帖子。 – olvlvl

+0

哦,好吧你正在使用路線模型綁定我猜。 – oseintow

+0

@olvlvl oseinow說它只是一個佔位符,不管路由如何。我認爲問題在別的地方。無論如何,提交表單後你有什麼錯誤? – smartrahat