1. Mở rộng Blade (Extending Blade) (chưa đọc đến đây)

https://viblo.asia/p/tap-13-blade-template-laravel-1VgZv1dRKAw

Laravel cho phép chúng ta tự định nghĩa các thẻ bằng phương thức directive có trong Blade facade. Việc này đương nhiên chúng ta cũng sẽ code trong boot của AppServiceProvider.

use Illuminate\Support\Facades\Blade;

public function boot()
{
    Blade::directive('print', function($expression) {
        return "<?php echo 'Printed ' . $expression; ?>";
    });
}

Quan sát đoạn code trên, tại method Blade::directive:

  • Tham số thứ nhất là tên thẻ

  • Tham số thứ hai là một Closure object, nó sẽ chứa biến dữ liệu nhận được qua các tham số của thẻ trong blade view. Trong Closure này, ta sẽ return mã PHP được viết dưới dạng chuỗi.

Sau khi đăng ký xong, ta có thể test thẻ @print như sau:

@print('Lê Chí Huy')

Nếu bạn muốn truyền nhiều tham số cho thẻ của mình thì bạn có thể xử lý chuỗi $expression để lấy các giá trị tham số.

Để mình test cho các bạn xem, tại Closure object mình sẽ dump $expression.

use Illuminate\Support\Facades\Blade;

public function boot()
{
    Blade::directive('print', function($expression) {
        dd($expression);
        
        return "<?php echo 'Printed ' . $expression; ?>";
    });
}

Sau đó mình thử gọi @print và truyền nhiều tham số vào nó:

@print('Lê', 'Chí', 'Huy')

Đây là kết quả:

Như các bạn thấy, $expression trả về chuỗi với dạng:

'value1', 'value2', 'value3', ...

Các bạn có thể tùy biến để có thể lấy các giá trị tham số từ $expression.

Lưu ý: Trong khi phát triển ứng dụng, nếu có sử dụng thẻ riêng trong blade view thì sau mỗi lần sửa đổi code xử lý trong mỗi thẻ riêng thì phải chạy lệnh Artisan view:clear để xóa cache và compile lại các view.

Ngoài ra bạn cũng có thể tự tạo cho mình lệnh điều kiện riêng có thể gọi trong blade view bằng method Blade::if được đăng ký tại boot của AppServiceProvider.

use Illuminate\Support\Facades\Blade;

public function boot()
{
    Blade::if('env', function ($environment) {
        return app()->environment($environment);
    });
}

Với Blade::if thì:

  • Tham số thứ nhất là tên lệnh điều kiện,

  • Tham số thứ hai là Closure nhận biến giá trị truyền vào và trả về boolean

Như đăng ký trên, nó sẽ kiểm tra môi trường hiện tại của ứng dụng, nếu trùng khớp thì sẽ trả về true, còn không thì trả về false.

Ta có thể sử dụng trong blade view như sau:

@env('local')
    // The application is in the local environment...
@elseenv('testing')
    // The application is in the testing environment...
@else
    // The application is not in the local or testing environment...
@endenv

Cảm ơn các bạn đã quan tâm theo dõi. Cùng đồng hành với mình qua những tập tiếp theo tại series "Hành trình chinh phục Laravel Framework" nhé! Chúc may mắn và hẹn gặp lại.

Ví dụ đã thực hiện:

C:\xampp\htdocs\blog\app\Providers\AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider {
  /**
   * Register any application services.
   *
   * @return void
   */
  public function register() {
    $this->app->singleton('MyUser', function ($app) {
      return new \App\User;
    });
  }

  /**
   * Bootstrap any application services.
   *
   * @return void
   */
  public function boot() {
    Blade::directive('print', function ($expression) {
      dd($expression);  
      return "<?php echo 'Printed ' . $expression; ?>";
    });
  }
}

C:\xampp\htdocs\blog\resources\views\child.blade.php

@print(Phạm Ngọc Tưởng)

C:\xampp\htdocs\blog\routes\web.php

<?php
Route::get('/', function () {
  return view('pages/login');
});

Last updated