Service provider là gì

Nhưng tôi ko khi nào nói: “Chúng tôi không làm được”. Và cũng ko nói: “Chúng tôi hoàn toàn có thể làm cho được”. Tôi hay đem không còn dũng khí để nói: “Chúng tôi đang làm cho được” với đưa ra quyết định dìm những công việc khó. — Inamori Kazuo


*
Laravel – Service Provider
CHÉM GIÓ VỀ CODE Laravel Framework Tagged Laravel, Laravel Framework, Laravel Service Provider, PHPhường.

# Giới thiệu

Trong bài viết trước, tôi sẽ đề cập đến thành phần mấu chốt Service container hoạt động thế nào. Ngắn gọn gàng thì Service container quản lý các dependency với thực hiện dependency injection (tiêm prúc thuộc). Chúng ta đã bind một class hay một interface vào Service container, tiếp đến bạn cũng có thể resolve sầu bọn chúng ra ở bất kể đâu. Trên thực tiễn vào giai đoạn trở nên tân tiến một ứng dụng cùng với Laravel chúng ta vẫn tiếp tục thực hiện các thao tác này, bởi vì bản chất Laravel cũng bind không hề ít yếu tố vào bên phía trong service container nhắc cả các nguyên tố core. Điều đáng chú ý sinh sống đó là bọn họ sẽ không thấy được hàm bind với resolve sầu trong Laravel. Vậy thì, Laravel thực hiện câu hỏi bind bằng cách nào? ngơi nghỉ đâu? Lúc nào? Câu vấn đáp là Service Provider – Là trung chổ chính giữa khởi sản xuất toàn bộ các áp dụng trong Laravel.

Với những ai đã từng thực hiện Laravel Framework các đã biết đến file config/ứng dụng.php. File này là địa điểm họ cấu hình những thiết lập của một áp dụng nlỗi debug gian lận, timezone, locale. Trong khi, họ sẽ thấy một yếu tố providers là 1 mảng những class được khai báo phía bên trong file này. Đây chính là địa điểm diễn ra Việc đăng ký những class với service container. Mảng providers này sẽ thân thuộc với phần nhiều ai đã từng thiết lập cắn thêm những package từ bên ngoài vào vào vận dụng Laravel.

Bạn đang xem: Service provider là gì

# Phương thơm thức register()

Trong số đó, ta thấy những class được Laravel ĐK sẵn cùng các class Lúc họ cài đặt một package bắt đầu phần đa mang tên theo dạng SomethingProvider. Ta thấy phần đông ko thực hiện cách làm app()->bind tuyệt những bí quyết knhì báo binding thẳng giống như trong tệp tin bootstrap/phầm mềm.php vẫn khai báo binding trực tiếp Kernel, ExceptionHandler nữa. Ttốt vào đó sẽ là knhì báo thương hiệu những class SomethingProvider vẫn triển khai Việc binding mà thôi. Ta hotline toàn bộ đa số class sẽ là Service Provider cùng tất cả gần như được kế thừa một abstract class ServiceProvider trong số ấy gồm một abstract function register(). Các Service provider sẽ bắt buộc phải ghi đtrần lại cách làm register() này, với đây cũng là cách làm thực hiện Việc binding vào Service Container sinh hoạt mỗi SomethingProvider.

Ví dụ:

app->singleton(Connection::class, function ($app) return new Connection(config("riak")); ); }}

# Thuộc tính bindings cùng singletons

Khi chúng ta nên binding các class, vậy vị bọn họ áp dụng app()->bind() tuyệt app()->singleton() những lần. Chúng ta rất có thể knhị báo như sau:

$this->app->singleton( AppServicesSchoolServiceInterface::class, AppServicesImplSchoolServiceImpl::class );// hoặc $this->app->bindings( AppServicesSchoolServiceInterface::class, AppServicesImplSchoolServiceImpl::class );Dưới phía trên sẽ là 1 ví dụ ĐK binding cùng với Service Container lúc áp dụng phong cách thiết kế Repository – Service – Controller trong Laravel.

app->singleton( AppServicesSchoolServiceInterface::class, AppServicesImplSchoolServiceImpl::class ); $this->app->singleton( AppRepositoriesContractsSchoolRepositoryInterface::class,AppRepositoriesEloquentRepositorySchoolRepositoryImpl::class ); }}Ở đây, tôi thực hiện giải pháp Binding Interfaces To Implementations để bind một interface tương ứng new một implementation.

// Bên trong class SchoolServiceclass SchoolServiceImpl implements SchoolServiceInterface protected $schoolRepository; public function __construct(SchoolRepositoryInterface $schoolRepository) $this->schoolRepository = $schoolRepository; // code ...// Bên vào SchoolControllerclass PageScanController extends Controller protected $schoolService; public function __construct(SchoolServiceInterface $schoolService) $this->schoolService = $schoolService; // code ...lúc đó, trên __contruct() khu vực bắt buộc kéo ra tôi vẫn type-hint interface đã được đăng ký, một instance của một implementation khớp ứng sẽ được mang ra để sử dụng.

# Phương thức boot

Thông thường ta đang yêu cầu viết code giải pháp xử lý một tác vụ nào đó bên phía trong Service Provider, sự việc xảy ra trường hợp các xử lý đó yên cầu đầy đủ service không giống. Khi này, đoạn code cách xử lý được viết bên phía trong hàm boot(). Hàm này sẽ tiến hành Call Khi tổng thể các Service provider đã được load dứt.

Xem thêm: Antivirus Là Gì ? Cách Gỡ Xóa Segurazo Antivirus Mới Nhất 2021

Chính do vậy thủ tục register() nên làm cất công việc binding các class, những công việc tương quan cho event listener, route, xúc tích tinh vi phải được đưa xuống cách thức boot()

# Deferred Providers

Có một điều đáng chăm chú Khi trở nên tân tiến vận dụng, bọn họ sẽ yêu cầu ĐK không ít các Service Provider. Lúc khởi chạy ứng dụng, Laravel đã bắt buộc load tất cả đông đảo Service Provider này trước lúc khởi hễ ứng dụng. Vì cầm, performance đã có thể tác động. Để nâng cao sự việc này, cùng với phiên bản Larave sầu 5.7 trnghỉ ngơi xuống đã cung ứng chúng ta với tùy lựa chọn knhì báo thêm phát triển thành $defer bên phía trong Service Provider. Mặc định $defer(knhì báo vào abstract class ServiceProvider) có giá trị là false có nghĩa là triển khai luôn luôn việc bind thông qua thủ tục register() trong Service Provider kia. Nếu bọn chúng ra knhì báo phát triển thành $defer ngơi nghỉ SomethingProvider với đặt giá trị là true thì phương thức register() của SomethingProvider đó sẽ không còn được chạy (vấn đề binding sẽ không còn ra mắt tại thời gian khởi chế tạo ra ứng dụng) chỉ khi đề nghị resolve service kia thì Laravel bắt đầu load provider đó với Việc binding bắt đầu được triển khai, một instance sẽ tiến hành tạo nên trong Service container cùng nghỉ ngơi phần đông lần call sau sẽ được đem trường đoản cú Service container ra cùng thực hiện. Với phiên bạn dạng Laravel 5.8 trngơi nghỉ lên thì chúng ta không nên knhị báo biến đổi $defer nữa, vậy vào kia chúng ra vẫn implement IlluminateContractsSupportDeferrableProviderinterface với tư tưởng một phương thức provider(). Pmùi hương thức này đã trả về service của provider đó.

# Kết luận

Qúa trình Service Provider được giải pháp xử lý đã như sau:

Kiểm tra xem Service Provider bao gồm ở trong DeferrableProvider hay không? (hoặc biến đổi $defer). Nếu ko ($defer = false) thì Hotline cách làm register và tiến hành việc binding. Nếu tất cả ($defer = true) thì hàm register sẽ không còn được Gọi, ráng vào kia hàm providers sẽ được call cùng cất giữ tác dụng trả về (service) của cách tiến hành này.khi resolve sầu một service từ Service Container, giả dụ service nằm trong DeferrableProvider thì vẫn triển khai chạy cách làm register của Service Provider này, trong lúc này quy trình binding mới được diễn ra, tiếp đến Service Provider đó sẽ bị xóa bỏ DeferrableProvider và công việc resolve liên tục được diễn ra.

Xem thêm: Quy Trình Luân Chuyển Chứng Từ Kế Toán Doanh Thu, Access Denied

Trên đó là đều gì tôi tìm hiểu được về Laravel Service Provider, có thể còn thiếu, có thể chưa đúng mực tại một vài ba điểm trên thời điểm đó. Sẽ có những cách tân nội dung bài viết này khi nhận ra những góp phần hoặc kiến thức bạn dạng thân được xâu rộng.