我在数据库中有很多类别。
这是类别实体
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
* @ORM\Table(name="categories")
*/
class Category
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Category")
*/
protected $rootCategory;
/**
* @ORM\Column(type="text")
*/
protected $name;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Category
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set rootCategory
*
* @param \AppBundle\Entity\Category $rootCategory
*
* @return Category
*/
public function setRootCategory(\AppBundle\Entity\Category $rootCategory = null)
{
$this->rootCategory = $rootCategory;
return $this;
}
/**
* Get rootCategory
*
* @return \AppBundle\Entity\Category
*/
public function getRootCategory()
{
return $this->rootCategory;
}
}
我想在我的编辑表单中获取所有类别
EditFormType:
namespace AppBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use AppBundle\Controller\CategoryController;
class EditPhotoFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$categoryController = new CategoryController();
$builder->add('title', 'text');
$builder->add('description', 'textarea');
$builder->add('category', EntityType::class, array(
'class' => 'AppBundle:Category',
'choices' => $categoryController->getCategories(),
));
}
public function getName()
{
return 'app_photo_edit';
}
}
getCategories()
public function getCategories() {
$em = $this->getDoctrine()->getManager();
return $em->getRepository('AppBundle:Category')->findAll();
}
我收到下一个错误:
错误:调用成员函数has()on null
那是因为控制器对象中没有Doctrine。在这种情况下,我应该在哪里获得Doctrine和Repository? 我该如何正确地做到这一点?
答案 0 :(得分:8)
首先,您应该从不自己实例化任何Controller类。 Symfony的内核使用控制器类来处理请求,并且它们会自动加载依赖项来执行此操作。
就在这里,您甚至不需要在FormType中要求EntityManager,因为EntityType
有一个内置选项query_builder
来执行您需要的操作:
$builder->add('category', EntityType::class, array(
'class' => 'AppBundle:Category',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('c');
},
);
这应该可以解决问题。 (查看here了解更多详情)
但是,如果有一天你确实需要在表单中导入依赖项(无论是EntityManager还是其他服务),请按以下步骤操作:
一个。在构造函数中导入给定的依赖项:
private $dependency;
public function __construct(Dependency $dependency)
{
$this->$dependency = $dependency;
}
B中。将您的表单声明为服务,并将您的依赖项ID作为参数:
<service id="app.form.type.edit_photo"
class="AppBundle\Form\Type\EditPhotoFormType">
<tag name="form.type" />
<argument type="service" id="app.dependencies.your_dependency" />
</service>
然后在您需要的地方使用$this->dependency
。
希望这有帮助! :)