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



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


以下が含まれます。


便利なリンク




貢献者は大歓迎です!

Source: https://habr.com/ru/post/J158213/


All Articles