Pages

Sunday, November 19, 2017

Laravel: Truyền dữ liệu từ Route -->Controller --> View và dùng chung dữ liệu trên View

Trong bài viết này, giả sử chúng ta có view welcome.blade.php như sau
<!DOCTYPE html>
<html>
<head>
 <title></title>
</head>
<body>
 <h1>Hello, {{ $name }}</h1>
</body>
</html>
Như vậy để truyền dữ liệu ra View (Passing Data To Views) chúng ta có các cách như sau đây để trên view welcome.blade.php có thể sử dụng được được biến $name

Cách 1: Truyền vào 1 mảng

return view('welcome', [
  'name' => 'Chung Nguyễn'
 ]);
Nếu cần truyền thêm dữ liệu thì thêm vào mảng trên bây nhiêu thôi.

Cách 2: Sử dụng with method

return view('welcome')->with('name', 'Chung Nguyễn');
Với việc dùng view helper function, chúng ta hoàn toàn có thể pass data to views 1 cách dễ dàng thông qua phương thức with, cũng giống như ở trên nhưng code chúng ta sẽ trở nên sáng sủa, dễ nhìn hơn phải k nào

Cách 3: Lồng compact

$name = 'Chung Nguyễn';
return view('welcome', compact('name'));
Cách này trong Laravel document không có nhắc tới, mình hay dùng cách này vì số lần gõ phím là ít nhất hehe
Nếu muốn truyền thêm nhiều dữ liệu hơn thì thêm như dưới đây
$name = 'Chung Nguyễn';
$age = 25;
return view('welcome', compact('name', 'age'));

Cách 4: Chia sẻ dữ liệu cho toàn bộ Views

Laravel cung cấp phương thức share chia sẻ dữ liệu cho toàn bộ Views (Sharing Data With All Views) hay nói cách khác là biến toàn cục.
Thông thường, bạn nên đặt share trong method boot của service provider chẳng hạn app/Providers/AppServiceProvider.php hoặc trong __construct function của Controller
<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('name', 'Chung Nguyễn'); // <= Truyền dữ liệu
    }

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

(credit: lượm lặt từ: https://chungnguyen.xyz/posts/truyen-du-lieu-ra-view-trong-laravel)

Ở cách 4 thì dùng view::share tiện hơn rất nhiều, và thấy là workable từ 5.4 trở lên.


1) Giả sử trong Route có

// sẽ gọi /myview trên trình duyệt, đây là request --> gọi tới route --> tới controller
Route::get('/myview', 'MyController@myview');

Route::get('/Time/{t}', 'MyController@Time');

// share giữa route, controller và view
View::share('khoahoc', 'Tiếng Việt');

2) Trong MyController có

 public function Time($t){

    return view('myview', ['time'=> $t]);

    }

3) Trong myview

<p>It is <?php echo $khoahoc;?></p>


Kết quả trên /Time/thamso của trình duyệt khi request vẫn ra

Đây là nội dung từ Controller:44
Đây là nội dung từ Route Tiếng Việt



Tham khảo:

https://laravel.com/docs/5.5/views


4 comments:

  1. vậy echo trong view kia là echo cái biến $khoahoc tạo trong route.

    ReplyDelete
  2. dùng myview.blade.php thì {{}} cho khỏe lol

    ReplyDelete
  3. noted: Khi dùng hàm view::share trong route thì biến trong hàm có thể được truyền tới bất kì view nào.

    vui ghê.

    ReplyDelete
  4. https://laravel.com/docs/5.5/views

    ReplyDelete