Symfony从表单类型的实体创建选择

时间:2016-02-22 10:17:32

标签: php symfony doctrine-orm

我在数据库中有很多类别。

这是类别实体

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? 我该如何正确地做到这一点?

1 个答案:

答案 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

希望这有帮助! :)