تتيح لك حزمة 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.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;
// ...
}
لإنشاء سجل عرض، يمكنك استدعاء أسلوب 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
التي تأتي مع هذه الحزمة العديد من الميزات المفيدة. تبدو واجهة برمجة التطبيقات لفئة 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 ();
الرجاء مراجعة الترقية للحصول على دليل الترقية التفصيلي.
الرجاء مراجعة سجل التغيير للحصول على مزيد من المعلومات حول ما تغير مؤخرًا.
يرجى الاطلاع على المساهمة للحصول على التفاصيل.
انظر أيضًا قائمة المساهمين الذين شاركوا في هذا المشروع.
موارد مفيدة:
لا تتردد في إضافة المزيد من البدائل!
هذا المشروع مرخص بموجب ترخيص MIT - راجع ملف الترخيص للحصول على التفاصيل.