2

Human缶がItem彼のポケットの中にあるとしましょう。それぞれItemがに異なる影響を及ぼしHumanます。

彼がアイテムを使用するとき、それは行きますItemController

class ItemController extends Controller
{
    public function useAction() {
       // Human
        $human = new Human();

       // Item
        $request = Request::createFromGlobals();
        $item_id = $request->request->get('item_id', 0);
        $item = new Item($item_id);

        // Different effects depending on the Item used
        switch($item->getArticleId()) {

            case 1: $this->heal($human, $item, 5); break; // small potion
            case 2: $this->heal($human, $item, 10); break; // medium potion
            case 3: $this->heal($human, $item, 15); break; // big potion

        }

    }

    // The following Heal Function can be placed here ?
    private function heal($human, $item, $life_points) {
        $human->addLife($life_points);
        $item->remove();
        return new Response("You have been healed of $life_points");
    }
}

ここに置くことはheal functionできますか?私はそれがコントローラーにあるはずではないと信じています。Item Entityしかし、私はそれを(応答のため、そして$ Humanを使用しているため)内部に配置すべきではないとも信じています

4

4 に答える 4

4

場合によります。これらのタイプの質問に対する私の理由は次のとおりです。コントローラーの関数のみを使用する場合は、そこにとどまることができます。ただし、共有機能である可能性が高い場合は、そのためのサービスを作成します。コマンドや別のコントローラーなどを使って人間を癒したいと思うかもしれません。その場合、これには共有コードを使用するのが理にかなっています。

サービスの作成は非常に簡単で、ロジックを共有することができます。私の意見では、コントローラーはリクエストフローを処理するのにより便利です。

于 2012-06-28T07:21:52.980 に答える
2

私はあなたがこれを行うことができると思います:

1:継承

  class BaseHumanController extend Controller{

  public function heal($param1, $param2, $param3){

  //put logic here

  }

} 

//Extend from BaseHumanController in any controller for call heal() method
class ItemController extend BaseHumanController{

//....
 $this->heal(...)

} 

2:heal()メソッドを使用してクラスを作成し、@PeterKruithofとしてサービスとして構成します

于 2012-06-28T12:37:37.770 に答える
0

私は絶対にそれがコントローラーに入ると思います。ウィキペディアから:

コントローラは入力を仲介し、モデルまたはビューのコマンドに変換します。

symfony2 crudジェネレーターによって生成されたdelete関数を見ると、エンティティに対してremoveが呼び出されます。

/**
 * Deletes a Bar entity.
 *
 * @Route("/{id}/delete", name="bar_delete")
 * @Method("post")
 */
public function deleteAction($id)
{
    $form = $this->createDeleteForm($id);
    $request = $this->getRequest();

    $form->bindRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getEntityManager();
        $entity = $em->getRepository('FooBundle:Bar')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Bar entity.');
        }

        $em->remove($entity);
        $em->flush();
    }

    return $this->redirect($this->generateUrl('bar_index'));
}
于 2012-06-28T06:19:55.697 に答える
0

それがコントローラーにあるべきではない理由はわかりません。そこでのみ使用する場合は、プライベートメソッドにしてください。

于 2012-06-28T13:20:37.870 に答える