[英]Service dependence injection not include manager symfony2
出于某种原因,我正在尝试将这些人包括在一种Form类型中,因为管理器未将其包括在构造函数中,也许这是一个简单的错字,但现在我无法通过symfony2(2.7)的菜谱示例看到错误。
这是FormType FloorType
namespace George\FloorBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use George\FloorBundle\Form\DataTransformer\ObjectToNumberTransformer;
use Doctrine\Common\Persistence\ObjectManager;
class FloorType extends AbstractType
{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('translations', 'a2lix_translations',array(
'required_locales' => array('bg','en')
))
->add('object', 'hidden', array(
// validation message if the data transformer fails
'invalid_message' => 'That is not a valid issue number',
));
$builder ->get('object')->addModelTransformer(new ObjectToNumberTransformer($this->manager));
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'George\FloorBundle\Entity\Floor'
));
}
/**
* @return string
*/
public function getName()
{
return 'george_floorbundle_floor';
}
}
需要注入管理器的服务
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="app.form.type.floor" class="George\FloorBundle\Form\Type\FloorType">
<tag name="form.type" />
<argument type="service" id="doctrine.orm.entity_manager"></argument>
</service>
</services>
使用管理器的变压器 ( 但是我没有出错,我只是想举一个完整的例子 )
<?php
namespace George\FloorBundle\Form\DataTransformer;
use George\ObjectsBundle\Entity\Object;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
class ObjectToNumberTransformer implements DataTransformerInterface
{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
/**
* Transforms an object (issue) to a string (number).
*
* @param Object|null $issue
* @return string
*/
public function transform($object)
{
if (null === $object) {
return '';
}
return $object->getId();
}
/**
* Transforms a string (number) to an object (issue).
*
* @return Object|null
* @throws TransformationFailedException if object (issue) is not found.
*/
public function reverseTransform($objectNumber)
{
// no issue number? It's optional, so that's ok
if (!$objectNumber) {
return;
}
$object= $this->manager
->getRepository('ObjectsBundle:Object')
// query for the issue with this id
->find($objectNumber)
;
if (null === $object) {
// causes a validation error
// this message is not shown to the user
// see the invalid_message option
throw new TransformationFailedException(sprintf(
'An issue with number "%s" does not exist!',
$objectNumber
));
}
return $object;
}
}
和我需要加载FloorType的控制器方法:
private function createEditForm(Floor $entity)
{
$manager = $this->getDoctrine()->getManager();
$form = $this->createForm(new FloorType($manager), $entity, array(
'action' => $this->generateUrl('admin_floor_update', array('id' => $entity->getId())),
'method' => 'PUT',
));
$form->add('submit', 'submit', array('label' => 'Update'));
return $form;
}
因此,当我删除经理时:
$manager = $this->getDoctrine()->getManager();
我遇到一个严重的错误:
可捕获的致命错误:传递给George \\ FloorBundle \\ Form \\ FloorType :: __ construct()的参数1必须实现接口Doctrine \\ Common \\ Persistence \\ ObjectManager,没有给出,在D:\\ work \\ infinity3 \\ src \\ George \\ FloorBundle \\ Controller中调用\\ FloorController.php在第171行并已定义
我这样理解- 服务未成功注入经理
在本地捆绑中调试服务
我已经调试了该服务,但已列出该服务,但是我无法对其进行管理以将管理器包含在FloorType中,因此我在这里遗漏了什么?
编辑
所以这是服务xml问题,由于@Matteo回答,我没有包括alias属性,我编辑了代码,它的工作原理就像一个魅力! 谢谢@Matteo!
这是编辑服务
<services>
<service id="app.form.type.floor" class="George\FloorBundle\Form\FloorType">
<tag name="form.type" alias="george_floorbundle_floor" />
<argument type="service" id="doctrine.orm.entity_manager"></argument>
</service>
</services>
我在哪里创建表格:
$form = $this->createForm('george_floorbundle_floor', $entity, array(
'action' => $this->generateUrl('admin_floor_update', array('id' => $entity->getId())),
'method' => 'PUT',
));
您应该在标签部分中定义一个别名,如下所示:
service.xml中
<services>
<service id="app.form.type.floor" class="George\FloorBundle\Form\Type\FloorType">
<tag name="form.type" alias="george_floorbundle_floor" />
<argument type="service" id="doctrine.orm.entity_manager"></argument>
</service>
</services>
并使用参考引用表单创建,如下所示:
$form = $this->createForm('george_floorbundle_floor', $entity, array(
'action' => $this->generateUrl('admin_floor_update', array('id' => $entity->getId())),
'method' => 'PUT',
));
希望这个帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.