依存関係の反転を使用したアプリケーションアーキテクチャの開発





この記事では、 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
      
      







以下が含まれます。





便利なリンク







貢献者は大歓迎です!



All Articles