دسته‌بندی مدل‌های الکوئنت در لاراول ۶

- 2 روز پیش
توسط علی بیات آپدیت شد
علی بیات ( 193487 تجربه )
6 روز پیش
تخصص : توسعه دهنده ارشد وب

درود دوستان

من پس از بارها پیاده سازی فیچِر دسته بندی‌ها در پروژه های مختلف، به این نتیجه رسیدم که سورس کد این فیچر را به یک پکیج لاراولی تبدیل کنم.

بنده اخیرا پکیجی به نام Laravel Categorizable منتشر کردم. این پکیج کاملا با نسخه ۶ لاراول سازگار است و با بهره گیری از روابط چندریختی (Polymorphism) این امکان را به ما می‌دهد که: هر مدلی که خواستیم را دسته بندی کنیم. به عبارت دیگر در یک اپلیکیشن لاراولی می‌توانیم پست‌ها، محصولات، ویدیو‌ها و هر تعداد مدل دیگر که نیاز داریم را براحتی دسته بندی‌ کنیم; با این پکیج همچنین ساخت، به روزرسانی و حذف دسته بندی‌ها به راحتی قابل انجام است.


نصب پکیج

برای نصب از طریق کامپوزر:

composer require alibayat/laravel-categorizable

سپس پابلیش کردن و اجرای مایگریشن:

php artisan vendor:publish --provider="AliBayat\LaravelCategorizable\CategorizableServiceProvider"
php artisan migrate

آماده سازی مدل

تنها کافیست از تریت پکیح در مدل مورد نظر استفاده کنیم:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use AliBayat\LaravelCategorizable\Categorizable;

class Post extends Model
{
    use Categorizable;

}

به همین سادگی ما قابلیت دسته‌بندی شدن رو به مدل Post اضافه کردیم. با این کار یک سری متد ها که مربوط به این فیچر هستند به مدل ما اضافه میشه


مدیریت دسته‌بندی‌ ها

برای نمایش متدها، نیاز به ساخت چند دسته‌بندی داریم. در زیر نحوه ساخت و حذف دسته‌بندی ها را به علاوه ساخت دسته‌بندی ها به حالت والد و فرزند (دسته‌بندی های تو در تو (Nested)) مرور می‌کنیم:

<?php

use AliBayat\LaravelCategorizable\Category;

// create "BackEnd" category
Category::create([
    'name' => 'BackEnd'
]);

// create "PHP" category
Category::create([
    'name' => 'PHP'
]);

// create "FrontEnd" category
Category::create([
    'name' => 'FrontEnd'
]);

// create "Test" Category (alternative way)
$test = new Category();
$test->name = 'Test';
$test->save();

// assign "PHP" as a child of "BackEnd" category
$parent = Category::findByName('BackEnd');
$child = Category::findByName('PHP');
$parent->appendNode($child);

// delete "Test" Category
$testObj = Category::findByName('Test');
$testObj->delete();

طریقه دسته‌بندی مدل‌ها

حال که دسته‌بندی ها را ساختیم، چند متغیر را مقداردهی میکنیم و سپس عملکرد متد ها را بررسی می‌کنیم:

<?php

use App\Post;
use AliBayat\LaravelCategorizable\Category;

$post = Post::first();

// ۳ different ways of getting a category's instance
$backendCategory = Category::findById(۱);   // 'BackEnd'
$phpCategory = Category::findByName('PHP'); // 'PHP'
$frontendCategory = Category::find(۳);      // 'FrontEnd'

حال برای...

افزودن پست به یک دسته بندی:

    $post->attachCategory($phpCategory);

حذف پست از یک دسته‌بندی:

    $post->detachCategory($phpCategory);

افزودن پست به چند دسته‌بندی:

    $post->syncCategories([
        $phpCategory,
        $backendCategory
        ]); 

حذف پست از تمام دسته‌بندی ها:

    $post->syncCategories([]); 

بررسی پیوست پست به دسته‌بندی ها:

    $post->hasCategory($phpCategory);

    $post->hasCategory([
        $phpCategory,
        $backendCategory
        ]);

    // return boolean

لیست دسته‌بندی های پیوست شده به یک پست:

    $post->categoriesList();

    // return array [id => name]

لیست پست‌های پیوست شده به یک دسته‌بندی:

    $categoryPosts = Category::find(۱)
        ->entries(Post::class)
        ->get();

    // return collection

مستندات پکیج در ریپازیتوری گیت‌هاب موجود است:
https://github.com/AliBayat/Laravel-Categorizable

در صورت پیدا کردن هر گونه باگ می‌تونید در قسمت Issues گیت و یا در این گفتگو اون رو عنوان کنید.

tresa021 ( 3805 تجربه )
6 روز پیش
تخصص : Professional PHP Developer

جالب بود ولی چرا این تصمیم رو گرفتید ک پکیجش کنید ؟!!!

علی بیات ( 193487 تجربه )
5 روز پیش
تخصص : توسعه دهنده ارشد وب

@claymore0465

در اکثر اپلیکیشن های تحت وب دسته‌بندی ها (Categories) نقش مهمی ایفا می‌کنند. در یک بلاگ ساده، یک فروشگاه اینترنتی، یک سیستم آموزشی و حتی سامانه‌های شخصی سازی شده و غیره مفهوم دسته بندی همیشه حظور دارد; مثلا در یک بلاگ، پست‌ها می‌توانند در دسته بندی‌ های خاص خود باشند و همین طور محصولات یک فروشگاه، مقالات آموزشی یک موسسه و ...

میشه گفت عدم اختراع دوباره چرخ، یکی از دلایلش هست

عرفان همتی ( 16745 تجربه )
4 روز پیش
تخصص : Backend Developer

@ali.bayat
آیا امکان پیاده سازی دسته بندی ها به صورت زیر دسته (به صورت نامحدود) امکان پذیر هستش ؟

حسین شفیعی ( 945 تجربه )
4 روز پیش
تخصص : توسعه دهنده لاراول

خوبه برای هر دسته بندی امکان قرار دادن یک آیکن و یک تصویر رو هم قرار بدید. در کل پکیج شما عالیه و متد هایی که براش نوشتین هم کافیه تا حد زیادی

علی بیات ( 193487 تجربه )
4 روز پیش
تخصص : توسعه دهنده ارشد وب

@mrerfan.ir
درود
بله ممکنه. و همچنین دریافت ساختار دسته‌بندی ها به شکل درختی و به شکل Flat هم ممکنه.

علی بیات ( 193487 تجربه )
4 روز پیش
تخصص : توسعه دهنده ارشد وب

@hshafiei374
سپاس، نظر لطف شماست.
اضافه کردن آیکن هم ایده جالبیه

mahdi khanzadi ( 50377 تجربه )
3 روز پیش
تخصص : برنامه نویس سمت سرور

خیلی خوبه. حتما توی پروژه های بعدی ازش استفاده میکنم :)

علی بیات ( 193487 تجربه )
3 روز پیش
تخصص : توسعه دهنده ارشد وب

@khanzadimahdi

درود و سپاس بابت نظر خوب شما آقای خانزادی.

GHM ( 3095 تجربه )
3 روز پیش
تخصص : دولوپر نیمه‌استک

@ali.bayat بنده لاراول کار نمیکنم اما حمایت و تشکر میکنم بابت این کار خوب

علی بیات ( 193487 تجربه )
3 روز پیش
تخصص : توسعه دهنده ارشد وب

@GHM

سپاس‌گذارم دوست عزیز، لطف دارید

Alimotreb ( 167492 تجربه )
3 روز پیش
تخصص : کانفیگ سرور و برنامه نویس

سلام
@ali.bayat

بسیار عالی ، کاربردی! حتما استفاده میکنم

علی بیات ( 193487 تجربه )
3 روز پیش
تخصص : توسعه دهنده ارشد وب

@Alimotreb

درود و سپاس از لطف شما. خوشحال میشم که این پکیج توسط جامعه توسعه دهندگان ایرانی مورد استفاده قرار بگیره.

امیرحسین فلاحی ( 6420 تجربه )
3 روز پیش
تخصص : طراح و برنامه نویس نرم افزار دسکتاپ و موبایل و وب

چقدر عالی. همیشه به این فکر میکردم که باید این پکیج رو یه بار برای همیشه بنویسم ولی وقت نمیشد و همیشه توی هر پروژه به صورت بزن در رویی کد میزدم و کارم رو راه مینداختم. خیلی کار خوبی کردید. حتما توی پروژه بعدی استفاده می کنم ازش

علی بیات ( 193487 تجربه )
2 روز پیش
تخصص : توسعه دهنده ارشد وب

@amhfallahi

درود و سپاس
دقیقا.. من به دفعات خودم این کار رو انجام داده‌ ام.. تا اینکه این پکیج رو در قالب یه ریپازیتوری private منتشر کردم.
به لطف Github عزیز که امکان استفاده از ریپازیتوری های private رو برای ایران و ۳ کشور دیگه محدود کرد، این پکیج هم به نوع Public تبدیل شد.

برای ارسال پاسخ باید وارد سایت شوید