معرفی کامپوننت های View در لاراول، یک راه جایگزین برای کامپوزر های View
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 4 دقیقه

معرفی کامپوننت های View در لاراول، یک راه جایگزین برای کامپوزر های View

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

فرض کنید که یک وبلاگ دارید، و باید در نوار کناری یک ویجت «برجسته ها» (Highlights) قرار دهید.

بخش برجسته ها با Response های یک API پر می شود.

پس احتمالا در کنترلر صفحه خانه خود چنین کدی دارید:

<?php

class HomeController extends Controller {

    protected $blog;

    public function __construct(BlogRepository $blog)
    {
        $this->blog = $blog
    }

    public function index()
    {
        return view('blog', [
            'posts' => $blog->latest(),
            'highlights' => $blog->highlights()
        ]);
    }
}

این روش ساده و تمیز است، اما وقتی که شروع به ارسال متغیر های برجسته مشابه به تمام صفحات وبسایت خود، برای مثال یک صفحه ارتباط با ما بکنید، این روش تبدیل به یک مشکل می شود:

<?php

class ContactPageController extends Controller {

    protected $blog;

    public function __construct(BlogRepository $blog)
    {
        $this->blog = $blog
    }

    public function index()
    {
        return view('contact', [
            'highlights' => $blog->highlights()
        ]);
    }
}

فرض کنید اگر 20 کنترلر مختلف داشته باشید چی می شود. احتمالا کد های تکراری زیادی خواهید داشت و همراه با بزرگ تر شدن برنامه تان، مدیریت آن سخت تر می شود.

از کامپوزر های View لاراول استفاده کنید

کامپوزر های View به شما اجازه می دهند که منطق کد را به خارج از کنترلر خود انتقال دهید، و داده ها را به گروه View های مشخصی ارسال کنید.

<?php

class HighLightsComposer
{

    protected $users;

    public function __construct(BlogRepository $blog)
    {
        $this->blog = $blog
    }

    public function compose(View $view)
    {
        $view->with('highlights', $this->blog->highlights());
    }
}

و بعد در Service Provider خود، چنین چیزی خواهید داشت:

<?php

class ComposerServiceProvider extends ServiceProvider
{
    public function boot()
    {
        View::composer(
            'highlights', 'App\Http\ViewComposers\HighlighsComposer'
        );
    }
}

در این نقطه می توانید کنترلر های خود را اینگونه ویرایش کنید:

<?php

class HomeController extends Controller {

    protected $blog;

    public function __construct(BlogRepository $blog)
    {
        $this->blog = $blog
    }

    public function index()
    {
        return view('blog', [
            'posts' => $blog->latest()
        ]);
    }
}

class ContactPageController extends Controller {

    public function index()
    {
        return view('contact');
    }

}

فکر کردن درباره محصول

در نگاه اول، این بسیار خوب به نظر می رسد، اما بیایید کمی درباره اش فکر کنیم.

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

تصور کنید که مشتری شما از شما درخواست کند که محتویات ویجت برجسته ها را با یک چیز استاتیک جایگزین کنید. در مثال فعلی، می توانید با به روز رسانی محتویات فایل highlights.blade.php این کار را انجام دهید.

برنامه همانطور که انتظار می رود اجرا می شود، اما فراخوانی API در پس زمینه (در کامپوزر View) اجرا می شود.

پس اهمیتی ندارد که منطق را از View خود حذف کنید یا نه، باید نام View را تغییر دهید، یا Service Provider را به روز رسانی کنید و فراخوانی API از ViewComposer را متوقف کنید.

استفاده از کامپوننت های View

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

چیزی که می خواهیم، استفاده مجدد از یک View است که با استفاده از داده های دینامیک (که از هر منبعی می توانند بیایند) ساخته خواهد شد.

کلاس کامپوننت جدیدی به نام Highlights بسازید.

کلاس های View Component باید رابط یا قرارداد مشترکی داشته باشند تا نوع داده هایی که می خواهیم برگردانیم را مشخص کند. در این مورد، قرارداد Htmlable لاراول بسیار مناسب است.

<?php

namespace App\ViewComponents;

use Illuminate\Support\Facades\View;
use Illuminate\Contracts\Support\Htmlable;

class HighlightsComponent implements Htmlable
{
    protected $blog;

    public function __construct(BlogRepository $blog)
    {
        $this->blog = $blog;
    }

    public function toHtml()
    {
        return View::make('highlights')
            ->with('highlights', $this->blog->highlights())
            ->render();
    }
}

ساخت یک دستور العمل Blade جدید برای رندر کردن کامپوننت های View

در حالی که در حال استفاده از تزریق Dependency در کلاس بالا هستیم، استفاده از IOC برای Resolve کردن آن Dependency ها برای ما، می تواند ایده خوبی باشد.

<?php

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        Blade::directive('render', function ($component) {
            return "<?php echo (app($component))->toHtml(); ?>";
        });
    }
}

در آخر، می توانید کامپوننت View را رندر کنید، که یک HTML partial را بر روی هر View ای بر می گراند.

// home.blade.php

@render(\App\ViewComponents\HighlightsComponent::class)

جمع بندی

با استفاده از این روش می توانید کامپوننت های پیچیده را با استفاده از داده های دینامیک بر روی هر View ای، مجددا استفاده کنید.

منطق کامپوننت تنها در صورتی که در دستور العمل @render() blade شامل شده باشد، اجرا می شود.

اگر با گروه بزرگی از توسعه دهندگان کار می کنید، می توانید مطمئن باشید که اگر کسی پیاده سازی ویجت در View را بدون به روز رسانی کد های آن تغییر دهد، کارایی برنامه تان تحت تاثیر قرار نخواهد گرفت.

منبع

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
در انتظار ثبت رای

6 سال پیش
/@er79ka

دیدگاه و پرسش

برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید ورود یا ثبت‌نام

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید