【问题标题】:Laravel 5: How to create a router model binding on multiple parametersLaravel 5:如何创建绑定多个参数的路由器模型
【发布时间】:2016-02-26 23:52:49
【问题描述】:

到目前为止,我知道如何在单个参数上创建路由器模型绑定,如下所示:

// RouteServiceProvider.php
$router->model('subject_slug', 'App\Subject', function($slug) {
     return Subject::where('slug', $slug)->firstOrFail();
});

上面可以这样使用:

// routes.php
Route::get('/{subject_slug}', 'MenuController@showSubject');

在控制器中:

public function showSubject(Subject $subject) {
   ....
}

但有时我需要指定多个参数才能获得正确的模型。

例如考虑以下路线:

Route::get('/{subject_slug}/{topic_slug}/', 'MenuController@showTopic');

以及对应的控制器:

public function showTopic(Subject $subject, Topic $topic) {
   ....
}

但是要获得Topic 的正确模型,我需要知道Subject。例如:

// !!! Invalid laravel code !!!
$router->model('topic_slug', 'App\Topic, function($subject_slug, $topic_slug) {
     // ERROR: $subject_slug is obviously not defined!
     return Topic::where([
        'subject_slug' => $subject_slug,
        'slug' => $topic_slug,
     ])->firstOrFail();
});

如何为Topic 进行路由器模型绑定,记住我需要知道Subject 之前的参数才能获取正确的Topic

还有其他更好的方法吗?

更新

目前我的控制器中的showTopic 方法是这样的:

public function showTopic(Subject $subject, $topic_slug) {
   $topic = Topic::where([
               'subject_slug' => $subject_slug,
               'slug' => $topic_slug,
            ])->firstOrFail();
   // ...
}

我没有topic_slug 的路由器模型绑定。 这按预期工作,但我想利用路由器模型绑定!

【问题讨论】:

  • 我怀疑没有办法做到这一点,因为你想要做的实际上是将两个模型(SubjectTopic)绑定到一个路由。您可能不得不回退到没有模型绑定的旧路由绑定来完成此操作。
  • 是的,我用的就是这个。甚至不知道bind

标签: laravel routing laravel-5 laravel-5.1 laravel-routing


【解决方案1】:

事实证明,我这样做的方式有点缺陷。我不恰当地使用模型绑定,而使用像这样的普通绑定会更好:

$router->bind('topic_slug', function($slug, Route $route) {
     $subject = $route->parameter('subject_slug');
     return Topic::where([
        'subject_slug' => $subject->slug,
        'slug' => $slug,
     ])->firstOrFail();
});

此外,我之前使用的模型绑定完全错误,因为第三个函数应该是“未找到的行为”(不是用于附加逻辑)!

【讨论】:

    猜你喜欢
    • 2017-01-10
    • 2015-07-12
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2015-07-02
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多