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

فرض کنید، یک بلاگی داریم و می‌خواهیم یک ویجت “highlights” را در نوار کناری نشان دهیم.

در کنترلر صفحه اصلی با کد زیر برای دریافت نتایج highlights روبرو خواهیم بود:

<?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()
        ]);
    }
}

اما زمانی که نیاز داریم از نتایج یکسان همان متغیر در یک صفحه دیگر از سایت مانند صفحه contact استفاده کنیم، نرم افزار با خطا خواهد شد:

<?php

class ContactPageController extends Controller {

    protected $blog;

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

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

تا بدین مرحله با تکرار Api قبلی همانند صفحه تماس با ما اگر تعدادی کنترلر متفاوت هم داشته باشیم؛ بایستی از کدهای یکسان استفاده کنیم. این کار باعث می شود نرم افزار بدلایل کدهای تکراری رشد کند و در این صورت نگهداری آن سخت‌تر خواهد بود.

استفاده از view composers در لاراول

view composers به ما این امکان را می‌دهد که بتوانیم منطق و کد خود را به خارج از کنترلر انتقال دهیم و داده‌ها را مستقیما به مجموعه‌ای از 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());
    }
}

پس از نوشتن کلاس View Composer مربوطه، بایستی در service provider نرم افزار، تغییراتی در متد boot داشته باشیم:

<?php

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

در مرحله بعد، Controller های نرم افزار را تصحیح می کنیم:

<?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 composers استفاده می‌کنیم، اجرای آن در تمام نرم افزار ادامه می‌یابد.
در هنگام بررسی بارگذاری نرم افزار تصور کنید مشتری از شما بخواهد محتوای “highlights” را با مقادیر استاتیک جایگزین کنید. در مثال فعلی، می‌توانید این کار را فقط با آپدیت محتویات فایل highlights.blade.php خود انجام دهید.
طبق انتظاری که داریم بارگذاری مقادیر استاتیک انجام می پذیرد، ولی فراخوانی API در پس زمینه اجرا می‌شود (در View Composer)
بنابراین، برای قطع کردن و عدم استفاده از “highlights” یا بایستی کد را از ویوهای مختلف حذف ‌کنیم یا باید نام را در ویو خود تغییر دهیم یا Service Provider را برای متوقف کردن فراخوانی API از ViewComposer ویرایش کنیم.

استفاده از View Components در لاراول

این روش، در واقع استفاده مجدد از یک 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 directive جدید برای رندر کردن view components

همانطور که ما از وابستگی در کلاس بالا استفاده می‌کنیم، استفاده از IOC برای resolve کردن این وابستگی‌ها برای ما مناسب خواهد بود.

<?php

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

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

// home.blade.php

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

در لاراول wrapping up

با استفاده از این روش، می‌توانیم با استفاده از داده‌های پویا در هر View در نرم افزار خود، از کامپوننت‌های پیچیده استفاده کنیم. نکت مهم اینست که کامپوننت ها تنها در صورتی اجرا می‌شوند که از طریق دستورالعمل render() blade directive@ به نرم افزار اضافه شده باشند.
 

 بهترین روش استفاده از کدهای تکراری و قابل استفاده مجدد در ویوهای مختلف در فریم ورک لاراول، استفاده از view components است.

 

لاراول
فقط
خوش آمدید!
ایجاد حساب کاربری