PaEndpointBundle-Symfonyコントローラーの代替

Symfonyでリクエストを処理する主な方法はコントローラーを使用することです。 コントローラー(アノテーション)でルーティングを直接記述する機能により、寿命がさらに向上しました。 ただし、コントローラーを継承するときにアノテーションを使用すると問題が発生します。子コントローラーごとにルーティングを再登録する必要があります。 しかし、crudアプリケーションでは、ベースコントローラーと、ベースコントローラーのロジックを継承する多くの子、および自動的に生成されるルートが存在する場合が一般的です。



標準のSymfonyコントローラーを改善する試みはDunglasActionBundleでした 。 このバンドルは、コントローラーに__invoke()メソッドが1つしかないことを前提としています。これにより、クラス名をルートの名前として使用でき、非常に便利です。 たとえば、次のようにURLを生成できます。



$route->generate(MyController::class, ['paramName' => 'value']);
      
      





しかし、このバンドルはコントローラーの継承の問題を解決しません。 したがって、これらの問題をすべて解決する独自のバンドルが作成されました-PaEndpointBundle



バンドル機能:





バンドルの主な概念は、エンドポイント-アプリケーションへのエントリポイントです(symfonyの用語では-単一のアクションを持つコントローラー)。 単純なエンドポイントの例:



 use PaLabs\EndpointBundle\EndpointInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; class TextEndpoint implements EndpointInterface { public function routes() { return new Route('/cool_message'); } public function execute(Request $request): Response { return new Response('Hello, world'); } }
      
      





このエンドポイントはyour.server / cool_messageでリクエストを処理し、テキスト「Hello、world」を含むレスポンスを返します。



エンドポイントが機能するには、symfonyでサービスとして登録するだけです。 他に何もする必要はありません-バンドル自体がエンドポイントを検出し、そのルートをアプリケーションルートの一般リストに追加します。



必要に応じて、ルートに独自の名前を設定します。これは次のように実行できます。



 public function routes() { return new EndpointRoute('my_route_name', new Route('/cool_message')); }
      
      





、その後、標準のsymfonyルーターまたはテンプレートで使用できます。



エンドポイントのroutes()メソッドは通常のクラスメソッドであるため、任意のロジックを使用してルートを生成できます。たとえば、一部のシステム設定に応じてルートを生成し、必要に応じてルートを有効または無効にし、ルートのコレクションを作成します。



EndpointRouterクラスは、 URLを生成するために使用されます 。 使用例:



 class SomeService { protected $router; public function __construct(EndpointRouter $router) { $this->router = $router; } public function doWork() { // ... $url = $endpointRouter->url(TextEndpoint::class); } }
      
      





TextEndpointでカスタムルート名が指定されていても、$ router-> url(TextEndpoint :: class)は引き続き機能します。 これは、ルートをキャッシュすることで実現されます。 もちろん、エンドポイントに複数のルートが指定されている場合、クラス名でURLを生成することはできず、ルートの名前を使用する必要があります。



バンドルの使用例は、 デモアプリケーションにあります

PaEndpointBundleまたはそのアイデアがsymfony開発者に役立つことを願っています。



All Articles