この 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 モデルに簡単に関連付けることができます。シンプルさを念頭に置いて設計されています。
このパッケージは、各ビュー レコードをデータベースに個別に保存します。この利点は、非常に具体的なカウントを行うことができることです。たとえば、2018 年 1 月 10 日から 2 月 17 日までに特定の投稿を閲覧した人の数を知りたい場合は、次のように実行できます。 views($post)->period(Period::create('10-01-2018', '17-02-2018'))->count();
。この欠点は、アプリケーションの訪問者数に応じてデータベースのサイズが急速に増大する可能性があることです。
主な機能の一部を次に示します。
このドキュメントには、この Laravel パッケージの使用に関する役立つ情報が記載されています。
このパッケージにはPHP 7.4以降およびLaravel 6 以降が必要です。
Lumen のサポートは維持されません。
バージョン | 照らす | 状態 | PHPのバージョン |
---|---|---|---|
^7.0 | 6.xx ~ 11.xx | 寄付による積極的な支援 | >= 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;
// ...
}
ビュー レコードを作成するには、Fluent Views
インスタンスでrecord
メソッドを呼び出します。
views ( $ post )-> record ();
訪問者のビューを記録する最適な場所は、コントローラー内です。例えば:
// PostController . php
public function show ( Post $ post )
{
views ( $ post )-> record ();
return view ( ' post.show ' , compact ( ' post ' ));
}
注:このパッケージはデフォルトでクローラーを除外します。たとえば Postman はクローラーでもあるため、テストするときはこの点に注意してください。
Views
インスタンスでcooldown
メソッドを使用して、ビュー レコード間にクールダウンを追加できます。クールダウンを設定するときは、分数を指定する必要があります。
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
クラスは、多くの便利な機能を提供します。 Period
クラスの API は次のようになります。
$ 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
2 つのスコープをモデルに追加します。
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
の 2 つのインデックスがすでにあります。
使用可能なストレージが十分にある場合は、 visitor
列に別のインデックスを追加できます。ビューの量に応じて、場合によってはクエリが高速化される可能性があります。
ビュー数のキャッシュは、アプリケーションのパフォーマンスに大きな影響を与える可能性があります。ここでビュー数のキャッシュに関するドキュメントを読むことができます
remember()
メソッドを使用すると、 count()
メソッドによって作成されたビュー数のみがキャッシュされます。 orderByViews
およびorderByUnique
クエリ スコープでは、クエリ ビルダーに何かを追加するだけであるため、これらの値は使用されません。これらのクエリを最適化するには、これらのカウントを使用して、表示可能なデータベース テーブルに追加の列または複数の列を追加します。
例: ブログ投稿をユニークなビュー数で並べ替えたいと考えています。最初に思い浮かぶのは、 orderByUniqueViews
クエリ スコープを使用することです。
$ posts = Post:: latest ()-> orderByUniqueViews ()-> paginate ( 20 );
多数のビューが保存されている場合、このクエリは非常に遅くなります。処理を高速化するには、たとえば、 posts
テーブルにunique_views_count
列を追加します。この列は、固有のビュー数を使用して定期的に更新する必要があります。これは、スケジュールされた Laravel コマンドを使用して簡単に実現できます。
これをより高速に行う方法があるかもしれませんが、そのようなコマンドは次のようになります。
$ posts = Post:: all ();
foreach ( $ posts as $ post ) {
$ post -> unique_views_count = views ( $ post )-> unique ()-> count ();
}
コア クラスの 1 つを独自の実装で拡張または置き換えたい場合は、それらをオーバーライドできます。
CyrildeWitEloquentViewableViews
CyrildeWitEloquentViewableView
CyrildeWitEloquentViewableVisitor
CyrildeWitEloquentViewableCrawlerDetectAdapter
注:すべてのカスタム クラスは元のインターフェイスを実装する必要があることを忘れないでください。
Visitor
クラスは、現在の訪問者に関するViews
ビルダー情報を提供する責任があります。次の情報が提供されます。
デフォルトのVisitor
クラスは、リクエストから情報を取得します。したがって、RESTful API 経由でViews
ビルダーを使用すると、いくつかの問題が発生する可能性があります。これを解決するには、訪問者に関する独自のデータを提供する必要があります。
Visitor
クラスはグローバルまたはローカルにオーバーライドできます。
Visitor
クラスを作成するLaravel アプリケーションで独自のVisitor
クラスを作成し、 CyrildeWitEloquentViewableContractsVisitor
インターフェイスを実装します。インターフェースで必要なメソッドを作成します。
あるいは、このパッケージに付属するデフォルトのVisitor
クラスを拡張することもできます。
カスタムVisitor
実装をCyrildeWitEloquentViewableContractsVisitor
コントラクトにバインドするだけです。
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Visitor::class,
App Services Views Visitor::class
);
Views
ビルダーのuseVisitor
setter メソッドを使用して訪問者インスタンスを設定することもできます。
use App Services Views Visitor ;
views ( $ post )
-> useVisitor ( new Visitor ()) // or app ( Visitor::class )
-> record ();
Views
Eloquent モデルの使用カスタムViews
実装をCyrildeWitEloquentViewableContractsViews
にバインドします。
次のコード スニペットを変更し、サービス プロバイダー ( AppServiceProvider
など) のregister
メソッドに配置します。
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts Views::class,
App Services Views Views::class
);
View
Eloquent モデルの使用カスタムView
実装をCyrildeWitEloquentViewableContractsView
にバインドします。
次のコード スニペットを変更し、サービス プロバイダー ( AppServiceProvider
など) のregister
メソッドに配置します。
$ this -> app -> bind (
CyrildeWit EloquentViewable Contracts View::class,
App Models View::class
);
カスタムCrawlerDetector
実装をCyrildeWitEloquentViewableContractsCrawlerDetector
にバインドします。
次のコード スニペットを変更し、サービス プロバイダー ( AppServiceProvider
など) のregister
メソッドに配置します。
$ 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 ファイルを参照してください。