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와 같은 제3자 서비스를 가져오고 싶지 않은 경우도 있습니다. 그렇다면 이 패키지가 유용할 것입니다. 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
두 가지 범위를 추가합니다.
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
특정 보기 가능 유형에 몇 개의 뷰가 있는지 알고 싶다면 다음과 같이 views()
도우미에 빈 Eloquent 모델을 전달해야 합니다.
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 );
저장된 뷰가 많으면 이 쿼리는 상당히 느립니다. 작업 속도를 높이려면 예를 들어 posts
테이블에 unique_views_count
열을 추가할 수 있습니다. 고유 조회수로 이 열을 주기적으로 업데이트해야 합니다. 이는 예약된 Laravel 명령을 사용하여 쉽게 달성할 수 있습니다.
이 작업을 수행하는 더 빠른 방법이 있을 수 있지만 해당 명령은 다음과 같습니다.
$ posts = Post:: all ();
foreach ( $ posts as $ post ) {
$ post -> unique_views_count = views ( $ post )-> unique ()-> count ();
}
핵심 클래스 중 하나를 자신만의 구현으로 확장하거나 바꾸려면 해당 클래스를 재정의하면 됩니다.
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 ();
자세한 업그레이드 가이드는 업그레이드를 참조하세요.
최근 변경된 사항에 대한 자세한 내용은 변경 로그를 참조하세요.
자세한 내용은 CONTRIBUTING을 참조하세요.
이 프로젝트에 참여한 기여자 목록도 참조하세요.
유용한 자료:
더 많은 대안을 자유롭게 추가하세요!
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.