#php #cookies #laravel #laravel-4
#php #файлы cookie #laravel #laravel-4
Вопрос:
Я создаю простой блог, в котором пользователь может добавлять, обновлять и просматривать записи. Я реализовал в публикации функцию подсчета просмотров, которая показывает количество просмотров публикации. Для этого я сделал следующее:
-
Создан прослушиватель событий:
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 на компьютере пользователя, всякий раз, когда он просматривает сообщение, и увеличивать views_count
. Если пользователи вернутся снова и снова просмотрят публикацию, проверьте, доступен ли файл cookie, если он доступен, то не увеличивайте его views_count
, в противном случае увеличьте это. Ниже показано, как я это реализовал:
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);
}
}
}
Но, похоже, это не работает, так как количество просмотров увеличивается каждый раз. Кто-нибудь, пожалуйста, может сказать мне, что я здесь делаю не так?
Комментарии:
1. Вы уверены, что файл cookie действительно создан? Используйте инструменты разработчика вашего браузера для проверки.
Ответ №1:
Чтобы сохранить файл cookie с помощью Laravel, вам необходимо отправить его в ответ. Однако вы можете обойти это, отправив файл 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 Docs http://laravel.com/docs/requests#cookies:
Постановка файла cookie в очередь для следующего ответа
Если вы хотите установить файл cookie перед созданием ответа, используйте метод Cookie::queue(). Файл cookie будет автоматически прикреплен к окончательному ответу вашего приложения.