تغییر قالب بر اساس کاربر در لاراول

تغییر قالب بر اساس کاربر در لاراول
13 خرداد 1398, خواندن در 2 دقیقه

فرض کنید بخواهید یک سایت چند کاربره با لاراول طراحی کنید. و یکی از امکاناتی که لازم داره اینه که براساس قوانینی که ما تعریف می کنیم, هر کلاینت بتونه قالب و تم مخصوص خودش رو مشاهده کنه. بصورت پیش فرض چند خط کد 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 استفاده کنیم. در این روش نیازی به نگرانی درباره ی جزئیات پیاده سازی قالب هامون نداریم. 

منبع

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

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

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

آفلاین
user-avatar
امیررضا سیستانه ای @reza.sys
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو