ویوها

مجتبی پاکزاد لاراول 5.6.29 در حال تکمیل رایگان

ساخت ویوها

دنبال اطلاعات بیشتری درباره نحوه نوشتن تمپلت‌های blade هستید؟ برای شروع داکیومنت blade را مطالعه کنید.

ویوها حاوی کدهای HTML هستند که توسط اپلیکیشن استفاده می‌شوند و لاجیک اپلیکیشن / کنترلر را از لاجیک لایه نمایش جدا می‌کنند. ویوها در دایرکتوری resources/views قرار می‌گیرند. یک ویو ساده می‌تواند شبیه مثال زیر باشد:

<!-- View stored in resources/views/greeting.blade.php -->

<html>
    <body>
        <h1>Hello, {{ $name }}</h1>
    </body>
</html>

از آنجایی که این ویو در resources/views/greeting.blade.php ذخیره شده است، با استفاده از هلپر گلوبال view می‌توانیم آن را به شکل زیر برگردانیم:

Route::get('/', function () {
    return view('greeting', ['name' => 'James']);
});

همانطور که می‌بینید، اولین آرگومان ارسال شده به هلپر view با نام فایل ویو در دایرکتوری resources/views متناظر است. آرگومان دوم، یک آرایه از داده‌هایی است که باید برای ویو مورد نظر در دسترس شوند. در این مثال، ما متغییر name را ارسال کرده‌ایم که در با استفاده از سینتکس Blade، در ویو قابل نمایش است.

البته، علاوه بر این، ویوها می‌توانند با ساختاری تودرتو، در ساب‌دایرکتوری‌هایی در دایرکتوری resources/views قرار بگیرند. برای ارجاع به ویوهای تودرتو، می‌توان از علامت "نقطه" استفاده کرد. برای مثال، اگر ویو شما در resources/views/admin/profile.blade.php ذخیره شده باشد، می‌توانید به شکل زیر به آن ارجاع کنید:

return view('admin.profile', $data);

مشخص کردن وجود یک ویو

اگر می‌خواهید مشخص کنید که آیا یک ویو وجود دارد، می‌توانید از فساد View استفاده کنید. اگر ویو وجود داشته باشد، متد exists مقدار true را برمی‌گرداند.

use Illuminate\Support\Facades\View;

if (View::exists('emails.customer')) {
    //
}

ساخت اولین ویوی در دسترس

با استفاده از متد first، می‌توانید از بین ویوهای مشخص شده در یک آرایه، اولین ویو را ایجاد کنید. هنگامی که اپلیکیشن یا پکیج شما، امکان سفارشی‌سازی یا بازنویسی ویوها را ارائه می‌دهد، این مورد بسیار کاربردی است:

return view()->first(['custom.admin', 'admin'], $data);

البته، این مورد را با فساد View نیز می‌تونید فراخوانی کنید:

use Illuminate\Support\Facades\View;

return View::first(['custom.admin', 'admin'], $data);

ارسال داده به ویو

همانطور که در مثال قبل دیدید، می‌توانید آرایه‌ای از داده‌ها را به ویوها ارسال کنید:

return view('greetings', ['name' => 'Victoria']);

هنگامی که اطلاعات را با این شیوه ارسال می‌کنید، داده باید به شکل آرایه‌ای با کلید و مقدار باشد. داخل ویو، با استفاده از کلید متناظر، می‌توانید به هر کدام از این مقادیر دسترسی داشته باشید، برای مثال <?php echo $key; ?>. به عنوان یک روش جایگزین برای ارسال یک آرایه کامل حاوی داده‌ها به هلپرفانکشن view، می‌توانید از متد with استفاده کنید تا تکه‌های داده را به صورت جداگانه به ویو اضافه کنید:

return view('greeting')->with('name', 'Victoria');

اشتراک‌گذاری داده‌ها برای تمام ویوها

گاهی ممکن است نیاز به اشتراک‌گذاری بخشی از داده‌ها را با تمام ویوهایی که توسط اپلیکیشن‌تان رندر می‌شوند، به اشتراک بگذارید. همچنین، با استفاده از متد share فساد Viewمی‌توانید این‌کار را انجام دهید. به طور معمول، share را باید داخل متد boot یکی از سرویس‌پروایدرها قرار دهید. اجباری وجود ندارد که این فراخوانی را در AppServiceProvider انجام دهید یا یک سرویس‌پروایدر جداگانه برای میزبانی این کد فراخوانی بسازید.

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('key', 'value');
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

ویو کامپوزرها (View Composers)

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

بیایید برای این مثال ویو کامپوزر را داخل یک سرویس‌پرووایدر رجیستر کنیم. فساد View متدهای اینترفیس Illuminate\Contracts\View\Factory را پیاده‌سازی می‌کند، پس با استفاده از این فساد می‌توانید به متدهای نهفته در این کانترکت (contract) دسترسی داشته باشید. به یاد داشته باشید، لاراول هیچ دایرکتوری پیش‌فرضی را برای ویو کامپوزرها در نظر نگرفته است. هر طوری که مایل باشید، برای سازماندهی آن‌ها آزاد هستید. برای مثال، می‌توانید دایرکتوری با نام app/Http/ViewComposers برای آن‌ها بسازید.

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        View::composer(
            'profile', 'App\Http\ViewComposers\ProfileComposer'
        );

        // Using Closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

به یاد داشته باشید، اگر سرویس‌پرووایدر جدیدی برای رجیستر کردن ویو کامپوزرتان ساخته‌اید، باید سرویس پرووایدر مورد نظرتان را در آرایه providers که در فایل کانفیگ config/app.php قرار دارد، اضافه کند.

حالا که کامپوزر موردنظرمان را رجیستر کردیم، هر بار که ویو profile رندر شود، متد ProfileComposer@compose اجرا خواهد شد. بنابراین، بیایید کلاس کامپوزر را تعریف کنیم:

<?php

namespace App\Http\ViewComposers;

use Illuminate\View\View;
use App\Repositories\UserRepository;

class ProfileComposer
{
    /**
     * The user repository implementation.
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * Create a new profile composer.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        // Dependencies automatically resolved by service container...
        $this->users = $users;
    }

    /**
     * Bind data to the view.
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('count', $this->users->count());
    }
}

درست قبل از اینکه ویو رندر شود، متد compose کامپوزر با نمونه Illuminate\View\View فراخوانی می‌شود. برای افزودن داده‌ها به ویو، می‌توانید از متد with استفاده کنید.

تمامی ویو کامپوزرها به وسیله سرویس‌کانتینر resolve می‌شوند، بنابراین هر وابستگی را که نیاز دارید، می‌توانید در constructor کامپوزر type-hint کنید.

اَتَچ کردن یک کامپوزر به چند ویو

با ارسال آرایه‌ای حاوی ویوها به آرگومان اول متد composer می‌توانید همزمان یک ویو کامپوزر را به چند ویو اَتَچ (attach) کنید:

View::composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);

متد composer یک کاراکتر را نیز به عنوان یک وایلدکارد * می‌پذیرد که به شما امکان اَتَچ کردن یک کامپوزر به همه ویوها را می‌دهد:

View::composer('*', function ($view) {
    //
});

ویو کریتورها (View Creators)

ویو کریتورها، خیلی شبیه ویو کامپوزرها هستند؛ گرچه، به جای اینکه تقریبا تا زمان رندر ویو صبر کنند، بلافاصله بعد اینکه نمونه‌سازی ویو انجام شود، اجرا می‌شوند. برای رجیستر کردن یک ویو کریتور، از متد creator استفاده کنید:

View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
منبع
Views