Tìm hiểu kiến trúc của Laravel – Phần 3. Service Provider.

Trong bài trước của series “Tìm hiểu kiến trúc của Laravel” mình đã giới thiệu về Service Container cùng với hai khái niệm bind và resolve, hôm nay trong bài viết này mình sẽ giới thiệu tiếp về Service Provider, nơi được coi là trái tim của Laravel.

Service providers are the central place of all Laravel application bootstrapping. Your own application, as well as all of Laravel’s core services are bootstrapped via service providers .

—- laravel.com —-

Nhìn chung thì Service Container trong Laravel là nơi quản lý class dependency và thực hiện dependency injection. Bạn chỉ cần bind một Class, Interface hay một từ khoá bất kỳ với Service Container là có thể resolve chúng ra ở bất cứ nơi đâu.

— – laravel beauty — –

Hai câu quotes mình lấy ở 2 tài liệu tham khảo là document của Laravel và bài viết về Service Provider trong series Laravel Beauty cho chúng ta thấy được cái nhìn cơ  bản về các công việc được Service Provider thực hiện. Đó là thực hiện việc “boostrapping” các boostrapper. Các boostrapper thì bao gồm việc registering service container bindings, các event listener, các middlewares và kể cả các routes. Mình sẽ chỉ tập trung đến việc thực hiện registering service container bindings.

Làm thế nào để viết một Services Provider?

Screenshot at Feb 05 14-25-36

Mình sẽ sử dụng tiếp ví dụ về binding class Computer trong bài viết tiếp cho trực quan. Đầu tiên, tất cả chúng ta tạo một Service Provider bằng lệnh artisan như sau :

php artisan make:provider ComputerProvider

laravel-service-providers

Khi đó ta sẽ có một Provider như hình trên với hai method là register và boot :

  • register() method: Trong phương thức register(), bạn chỉ nên thực hiện việc binding class vào service container. Bạn không bao giờ nên khai báo hay đăng ký bất cứ các event listeners, routes, hoặc các chức năng nào khác trong phương thức này.
  • boot() method: Method này sẽ được gọi sau khi tất cả các service provider đã được đăng ký xong, điều này có nghĩa là bạn có thể gọi đến tất cả các service provider khác đã được đăng ký với framework.

Trở lại với ví dụ, mình sẽ triển khai việc binding với đoạn code như sau :

laravel-service-providers-register-method

Hướng dẫn sử dụng của Services Provider.

Sau khi đã triển khai binding trong ComputerProvider, để hoàn toàn có thể thực thi việc resolve ta cần khai báo Provider này với framework và triển khai điều đó trong file config / app.php .Đây chính là nơi mở màn của việc registering service container bindings. Tuy nhiên thay vì luôn phải sử dụng app ( ) -> bind ( ), app ( ) -> instance ( ) … ( đã được triển khai trong method register ( ) trong Provider ) thì ở phần khai báo bindings trong file config / app.php này ta lại truyền vào tên những class provider. Mà những class đó thường được đặt tên dưới dạng là SomethingServiceProvider .

Ngoài ra, chắc bạn cũng đã từng để ý là thường thì ở các package Laravel mà các bạn vẫn hay dùng, như Laravel Debugbar, Laravel Markdown, Laravel IDE Helper …, khi cài đặt, các package đó đều yêu cầu các bạn add class ServiceProvider của chúng vào phần providers trong config/app.php. Hay nói các khác, các third-party package cho Laravel cũng thường xuyên cung cấp Service Provider để quá trình cài đặt và sử dụng được dễ dàng.

— – Laravel Beauty — –

laravel-service-providers-app-config

Đây là file config/app.php với biến provider khai báo tất cả các Service Provider mà framework cần. Nhìn chúng ta có thể thấy được ngoài các Provider có sẵn,  mình đã khai báo thêm ComputerProvider vừa viết, Debugbar\ServiceProvider khi mình cài thêm và một package ServiceProvider mà mình tự viết.

Sau khi đã khai báo như vậy, tất cả chúng ta hoàn toàn có thể thực thi resolve được class Computer ở bất kỳ đâu .

laravel-service-providers

laravel-service-providers-resolving

laravel-service-providers-resolving-result

Lời kết.

Hi vọng qua phần trình bày của mình về Service Provider, các bạn đã có được cái nhìn cơ bản nhất về Service Provider và cách sử dụng chúng trong ứng dụng Laravel của mình. Cám ơn các bạn đã đón đọc bài viết này và hãy đón đọc các bài viết khác trong series “Tìm hiểu về kiến trúc của Laravel” nhé.

Tài liệu tham khảo.

Series bài viết về kiến trúc Laravel.

Chia sẻ: