همه چیز درباره دیرکتیوهای سفارشی در Blade

دیرکتیوهای Blade


دیرکتیوها در Blade تابع هایی هستند که شرط ها و کد های پیچیده رو پنهان می کنند! Blade شامل تعدادی زیادی Directive از پیش ساخته شده است مثل دیرکتیوهای [email protected] یا [email protected] و یا [email protected] که امیدوارم باهشون آشنایی داشته باشید.

برای اکثر پروژه ها همین دیرکتیوهای پیش فرض می تونن کار ما رو راه بیندازن ولی وقتی پروژتون مقیاس بزرگی داره و حرفه ای تر می خواهید عمل کنید حتما به سراغ Directive ها خواهید رفت.

تعریف یک Directive سفارشی در Blade

شما می توانید برای تعریف یک Directive به این صورت عمل کنید:


\Blade::directive('directive_name', function ($expression) {
    return $expression;
});

پارامتر expression$ اختیاری می باشد، وقتی نیاز داریددیرکتیو شماآرگومانی را دریافت کند می توانید به عنوان آرگومان استفاده می شود.


بگذارید با یک مثال ساده Hello World شروع کنم، شاید بگویید ای بابا چرا همش این مثال! ولی خب فقط محض سادگی و روانی، بعد حتما مثال پیچیده تر براتون بیان می کنم.


@hello('World')


اگر ما بخواهیم چنین دیرکتیوی داشته باشیم که مقداری رو بهش بدیم تا بهش سلام برسونه! به این صورت دیرکتیو خودمون رو تعریف می کنیم:

namespace App\Providers;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::directive('hello', function ($expression) {
            return "<?php echo 'Hello ' . {$expression}; ?>";
        });
    }
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}



مقدار expression$ پاس داده شده رو به Hello متصل میکنه و در نهایت همه اینها echo می شوند.

خب! شما اولین دیرکتیو خودتون رو ساختید و می تونید در اون از کدهای خودتون استفاده کنید! ولی directive ها خیلی بیشتر از اینها میتونن کار شما رو راحت تر کنند که با یک مثال کاربردی تر برای ما عزیران شرح می دهم.


مثال پنهان سازی محتوای فروشی

تصور کنید شما در وب سایت خود مثلا ویدئو هایدارید که فقط دوست دارید کاربران ویژه شما که حق عضویت پرداخته اند آن ها رو تماشا کنند، مثل لاراکست


شما می تونید در داخل view های خود از IF ها استفاده کنید ولی خب توجه داشته باشید که وقتی تعداد های شما زیاد میشه چه اتفاقی میفته شما مجبورید برای هر view این کار رو انجام بدهید و logic خودتون رو اونجا تکرار کنید! حالا تصور کنید اسم یک فیلد استفاده شده درif عوض بشه، باید همه اون view ها رو ویرایش کنید!

ولی با استفاده از Directive ها این کار خیلی هم راحته.فقط قبل از نوشتن دیرکتیو ها فکر کنید که چطور از اون ها استفاده خواهید کرد، برای مثال من می خواهیم چنین ساختاری در view داشته باشم .

<div id="app">
<div >

  <div >
     <h2>ویدئوهای کاربران مشترک&<h2>
        @subscribed
            <video src="video_for_paid_users_only.mp4"></video>
        @unsubscribed
            <p>برای تماشای ویدئو ها باید حق اشتراک بپردازید.</p>;
        @endsubscribed
    </div>
  <div >
        <h2>تبلیغات</h2>
        @subscribed

        @unsubscribed
            @foreach ($annoyingAds as $ad)
            	//Ads
                {{-- Sponsorships: more than a hundred annyoing companies --}}
        <div >{!! $ad !!}</div>
            @endforeach
        @endsubscribed


اینجا ما از سه دیرکتیو subscribed @unsubscribed @[email protected] استفاده کردیم که حالا باید باید اون ها مطابق با نیاز های خودمون بنویسیم، دیرکتیو [email protected]بررسی می کند که آیا کاربر ما لاگین کرده و حق اشتراک دارد. دیرکتیو <[email protected] کار <else</span> رو برای دیکتیو قبلی انجام میده. در نهایت دیرکتیو [email protected] هم شرط رو با یک endif می بندد.


خب حالا با این تفاسیر بیایید کد دیرکتیو های خودمون رو ینویسیم.

توجه داشته باشید که ما آنها را در `AppServiceProvider.php `تعریف می کنیم.

<?php
namespace App\Providers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::directive('subscribed', function () {
            $conditon = false;
            // check if the user is authenticated
            if (Auth::check()) {
                // check if the user has a subscription
                $condition = Auth::user()->isSubscribed;
            }
            return<?php if ($condition) { ?>";
        });
        Blade::directive('unsubscribed', function () {
            return <?php } else { ?>";
        });
        Blade::directive('endsubscribed', function () {
            return <?php } ?>";
        });
    }
}


خب به این ترتیب شما اولین دیرکتیو سفارشی خودتون رو نوشتید. حالا با تملم لذت و راحتی از ان تو view ها استفاده کنید.


مواردی که در هنگام نوشتن دیرکتیو ها باید در نظر بگیرید:

هنگام گرفتن خروجی output برای جلوگیری از تزریق کد مخرب از تابع هلپر لاراول ()e استفاده کنید

\Blade::directive('hello', function ($expression) {
    return <?php echo 'Hello ' . e({$expression}); ?>";
});

بعد از هر بار آپدیت کردن منطق Directive های خودتون شما نیاز دارید تا دستور زیر رو برای پاکسازی کش view ها استفاده کنید.

php artisan view:clear