Sau đây là hướng dẫn tạo 1 View Composer đơn giản với Laravel 5
1. Tạo View Composer
- Laravel không có sẵn folder ViewComposer --> Bạn có thể tự tạo: App\Http\ViewComposers
- Tạo class MyTestComposer với nội dung bên dưới
- Code nghiệp vụ trong hàm composer và truyền tham số ra template. Ví dụ: Truyền biến $testVariable ra template như bên dưới.
<?php //file: MyTestComposer.php2. Tạo template để xử lý dữ liệu mà ViewComposer đẩy ra
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
class MyTestComposer {
// protected $param;
/**
* Create a new composer.
* @return void
*/
public function __construct() {
// Dependencies automatically resolved by service container...
}
/**
* Bind data to the view.
*
* @param View $view
* @return void
*/
public function compose(View $view) {
// Code here
$view->with('testVariable', 'Value from MyTest Composer');
}
}
Ở đây tôi tạo template theo đường dẫn sau: (tùy thuộc vào cách quy hoạch project của các bạn) resources/view/frontend/default/myComposer.blade.php
Nội dung template, ví dụ:
MyComposer Content <br />3. Định nghĩa ComposerServiceProvider
{{ $testVariable }} -- Hien thi gia tri bien $testVariable
- Bạn cần tìm hiểu thêm về Provider: http://laravel.com/docs/5.0/providers
- Tạo class ComposerServiceProvider trong thư mục app/Providers với nội dung sau:
- Đoạn code bôi đậm chính là khai báo việc template nào sẽ sử dụng ViewComposer của bạn? Ở đây là template layout chung của website. Bạn cũng có thể nhúng nó vào bất kỳ template nào tùy vào nghiệp vụ của hệ thống (home, news detail, etc ... )
Ví dụ:
View::composer(['frontend.home', 'frontend.newsDetail'], 'App\Http\ViewComposers\MyTestComposer');
<?php // file: ComposerServiceProvider.php4.Sau khi định nghĩa ComposerServiceProvider bạn cần khai báo vào mảng providers để hệ thống thực thi.
namespace App\Providers;
use View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider {
/**
* Register bindings in the container.
*
* @return void
*/
public function boot() {
// Using class based composers...
View::composer('frontend.layout', 'App\Http\ViewComposers\MyTestComposer');
// Using Closure based composers...
// View::composer('frontend.layout', function()
// {
// $menu = 'A|B|C';
// $view->with('menus', $menus);
// });
}
/**
* Register
*
* @return void
*/
public function register() {
//
}
}
Sửa file: config/app.php
Thêm đoạn code bôi đậm vào mảng providers. (Tôi rút gọn các đoạn code mặc định)
'providers' => [5. Include template
/*
* Laravel Framework Service Providers...
*/
...... Default Providers
/*
* Application Service Providers...
*/
...... Default Providers
'App\Providers\ComposerServiceProvider'
],
Ở trên tôi khai báo template layout sẽ dùng MyTestComposer. Nghĩa là các tham số tương ứng của MyTestComposer cũng sẽ được truyền ra view tương ứng.
Việc cuối cùng cần làm là include template xử lý các tham số của MyTestComposer này
Mở file: resources/views/frontend/layout.blade.php include như sau
@include('frontend.default.myComposer')6. Done.
Chúc các bạn có những dòng code đẹp và tường minh với Laravel :)
Refer:
- http://laravel.com/docs/5.0/views
- http://laravel.com/docs/5.0/providers
- http://laravel.com/docs/5.0/templates
- http://heera.it/laravel-4-view-composer-master-layout#.VPENkIusV1k
Laravel55555.