chirag7jain
chirag7jain

Reputation: 1537

Accessing Method Through Service --- Symfony2

My Controller PurchaseOrder Controller

<?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()
    ;
}
}

Serivces.yml

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

Accessing method inside controller [Not Purchase Controller]

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

Getting error:

FatalErrorException: Error: Call to a member function get() on a non-object in /home/cj/public_html/Symfony/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php line 163

The new Action does exist

I think I am doing something wrong while defining the service

Upvotes: 0

Views: 2012

Answers (1)

Luke
Luke

Reputation: 3353

When you call $this->get("your.service") you are asking the dependency injection container to load that service. You are requesting that it loads one of your controllers which extends Symfony's controller class which extends ContainerAware. The error you are getting is because the loaded controller is likely trying to access a service like "request" using $this->container->get("request") but $this->container is not set.

ContainerAware has a method setContainer which you can actually run when your service is setup by using the calls: argument in services.yml:

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

Symfony2 does this for the loaded controller (PurchaseOrderController) but not if you just load a controller class yourself.

It would be much better practice to extract the newAction (or the required logic) from PurchaseController as a service itself rather than setting the whole controller as a service. This way both Purchase and PurchaseOrder controllers can call the service to create a new purchase (or whatever newAction does) and you are not loading a whole controller everytime. Check out the FOS user bundle user manager for a good example of a service or http://symfony.com/doc/2.1/book/service_container.html#what-is-a-service

Upvotes: 6

Related Questions