如何从视图访问存储库逻辑


How do I access repository logic from the view?

基本上,我正在编写一个简单的博客应用程序,用户可以在其中对帖子进行投票(我在应用程序中将此过程命名为评分)。我的问题是,我不确定访问方法以确定用户是否在帖子上投票的最佳方法是什么,因为我不想将存储库传递到我的视图中,也不希望模型具有模仿存储库的方法……这里有两个想法——这是唯一的方法吗?

第一种方法要求我将PostRepository传递给我的视图以及已经传递的Post模型…

<!-- Repository-in-view approach -->
<p>You voted {{ $postRepository->hasUserScored($post->id, $user->id) ? 'up' : 'down' }}.</p>
-----------
// Inside `PostRepository`
public function hasUserScored($postId, $userId, $vote = true)
{
    // DB logic to determine ...
}
或者我应该这样做吗?
<!-- Repository-in-view approach -->
<p>You voted {{ $post->hasUserScored($user->id) ? 'up' : 'down' }}.</p>
-----------
// Inside `Post`
public function hasUserScored($userId)
{
    return (new PostRepository)->hasUserScored($this->id, $userId);
}
// Inside `PostRepository`
public function hasUserScored($postId, $userId, $vote = true)
{
    // DB logic to determine ...
}

克服这个问题的最好方法是什么?任何帮助非常感激,谢谢!

最佳实践是避免从视图内部调用函数。

从控制器调用函数,并将数据传递给视图。或者,也可以使用视图编写器。

你为什么用这么复杂的方式做这件事?你的Post模型不能只是与用户+数据透视表的多对多关系吗?然后,检查User投票就像下面这样简单:

function users()
{
    return $this->belongsToMany('User')->withPivot('vote');       
}
function getUserScore($userId)
{
     return $this->users->find($userId)->pivot->vote;       
}

同样,如果您想检查用户是否投票,只需执行:

function hasUserVoted($userId)
{
     return $this->users->contains($userId);
}

您必须将Repository传递给视图。虽然你想做的不是最聪明的方法,但符合你的需要。方法是

在控制器__construct中添加如下内容

function __construct(PostRepositoryInterface $post){
    $this->post = $post;
}

如果你不使用接口,那么只需传递存储库

然后返回到视图

view(your.view)->with('post', $this->post);