我将一个大型项目从CodeIgniter移动到Laravel 5,遇到了一个我似乎无法找到解决方案的问题。
我知道你可以做路由模型绑定,并且我已经广泛使用它而没有问题,我知道你可以进行方法注入,比如将Request注入到方法中。
但是我的问题"我有多个具有相同名称的类,但对于项目的不同部分,例如:
App\Models\Knowledgebase\Article
App\Models\News\Article
App\Models\Minisite\Resources\Article
如您所见,我有3种不同的Article
模型。一个用于知识库文章,一个用于新闻文章,一个用于部门资源文章。
但是,使用路由模型绑定时,似乎我只能将一个模型绑定到关键字,并且由于我的每个网址都有关键字文章,因此它不起作用。
所以我的问题是,是否可以通过将相关模型指定为参数来将其注入方法?或者我需要通过以下方式将其硬编码到方法中:
$article = App\Models\Knowledgebase\Article::find($some_id);
或者我可以这样做:
public function show(App\Models\Knowledgebase\Article $article)
{
// code
}
目前,如果我尝试注入文章,$article
将成为文章模型的新实例,而不是模型记录。框架会让您手动检索每个方法的模型,这似乎有点奇怪。
感谢任何帮助。
答案 0 :(得分:3)
但是,使用路由模型绑定时,似乎我只能将一个模型绑定到关键字,并且因为我的每个URL都有关键字Article,所以它实际上不起作用。
您可以在每种类型的绑定中使用不同的关键字。
// 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) {});
答案 1 :(得分:2)
为什么不直接使用和别名导入类?
<?php
use App\Models\Knowledgebase\Article as MyArticle
然后在你的功能上执行此操作:
public function show(MyArtcile $article)
{
// code
}