Symfony2サービス

wtk13

私はDBに2つのテーブルを持っている(questionanswer)。1つの質問には多くの答えがあります。

私はいくつかを取得し、結果の配列を準備することにAnswers依存しquestion.typeます。

フレームワークのないアプリでFactory特定のオブジェクト(、、を返すクラスがDBに依存しています。すべては抽象クラス拡張を宣言した方法をすべてのタイプには、結果を準備するための独自のビジネスロジックがあります。SingleChoiceQuestionOpenQuestionMultipleChoiceQuestionquestion.typeQuestionsQuestionabstractgetResults

したがって、この状況では、ファクトリでオブジェクトを作成したときにメソッドgetResults使用しており、すべてが正常に機能しています。

私はsymfonyでそれを作成したいと私は、ドキュメントを読んでください。私の意見では、私はすべての私のためのサービスを作成する必要がありQuestionタイプを。

結果の配列を返すAggregatedResultsManagerメソッドgenerate作成しました特定のからメソッドをquestion.type呼び出すことに依存しますgetResultsservice

DB構造を変更できないことを付け加えたいと思います。

私の質問:

  1. 私が作成し、使用していますservicesよね?間違った場合は、理解を助け、正しい方法を教えてください。
  2. 私はAggregatedResultsManager約18の質問タイプのようないくつかのサービスを持っています。

各サービスswitchで18の選択肢を作成する必要がありますが、それを防ぐにはどうすればよいですか?

switch ($this->question->getType()) {
    case Question::SINGLE:
        $results = $this->container->get('app.single_choice_question')->getResults($answers);
        break;
    // other types
}

タイプとサービス名を使用して配列を作成するアイデアがあります。

$services = [
    Question::SINGLE => 'app.single_choice_question',
    Question::MULTIPLE => 'app.multiple_choice_question',
    Question::OPEN => 'app.open_question',
];

次に、次のように各サービスで使用します。

$results = $this->container->get($services[$this->question->getType()])->getResults($answers);

18の選択肢があるスイッチを使わないのが最善の方法だと思います。ただし、サービス名を配列にハードコーディングする必要があります。

私のコード:

services.yml

app.question:
    class: AppBundle\Questions\Question
    abstract: true
    arguments: ['@doctrine.orm.entity_manager']

app.single_choice_question:
    class: AppBundle\Questions\SingleChoice
    parent: app.question

app.agreggated_results_manager:
    class:  AppBundle\Results\AggregatedResultsManager
    arguments: ['@doctrine.orm.entity_manager', '@service_container']

抽象的な質問

abstract class Question
{
    /**
     * @var EntityManager
     */
    protected $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    abstract public function getResults($answers);
}

SingleChoice

class SingleChoice extends Question
{
    public function getResults($answers)
    {
        $results = [];

        // business logic

        return $results;
    }
}

結果

class AggregatedResultsManager
{
    /**
     * @var EntityManager
     */
    private $em;

    /**
     * @var Question
     */
    private $question;

    /**
     * @var ContainerInterface
     */
    private $container;

    public function __construct(EntityManager $em, ContainerInterface     $container)
    {
        $this->em = $em;
        $this->container = $container;
    }

    public function generate()
    {
        if (!$this->question) {
            throw new \LogicException('Question is not set');
        }

        $answers = $this->em
            ->getRepository('AppBundle:Answer')
            ->findBy(['question' => $this->question]);

        $results = [];

        if (empty($answers)) {
            return $results;
        }

        switch ($this->question->getType()) {
            case Question::SINGLE:
                $results = $this->container->get('app.single_choice_question')->getResults($answers);
                break;
            // other types
        }

        return $results;
    }


    public function setQuestion(Question $question)
    {
        $this->question = $question;
    }
}

コントローラ

public function questionIdsAction(Question $question)
{
    $resultsManager = $this->get('app.agreggated_results_manager');
    $resultsManager->setQuestion($question);
    $results = $resultsManager->generate();

    return new JsonResponse($results);
}
CERAD

18のQuestionTypeがすべてAbstractQuestionを拡張していると言っていると思いますが、エンティティマネージャーがそれを機能させる必要がありますか?18のサービスを作成してからコンテナーを使用する代わりに、質問ファクトリを作成することをお勧めします。

class QuestionFactory
    public function __construct($entityManager)
        $this->entityManager = $entityManager;
    public function create($questionType)
        switch($questionType) {
            case Question::SINGLE: return new SingleQuestion($this->entityManager);

次に、ファクトリを結果マネージャに挿入します。

このアプローチにより、一連のサービスを作成したり、コンテナーを通過したりする必要がなくなります。あなたはまだswitchステートメントを持っていますが、それは大丈夫です。

発生する可能性がある唯一の問題は、一部のQuestionTypeに追加の依存関係が必要な場合です。その場合、サービスの使用に戻る可能性があります。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Symfony2のGmailサービス

分類Dev

Symfony2サービス:例のリスト?

分類Dev

Symfony2サービスクラス。関数呼び出し

分類Dev

Symfony2条件付きサービス宣言

分類Dev

サービス中のリダイレクト-symfony2

分類Dev

Symfony2バンドルサービスの分離

分類Dev

工場をsymfony2サービスに渡す

分類Dev

Symfony2のサービスコンストラクターのgetUser

分類Dev

Symfony2の未定義のサービスパラメーター

分類Dev

Symfony2の未定義のサービスパラメーター

分類Dev

Symfony2レイジーサービスいつ使用しますか?

分類Dev

Symfony2でサービスのフォームを作成する

分類Dev

Symfony2がサービスをロードしていません

分類Dev

symfony2サービスコンテナリンク/クローンサービスコンテナ

分類Dev

Symfony2のサービスからcreateForm()とgenerateUrl()を呼び出します

分類Dev

状態の有無にかかわらずSymfony2サービス

分類Dev

symfony2とサービスを自動的に実行します

分類Dev

symfony2サービス内で$ this-> render()を実行する方法は?

分類Dev

symfony2サービスが依存関係を登録していません

分類Dev

Symfony2でサービスを使用するための最良の方法

分類Dev

Symfony2はサービスを受けるかコンテナサービスを受ける

分類Dev

Symfony2はサービスのユーザーと教義にアクセスします

分類Dev

ベストプラクティスSymfony2(ファクトリ)サービス

分類Dev

カスタムクラスのsymfony2でサービスコンテナを作成する方法

分類Dev

Symfony2のコマンドからサービスを正しくインスタンス化する方法

分類Dev

コンストラクターのサービスとしてDoctrineDbalを注入するSymfony2

分類Dev

1つのコントローラーでsymfony2のサービスを複数回呼び出す方法

分類Dev

symfony2のすべてのクラスはサービスである必要がありますか?

分類Dev

symfony2のEntitymanager:Webサービスに置き換えられましたか?

Related 関連記事

  1. 1

    Symfony2のGmailサービス

  2. 2

    Symfony2サービス:例のリスト?

  3. 3

    Symfony2サービスクラス。関数呼び出し

  4. 4

    Symfony2条件付きサービス宣言

  5. 5

    サービス中のリダイレクト-symfony2

  6. 6

    Symfony2バンドルサービスの分離

  7. 7

    工場をsymfony2サービスに渡す

  8. 8

    Symfony2のサービスコンストラクターのgetUser

  9. 9

    Symfony2の未定義のサービスパラメーター

  10. 10

    Symfony2の未定義のサービスパラメーター

  11. 11

    Symfony2レイジーサービスいつ使用しますか?

  12. 12

    Symfony2でサービスのフォームを作成する

  13. 13

    Symfony2がサービスをロードしていません

  14. 14

    symfony2サービスコンテナリンク/クローンサービスコンテナ

  15. 15

    Symfony2のサービスからcreateForm()とgenerateUrl()を呼び出します

  16. 16

    状態の有無にかかわらずSymfony2サービス

  17. 17

    symfony2とサービスを自動的に実行します

  18. 18

    symfony2サービス内で$ this-> render()を実行する方法は?

  19. 19

    symfony2サービスが依存関係を登録していません

  20. 20

    Symfony2でサービスを使用するための最良の方法

  21. 21

    Symfony2はサービスを受けるかコンテナサービスを受ける

  22. 22

    Symfony2はサービスのユーザーと教義にアクセスします

  23. 23

    ベストプラクティスSymfony2(ファクトリ)サービス

  24. 24

    カスタムクラスのsymfony2でサービスコンテナを作成する方法

  25. 25

    Symfony2のコマンドからサービスを正しくインスタンス化する方法

  26. 26

    コンストラクターのサービスとしてDoctrineDbalを注入するSymfony2

  27. 27

    1つのコントローラーでsymfony2のサービスを複数回呼び出す方法

  28. 28

    symfony2のすべてのクラスはサービスである必要がありますか?

  29. 29

    symfony2のEntitymanager:Webサービスに置き換えられましたか?

ホットタグ

アーカイブ