Tìm hiểu về View trong Laravel

Laravel

Trong bài này chúng ta sẽ tìm hiểu đến View, một thành phần giữ vai trò quan trọng trong mô hình MVC của Laravel. Nhiệm vụ của View là nhận dữ liệu từ Controller và sau đó dựa vào layout của giao diện nó sẽ xử lý dữ liệu theo yêu cầu.

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:

<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 viewnhư 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 existssẽ 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
{
    public function boot()
    {
        View::share('key', 'value');
    }

    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
{
    public function boot()
    {
        View::composer(
            'profile', 'App\Http\ViewComposers\ProfileComposer'
        );
       
        View::composer('dashboard', function ($view) {
            //
        });
    }

    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
{
    protected $users;
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

    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.

Đí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');

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *