フレームワークに依存しないコントローラーを作成する方法は?

通常、コントローラーはアプリケーションで最も関連するクラスと見なされます。 原則として、要求データに基づいて、データベースでデータを受信または保存し、データまたはストレージの結果をHTMLに変換します。これは、要求を行ったクライアントへの応答として機能します。



コントローラーはどこにでもあり、通常は互いに独立したアプリケーションの部分を接続します。 これにより、コントローラーの接続性が大幅に向上します。依存関係には、Doctrineエンティティマネージャー、Twigテンプレートエンジン、FrameworkBundleのベースコントローラーなどがあります。



この投稿では、このレベルの接続が完全に不要であることを示します。 いくつかの簡単な手順を実行するだけで、接続を大幅に削減する方法を紹介します。 その結果、たとえばSilexやDrupalに基づいたさまざまなタイプのアプリケーションで再利用できるコントローラーが得られます。



パートI:標準コントローラーを使用しない





過剰な接続:ベースコントローラーからの継承


基本的に、出会ったコントローラークラスはFrameworkBundleのコントローラークラスから継承します。



use Symfony\Bundle\FrameworkBundle\Controller\Controller; class MyController extends Controller { ... }
      
      







コントローラーの基本クラスは、createNotFoundException()やredirect()などの便利な略語を追加します。 また、コントローラーを自動的にContainerAwareの後続(コンテナーの「認識」)にし、その結果、Dependency Injection Container(DIC)がコントローラーに自動的に注入されます。 コンテナから、必要なサービスを取得できます。



ヘルパーメソッドを使用しないでください!


もちろん、これはすべて非常に便利に思えますが、あなたが少し怠け者であれば、つながりを大幅に減らすことができます。 これらの補助メソッドを捨てることには何の問題もありません。それらのほとんどの本体はすべて同じ行で構成されています(実際に何が起こっているかを理解するには、ベースコントローラーを見てください!)。 これらのメソッドの呼び出しを、それらのコードで簡単に置き換えることができます。



 class MyController extends Controller { public function someAction() { // : throw $this->createNotFoundException($message); // : throw new NotFoundHttpException($message); } }
      
      







依存性注入を使用する


コントローラーの親クラスのヘルパーメソッドを使用しなくなった場合は、この不要な継承を取り除くために別の手順を実行できます。 コンテナから依存関係を取得する代わりに、コンストラクターに手動でそれらを挿入します。



 class MyController extends Controller { public function someAction() { $this->get('doctrine')->getManager(...)->persist(...); } } //  : use Doctrine\Common\Persistence\ManagerRegistry; class MyController extends Controller { public function __construct(ManagerRegistry $doctrine) { $this->doctrine = $doctrine; } public function someAction() { $this->doctrine->getManager(...)->persist(...); } }
      
      







コントローラーをサービスにする


また、ControllerResolverが通常行うように、新しい演算子を呼び出すことによって新しいコントローラーサービスが構築されるだけでなく、コントローラーのすべての依存関係が正しく挿入されることを確認する必要もあります。 これを行うには、サービスを宣言する必要があります。



 services: my_controller: class: MyController arguments: - @doctrine
      
      





また、ルーティング設定も修正する必要があります。 注釈を使用する場合:



 /** * @Route(service="my_controller") */ class MyController extends Controller { ... }
      
      





そして、ルーティングがYML設定ファイルに保存されている場合:



 my_action: path: /some/path defaults: _controller: my_controller:someAction
      
      







最後に、標準のsymphonyコントローラーから継承する必要がなくなりました。また、コントローラーがDIコンテナーについて何も知る必要もありません。そのすべての依存関係がコンストラクター引数に注入されるためです。 また、基本クラスの補助メソッドに依存しなくなりました。つまり、コントローラのクラスの宣言からuse式とともにextends Controllerを最終的に削除できるようになりました。



 class MyController { }
      
      







これが、無関係なコードに対して多くのボーナスポイントを獲得する方法です!



次の投稿で注釈と、それを取り除いた場合にコードがどのように接続されなくなるかについて説明します。



All Articles