【问题标题】:Laravel Method Model Binding?Laravel 方法模型绑定?
【发布时间】:2015-04-17 15:52:07
【问题描述】:

我正在将一个大型项目从 CodeIgniter 迁移到 Laravel 5,并且遇到了一个我似乎无法找到解决方案的问题。

我知道你可以做路由模型绑定,我一直在广泛使用它没有问题,我知道你可以做方法注入,例如将Request注入方法。

但我的“问题”是我有多个同名的类,但针对项目的不同部分,例如:

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 将成为文章模型的新实例,而不是模型记录。该框架会让您手动检索每种方法的模型,这似乎有点奇怪。

感谢任何帮助。

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    但是,使用路由模型绑定,我似乎只能将一个模型绑定到一个关键字,而且由于我的每个 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) {});
    

    【讨论】:

    • 我可以在Route::resource() 中使用这种方法吗?无论哪种方式,这也很有帮助
    • @PhilCross 我很少使用Route::resource(),抱歉。也许?
    • 我决定用单独的路由(get/post/put 等)替换路由资源。至少这样我可以在 Route 文件中更好地控制模型别名的名称。
    【解决方案2】:

    你为什么不直接使用和别名导入类?

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

    然后在你的函数上这样做:

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

    【讨论】:

    • 抱歉,我不确定我是否清楚我需要什么!我可以将模型绑定到方法,但不能从路由自动填充它,而不使用路由模型绑定。我会尝试更新我的问题。
    • 这可以在'aliases' =&gt; [ ... 'KBArticle' =&gt; 'App\Models\Knowledgebase\Article', ...] 下的app/app.php 文件中完成吗?如果有可能,那将节省时间。
    • 哦,我明白了,你为什么不在控制器的构造函数上定义你的模型?
    • @TimLewis 是的,你可以,例如,你可以为你的用户模型添加一个别名,只需尝试在你的 app.php 末尾添加这个,'Megauser' =&gt; 'App\User'' 然后在你的控制器上做@987654326 @
    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 2018-10-27
    • 2021-05-24
    • 2020-09-22
    • 2013-05-28
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多