Reputation: 1537
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
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