標準の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() { // ... $url = $endpointRouter->url(TextEndpoint::class); } }
TextEndpointでカスタムルート名が指定されていても、$ router-> url(TextEndpoint :: class)は引き続き機能します。 これは、ルートをキャッシュすることで実現されます。 もちろん、エンドポイントに複数のルートが指定されている場合、クラス名でURLを生成することはできず、ルートの名前を使用する必要があります。
バンドルの使用例は、 デモアプリケーションにあります 。
PaEndpointBundleまたはそのアイデアがsymfony開発者に役立つことを願っています。