mardi 24 novembre 2015

Laravel 5: How to create a router model binding on multiple parameters

So far I know how to create a router model binding on single parameters like so:

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

The above can then be used like this:

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

And in the controller:

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

But sometimes I need to specify multiple parameters in order to get the right model.

For example consider the following route:

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

and the corresponding controller:

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

However to get the correct model for Topic I need to know the Subject. For example:

// !!! 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();
});

How can I make a router model binding for Topic bearing in mind I need to know the Subject parameter before it in order to fetch the correct Topic.

Is there an alternative better way of doing this?

UPDATE

Currently my showTopic method in my controller is like this:

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

and I have no router model binding for topic_slug. This works as expected, but I would like to take advantage of router model bindings!



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire