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

时间:2014-08-15 11:19:07

标签: php design-patterns laravel

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

第一种方法要求我将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 ...
}

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

3 个答案:

答案 0 :(得分:0)

最佳做法是避免在视图中调用函数。

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

答案 1 :(得分:0)

为什么这么复杂?你的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);
}

答案 2 :(得分:0)

你必须将存储库传递给视图..虽然你想做的不是最聪明的方法,而是根据你的需要......方式是

你控制器上的

__construct你添加这样的东西

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

如果您不使用界面,则只需传递存储库

然后你回到视图

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

然后你就完成了..