
この記事では、 Inversion of Controlを使用したアプリケーションアーキテクチャの開発について再度説明します。
私はすでにIoCライブラリとModularについてhabrで書いています。 今、私はさらに進んで、可能なすべてを単純化し、アーキテクチャの原理を説明しようとしています。 また、新しいGranulaライブラリについても説明します。
サイト上のユーザーを管理するためのライブラリを作成したいと考えてみましょう。 最初に必要なのは、についての情報を保存する場所です
ユーザー。
ストレージインターフェースについて説明しましょう。
interface StorageInterface { public function set($key, $value); public function get($key); public function save(); public function load(); }
さて、このインターフェイスの実装が必要になりました。 まず、情報をファイルに保存します。 クラスFileStorageを作成します。
Filestorage.php
class FileStorage implements StorageInterface { private $file = 'data.json'; private $data = array(); public function set($key, $value) { $this->data[$key] = $value; } public function get($key) { return $this->data[$key]; } public function save() { file_put_contents($this->file, json_encode($this->data)); } public function load() { $this->data = json_decode(file_get_contents($this->file)); } }
ユーザークラスを作成します
class User { public function __construct(StorageInterface $storage) { } }
次に、Userクラスのインスタンスを作成します。
$user = new User(new FileStorage());
さて、他のプログラマーがファイルの代わりにデータベースを使用したい場合はどうでしょうか? これを行うには、DatabaseStorageクラスを作成し、StorageInterfaceインターフェイスを実装して、FileStorageのすべての出現箇所を置き換える必要があります。 ただし、ライブラリを変更すると、その更新に問題が生じます。
これを避けるために、オプションを紹介しましょう:
$options = array( 'StorageInterface' => 'FileStorage', ); $user = new User($option['StorageInterface']);
FileStorageをDatabaseStorageに置き換えるには、オプションでこれを指定するだけです。
$options['StorageInterface'] = 'DatabaseStorage';
現在オプションと呼ぶものは、実際にはIoCコンテナーです。
このアーキテクチャにより、最も柔軟なアプリケーションとライブラリを構築できます。
前回の記事では、モジュラーライブラリについて説明しましたが、開発を続け、最良の理解のためにすべてを単純化しようとしました。 その主なタスクは、IoCのアプリケーションを実際に訓練し、モジュール化されたアプリケーションアーキテクチャを作成することです。
今ではグラニュラと呼ばれています。
任意のライブラリをグラニュルのモジュールにすることができます。 たとえば、Symfony自体のように、 SymfonyコンポーネントからMVCアプリケーションを作成できます。
各グラニュールモジュールは、そのクラスで説明する必要があります。
use Granula\Module; use Inversion\Container; class MyModule extends Module { public function build(Container $container) { // . } }
たとえば、記事の冒頭で作成したライブラリの説明は次のようになります。
$container['StorageInterface'] = 'FileStorage';
さらにカットすることもできます。
$container[] = 'FileStorage';
ただし、この場合、クラスの遅延読み込みは機能しません。FileStorageはインターフェイス(IoCコンテナのライブラリ)によってすぐに読み込まれ、インターフェイスを決定するためです。
Symfony Routingコンポーネントのモジュールの説明の例
$container['request'] = $container['Symfony\Component\HttpFoundation\Request'] = new Factory('Symfony\Component\HttpFoundation\Request', 'createFromGlobals'); $container['Symfony\Component\Config\FileLocator'] = 'Symfony\Component\Config\FileLocator'; $container['Doctrine\Common\Annotations\Reader'] = 'Doctrine\Common\Annotations\AnnotationReader'; $container['Symfony\Component\Routing\Loader\AnnotationClassLoader'] = 'Granula\Router\AnnotatedRouteControllerLoader'; $container['Symfony\Component\Config\Loader\LoaderInterface'] = 'Symfony\Component\Routing\Loader\AnnotationDirectoryLoader'; $container['request.context'] = $container['Symfony\Component\Routing\RequestContext'] = new Service('Symfony\Component\Routing\RequestContext'); $container['router'] = $container['Symfony\Component\Routing\RouterInterface'] = new Factory('Granula\Router\RouterFactory');
これで、コンテナを使用してSymfonyのようにインスタンスを作成できます。
$object = $container->get('Class');
または、工場の助けを借りて(特性を使用する場合):
$user = User::create();
次に、必要なすべてのモジュールがフロントコントローラーで指定されます。
class App extends Granula\App { public function register() { return array( new MyModule(), // ); } }
そして、index.phpファイルで、次を実行します。
$app = new App(); $app->run();
必要なすべてのモジュールを設計して、本格的なMVCアプリケーションを作成しました。 それを試すには、 Composerを使用してインストールします。
composer create-project granula/app www
以下が含まれます。
- symfonyコンポーネント
- 小枝
- ドクトリンオーム
便利なリンク
- PHPコードの依存関係の管理
- GitHubのグラニュラ
- 反転 -IoCライブラリは、グラニュールとは別に使用できます。
貢献者は大歓迎です!