Custom Blade Directive Laravel
Bài đăng này đã không được cập nhật trong 4 năm
Chào các bạn hôm nay mình sẽ giới thiệu đến các bạn cách làm như thế nào để tạo ra các directive riêng của mình giống như các directives có sẵn của Laravel như @section
, @iyeld
, @foreach
.
Giới thiệu custom blade directive
Để define một custome blade template chúng ta sẽ sử dụng Blade:: và đặt nó trong phương thức boot()
của file AppServiceProvider
như sau:
Blade::directive('directive_name', function ($expression) {
return $expression;
});
Ví dụ, mình sẽ define một directive là @hello
trong file AppServiceProvider
như thế này:
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()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Blade::directive('hello', function ($expression) {
return "<?php echo 'Hi '. {$expression} .','; ?>";
});
}
}
Sau đó trong file view bạn chỉ cần gọi như sau:
@hello('ABC')
Thử ngay trên browser chúng ta sẽ có được kết quả như sau:
Hướng dẫn defining một custom blade directive
Tuy nhiên ở phần trên chỉ là một ví dụ hết sức đơn giản, bây giờ chúng ta sẽ tạo một directive thực sự để sử dụng
Tạo một Service Provider
Như ví dụ trên chúng ta đã define một directive bên trong AppServiceProvider điều đó vẫn ổn nó vẫn có thể hoạt động, nhưng mình khuyên các bạn nên tạo ra một service provider riêng để dễ dàng quản lý cho các custom blade directive của bạn, cụ thể mình sẽ tạo riêng một service provider BladeServiceProvider
như bằng cách này:
php artisan make:provider BladeServiceProvider
câu lệnh trên sẽ tạo ra một file là BladeServiceProvider.php
trong thư mục app/Providers
từ nay chúng ta sẽ add custom blade logic vào file này. Tiếp theo chúng ta sẽ tiền hành regist service provider này vào trong vào trong providers
array bên trong file config/app.php
như sau:
providers' => [
...
App\Providers\BladeServiceProvider::class,
]
Sử dụng Service Provider
Bây giờ chúng ta sẽ làm một ví dụ nho nhỏ để sử dụng BladeServiceProvider
như sau: Chúng ta sẽ chỉ hiển thị button xóa với điều kiện nếu giá trị id từ url khác với giá trị mà chúng ta đã thiết lập. Chúng ta sẽ add code xử lý việc hiển thị button xóa vào file BladeServiceProvider
trong method boot()
như sau:
public function boot()
{
Blade::directive('check_id', function ($expression) {
return "<?php if(request()->get('id') != {$expression}) : ?>";
});
Blade::directive('endcheck_id', function ($expression) {
return "<?php endif; ?>";
});
}
Sang bên ngoài view các bạn chỉ cần gọi như sau:
@check_id(10)
<a class="btn btn-danger">
<i class="fas fa-trash"></i>
Delete
</a>
@endcheck_id
Chạy thử kết quá chúng ta sẽ được như hình dưới đây:
Trường hợp nếu bị lỗi hoặc view không update được thì các bạn sẽ làm như sau:
php artisan view:clear
Kết Luận
Trên đây là mình đã hướng dẫn các bạn làm thế nào để tạo ra các custom blade directive trong laravel, các bạn có thể dễ dàng tạo ra các custom blade directive mà các bạn mong muốn
Tham khảo
https://www.larashout.com/creating-custom-laravel-blade-directive https://codeburst.io/just-in-case-laravel-create-custom-blade-directive-b60a7160949d
All rights reserved