在Laravel中嵌套共享子资源

时间:2013-08-07 07:21:18

标签: laravel laravel-4

我想知道如何区分来自子资源中不同父资源的请求。

考虑子资源评论,由帖子和用户共享。注释控制器如何知道正确的父资源是什么?

我有这些路线:

Route::resource('posts', 'PostsController');
Route::resource('posts.comments', 'CommentsController');
Route::resource('users', 'UsersController');
Route::resource('users.comments', 'CommentsController');

CommentsController中,我得到了这个功能:

public function index($parent_id) {
    // return multiple comments here
}

因此,我可能希望显示属于某个帖子的所有评论或属于某个用户的所有评论,但CommentsController如何判断$parent_id是否指向此帖子或用户情况?

2 个答案:

答案 0 :(得分:5)

这应该有效

Route::resource('posts', 'PostsController');
Route::resource('users', 'UsersController');
Route::resource('posts.comments', 'CommentsController');
Route::resource('users.comments', 'CommentsController');

让父母使用这个

$parent = Request::segment(1) === 'posts' ? 'posts' : 'users';

答案 1 :(得分:3)

如果你想拥有Route::model绑定,那么代替id,将模型传递给你的控制器动作,考虑以下内容来区分用户和帖子:

Route::model('post', 'Post');
Route::model('user', 'User');
Route::model('comment', 'Comment');

Route::resource('posts', 'PostsController');
Route::resource('posts.comments', 'CommentsController');
Route::resource('users', 'UsersController');
Route::resource('users.comments', 'CommentsController');

然后,如果要确保操作定义中的参数类型,只需使用户和帖子从某个抽象基类扩展,如下所示:

abstract class Commentable extends \Eloquent {}

class User extends Commentable {}

现在您可以在控制器中使用以下内容:

class CommentsController extends BaseController {
    function index(Commentable $commentable, Comment $comment) {
        // Possibly check if this comment and the given commentable are even related...
        dd($commentable); // make your logic check if it is an instanceof User or Post!
    }
}