【问题标题】:Route Model Binding multiple types of Models to the same Controller method in LaravelRoute Model 将多种类型的模型绑定到 Laravel 中的同一个 Controller 方法
【发布时间】:2017-03-31 13:55:43
【问题描述】:

我试图找出在 Laravel 中实现多态关系的正确方法,使用的示例是允许相同的“评论”模型与“帖子”和“视频”都有关系。

这与 Laravel 文档中的示例相同,如下所示:

posts
    id - integer
    title - string
    body - text

videos
    id - integer
    title - string
    url - string

comments
    id - integer
    body - text
    commentable_id - integer
    commentable_type - string

我已经设置了模型来回建立关系 - 没有问题。我的问题是如何最有效地使用 CommentsController?我希望能够使用相同的 CommentsController@store 方法来存储任何类型的评论,无论是帖子还是视频。

这个,而不是有一个 CommentsController@storePostComment 和一个 CommentsController@storeVideoComment 的替代方案。

我的路线设置如下:

Route::post('/posts/{post}/comments', 'CommentsController@store'); 
Route::post('/videos/{video}/comments', 'CommentsController@store');

我的 CommentsController@store 方法设置如下,目前仅用于帖子

class CommentsController extends Controller
{

    public function store(Post $post)
    {
        $post->addComment(request('body'));      

        return back(); 
    }
}

Laravel 的路由模型绑定抓取正确的 Post 并且 addComment() 方法保存评论。

我的问题是如何修改它以接受相同方法的帖子或视频?我确信这是正确的方法,而不是为每个方法创建单独的方法,但不知道如何去做。

【问题讨论】:

    标签: php laravel routes eloquent


    【解决方案1】:

    尝试使用 SEGMENT

    public function store($data)  //{post} or {video} comes here
    {
       if(Request::segment(1) == 'posts'){
           $post = new Post;
           $post->addComment(request('body'));
       }else if(Request::segment(1) == 'videos'){
           $video = new Video;
           $video->addComment(request('url'));
       }     
       return back(); 
    }
    

    【讨论】:

    • 感谢您的回复。我现在要这样做!我希望有一种方法可以自动检测类型并分配......类似于界面的东西,但会继续尝试解决这个问题。
    • 您对此有进一步了解吗?
    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2016-10-25
    • 2018-01-10
    • 2015-01-09
    • 2013-03-25
    相关资源
    最近更新 更多