فرض کنید بخواهید یک سایت چند کاربره با لاراول طراحی کنید. و یکی از امکاناتی که لازم داره اینه که براساس قوانینی که ما تعریف می کنیم, هر کلاینت بتونه قالب و تم مخصوص خودش رو مشاهده کنه. بصورت پیش فرض چند خط کد css کافیست, اما برخی از کلاینت ها, قالب کاملا متفاوت می خواهند.
طبیعتا بارگذاری stylesheet متفاوت برای هر کلاینت کار بیهوده ایست, اما برای استفاده از یک view کاملا متفاوت به ازای هر قالب, شما میتونید یک کد رو بارها در بخش های مختلف اپلیکیشن استفاده کنید.
namespace App\Http\Controllers;
use App\Client;
class HomeController
{
public function __invoke(Client $client)
{
return view("themes.{$client->theme->name}.home", [
'client' => $client,
]);
}
}
بیایید فرض کنیم ما با یک قالب به نام spatie سر و کله میزنیم. view ما به صورت در میاد :
@extends('themes.spatie.layouts.app')
@section('main')
Welcome to {{ $client->name }}'s site!
@include('themes.spatie.partials.introduction') @endsection
چیزهایی که من اینجا دوست ندارم. اولیش ارسال client->theme->name$ به هر اسم view هست که باعث میشه بسرعت کسل کننده بشه. مشکل زیادی اینجا وجود نداره, اما در مجموع به نظر میرسه باید بهتر عمل کنیم, اما من می خواهم اینجا بیشتر در مورد vendor namespace ها صحبت کنم.
لاراول به شما اجازه میده یک view vendor namespace ثبت کنید که به یک مسیر مشخص شامل فایل های blade اشاره میکنه. این قابلیت برای توسعه ی پکیج ها در نظر گرفته شده, اما یک راه حل مناسب برای مشکل ماست.
با ثبت یک namespace با مکان قالب فعلی, ما میتونیم تمام قسمت های داینامیک اسامی view ها رو وقتی اونها رو صدا میزنیم, رها کنیم.
class HomeController
{
public function __invoke(Client $client)
{
return view('theme::home', [
'client' => $client,
]);
}
}
و برای view هم :
@extends('theme::layouts.app')
@section('main')
Welcome to {{ $client->name }}'s site!
@include('theme::partials.introduction') @endsection
ثبت یک vendor namespace بسیار سادست. یک service provider بسازید و در متد boot کافیه loadViewsForm رو صدا بزنید. همچنین ما باید مسیری که شامل view هاست و یک اسم برای vendor خودمون رو پاس بدیم.
namespace App\Providers;
use App\Client;
class ThemeServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot(Client $client)
{
$views = resources_path(
"views/themes/{$client->theme->name}"
);
$this->loadViewsFrom($views, 'theme');
}
}
به همین سادگی, حالا کافیه که از میانبر کوتاه ::theme استفاده کنیم. در این روش نیازی به نگرانی درباره ی جزئیات پیاده سازی قالب هامون نداریم.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید