[Bài đọc] Một số cú pháp khác trong Blade
NỘI DUNG BÀI VIẾT
Chú thích
Blade cũng cho phép bạn tạo chú thích trong view. Tuy nhiên, không như chú thích của HTML, các chú thích của Blade không đi kèm trong nội dung HTML được trả về:
{{-- This comment will not be present in the rendered HTML --}}
PHP
Trong một số trường hợp, bạn cần nhúng mã PHP vào trong view. Bạn có thể sử dụng directive @php để thực thi một khối mã PHP thuần trong template:
@php // @endphp
Lưu ý: Blade cung cấp cách để nhúng một mã PHP vào trong view, tuy nhiên việc sử dụng nó thường xuyên cho thấy bạn có quá nhiều mã nguồn xử lý trong template, điều đó không tốt, hãy xem xét lại.
#Including Sub-Views
Directive @include cho phép bạn chèn một view Blade vào trong một view khác. Tất cả các biến trong view cha đều được sử dụng trong view chèn thêm:
<div> @include('shared.errors') <form> <!-- Form Contents --> </form> </div>
Mặc dù các view được chèn thêm sẽ được sử dụng tất cả các biến trong view cha, tuy nhiên bạn cũng có thể truyền thêm một mảng dữ liệu vào view đó:
@include('view.name', ['some' => 'data'])
Tất nhiên, nếu bạn @include một view mà không tồn tại, Laravel sẽ ném ra lỗi. Nếu bạn không muốn include một view mà có thể không tồn tại, bạn có thể sử dụng directive @includeIf:
@includeIf('view.name', ['some' => 'data'])
Lưu ý: Bạn nên tránh sử dụng hằng __DIR và __FILE trong view vì chúng sẽ tham chiếu tới vị trí file trong bộ nhớ, view được biên dịch lại.
Rendering Views For Collections
Bạn có thể kết hợp việc lặp và chèn thêm view bằng cách sử dụng directive @each:
@each('view.name', $jobs, 'job')
Tham số thứ nhất là view để đưa vào mỗi phần tử trong mảng hay collection. Tham số thứ hai là một mảng hay collection mà bạn muốn lặp. Tham số thứ ba là tên biến được gán vào mỗi vòng lặp trong view. Ví dụ, bạn muốn lặp một mảng tên là jobs, bạn cần truy xuất vào mỗi job thông qua biến job bên trong view.
Bạn cũng có thể truyền vào directive một tham số thứ tư, tham số này sẽ chỉ định view được đưa ra nếu mảng đưa vào là rỗng.
@each('view.name', $jobs, 'job', 'view.empty')
Stacks
Blade cho phép bạn đẩy các đoạn script vào một stack, các stack này có thể được đưa vào một vị trí nào đó trong view hoặc layout.
@push('scripts') <script src="/example.js"></script> @endpush
Bạn có thể dùng đoạn mã trên nhiều lần và mỗi lần như vậy nó sẽ đẩy vào directive @stack trong layout:
<head> <!-- Head Contents --> @stack('scripts') </head>
Service Injection
Directive @inject được sử dụng để lấy một service từ Laravel service container. Trong @inject tham số thứ nhất là tên biến service, tham số thứ hai là lớp hoặc interface của service mà bạn muốn lấy:
@inject('metrics', 'App\Services\MetricsService') <div> Monthly Revenue: {{ $metrics->monthlyRevenue() }}. </div>
Extending Blade
Blade cho phép bạn tạo mới một directive bằng cách sử dụng phương thức directive. Khi trình biên dịch gặp directive do người dùng tự tạo nó sẽ gọi callback được cung cấp với những tham số tương ứng:
Ví dụ dưới đây tạo một directive @datetime($var) để thực hiện định dạng biến $var là đối tượng của Datetime:
<?php namespace App\Providers; use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Perform post-registration booting of services. * * @return void */ public function boot() { Blade::directive('datetime', function ($expression) { return "<?php echo ($expression)->format('m/d/Y H:i'); ?>"; }); } /** * Register bindings in the container. * * @return void */ public function register() { // } }
Như bạn thấy, chúng tôi sẽ nối phương thức format vào bất bất kỳ biểu thức nào được đưa vào directive.Vì vậy trong ví dụ trên, mã php được tạo ra bởi directive sẽ là:
<?php echo ($var)->format('m/d/Y H:i'); ?>
Lưu ý: Sau khi cập nhật mã lệnh của một directive Blade, bạn cần xóa hết tất cả các view blade trong bộ nhớ bằng cách sử dụng lệnh artisan view:clear
Leave a Reply