Php Laravel 4:用于唯一访客计数的Cookies

Php Laravel 4:用于唯一访客计数的Cookies,php,cookies,laravel,laravel-4,Php,Cookies,Laravel,Laravel 4,我正在创建一个简单的博客,用户可以在其中添加、更新和查看帖子。我在帖子中实现了视图计数功能,显示帖子上的视图数。为此,我所做的是: 已创建事件侦听器: Event::listen('post.viewed','PostHandler@updatePostViewsAction'); 创建了PostHandler和updatePostViewsAction class PostHandler { public function handle() { //

我正在创建一个简单的博客,用户可以在其中添加、更新和查看帖子。我在帖子中实现了视图计数功能,显示帖子上的视图数。为此,我所做的是:

  • 已创建事件侦听器:

    Event::listen('post.viewed','PostHandler@updatePostViewsAction');

  • 创建了
    PostHandler
    updatePostViewsAction

    class PostHandler
    {
        public function handle()
        {
            // 
        }
    
        public function updatePostViewsAction( $post )
        {
            // Update view counter of post
            $post->views_count = $post->views_count + 1;
            $post->save();
        }
    }
    
  • 工作正常,视图计数已成功更新。但后来我决定将视图进行唯一计数。为此,我尝试使用cookies即在用户计算机上创建一个cookie,每当他查看帖子时,增加
    查看次数
    。如果用户再次回来查看帖子,请检查是否有可用的cookie,如果它可用,则不要增加
    查看次数
    否则增加该次数。以下是我是如何实现这一点的:

    class PostHandler
    {
        public function handle()
        {
            // 
        }
    
        public function updatePostViewsAction( $post )
        {
            if ( !Cookie::get('post_viewed') ) {
                // Update view counter of post
                $post->views_count = $post->views_count + 1;
                $post->save();
                Cookie::forever('post_viewed', true);
            }
        }
    }
    

    但是它似乎不起作用,因为每次的浏览量都在增加。有人能告诉我,我做错了什么吗?

    为了用Laravel保存cookie,您需要将其发送到响应。但是,您可以通过将cookie发送到队列来解决此问题

    public function updatePostViewsAction( $post )
    {
        if ( !Cookie::get('post_viewed') ) {
            // Update view counter of post
            $post->views_count = $post->views_count + 1;
            $post->save();
            // Create a cookie before the response and set it for 30 days
            Cookie::queue('post_viewed', true, 60 * 24 * 30);
        }
    }
    
    来源于Laravel文档:

    将Cookie排队等待下一个响应

    如果要在创建响应之前设置cookie,请使用cookie::queue()方法。cookie将自动附加到应用程序的最终响应


    为了使用Laravel保存cookie,需要将其发送到响应。但是,您可以通过将cookie发送到队列来解决此问题

    public function updatePostViewsAction( $post )
    {
        if ( !Cookie::get('post_viewed') ) {
            // Update view counter of post
            $post->views_count = $post->views_count + 1;
            $post->save();
            // Create a cookie before the response and set it for 30 days
            Cookie::queue('post_viewed', true, 60 * 24 * 30);
        }
    }
    
    来源于Laravel文档:

    将Cookie排队等待下一个响应

    如果要在创建响应之前设置cookie,请使用cookie::queue()方法。cookie将自动附加到应用程序的最终响应


    您确定确实创建了cookie吗?使用浏览器的开发人员工具进行检查。是否确实创建了cookie?使用浏览器的开发人员工具进行检查。