0

マイ コントローラ PurchaseOrder コントローラ

<?php

namespace CJ\BusinessBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use CJ\BusinessBundle\Entity\PurchaseOrder;
use CJ\BusinessBundle\Form\PurchaseOrderType;

/**
 * PurchaseOrder controller.
 *
 * @Route("/purchaseorder")
 */
class PurchaseOrderController extends Controller
{
/**
 * Lists all PurchaseOrder entities.
 *
 * @Route("/", name="purchaseorder")
 * @Method("GET")
 * @Template()
 */
public function indexAction()
{
    $em = $this->getDoctrine()->getManager();

    $entities = $em->getRepository('CJBusinessBundle:PurchaseOrder')->findAll();

    return array(
        'entities' => $entities,
    );
}

/**
 * Creates a new PurchaseOrder entity.
 *
 * @Route("/", name="purchaseorder_create")
 * @Method("POST")
 * @Template("CJBusinessBundle:PurchaseOrder:new.html.twig")
 */
public function createAction(Request $request)
{
    $entity  = new PurchaseOrder();
    $form = $this->createForm(new PurchaseOrderType(), $entity);
    $form->bind($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('purchaseorder_show', array('id' => $entity->getId())));
    }

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
}

/**
 * Displays a form to create a new PurchaseOrder entity.
 *
 * @Route("/new", name="purchaseorder_new")
 * @Method("GET")
 * @Template()
 */
public function newAction()
{
    $entity = new PurchaseOrder();
    $form   = $this->createForm(new PurchaseOrderType(), $entity);

    $purchase = $this->get('cj.businessbundle.purchase');
    $purchase->newAction();

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
}

/**
 * Finds and displays a PurchaseOrder entity.
 *
 * @Route("/{id}", name="purchaseorder_show")
 * @Method("GET")
 * @Template()
 */
public function showAction($id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('CJBusinessBundle:PurchaseOrder')->find($id);

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

    $deleteForm = $this->createDeleteForm($id);

    return array(
        'entity'      => $entity,
        'delete_form' => $deleteForm->createView(),
    );
}

/**
 * Displays a form to edit an existing PurchaseOrder entity.
 *
 * @Route("/{id}/edit", name="purchaseorder_edit")
 * @Method("GET")
 * @Template()
 */
public function editAction($id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('CJBusinessBundle:PurchaseOrder')->find($id);

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

    $editForm = $this->createForm(new PurchaseOrderType(), $entity);
    $deleteForm = $this->createDeleteForm($id);

    return array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    );
}

/**
 * Edits an existing PurchaseOrder entity.
 *
 * @Route("/{id}", name="purchaseorder_update")
 * @Method("PUT")
 * @Template("CJBusinessBundle:PurchaseOrder:edit.html.twig")
 */
public function updateAction(Request $request, $id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('CJBusinessBundle:PurchaseOrder')->find($id);

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

    $deleteForm = $this->createDeleteForm($id);
    $editForm = $this->createForm(new PurchaseOrderType(), $entity);
    $editForm->bind($request);

    if ($editForm->isValid()) {
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('purchaseorder_edit', array('id' => $id)));
    }

    return array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    );
}

/**
 * Deletes a PurchaseOrder entity.
 *
 * @Route("/{id}", name="purchaseorder_delete")
 * @Method("DELETE")
 */
public function deleteAction(Request $request, $id)
{
    $form = $this->createDeleteForm($id);
    $form->bind($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $entity = $em->getRepository('CJBusinessBundle:PurchaseOrder')->find($id);

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

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

    return $this->redirect($this->generateUrl('purchaseorder'));
}

/**
 * Creates a form to delete a PurchaseOrder entity by id.
 *
 * @param mixed $id The entity id
 *
 * @return Symfony\Component\Form\Form The form
 */
private function createDeleteForm($id)
{
    return $this->createFormBuilder(array('id' => $id))
        ->add('id', 'hidden')
        ->getForm()
    ;
}
}

サービス.yml

services:
   cj.businessbundle.purchase:
      class: CJ\BusinessBundle\Controller\PurchaseController

コントローラー内部へのアクセス方法【コントローラーを購入しない】

$purchase = $this->get('cj.businessbundle.purchase');
$purchase->newAction();

取得エラー:

FatalErrorException: エラー: /home/cj/public_html/Symfony/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php 行 163 の非オブジェクトに対するメンバー関数 get() の呼び出し

新しいアクションは存在します

サービスの定義中に何か間違ったことをしていると思います

4

1 に答える 1

6

呼び出す$this->get("your.service")と、依存性注入コンテナーにそのサービスをロードするように求められます。ContainerAwareを拡張する Symfony のコントローラー クラスを拡張するコントローラーの 1 つをロードするように要求しています。取得しているエラーは、ロードされたコントローラーが「リクエスト」を使用してサービスにアクセスしようとしている可能性が高いが、設定されて$this->container->get("request")$this->containerないためです。

ContainerAware には、services.yml の引数setContainerを使用してサービスをセットアップするときに実際に実行できるメソッドがあります。calls:

services:
   cj.businessbundle.purchase:
      class: CJ\BusinessBundle\Controller\PurchaseController
      calls:
        - [setContainer, [@service_container]]

Symfony2 は、ロードされたコントローラー (PurchaseOrderController) に対してこれを行いますが、自分でコントローラー クラスをロードするだけの場合は行いません。

コントローラー全体をサービスとして設定するよりも、PurchaseController から newAction (または必要なロジック) をサービス自体として抽出する方がはるかに優れた方法です。このようにして、 Purchase コントローラーと PurchaseOrder コントローラーの両方がサービスを呼び出して新しい購入 (または newAction が行うもの) を作成することができ、毎回コントローラー全体をロードする必要はありません。サービスの良い例については、 FOS ユーザー バンドルのユーザー マネージャーを確認するか、 http://symfony.com/doc/2.1/book/service_container.html#what-is-a-service

于 2013-04-05T10:21:56.040 に答える