Views

Tạo Views

Views chứa nội dung HTML phục vụ cho ứng dụng của bạn và tách riêng ra controller / ứng dụng. Views chứa tại thư mục resources/views. Ví dụ đơn giản của view nhìn giống như sau:

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

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

Nội dung view này lưu tại resources/views/greeting.blade.php, chúng ta sẽ trả dữ liệu về hàm view như sau:

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

Như bạn có thể thấy, tham số đầu tiên của hàm view tương ứng với tên tệp tin trong thư mục resources/views. Tham số thứ hai là một mảng dữ liệu cần dùng cho view. Trong trường hợp này, chúng ta truyền biến name, khi nó hiển thị ở view, sử dụng cú pháp Blade syntax.

Tất nhiên, các view có thể nằm trong thư mục con của thư mục resources/views. "Dấu chấm" sẽ ngăn cách các thư mục con. Ví dụ, Nếu view của bạn lưu trong thư mục resources/views/admin/profile.blade.php, thì khi đó nó sẽ như sau:

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

Kiểm tra tồn tại view

Nếu bạn cần kiểm tra view có tồn tại hay không, bạn có thể dùng View facade. Phương thức exists sẽ trả về true nếu view tồn tại:

use Illuminate\Support\Facades\View;

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

Truyền dữ liệu vào view

Như bạn nhìn thấy ở ví dụ trước, bạn có thể truyền một mảng của dữ liệu vào view:

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

Khi bạn truyền dữ liệu theo cách này, $datanên là một cặp key/value. Bên trong view, bạn có thể lấy giá trị bằng cách sử dụng key, như <?php echo $key; ?>. Bạn cũng có thể để truyền dữ liệu vào view view, bạn có thể dùng phương thức with như bên dưới:

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

Chia sẻ dữ liệu cho tất cả views

Thỉnh thoảng, bạn cần chia sẻ một phẩn dữ liệu với tất cả các views trong ứng dụng của bạn. Bạn có thể sử dụng phương thức share của facade. Thông thương, bạn chỉ cần họi phương thức sharetrong phương thức boot của service provider. Bạn có thể thoải mái thêm vào trong AppServiceProvider hoặc tự tạo ra một service provider khác:

<?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 composers là callbacks hoặc class phương thức nó được gọi khi một view được render. Nếu bạn có dữ liệu và bạn muốn ràng buộc chúng với một view tại thời điểm view được render, một view composer có thể giúp bạn tổ chức các logic bên trongview đó.

Đối với ví dụ bên dưới, chúng ta đăng ký một view composers trong service provider. Chúng ta sẽ sử dụng View facade để truy cập vào thể hiện Illuminate\Contracts\View\Factory. Ghi nhớ, Laravel không có thư mục mặc định cho view composers. Chúng ta có thể tự do tổ chức theo ý chúng ta muốn. Ví dụ, bạn có thể tạo một thư mục 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()
    {
        //
    }
}

Chú ý, nếu bạn tạo mới một service provider chứa những view composer, bạn sẽ cần phải thêm service provider vào trong mảng providers trong file cấu hình config/app.php.

Bây giờ bạn đã đăng ký với composer, phương thức ProfileComposer@compose sẽ thực thi mỗi lần profile view được render. Vì vậy, Hãy định nghĩa một class 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());
    }
}

Trước khi view được render, phương thức compose của composer được gọi với thể hiện Illuminate\View\View. Bạn có thể sử dụng phương thức with để ràng buộc dữ liệu vào view.

Tất cả view composers được xử lý qua service container, vì vậy bạn có thể type-hint bất cứ dependencies bạn cần vào hàm constructor của composer.

Đính kèm Composer vào nhiều views

Bạn có thể gán một view composer vào nhiều views bằng cách truyền một mảng của các view như là tham số thứ nhất của phương thức composer:

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

Phương thức composer ngoài ra còn chấp nhận ký tự * như một ký tự đại diện, cho phép bạn gán một composer vào tất cả các views:

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

View Creators

View creators rất giống với view composer; tuy nhiên, chúng sẽ tác động trực tiếp vào các view thay vì chờ các view cho tới khi chúng được render. Để đăng ký một view creator, sử dụng phương thức creator:

View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
Nguồn: https://laravel.com/docs/5.3/views