2015-04-17 107 views
0

我正在將一個大型項目從CodeIgniter移動到Laravel 5,並且遇到了一個我似乎無法找到解決方案的問題。Laravel方法模型綁定?

我知道你可以做路由模型綁定,並且我一直在使用它沒有問題,並且我知道你可以做方法注入,比如注入請求到方法中。

但我的「問題」是我有多個類具有相同的名稱,但該項目的不同部分,例如:

App\Models\Knowledgebase\Article 
App\Models\News\Article 
App\Models\Minisite\Resources\Article 

正如你所看到的,我有3種不同的型號Article。一個用於知識庫文章,一個用於新聞文章,另一個用於部門資源文章。

但是,使用路由模型綁定,似乎我只能將一個模型綁定到關鍵字,並且由於我的URL每個都有關鍵字Article,所以它不起作用。

所以我的問題是,是否有可能通過將其指定爲參數將相關模型注入方法中?或者我需要硬編碼到方法說:

$article = App\Models\Knowledgebase\Article::find($some_id); 

或者,我可以做這樣的事情:

public function show(App\Models\Knowledgebase\Article $article) 
{ 
    // code 
} 

此刻,如果我嘗試注入的文章,$article變文章模型的新實例,而不是模型記錄。這似乎有點奇怪,框架會讓你手動檢索每種方法的模型。

任何幫助表示讚賞。

回答

3

然而,隨着路由模型綁定,看來我只能一個模型綁定到一個關鍵詞,因爲我的網址分別具有關鍵字文章,它並沒有真正的工作。

您可以在每種類型的綁定中使用不同的關鍵字。

// in the router 
$router->model('kbarticle', 'App\Models\Knowledgebase\Article'); 
$router->model('newsarticle', 'App\Models\News\Article'); 
$router->model('sitearticle', 'App\Models\Minisite\Resources\Article'); 

// in your routes file 
Route::get('knowledge/{kbarticle}', function(App\Models\Knowledgebase\Article $article) {}); 
Route::get('news/{newsarticle}', function(App\Models\News\Article $article) {}); 
Route::get('site/{sitearticle}', function(App\Models\Minisite\Resources\Article $article) {}); 
+0

我可以用'Route :: resource()'使用這種方法嗎?無論哪種方式,這也很有幫助 –

+0

@PhilCross我不使用'Route :: resource()'太多了,對不起。也許? – ceejayoz

+0

我決定用單獨的路線替換路線資源(get/post/put等)。至少這樣我可以在Route文件中更好地控制模型別名的名稱。 –

2

爲什麼不直接導入類和別名?

<?php 
use App\Models\Knowledgebase\Article as MyArticle 

然後在你的函數只是這樣做:

public function show(MyArtcile $article) 
{ 
    // code 
} 
+0

對不起,我不知道我是否清楚自己需要什麼!我可以將一個模型綁定到一個方法,但不能自動從路由中填充它,而不使用路由模型綁定。我會嘗試更新我的問題。 –

+0

這可以在''aliases'=> [...'KBArticle'=>'App \ Models \ Knowledgebase \ Article',...]''app \ app.php'文件中完成嗎?如果可能的話,這將節省時間。 –

+0

哦,我明白了,爲什麼不在控制器的構造函數上定義模型? –