Laravel - 在导航栏

时间:2015-10-10 06:38:45

标签: php laravel laravel-5

目前正在处理我的laravel应用中的通知功能。通知不需要是实时的,用户只需刷新页面,然后系统将再次获得最新的通知计数并显示在导航栏的顶部。我通过在我的基本控制器中实现get count函数实现了这一点,我的所有其他控制器都将从它扩展。以下是我如何获得通知计数的示例。

我有两张桌子ap_threadap_thread_comment。 ap_thread有一列last_visit_date,ap_thread_comment有一列created_at。一个帖子可以有很多评论,我只是查询ap_thread_comment created_date是>而不是ap_thread last_visit_date并获得未读评论。当线程所有者访问其主题时,ap_thread last_visit_date将更新。

现在的问题是,当某个用户对该帖子发表评论时,我们会说2条未读评论。但是当线程所有者再次访问他们的线程时,它将显示2个未读的注释,因为基本控制器将首先触发,而不是仅由控制器跟随以更新last_visit_date。如果我再次刷新页面,我可以得到正确的计数。我是否做错了实施这样的通知?以下是我的代码

class BaseController extends Controller{
public function __construct() {
   $new_thread_comment_count = 50; // 50 unread comments for example.
   View::share('new_thread_comment_count', $new_thread_comment_count);
}

class ThreadController extends BaseController{
   // update last visit date function
}

1 个答案:

答案 0 :(得分:3)

我认为这与您设置线程评论计数时有关。由于您在方法的构造函数中调用它,因此在过程中过早地得到未读数。

我建议您不要使用View::share()而实际使用view composer。视图作曲家基本上会给你一个懒惰的评价,因为它们是在呈现视图之前调用的。

您可以使用;

在注册方法中将视图编辑器附加到应用程序服务提供程序中
// '*' will attach this composer to all views, if you want only a single view
// specify it's name, or you can specify an array of views.
view()->composer('*', function (View $view) {
    $new_thread_comment_count = 50;
    $view->with('new_thread_comment_count', $new_thread_comment_count);
});

正如作曲家的文档中所述,如果您不是关闭的粉丝,或者在服务提供商中放入太多逻辑,那么您可以在其中放置一个命名类;

view()->composer('*', 'App\Http\ViewComposers\NewThreadCommentCounter');