symfonyでコントローラーの代わりにアクションクラスを使用します

Serhii Popov:

私はの付着していますアクションクラスの使用の代わりに、アプローチコントローラを説明は非常に簡単です。コントローラに多くのアクションが含まれていることがよくあります。依存性注入の原則に従って、必要なすべての依存関係をコンストラクタに渡す必要があります。これにより、コントローラに非常に多くの依存関係があるが、特定の瞬間に状況が発生します。(例:リクエスト)一部の依存関係のみを使用します。そのスパゲッティコードを保守およびテストするのは困難です。

明確にするために、私はすでにZend Framework 2でそのアプローチを使用してきましたが、そこにはMiddlewareという名前が付いています。API-Platformでも、ControllerではなくActionクラス使用する同様のものが見つかりましたが、問題は、それを調理する方法がわからないことです。

UPD:次のアクションクラスを取得して標準のコントローラーを置き換えるにはどうすればよいですか?また、通常のSymfonyプロジェクトにどの構成を追加する必要がありますか?

<?php
declare(strict_types=1);

namespace App\Action\Product;

use App\Entity\Product;
use Doctrine\ORM\EntityManager;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class SoftDeleteAction
{
    /**
     * @var EntityManager
     */
    private $entityManager;

    /**
     * @param EntityManager $entityManager
     */
    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    /**
     * @Route(
     *     name="app_product_delete",
     *     path="products/{id}/delete"
     * )
     *
     * @Method("DELETE")
     *
     * @param Product $product
     *
     * @return Response
     */
    public function __invoke(Request $request, $id): Response
    {
        $product = $this->entityManager->find(Product::class, $id);
        $product->delete();
        $this->entityManager->flush();

        return new Response('', 204);
    }
}
Cerad:

質問は少し興味深いですが、stackoverflowについては少しあいまいです。だからここにいくつかの設定の詳細があります。

すぐに使えるS4スケルトンプロジェクトから始めます。

symfony new --version=lts s4api
cd s4api
bin/console --version # 4.4.11
composer require orm-pack

SoftDeleteActionを追加します。

namespace App\Action\Product;
class SoftDeleteAction
{
    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }
    public function __invoke(Request $request, int $id) : Response
    {
        return new Response('Product ' . $id);
    }
}

そしてルートを定義します:

# config/routes.yaml
app_product_delete:
    path: /products/{id}/delete
    controller: App\Action\Product\SoftDeleteAction

この時点で、配線はほぼ完了しています。あなたが得るURLに行くと:

The controller for URI "/products/42/delete" is not callable:

その理由は、サービスはデフォルトでプライベートであるためです。通常は、サービスを公開する処理を行うAbstractControllerから拡張しますが、この場合の最も速い方法は、アクションをコントローラーとしてタグ付けすることです。

# config/services.yaml
    App\Action\Product\SoftDeleteAction:
        tags: ['controller.service_arguments']

この時点で、ワイヤードアクションが機能しているはずです。

もちろん、多くのバリエーションといくつかの詳細があります。ルートをPOSTまたは偽のDELETEに制限する必要があります。

また、空のControllerServiceArgumentsInterfaceを追加してから、services instanceof機能を使用してコントローラータグを適用することを検討すると、コントローラーサービスを手動で定義する必要がなくなります。

しかし、これはあなたが始めるのに十分なはずです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

yii2のコントローラーアクションでエコーの代わりにリターンを使用する方法

分類Dev

RedirectToActionは、他のコントローラーのアクションに転送する代わりに、URLにルートを追加します

分類Dev

Apollo GraphQLクライアントクエリは、データの代わりにイントロスペクションの結果を返します

分類Dev

Railsでカスタムアクションの代わりに別のコントローラーを作成する必要があるのはいつですか?

分類Dev

コンストラクターインジェクションの代わりにinjector.getを使用する

分類Dev

Asp.net MVC AjaxPost-コントローラーアクションの代わりにビューを探します

分類Dev

Apacheの代わりにロードバランサーを使用して、特定のIPからのトランザクションを抑制します

分類Dev

ビューの代わりにコントローラー内でAngularルートスコーププロパティ$ resolveにアクセスします

分類Dev

ファクトリクラスのロードの書き込みを回避するためにコンストラクターインジェクションの代わりにservicelocationを使用するのは悪いことですか

分類Dev

デスクトップショートカット(リンク)を作成する方法ですが、C#でプログラムで.lnkの代わりに独自のショートカットファイル拡張子(.appfolderなど)を使用しますか?

分類Dev

ローカルホストの代わりにIPアドレスを使用してWebアプリケーションにアクセスできません

分類Dev

別のコントローラーを押す代わりに、フリップトランジションを使用して新しいナビゲーションスタックを作成する

分類Dev

フラッシュコンポーネントは、aempublishでフラッシュアニメーションの代わりに代替画像を表示します

分類Dev

Rails:文字列キーコントローラーを使用してURLヘルパーを呼び出すと、アクションは非推奨になります。代わりに記号を使用しますか?

分類Dev

コンストラクター引数の代わりにブロックを使用してオブジェクトを初期化します

分類Dev

コミットまたはロールバックの代わりにMySQLInnoDBのトランザクションをキャンセルする

分類Dev

Dropbox api V2、URLハッシュ(#)の代わりにクエリパラメータでアクセストークンを取得します(Nodejs)

分類Dev

コンストラクター呼び出しの代わりにセグメンテーション違反

分類Dev

「コントローラー、アクション、モデル」すべてのコードパスが値を返すわけではありません

分類Dev

コントローラはアプリケーション層またはインフラストラクチャ層の内部にありますか?Clean Architectureでコントローラーを使用する必要がありますか?

分類Dev

Yiiは、基になるスクリプトを実行する代わりに、URLをコントローラー/アクションとして解決します

分類Dev

クエリの代わりにストアドプロシージャを使用することで、SQLインジェクションから安全ですか?

分類Dev

PHPバージョン5.6でクラス定数の代わりにグローバル定数を使用する方法

分類Dev

PHPセッションは、IF条件を使用する代わりに2つのブートストラップアラートを表示します

分類Dev

分散トランザクションシステムでバランスの代わりにトランザクション履歴を使用する

分類Dev

機能ブランチでの作業では、マージの代わりにプル リクエストを使用します。gitフローですか?

分類Dev

AngularJSコントローラーとディレクティブで「scope」の代わりに「this」を使用する

分類Dev

クラスは、コンストラクターに割り当てられた文字列プロパティの代わりにnullを返していますか?

分類Dev

Railsは、データを出力する代わりにハッシュ/配列を生成するコントローラーのロジックを表示します

Related 関連記事

  1. 1

    yii2のコントローラーアクションでエコーの代わりにリターンを使用する方法

  2. 2

    RedirectToActionは、他のコントローラーのアクションに転送する代わりに、URLにルートを追加します

  3. 3

    Apollo GraphQLクライアントクエリは、データの代わりにイントロスペクションの結果を返します

  4. 4

    Railsでカスタムアクションの代わりに別のコントローラーを作成する必要があるのはいつですか?

  5. 5

    コンストラクターインジェクションの代わりにinjector.getを使用する

  6. 6

    Asp.net MVC AjaxPost-コントローラーアクションの代わりにビューを探します

  7. 7

    Apacheの代わりにロードバランサーを使用して、特定のIPからのトランザクションを抑制します

  8. 8

    ビューの代わりにコントローラー内でAngularルートスコーププロパティ$ resolveにアクセスします

  9. 9

    ファクトリクラスのロードの書き込みを回避するためにコンストラクターインジェクションの代わりにservicelocationを使用するのは悪いことですか

  10. 10

    デスクトップショートカット(リンク)を作成する方法ですが、C#でプログラムで.lnkの代わりに独自のショートカットファイル拡張子(.appfolderなど)を使用しますか?

  11. 11

    ローカルホストの代わりにIPアドレスを使用してWebアプリケーションにアクセスできません

  12. 12

    別のコントローラーを押す代わりに、フリップトランジションを使用して新しいナビゲーションスタックを作成する

  13. 13

    フラッシュコンポーネントは、aempublishでフラッシュアニメーションの代わりに代替画像を表示します

  14. 14

    Rails:文字列キーコントローラーを使用してURLヘルパーを呼び出すと、アクションは非推奨になります。代わりに記号を使用しますか?

  15. 15

    コンストラクター引数の代わりにブロックを使用してオブジェクトを初期化します

  16. 16

    コミットまたはロールバックの代わりにMySQLInnoDBのトランザクションをキャンセルする

  17. 17

    Dropbox api V2、URLハッシュ(#)の代わりにクエリパラメータでアクセストークンを取得します(Nodejs)

  18. 18

    コンストラクター呼び出しの代わりにセグメンテーション違反

  19. 19

    「コントローラー、アクション、モデル」すべてのコードパスが値を返すわけではありません

  20. 20

    コントローラはアプリケーション層またはインフラストラクチャ層の内部にありますか?Clean Architectureでコントローラーを使用する必要がありますか?

  21. 21

    Yiiは、基になるスクリプトを実行する代わりに、URLをコントローラー/アクションとして解決します

  22. 22

    クエリの代わりにストアドプロシージャを使用することで、SQLインジェクションから安全ですか?

  23. 23

    PHPバージョン5.6でクラス定数の代わりにグローバル定数を使用する方法

  24. 24

    PHPセッションは、IF条件を使用する代わりに2つのブートストラップアラートを表示します

  25. 25

    分散トランザクションシステムでバランスの代わりにトランザクション履歴を使用する

  26. 26

    機能ブランチでの作業では、マージの代わりにプル リクエストを使用します。gitフローですか?

  27. 27

    AngularJSコントローラーとディレクティブで「scope」の代わりに「this」を使用する

  28. 28

    クラスは、コンストラクターに割り当てられた文字列プロパティの代わりにnullを返していますか?

  29. 29

    Railsは、データを出力する代わりにハッシュ/配列を生成するコントローラーのロジックを表示します

ホットタグ

アーカイブ