اذهب إلى المحتوى
  • 0

استفسار حول منطق الأعمال والمستودعات | action and repository design pattern

أحمد مصطفى كامل

السؤال

Recommended Posts

  • 0

1 -  توضيح حول action design pattern laravel

"نمط تصميم الإجراء" هو طريقة بسيطة ولكنها نظيفة وفعالة لإعادة استخدام منطق الأعمال في Laravel.

لنبدأ بتطبيق إدارة الخادم. لدى المستخدم خوادم ، ثم في يوم واحد ، يريد المستخدم أرشفة الخادم. المتحكم للقيام بذلك قد يكون: 

namespace App\Http\Controllers;

use App\Models\Server;

class ArchivedServersController extends Controller
{
    public function store(Server $server)
    {
        $this->authorize('update', $server);

        $server->markAsArchived();

        $server->owner->notify(new ServerArchivedNotification($server));

        return $server;
    }
}

هذه طريقة Laravel نموذجية. منطق الأعمال مخفي في النموذج مثل:

class Server extends Model
{
    public function markAsArchived()
    {
        return tap($this)->update([
            'archived_at' => now(),
        ]);
    }
}

لنفترض الآن أن التطبيق يريد مسح وأرشفة الخوادم التي كانت غير نشطة لفترة طويلة. سيكون الأمر:

class ArchiveInactiveServers extends Command
{
    protected $signature = 'archive-inactive-servers';

    public function handle()
    {
        Server::inactiveForALongTime()
            ->get()
            ->each(function ($server) {
                $server->markAsArchived();

                $server->owner->notify(new ServerArchivedNotification($server));
            });
    }
}

بصراحة ، من وجهة نظري ، لا يزال من الجيد ترك الأمر على النحو الوارد أعلاه. الآن ، ينمو العمل ، ولأسباب معينة ، يحتاج التطبيق إلى القيام بأمرين للتحضير والانتهاء قبل / بعد وضع علامة على الخادم على أنه مؤرشف.

$server->prepareToArchieve();

$server->markAsArchived();

$server->doSomethingToFinalise();

$server->owner->notify(new ServerArchivedNotification($server));

الآن مع كل تحديث قادم ، تحتاج إلى تكراره مرتين: في وحدة التحكم والأمر. إنه ليس إلزاميًا ولكن يمكن اعتبار استخراج منطق الأعمال. لننقل المنطق إلى فئة مخصصة تسمى ArchiveServer:

namespace App\Actions;

use App\Models\Server;
use App\Notifications\ServerArchivedNotification;

class ArchiveServer
{
    public function archive(Server $server)
    {
        $server->prepareToArchieve();

        $server->markAsArchived();

        $server->doSomethingToFinalise();

        $server->owner->notify(new ServerArchivedNotification($server));
    }
}

نحن نطلق على هذه الفئات مثل هذه "الإجراءات". الإجراء عبارة عن فئة بسيطة ذات طريقة عامة واحدة فقط تتعامل مع منطق الأعمال. يمكنك تسميته كما تريد: فعل الإجراء ، أو التعامل ، أو حتى __invoke لاستدعائه مباشرة كدالة. ذلك يعتمد على ذوقك.

يمكنك الآن تنفيذ الإجراء عبر مساعد التطبيق:

class ArchivedServersController extends Controller
{
    public function store(Server $server)
    {
        $this->authorize('update', $server);

        app(ArchieveServer::class)->archive($server);

        return $server;
    }
}
class ArchiveInactiveServers extends Command
{
    protected $signature = 'archive-inactive-servers';

    public function handle()
    {
        Server::inactiveForALongTime()
            ->get()
            ->each(fn ($server) => app(ArchieveServer::class)->archive($server));
    }
}

2- The Repository pattern

المستودعات هي فئات أو مكونات تغلف المنطق المطلوب للوصول إلى مصادر البيانات. إنها تركز وظائف الوصول إلى البيانات المشتركة ، وتوفر إمكانية صيانة أفضل وفصل البنية التحتية أو التكنولوجيا المستخدمة للوصول إلى قواعد البيانات من طبقة نموذج المجال. إذا كنت تستخدم مخطط ربط الكائنات (ORM) مثل Laravel or django Framework ، فإن الكود الذي يجب تنفيذه يكون مبسطًا ، وذلك بفضل LINQ والكتابة القوية. يتيح لك هذا التركيز على منطق استمرارية البيانات بدلاً من التركيز على سباكة الوصول إلى البيانات.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...