Этот пакет Laravel >= 6.0 позволяет связывать представления с моделями Eloquent.
После установки вы можете делать такие вещи:
// Return total views count
views ( $ post )-> count ();
// Return total views count that have been made since 20 February 2017
views ( $ post )-> period (Period:: since ( ' 2017-02-20 ' ))-> count ();
// Return total views count that have been made between 2014 and 2016
views ( $ post )-> period (Period:: create ( ' 2014 ' , ' 2016 ' ))-> count ();
// Return total unique views count ( based on visitor cookie )
views ( $ post )-> unique ()-> count ();
// Record a view
views ( $ post )-> record ();
// Record a view with a cooldown
views ( $ post )-> cooldown ( now ()-> addHours ( 2 ))-> record ();
Иногда вы не хотите использовать стороннюю службу, такую как Google Analytics, для отслеживания просмотров страниц вашего приложения. Тогда этот пакет вам пригодится. Eloquent Viewable позволяет легко связывать представления с моделями Eloquent. Он разработан с учетом простоты.
Этот пакет сохраняет каждую запись представления индивидуально в базе данных. Преимущество этого метода в том, что он позволяет нам производить очень конкретные подсчеты. Например, если мы хотим узнать, сколько людей просмотрело конкретную публикацию в период с 10 января по 17 февраля 2018 года, мы можем сделать следующее: views($post)->period(Period::create('10-01-2018', '17-02-2018'))->count();
. Недостаток этого подхода заключается в том, что размер вашей базы данных может быстро увеличиваться в зависимости от количества посетителей вашего приложения.
Вот некоторые из основных особенностей:
В этой документации вы найдете полезную информацию об использовании этого пакета Laravel.
Для этого пакета требуются PHP 7.4+ и Laravel 6+ .
Поддержка Lumen не поддерживается.
Версия | освещать | Статус | PHP-версия |
---|---|---|---|
^ 7,0 | 6.хх - 11.хх | Активная поддержка взносами | >= 7.4.0 |
Сначала вам нужно установить пакет через Composer:
composer require cyrildewit/eloquent-viewable
Во-вторых, вы можете опубликовать миграции с помощью:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " migrations "
Наконец, вам нужно запустить команду migrate
:
php artisan migrate
При желании вы можете опубликовать файл конфигурации с помощью:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " config "
Если вы предпочитаете регистрировать пакеты вручную, вы можете добавить следующего поставщика в список поставщиков вашего приложения.
// config/app.php
' providers ' => [
// ...
CyrildeWit EloquentViewable EloquentViewableServiceProvider::class,
];
Чтобы связать представления с моделью, модель должна реализовать следующий интерфейс и признак:
CyrildeWitEloquentViewableContractsViewable
CyrildeWitEloquentViewableInteractsWithViews
Пример:
use Illuminate Database Eloquent Model ;
use CyrildeWit EloquentViewable InteractsWithViews ;
use CyrildeWit EloquentViewable Contracts Viewable ;
class Post extends Model implements Viewable
{
use InteractsWithViews;
// ...
}
Чтобы создать запись представления, вы можете вызвать метод record
в свободном экземпляре Views
.
views ( $ post )-> record ();
Лучшее место, где вам следует записывать взгляды посетителей, — это внутри вашего контроллера. Например:
// PostController . php
public function show ( Post $ post )
{
views ( $ post )-> record ();
return view ( ' post.show ' , compact ( ' post ' ));
}
Примечание. Этот пакет по умолчанию отфильтровывает сканеры. Помните об этом при тестировании, поскольку Postman, например, также является сканером.
Вы можете использовать метод cooldown
в экземпляре Views
, чтобы добавить время восстановления между записями представлений. При установке времени восстановления необходимо указать количество минут.
views ( $ post )
-> cooldown ( $ minutes )
-> record ();
Вместо того, чтобы передавать количество минут как целое число, вы также можете передать экземпляр DateTimeInterface
.
$ expiresAt = now ()-> addHours ( 3 );
views ( $ post )
-> cooldown ( $ expiresAt )
-> record ();
При записи просмотра с задержкой сеанса этот пакет также сохранит снимок просмотра в сеансе посетителя с датой истечения срока действия. Всякий раз, когда посетитель снова просматривает элемент, этот пакет проверяет его сеанс и решает, следует ли сохранить представление в базе данных или нет.
views ( $ post )-> count ();
use CyrildeWit EloquentViewable Support Period ;
// Example : get views count from 2017 upto 2018
views ( $ post )
-> period (Period:: create ( ' 2017 ' , ' 2018 ' ))
-> count ();
Класс Period
, входящий в состав этого пакета, предоставляет множество полезных функций. API класса Period
выглядит следующим образом:
$ startDateTime = Carbon:: createFromDate ( 2017 , 4 , 12 );
$ endDateTime = ' 2017-06-12 ' ;
Period:: create ( $ startDateTime , $ endDateTime );
Period:: since (Carbon:: create ( 2017 ));
Period:: upto (Carbon:: createFromDate ( 2018 , 6 , 1 ));
Использует Carbon::today()
в качестве даты и времени начала минус заданная единица измерения.
Period:: pastDays (int $ days );
Period:: pastWeeks (int $ weeks );
Period:: pastMonths (int $ months );
Period:: pastYears (int $ years );
Использует Carbon::now()
в качестве даты и времени начала минус заданная единица измерения.
Period:: subSeconds (int $ seconds );
Period:: subMinutes (int $ minutes );
Period:: subHours (int $ hours );
Period:: subDays (int $ days );
Period:: subWeeks (int $ weeks );
Period:: subMonths (int $ months );
Period:: subYears (int $ years );
Если вы хотите получить только количество уникальных просмотров, вы можете просто добавить unique
метод в цепочку.
views ( $ post )
-> unique ()
-> count ();
Признак Viewable
добавляет в вашу модель две области видимости: orderByViews
и orderByUniqueViews
.
Post:: orderByViews ()-> get (); // descending
Post:: orderByViews ( ' asc ' )-> get (); // ascending
Post:: orderByUniqueViews ()-> get (); // descending
Post:: orderByUniqueViews ( ' asc ' )-> get (); // ascending
Post:: orderByViews ( ' asc ' , Period:: pastDays ( 3 ))-> get (); // descending
Post:: orderByViews ( ' desc ' , Period:: pastDays ( 3 ))-> get (); // ascending
И, конечно же, это также возможно с вариантом уникальных представлений:
Post:: orderByUniqueViews ( ' asc ' , Period:: pastDays ( 3 ))-> get (); // descending
Post:: orderByUniqueViews ( ' desc ' , Period:: pastDays ( 3 ))-> get (); // ascending
Post:: orderByViews ( ' asc ' , null , ' custom-collection ' )-> get (); // descending
Post:: orderByViews ( ' desc ' , null , ' custom-collection ' )-> get (); // ascending
Post:: orderByUniqueViews ( ' asc ' , null , ' custom-collection ' )-> get (); // descending
Post:: orderByUniqueViews ( ' desc ' , null , ' custom-collection ' )-> get (); // ascending
Если вы хотите узнать, сколько представлений имеет определенный видимый тип, вам нужно передать пустую модель Eloquent views()
следующим образом:
views ( new Post ())-> count ();
Вы также можете передать полное имя класса. Затем пакет разрешит экземпляр из контейнера приложения.
views (Post::class)-> count ();
views ( ' AppPost ' )-> count ();
Если у вас есть разные типы представлений для одного и того же видимого типа, вы можете сохранить их в отдельной коллекции.
views ( $ post )
-> collection ( ' customCollection ' )
-> record ();
Чтобы получить количество просмотров в определенной коллекции, вы можете повторно использовать тот же метод collection()
.
views ( $ post )
-> collection ( ' customCollection ' )
-> count ();
Чтобы автоматически удалять все представления просматриваемой модели Eloquent при удалении, вы можете включить ее, установив для свойства removeViewsOnDelete
значение true
в определении вашей модели.
protected $ removeViewsOnDelete = true ;
В некоторых сценариях кэширование количества просмотров может оказаться затруднительным. Период может быть, например, динамическим, что делает кэширование невозможным. Вот почему вы можете использовать встроенную функцию кэширования.
Чтобы кэшировать количество просмотров, просто добавьте в цепочку метод remember()
. Время жизни по умолчанию — навсегда.
Примеры:
views ( $ post )-> remember ()-> count ();
views ( $ post )-> period (Period:: create ( ' 2018-01-24 ' , ' 2018-05-22 ' ))-> remember ()-> count ();
views ( $ post )-> period (Period:: upto ( ' 2018-11-10 ' ))-> unique ()-> remember ()-> count ();
views ( $ post )-> period (Period:: pastMonths ( 2 ))-> remember ()-> count ();
views ( $ post )-> period (Period:: subHours ( 6 ))-> remember ()-> count ();
// Cache for 3600 seconds
views ( $ post )-> remember ( 3600 )-> count ();
// Cache until the defined DateTime
views ( $ post )-> remember ( now ()-> addWeeks ( 2 ))-> count ();
// Cache forever
views ( $ post )-> remember ()-> count ();
Файл миграции таблицы views
по умолчанию уже имеет два индекса: viewable_id
и viewable_type
.
Если у вас достаточно свободного места, вы можете добавить еще один индекс для столбца visitor
. В зависимости от количества просмотров это может ускорить выполнение запросов в некоторых случаях.
Кэширование количества просмотров может оказать большое влияние на производительность вашего приложения. Вы можете прочитать документацию о кэшировании количества просмотров здесь.
Использование метода remember()
будет кэшировать только количество просмотров, выполненное методом count()
. Области запросов orderByViews
и orderByUnique
не используют эти значения, поскольку они только добавляют что-то в построитель запросов. Чтобы оптимизировать эти запросы, вы можете добавить дополнительный столбец или несколько столбцов в видимую таблицу базы данных с этими счетчиками.
Пример: мы хотим упорядочить сообщения в блоге по количеству уникальных просмотров . Первое, что может прийти вам на ум, — это использовать область запроса orderByUniqueViews
.
$ posts = Post:: latest ()-> orderByUniqueViews ()-> paginate ( 20 );
Этот запрос выполняется довольно медленно, если у вас много сохраненных представлений. Чтобы ускорить процесс, вы можете добавить, например, столбец unique_views_count
в таблицу posts
. Нам придется периодически обновлять этот столбец с указанием количества уникальных просмотров. Этого можно легко добиться с помощью запланированной команды Laravel.
Возможно, есть более быстрый способ сделать это, но такая команда может выглядеть так:
$ posts = Post:: all ();
foreach ( $ posts as $ post ) {
$ post -> unique_views_count = views ( $ post )-> unique ()-> count ();
}
Если вы хотите расширить или заменить один из основных классов своими собственными реализациями, вы можете их переопределить:
CyrildeWitEloquentViewableViews
CyrildeWitEloquentViewableView
CyrildeWitEloquentViewableVisitor
CyrildeWitEloquentViewableCrawlerDetectAdapter
Примечание. Не забывайте, что все пользовательские классы должны реализовывать свои исходные интерфейсы.
Класс Visitor
отвечает за предоставление конструктору Views
информации о текущем посетителе. Предоставляется следующая информация:
Класс Visitor
по умолчанию получает информацию из запроса. Поэтому у вас могут возникнуть некоторые проблемы при использовании построителя Views
через RESTful API. Для решения этой проблемы вам необходимо будет предоставить собственные данные о посетителе.
Вы можете переопределить класс Visitor
глобально или локально.
Visitor
Создайте собственный класс Visitor
в своем приложении Laravel и реализуйте интерфейс CyrildeWitEloquentViewableContractsVisitor
. Создайте необходимые методы интерфейса.
Альтернативно вы можете расширить класс Visitor
по умолчанию, который поставляется с этим пакетом.
Просто привяжите свою собственную реализацию Visitor
к контракту CyrildeWitEloquentViewableContractsVisitor
.
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Visitor::class,
App Services Views Visitor::class
);
Вы также можете установить экземпляр посетителя, используя метод установки useVisitor
в конструкторе Views
.
use App Services Views Visitor ;
views ( $ post )
-> useVisitor ( new Visitor ()) // or app ( Visitor::class )
-> record ();
Views
Eloquent Привяжите свою собственную реализацию Views
к CyrildeWitEloquentViewableContractsViews
.
Измените следующий фрагмент кода и поместите его в метод register
поставщика услуг (например, AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Views::class,
App Services Views Views::class
);
View
Eloquent Привяжите свою собственную реализацию View
к CyrildeWitEloquentViewableContractsView
.
Измените следующий фрагмент кода и поместите его в метод register
поставщика услуг (например, AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts View::class,
App Models View::class
);
Привяжите свою собственную реализацию CrawlerDetector
к CyrildeWitEloquentViewableContractsCrawlerDetector
.
Измените следующий фрагмент кода и поместите его в метод register
поставщика услуг (например, AppServiceProvider
).
$ this -> app -> singleton (
CyrildeWit EloquentViewable Contracts CrawlerDetector::class,
App Services Views CustomCrawlerDetectorAdapter::class
);
Views
use CyrildeWit EloquentViewable Views ;
Views:: macro ( ' countAndRemember ' , function () {
return $ this -> remember ()-> count ();
});
Теперь вы можете использовать это сокращение следующим образом:
views ( $ post )-> countAndRemember ();
Views:: forViewable ( $ post )-> countAndRemember ();
Подробное руководство по обновлению см. в разделе «ОБНОВЛЕНИЕ».
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
Пожалуйста, смотрите ВКЛАД для получения подробной информации.
См. также список участников, принявших участие в этом проекте.
Полезные ресурсы:
Не стесняйтесь добавлять больше альтернатив!
Этот проект лицензируется по лицензии MIT — подробности см. в файле LICENSE.