View Trong Laravel 8

View đóng vai trò giao tiếp giữa ứng dụng PHP và người dùng cuối vì vậy nó luôn có vai trò cực kỳ quan trọng. Chính vì vậy trong mô hình MVC của Laravel chúng ta sẽ tìm hiểu View trước. Bài viết này sẽ hướng dẫn các bạn cách tạo View trong Laravel 8 thế nào cho chuẩn. Cùng đón xem nhé!

1. Tạo view trong Laravel 8

Mặc định trong Laravel 8 các view sẽ được đặt trong thư mục resources/views. Nếu như bạn muốn thay đổi thư mục bạn có thể vào config/view.php thay đổi lại giá trị của paths.

View hỗ trợ file có đuôi là .html, .php, .css , .blade.php. Nếu trong thư mục có cùng các view trùng tên thì laravel sẽ ưu tiên theo thứ tự như sau: .blade.php , .php, .css, .html.

Ví Dụ: Mình sẽ tạo view có tên là home.html với nội dung như sau:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Hoc.TV</title>
</head>
<body>
<h2>Xin chào 500 ae!</h2>
</body>
</html>

2. Render view trong Laravel.

Để render view trong Laravel 8 các bạn có thể sử dụng hàm view() hoặc View::make() với cú pháp sau:

view($view, $data);

// hoặc
use \Illuminate\Support\Facades\View;
View::make($view, $data);

Trong đó:

  • $view là path (đường dẫn) đến view (tính từ thư mục views).
  • $data là mảng data bạn muốn truyền vào trong view. Tham số này có thể bỏ trống.

Ví Dụ 1: Mình sẽ render view home.html trong ví dụ trên.\

Mở file routes/web.php  thêm code 

Route::get('/', function () {
    return view('home');
})->name('home');

Kết quả khi truy cập http://localhost:8000/ ta nhận được kết quả sau

Ví Dụ 2 : Mình sẽ tạo một view và truyền data vào trong.

Tạo file home.php theo đường dẫn vừa nãy resources/views/ và thêm vào đoạn code sau

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title><?=$title?></title>
</head>
<body>
<h2><?=$body?></h2>
</body>
</html>

Vửa lại file routes/web.php.

Route::get('/', function () {
    return view('home', ['title' => 'hoc.tv', 'body' => 'Học học nữa, học mãi']);
})->name('home');

Xem lại kết quả:

Và đây là kết quả dưới dạng viewsource cho mọi người dễ hình dung:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>hoc.tv</title>
</head>
<body>
<h2>Học học nữa, học mãi</h2>
</body>
</html>

Nếu trong trường hợp view của bạn nằm trong một thư mục con trong resources/views thì bạn có thể sử dụng dấu chấm (.) để đại diện cho kí tự /.

VD: Với file view resources/views/home/index.php thì render sẽ như sau:


Route::get('/', function () {
    return view('home.index', ['title' => 'hoc.tv', 'body' => 'Học nữa học mãi']);
})->name('home');

3. View first trong Laravel.

Trong một số trường hợp bạn muốn render ra view tồn tại đầu tiên trong danh sách view thì bạn có thể sử dụng phương thức first trong View object với cú pháp như sau:

use Illuminate\Support\Facades\View;

View::first($views, $data);

Trong đó:

  • $views là đường dẫn đến view (tính từ thư mục views).
  • $data là mảng data bạn muốn truyền vào trong view, tham số này có thể bỏ trống.

VD:

use Illuminate\Support\Facades\View;

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

4. Kiểm tra view tồn tại trong Laravel.

Để kiểm tra xem một view có tồn tại hay không các bạn sử dụng phương thức exists với cú pháp như sau:

use Illuminate\Support\Facades\View;

View::exists($view):

Trong đó: $view là đường dẫn đến view bạn muốn check.

Ví Dụ: Kiểm tra xem thư mục views có view nào tên home không.

use Illuminate\Support\Facades\View;

if (View::exists('home')) {
   // tồn tại
}

5. Truyền data cho tất cả view.

Trong laravel 8 để truyền view cho tất cả các view các bạn có thể sử dụng phương thức share trong View object. Để cho ứng dụng được hoạt động tốt và chính xác nhất bạn nên đưa view share vào trong provider.

VD: mình sẽ share data có name là siteTitle cho tất cả các view trong Laravel.

- file Providers/AppServiceProvider.php.

<?php

namespace App\Providers;

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

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('siteTitle', 'hoc.tv');
    }
}

Lúc này trong các view các bạn có thể sử dụng biến $siteTitle.

6. View composer.

View composer là một class (lớp) hoặc một callback nó sẽ được gọi khi view render. Nếu bạn muốn đưa data vào view khi render thì View composer cũng là một giải pháp dành cho bạn.

Trong một số trường hợp nhiều view cần dùng chung một đoạn logic (nhưng không phải tất cả) và truyền vào view thì bạn nên sử dụng view composer cho code đỡ bị lặp lại.

Bạn cần đăng kí view composer vào trong provider để cho Laravel biết. Và Laravel có cung cấp cho chúng ta có hai cách để khai báo view composer đó là dùng closure hoặc là class

Đối với view composer dùng closure thì bạn chỉ việc khai báo theo cú pháp sau:

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

Trong đó: $view là view bạn muốn tác động. Nếu bạn muốn tác động đến nhiều view bạn có thể truyền vào một mảng và nếu bạn muốn tác động hết thì chỉ cần khai báo $view = '*'.

VD: Mình sẽ thêm $title vào trong view home. Sử dụng view composer.

View::composer('home', function ($view) {
    $view->with('title', 'hoc.tv');
});

Đối với view composer class, các bạn sử dụng cú pháp sau:

View::composer($views, $className);

Trong đó

  • $view thì tương tự như đối với view composer closure. 
  • $className là tên của class chưa logic composer. Class composer này bắt buộc phải có method compose có visibility là public và nhận tham số truyền vào là một View object.

Ví Dụ: Tương tự ví dụ trên nhưng sử dụng view composer class.

file app/Http/View/Composers/SiteNameComposer.php.

<?php

namespace App\Http\View\Composers;

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

class SiteNameComposer
{
    /**
     * The user repository implementation.
     *
     * @var \App\Repositories\UserRepository
     */
    protected $users;

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

    /**
     * Bind data to the view.
     *
     * @param  \Illuminate\View\View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('title', 'hoc.tv');
    }
}

Khai báo trong provider.

use App\Http\View\Composers\SiteNameComposer;

View::composer('home', SiteNameComposer::class);

7. Kết lại

Bài này chúng ta chỉ học các cách truyền dữ liệu vào view trong Laravel 8 mà thôi. Bài tiếp theo mình sẽ giới thiệu với mọi người về blade trong Laravel 8 các bạn đón chờ nhé. Cảm ơn các bạn đã theo dõi.

Bình luận