แพ็คเกจ 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 ไม่ได้รับการดูแล
| เวอร์ชัน | ส่องสว่าง | สถานะ | เวอร์ชันพีเอชพี |
|---|---|---|---|
| ^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,
];ในการเชื่อมโยงมุมมองกับโมเดล โมเดล จะต้อง ใช้อินเทอร์เฟซและลักษณะต่อไปนี้:
CyrildeWitEloquentViewableContractsViewableCyrildeWitEloquentViewableInteractsWithViewsตัวอย่าง:
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 ' ));
}หมายเหตุ: แพ็คเกจนี้จะกรองโปรแกรมรวบรวมข้อมูลตามค่าเริ่มต้น โปรดคำนึงถึงสิ่งนี้เมื่อทำการทดสอบ เนื่องจากบุรุษไปรษณีย์ก็เป็นตัวอย่างในการรวบรวมข้อมูลเช่นกัน
คุณสามารถใช้วิธี 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 ();
}หากคุณต้องการขยายหรือแทนที่หนึ่งในคลาสหลักด้วยการใช้งานของคุณเอง คุณสามารถแทนที่คลาสเหล่านั้นได้:
CyrildeWitEloquentViewableViewsCyrildeWitEloquentViewableViewCyrildeWitEloquentViewableVisitorCyrildeWitEloquentViewableCrawlerDetectAdapterหมายเหตุ: อย่าลืมว่าคลาสแบบกำหนดเองทั้งหมดต้องใช้อินเทอร์เฟซดั้งเดิม
คลาส 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 - ดูรายละเอียดในไฟล์ใบอนุญาต