Symfonyでリクエストを処理する主な方法は
コントローラーを使用
することです。 コントローラー(アノテーション)でルーティングを直接記述する機能により、寿命がさらに向上しました。 ただし、コントローラーを継承するときにアノテーションを使用すると問題が発生します。子コントローラーごとにルーティングを再登録する必要があります。 しかし、crudアプリケーションでは、ベースコントローラーと、ベースコントローラーのロジックを継承する多くの子、および自動的に生成されるルートが存在する場合が一般的です。
標準のSymfonyコントローラーを改善する試みは
DunglasActionBundleでした 。 このバンドルは、コントローラーに__invoke()メソッドが1つしかないことを前提としています。これにより、クラス名をルートの名前として使用でき、非常に便利です。 たとえば、次のようにURLを生成できます。
$route->generate(MyController::class, ['paramName' => 'value']);
しかし、このバンドルはコントローラーの継承の問題を解決しません。 したがって、これらの問題をすべて解決する独自のバンドルが作成されました
-PaEndpointBundleバンドル機能:
- シンプルなコントローラーインターフェイス-1つの実行(Request $ request)メソッドのみ:応答
- クラス名による便利なURL生成-$ router-> url(SomeEndpoint :: class)
- リファクタリングの利便性-コントローラーの名前を変更または移動する場合、追加のアクションは必要ありません。たとえば、ルートの名前を変更します。
- ルートの名前を指定する必要はありません(ただし、必要に応じて指定できます)
バンドルの主な概念は、エンドポイント-アプリケーションへのエントリポイントです(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() {
TextEndpointでカスタムルート名が指定されていても、$ router-> url(TextEndpoint :: class)は引き続き機能します。 これは、ルートをキャッシュすることで実現されます。 もちろん、エンドポイントに複数のルートが指定されている場合、クラス名でURLを生成することはできず、ルートの名前を使用する必要があります。
バンドルの使用例は、
デモアプリケーションにあります 。
PaEndpointBundleまたはそのアイデアがsymfony開発者に役立つことを願っています。