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