ایجاد view

اصول آموزش Laravel

تاریخ : جمعه 20 بهمن 1396

در یک برنامه لاراول خدمات HTML، توسط صفحات view ارائه می‌شوند؛ بنابراین، به واسطه آن منطق یا کد برنامه که معمولاً در کنترلر برنامه قرار دارد را از لایه نمایشی جدا می‌شود. صفحات view در دایرکتوری resources/views ذخیره می‌شوند. در مثال زیر نمونه‌ای از یک view ساده را مشاهده می‌کنید:

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

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

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

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

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

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

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


تعیین موجود بودن یک view در برنامه

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

use Illuminate\Support\Facades\View;

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


ایجاد اولین view موجود

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

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

فراخوانی این متد توسط facade View هم می‌تواند انجام شود:

use Illuminate\Support\Facades\View;

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


انتقال اطلاعات به view

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

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

هنگام انتقال اطلاعات به این روش، داده‌ها باید به همراه کلید و مقدار در یک آرایه‌ قرار گیرند. در داخل view، می‌توان به هر مقدار با استفاده از کلید مربوط به آن مانند دسترسی داشت. به جای انتقال آرایه‌ای کامل از داده‌ها به تابع کمکی view ، مانند مثال زیر می‌توان از متد with جهت اضافه کردن تکه داده‌ها به صورت جداگانه به view، استفاده کرد:

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


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

گاهی اوقات، لازم است بخشی از داده‌ها را با تمام viewهایی که توسط برنامه ارائه شده‌اند، به اشتراک بگذارید. این کار را می‌توان با استفاده از متد share در facade view انجام داد. معمولاً، فراخوانی‌های متد share را بایستی در متد boot موجود در service provider قرار داد. می‌توانید آن‌ها را به AppServiceProvider اضافه کنید یا یک service provider جداگانه برای آن‌ها بسازید:

<?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

کامپوزرهای view ، توابع callback یا متدهای کلاسی هستند که در هنگام رندر شدن یا نمایش یک view فراخوانی می‌شوند. اگر بخواهید هر زمان که view نمایش داده می‌شود، داده‌ها را به آن انتقال دهید، استفاده از view composer می‌تواند این منطق را در یک مکان واحد برای شما سازماندهی کند.

برای درک بهتر این موضوع، اجازه دهید view composer را در service provider ثبت کنیم. از facade مربوط به View برای دسترسی به زیرمجموعه‌های پیاده سازی قرارداد Illuminate\Contracts\View\Factory استفاده می‌کنیم. باید توجه داشت که لاراول دایرکتوری پیش‌فرض برای view composer ندارد. با این وجود، می‌توانید آن‌ها را سازماندهی کنید. برای مثال، می‌توانید یک دایرکتوری 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()
    {
        //
    }
}
توجه داشته باشید که اگر بخواهید یک service provider جدید برای ثبت view composer خود ایجاد کنید، باید حتما این service provider را به آرایه providers در پیکربندی config/app.php اضافه کنید.

اکنون که composer ثبت شده است، هر زمان که ویو profile نمایش داده می‌شود، متد [email protected] اجرا می‌شود. حال اجازه دهید در مثال زیر، کلاس composer را تعریف کنیم:

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

درست قبل از آنکه view نمایش داده شود، متد composer مربوط به composer با نمونه کلاس Illuminate\View\View فراخوانی می‌شود. می‌توانید با استفاده از متد with داده‌ها را به ویو bind کنید.

تمام view composerها از طریق service container تشخیص داده شده و resolve می‌شوند، بنابراین، می‌توانید هر وابستگی‌ که به آن نیاز دارید را در سازنده composer خود اعلان نوع یا type-hint کنید.


پیوست composer به چندین view

می‌توان با انتقال آرایه‌ای از viewها به عنوان اولین آرگومان به متد composer یک view composer را به چندین view به صورت همزمان پیوست کرد:

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

همچنین، متد composer کاراکتر * را به عنوان یک پارامتر wildcard می‌پذیرد که امکان می‌دهد که یک composer را به تمام viewها پیوست کنید:

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


view creator استفاده از

استفاده از view creatorها بسیار شبیه به view composerها هستند. با این حال، آن‌ها بلافاصله پس از ایجاد view اجرا می‌شوند و اجازه اماده شدن view برای نمایش را نمی‌دهند. برای ثبت یک view creator، می‌توان از متد creator به صورت مثال زیر استفاده کرد:

View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');

منابع مورد مطالعه جهت جمع آوری این مطلب:
https://laravel.com/docs/5.6/views
https://www.lydaweb.com/article/courses/laravel-5-5-tutorial/248/آموزش-لاراول-استفاده-از-view-در-لاراول

نظرات