2015-04-17 67 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

哦,我明白了,为什么不在控制器的构造函数上定义模型? –