- vừa được xem lúc

IoC Container in PHP (Part 2)

0 0 24

Người đăng: Nguyen You

Theo Viblo Asia

Trong bài viết này, chúng ta sẽ tiến hành implement IoC Container.

1. Initalize project

?phpioccontainer ┣ ?src ┃ ┗ ?Illuminate ┃ ┃ ┣ ?Container ┃ ┃ ┃ ┗ ?Container.php ┃ ┃ ┗ ?Contracts ┃ ┃ ┃ ┗ ?Container ┃ ┃ ┃ ┃ ┗ ?Container.php ┣ ?tests ┃ ┗ ?Container ┃ ┃ ┗ ?ContainerTest.php ┣ ?composer.json ┗ ?index.php

Bên trên là cấu trúc thư mục khởi tạo project của chúng ta. Lần lượt nội dung của các file sẽ như sau :

composer.json

{ "name": "vscode/phpioccontainer", "autoload": { "psr-4": { "Illuminate\\": "src/Illuminate/" } }, "require-dev": { "phpunit/phpunit": "^9" }
}

src/Illuminate/Container/Container.php

<?php namespace Illuminate\Container; use Illuminate\Contracts\Container\Container as ContainerContract; class Container implements ContainerContract
{ protected $bindings = []; public function bind($abstract, $concrete = null) { return 'bind'; } public function make($abstract) { return 'make'; }
}

src/Illuminate/Contracts/Container/Container.php

<?php namespace Illuminate\Contracts\Container; interface Container
{ public function bind($abstract, $concrete = null); public function make($abstract);
}

tests/Container/ContainerTest.php

<?php namespace Illuminate\Tests\Container; use Illuminate\Container\Container;
use PHPUnit\Framework\TestCase; class ContainerTest extends TestCase
{ public function testClosureResolution() { $container = new Container; $container->bind('name', function () { return 'You'; }); $this->assertSame('You', $container->make('name')); }
}

Đó là nội dung của 4 files chính của chúng ta trong bài viết lần này.

Nếu ta chạy unit test tại thời điểm này, chắc chắn là test fail (RED), và đây là điều chúng ta mong muốn, theo đúng tinh thần của TDD.

Công việc cần làm của chúng ta bây giờ là làm cho test pass (GREEN).

2. Implement Container

2.1. Closure resolution

Chúng ta sẽ implement dạng đơn giản nhất của container, là nó chỉ thực hiện resolve các closure (function) được binding. Về ý tưởng thì tương đối đơn giản.

bind this with that. make that then give me this

Ý tưởng implement là ta sẽ có một mảng bindings[] để lưu trữ tất cả các bindings.

<?php namespace Illuminate\Container; use Illuminate\Contracts\Container\Container as ContainerContract; class Container implements ContainerContract
{ protected $bindings = []; public function bind($abstract, $concrete = null) { $this->bindings[$abstract] = $concrete; } public function make($abstract) { $concrete = $this->getConcrete($abstract); return $concrete(); } protected function getConcrete($abstract) { return $this->bindings[$abstract]; }
}

Việc thực hiện khá là đơn giản, giờ thì thử chạy lại unit test của chúng ta nào

$ ./vendor/bin/phpunit tests PHPUnit 9.5.2 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 00:00.004, Memory: 4.00 MB OK (1 test, 1 assertion)

Hurray! Passed!

2.1. Singleton

...To Be Continued!

Cảm ơn các bạn đã đọc bài viết, hẹn gặp lại ở bài viết tiếp theo, chúng ta sẽ tiến hành implement dạng singleton của binding nhé!


Code: https://github.com/tunt-1890/phpioccontainer

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 402

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 455

- vừa được xem lúc

Sử dụng Swagger để xây dựng API documentation

Giới thiệu về Swagger. RESTful API là một tiêu chuẩn dùng trong việc thiết kế API cho các ứng dụng web (thiết kế Web services) để tiện cho việc quản lý các resource.

0 0 1k

- vừa được xem lúc

So sánh Interface và Abstract trong lập trình hướng đối tượng.

Tổng quan. Interface và Abstract class là 2 khái niệm cơ bản trong lập trình OOP.

0 0 63

- vừa được xem lúc

CURL và cách sử dụng trong PHP

Giới Thiệu. CURL là bộ thư viện được sử dụng để giúp thực hiện việc chuyển dữ liệu thông qua nhiều giao thức khác nhau (như HTTP, FPT...). Với giao thức HTTP, cURL hỗ trợ việc gửi dữ liệu sử dụng tất cả các phương thức hiện có như GET, POST, PUT, DELETE... cURL cũng hỗ trợ việc chuyền dữ liệu sử dụn

0 0 93

- vừa được xem lúc

Thêm dòng dữ liệu mới (MySQL) trong Laravel

Chào các bạn, Laravel hiện đang là hot trend trong "thế giới PHP". 1. Cấu hình cơ bản ban đầu. .

0 0 51