Laravel View Composer

Laravel View Composer cơ bản

Hi các bạn,

Lại là 1 bài về View trong Laravel nhé, hehe. Dạo này biết thêm vài cái khá hay nên chia sẻ cho các bạn tiện thể note lại lun ko mốt quên :))

Bài này sẽ nói về View Composer nè.

1/ Laravel View Composer là gì?

Chúng ta sẽ nói về problem và solution đi nhé. Problem như sau:

  • Trong front-end page của chúng ta, tất nhiên sẽ có những data mà lặp đi lặp lại miết, ví dụ như Categories đi, lúc nào ta cũng fải cần 1 list category để render ra page.
  • Từ đó page nào ở front-end cũng fải get ra cái categories và pass vào view => lặp code
  • => View Composer sinh ra để giúp ta giải quyết điều này.

Với feature Laravel View Composer, ta sẽ pass được những data cần thiết dành cho các views nhất định, tránh lặp code tại các Controller => DRY (Don’t Repeat Yourself).

Laravel 5+ đã có thể xài rùi nhé. Nhỏ hơn mình ko rõ 😀

2/ Define Laravel View Composer

2.1/ Structure

Ta nên biết rõ 1 phần Structure của thằng View Composer này để dễ dàng define hơn, việc ta cần define là:

  • Khởi tạo 1 ServiceProvider để boot những cái View Composer rules
  • Tạo ra Composer class, trong class đó ta sẽ thực hiện lấy data và gán vào View.

2.2/ Tạo ViewServiceProvider

Ta sẽ bỏ nó vào app/Providers nhé, tạo 1 Class với tên ViewServiceProvider, ví dụ:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {

    }
}

Lưu ý: sau khi tạo class này xong, để class này dc startup khi có request, các bạn cần vào “config/app.php” và thêm cái định danh của Class vào cái array providers. Quan trọng nhé.

2.3/ Tạo Composer và gán data vào View

Mình sẽ để View Composer class tại thư mục: app/Libraries/ViewComposers nhé 😀

Composer thực chất cũng chỉ là 1 class bình thường thôi, nhưng fải có phương thức compose và được public, nhận vào 1 biến $view như sau:

<?php

namespace App\Libraries\ViewComposers;

use Illuminate\View\View;
use App\Models\Entities\CategoryEntity;

class CategoryComposer
{
    /**
     * Bind data to the view.
     * Bind data vào view. $view->with('ten_key_se_dung_trong_view', $data);
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    { 
    }
}

Trong class này ta làm gì cũng dc, constructor các bạn thích khởi tạo để làm gì đó cũng dc. Quan trọng là mọi data fải được set trong method compose. Ví dụ mình sẽ lấy toàn bộ category và set vào nè:

<?php

namespace App\Libraries\ViewComposers;

use Illuminate\View\View;
use App\Models\Entities\CategoryEntity;

class CategoryComposer
{
    /**
     * Bind data to the view.
     * Bind data vào view. $view->with('ten_key_se_dung_trong_view', $data);
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        // get all category (for demo purpose)
        $categories = CategoryEntity::all();
		
	// bind to view
        $view->with('categories', $categories);
    }
}

Vậy là xong 😀

2.4/ Khai báo View Composer tại ViewServiceProvider

Okay, bước cuối cùng cũng là bước quan trọng nhất, để ta bind cái Composer của chúng ta với những views cần thiết.

Tại method boot của ViewServiceProvider, ta define như sau:

// single view bind
View::composer(
	'profile', // view name
	'App\Libraries\ViewComposers\CategoryComposer' // composer class name
);

// multiple view bind
View::composer(
	[
		'home',
		'about-us',	
		//... more if you want
	], 
	'App\Libraries\ViewComposers\CategoryComposer' // class name
);

Ta cũng có thể dùng wildcard rule (*) như sau:

// single view bind
View::composer(
	'sethphat.*', // view name - wildcard in sethphat folder
	'App\Libraries\ViewComposers\CategoryComposer' // composer class name
);

// multiple view bind
View::composer(
	[
		'sethphat.*',
		'admin.*',	
		//... more if you want
	], 
	'App\Libraries\ViewComposers\CategoryComposer' // class name
);

Thậm chí cho tất cả views:

// single view bind
View::composer(
	'*', // view name - all views
	'App\Libraries\ViewComposers\CategoryComposer' // composer class name
);

=> Tất cả những views nào mà được bind vào, sẽ xài được những data mà Composer đã set vào. Quá tiện lợi và DRY fải ko nào?

3/ Kết luận về Laravel View Composer cơ bản nè

Đây là một feature mình thấy khá hay mà Laravel View đem lại. Laravel View Composer có thể giúp ích cho các bạn khá là nhiều đó, ví dụ như:

  • Lấy category, menu,… sẵn cho view
  • Lấy ra các config từ db, cache,… sẵn cho view

More information: https://laravel.com/docs/5.8/views#view-composers

Tìm hiểu thêm Laravel features: https://sethphat.com/sp-category/lap-trinh/laravel-5-php

Cám ơn các bạn đã theo dõi!

facebook
google+
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Leave a Reply

Your email address will not be published. Required fields are marked *

Bình luận qua Facebook