DBに2つのテーブルがあります(question
とanswer
)。一つの質問には多くの答えがあります。Symfony2サービス
Answers
があります。question.type
に依存します。結果の配列を準備します。任意のフレームワークなしにアプリで
私はDBから特定のオブジェクト(SingleChoiceQuestion
、OpenQuestion
、MultipleChoiceQuestion
)依存question.type
を返すFactory
クラスを有しています。すべてQuestions
は、abstract
メソッドgetResults
と宣言された抽象クラスQuestion
を継承しています。すべてのタイプには、結果を準備するための独自のビジネスロジックがあります。
このような状況では、工場でオブジェクトを作成したときに、メソッドgetResults
を使用していて、すべて正常に動作します。
私はそれをSymfonyで作成したいと思いますし、ドキュメントを読んでいます。私の意見では、すべての私のQuestion
タイプのサービスを作成する必要があります。
結果配列を返すgenerate
メソッドでAggregatedResultsManager
を作成しました。 question.type
に応じて、特定のservice
からgetResults
メソッドを呼び出します。
DB構造を変更することはできませんので、追加したいと思います。
私の質問:
- 私が作成し、
services
権利を使用していますか?私が間違っていたら、それを理解して正しい方法を教えてください。 AggregatedResultsManager
のようないくつかのサービスと約18種類の質問タイプがあります。
各サービスでは、私はswitch
を18個の選択肢で作成する必要があります。その防止方法は?
$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);
switch ($this->question->getType()) {
case Question::SINGLE:
$results = $this->container->get('app.single_choice_question')->getResults($answers);
break;
// other types
}
私は種類やサービス名を持つ配列を作成するためのいくつかのアイデアを持っています18の選択肢を持つスイッチを使用しない。しかし、私は配列でサービス名をハードコードする必要があります。
マイコード:
サービス。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
@セラードあなたは右です!私が彼が求めている唯一の本当の疑問は、「サービスを作成して使用しているのですか?」 –
@Ceradフィードバックをいただきありがとうございました。私は質問を追加しました。 – wtk13