Este pacote Laravel >= 6.0 permite associar visualizações a modelos Eloquent.
Depois de instalado você pode fazer coisas assim:
// 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 ();
Às vezes, você não deseja recorrer a um serviço de terceiros, como o Google Analytics, para rastrear as visualizações de página do seu aplicativo. Então este pacote é útil. Eloquent Viewable permite associar facilmente visualizações a modelos Eloquent. Ele foi projetado com a simplicidade em mente.
Este pacote armazena cada registro de visualização individualmente no banco de dados. A vantagem disto é que nos permite fazer contagens muito específicas. Por exemplo, se quisermos saber quantas pessoas visualizaram uma postagem específica entre 10 de janeiro e 17 de fevereiro de 2018, podemos fazer o seguinte: views($post)->period(Period::create('10-01-2018', '17-02-2018'))->count();
. A desvantagem disso é que seu banco de dados pode crescer rapidamente dependendo da quantidade de visitantes que seu aplicativo recebe.
Aqui estão alguns dos principais recursos:
Nesta documentação você encontrará algumas informações úteis sobre o uso deste pacote Laravel.
Este pacote requer PHP 7.4+ e Laravel 6+ .
O suporte para Lumen não é mantido.
Versão | Iluminar | Status | Versão PHP |
---|---|---|---|
^7,0 | 6.xx - 11.xx | Apoio ativo por contribuições | >= 7.4.0 |
Primeiro, você precisa instalar o pacote via Composer:
composer require cyrildewit/eloquent-viewable
Em segundo lugar, você pode publicar as migrações com:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " migrations "
Finalmente, você precisa executar o comando migrate
:
php artisan migrate
Opcionalmente, você pode publicar o arquivo de configuração com:
php artisan vendor:publish --provider= " CyrildeWitEloquentViewableEloquentViewableServiceProvider " --tag= " config "
Se preferir registrar pacotes manualmente, você pode adicionar o seguinte provedor à lista de provedores do seu aplicativo.
// config/app.php
' providers ' => [
// ...
CyrildeWit EloquentViewable EloquentViewableServiceProvider::class,
];
Para associar visualizações a um modelo, o modelo deve implementar a seguinte interface e característica:
CyrildeWitEloquentViewableContractsViewable
CyrildeWitEloquentViewableInteractsWithViews
Exemplo:
use Illuminate Database Eloquent Model ;
use CyrildeWit EloquentViewable InteractsWithViews ;
use CyrildeWit EloquentViewable Contracts Viewable ;
class Post extends Model implements Viewable
{
use InteractsWithViews;
// ...
}
Para fazer um registro de visualização, você pode chamar o método record
na instância fluente Views
.
views ( $ post )-> record ();
O melhor lugar onde você deve registrar a visão de um visitante seria dentro do seu controlador. Por exemplo:
// PostController . php
public function show ( Post $ post )
{
views ( $ post )-> record ();
return view ( ' post.show ' , compact ( ' post ' ));
}
Nota: Este pacote filtra os rastreadores por padrão. Esteja ciente disso ao testar, porque o Postman também é um rastreador, por exemplo.
Você pode usar o método cooldown
na instância Views
para adicionar um cooldown entre os registros de visualização. Ao definir um tempo de espera, você precisa especificar o número de minutos.
views ( $ post )
-> cooldown ( $ minutes )
-> record ();
Em vez de passar o número de minutos como um número inteiro, você também pode passar uma instância DateTimeInterface
.
$ expiresAt = now ()-> addHours ( 3 );
views ( $ post )
-> cooldown ( $ expiresAt )
-> record ();
Ao gravar uma visualização com atraso de sessão, este pacote também salvará um instantâneo da visualização na sessão do visitante com data e hora de expiração. Sempre que o visitante visualizar o item novamente, este pacote irá verificar sua sessão e decidir se a visualização deve ser salva no banco de dados ou não.
views ( $ post )-> count ();
use CyrildeWit EloquentViewable Support Period ;
// Example : get views count from 2017 upto 2018
views ( $ post )
-> period (Period:: create ( ' 2017 ' , ' 2018 ' ))
-> count ();
A classe Period
que vem com este pacote oferece muitos recursos úteis. A API da classe Period
é a seguinte:
$ 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 ));
Usa Carbon::today()
como data e hora de início menos a unidade fornecida.
Period:: pastDays (int $ days );
Period:: pastWeeks (int $ weeks );
Period:: pastMonths (int $ months );
Period:: pastYears (int $ years );
Usa Carbon::now()
como data e hora de início menos a unidade fornecida.
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 );
Se você deseja apenas recuperar a contagem de visualizações exclusivas, basta adicionar o método unique
à cadeia.
views ( $ post )
-> unique ()
-> count ();
A característica Viewable
adiciona dois escopos ao seu modelo: orderByViews
e 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
E, claro, também é possível com a variante de visualizações exclusivas:
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
Se você quiser saber quantas visualizações um tipo visível específico possui, você precisa passar um modelo vazio do Eloquent para o auxiliar views()
da seguinte forma:
views ( new Post ())-> count ();
Você também pode passar um nome de classe totalmente qualificado. O pacote então resolverá uma instância do contêiner do aplicativo.
views (Post::class)-> count ();
views ( ' AppPost ' )-> count ();
Se você tiver diferentes tipos de visualizações para o mesmo tipo visualizável, convém armazená-las em sua própria coleção.
views ( $ post )
-> collection ( ' customCollection ' )
-> record ();
Para recuperar a contagem de visualizações em uma coleção específica, você pode reutilizar o mesmo método collection()
.
views ( $ post )
-> collection ( ' customCollection ' )
-> count ();
Para excluir automaticamente todas as visualizações de um modelo Eloquent visível na exclusão, você pode habilitá-lo definindo a propriedade removeViewsOnDelete
como true
na definição do seu modelo.
protected $ removeViewsOnDelete = true ;
Armazenar em cache a contagem de visualizações pode ser um desafio em alguns cenários. O período pode ser, por exemplo, dinâmico, o que impossibilita o armazenamento em cache. É por isso que você pode usar a funcionalidade de cache integrada.
Para armazenar em cache a contagem de visualizações, basta adicionar o método remember()
à cadeia. A vida útil padrão é para sempre.
Exemplos:
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 ();
O arquivo de migração da tabela de views
padrão já possui dois índices para viewable_id
e viewable_type
.
Se você tiver armazenamento suficiente disponível, poderá adicionar outro índice para a coluna visitor
. Dependendo da quantidade de visualizações, isso pode agilizar suas consultas em alguns casos.
O armazenamento em cache das contagens de visualizações pode ter um grande impacto no desempenho do seu aplicativo. Você pode ler a documentação sobre como armazenar em cache a contagem de visualizações aqui
Usar o método remember()
armazenará em cache apenas as contagens de visualizações feitas pelo método count()
. Os escopos de consulta orderByViews
e orderByUnique
não estão usando esses valores porque apenas adicionam algo ao construtor de consultas. Para otimizar essas consultas, você pode adicionar uma coluna extra ou várias colunas à tabela de banco de dados visível com essas contagens.
Exemplo: queremos ordenar as postagens do nosso blog por contagem de visualizações únicas . A primeira coisa que pode vir à sua mente é usar o escopo de consulta orderByUniqueViews
.
$ posts = Post:: latest ()-> orderByUniqueViews ()-> paginate ( 20 );
Esta consulta é bastante lenta quando você tem muitas visualizações armazenadas. Para acelerar as coisas, você pode adicionar, por exemplo, uma coluna unique_views_count
à sua tabela posts
. Teremos que atualizar esta coluna periodicamente com a contagem de visualizações únicas. Isso pode ser facilmente alcançado usando um comando agendado do Laravel.
Pode haver uma maneira mais rápida de fazer isso, mas esse comando pode ser assim:
$ posts = Post:: all ();
foreach ( $ posts as $ post ) {
$ post -> unique_views_count = views ( $ post )-> unique ()-> count ();
}
Se quiser estender ou substituir uma das classes principais por suas próprias implementações, você pode substituí-las:
CyrildeWitEloquentViewableViews
CyrildeWitEloquentViewableView
CyrildeWitEloquentViewableVisitor
CyrildeWitEloquentViewableCrawlerDetectAdapter
Nota: Não esqueça que todas as classes personalizadas devem implementar suas interfaces originais
A classe Visitor
é responsável por fornecer ao construtor Views
informações sobre o visitante atual. As seguintes informações são fornecidas:
A classe Visitor
padrão obtém suas informações da solicitação. Portanto, você pode enfrentar alguns problemas ao usar o construtor Views
por meio de uma API RESTful. Para resolver isso, você precisará fornecer seus próprios dados sobre o visitante.
Você pode substituir a classe Visitor
global ou localmente.
Visitor
Crie sua própria classe Visitor
em sua aplicação Laravel e implemente a interface CyrildeWitEloquentViewableContractsVisitor
. Crie os métodos necessários pela interface.
Alternativamente, você pode estender a classe Visitor
padrão que vem com este pacote.
Basta vincular sua implementação personalizada Visitor
ao contrato CyrildeWitEloquentViewableContractsVisitor
.
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Visitor::class,
App Services Views Visitor::class
);
Também é possível configurar a instância do visitante usando o método setter useVisitor
no construtor Views
.
use App Services Views Visitor ;
views ( $ post )
-> useVisitor ( new Visitor ()) // or app ( Visitor::class )
-> record ();
Views
Eloquent Vincule sua implementação Views
customizada ao CyrildeWitEloquentViewableContractsViews
.
Altere o seguinte trecho de código e coloque-o no método register
em um provedor de serviços (por exemplo AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Views::class,
App Services Views Views::class
);
View
Eloquent Vincule sua implementação View
personalizada ao CyrildeWitEloquentViewableContractsView
.
Altere o seguinte trecho de código e coloque-o no método register
em um provedor de serviços (por exemplo AppServiceProvider
).
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts View::class,
App Models View::class
);
Vincule sua implementação personalizada CrawlerDetector
ao CyrildeWitEloquentViewableContractsCrawlerDetector
.
Altere o seguinte trecho de código e coloque-o no método register
em um provedor de serviços (por exemplo 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 ();
});
Agora você pode usar esta abreviação assim:
views ( $ post )-> countAndRemember ();
Views:: forViewable ( $ post )-> countAndRemember ();
Consulte ATUALIZAÇÃO para obter um guia de atualização detalhado.
Consulte CHANGELOG para obter mais informações sobre o que mudou recentemente.
Consulte CONTRIBUINDO para obter detalhes.
Veja também a lista de colaboradores que participaram deste projeto.
Recursos úteis:
Sinta-se à vontade para adicionar mais alternativas!
Este projeto está licenciado sob a licença MIT - consulte o arquivo LICENSE para obter detalhes.