Php 通过服务访问方法---Symfony2
我的控制器PurchaseOrder控制器Php 通过服务访问方法---Symfony2,php,symfony,Php,Symfony,我的控制器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\B
<?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()
;
}
}
控制器内部的访问方法[非购买控制器]
$purchase = $this->get('cj.businessbundle.purchase');
$purchase->newAction();
获取错误:
FatalErrorException:错误:在/home/cj/public_html/Symfony/vendor/Symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php第163行中对非对象调用成员函数get()
新的行动确实存在
当您调用
$this->get(“your.service”)
请求依赖注入容器加载该服务时,我认为我在定义服务时做错了什么。您请求它加载一个扩展Symfony的控制器类的控制器,该控制器类扩展了。您收到的错误是因为加载的控制器可能试图使用$this->container->get(“request”)
访问类似“request”的服务,但未设置$this->container
ContainerWare有一个方法setContainer
,在设置服务时,您可以使用services.yml中的calls:
参数实际运行该方法:
services:
cj.businessbundle.purchase:
class: CJ\BusinessBundle\Controller\PurchaseController
calls:
- [setContainer, [@service_container]]
Symfony2对加载的控制器(PurchaseOrderController)执行此操作,但如果您只是自己加载控制器类,则不会执行此操作
从PurchaseController中提取newAction(或所需逻辑)作为服务本身比将整个控制器设置为服务要好得多。通过这种方式,PurchaseOrder和PurchaseOrder控制器都可以调用服务来创建新的购买(或newAction所做的任何操作),而不是每次都加载整个控制器。查看服务的示例,或者当您调用
$this->get(“your.service”)
时,请求依赖项注入容器加载该服务。您请求它加载一个扩展Symfony的控制器类的控制器,该控制器类扩展了。您收到的错误是因为加载的控制器可能试图使用$this->container->get(“request”)
访问类似“request”的服务,但未设置$this->container
ContainerWare有一个方法setContainer
,在设置服务时,您可以使用services.yml中的calls:
参数实际运行该方法:
services:
cj.businessbundle.purchase:
class: CJ\BusinessBundle\Controller\PurchaseController
calls:
- [setContainer, [@service_container]]
Symfony2对加载的控制器(PurchaseOrderController)执行此操作,但如果您只是自己加载控制器类,则不会执行此操作
从PurchaseController中提取newAction(或所需逻辑)作为服务本身比将整个控制器设置为服务要好得多。通过这种方式,PurchaseOrder和PurchaseOrder控制器都可以调用服务来创建新的购买(或newAction所做的任何操作),而不是每次都加载整个控制器。查看服务的一个很好的示例,或者您可以在调用$purchase=$this->get('cj.businessbundle.purchase')的地方发布类;这个控制器就是我调用它的类。它在公共函数newaction下,我没有注意到:)sorrycan你可以调用$purchase=$this->get('cj.businessbundle.purchase')的post类;这个控制器就是我调用它的类。它属于公共职能部门(我没有注意到:)sorry@Luke非常感谢你。嘿,你能指出一些让我构建ajax表单的东西吗。像采购订单一样,我希望有添加选项来添加新项目。与add new item按钮一样,symfony2文档也会通过Ajax将字段添加到表单中。symfony2文档有一个关于集合和使用jQuery(在其示例中)向任务添加新标记的部分。不知道你是不是这么想的mean@Luke非常感谢你。嘿,你能指出一些让我构建ajax表单的东西吗。像采购订单一样,我希望有添加选项来添加新项目。与add new item按钮一样,symfony2文档也会通过Ajax将字段添加到表单中。symfony2文档有一个关于集合和使用jQuery(在其示例中)向任务添加新标记的部分。不知道你是不是这个意思