Silex + Doctrine2 ORM + Dropdown(EntityType)

时间:2016-01-04 10:25:47

标签: symfony doctrine-orm silex

我有一个控制器,它呈现一个表单,假设有一个下拉列表,其标题是针对client_user实体映射的。下面是我在控制器中用来创建表单的代码:

$builder = $this->get(form.factory);
$em = $this->get('doctrine.entity_manager');

$form = $builder->createBuilder(new ClientUserType($em), new ClientUser())->getForm();

下面是我的ClientUserType类,其中包含我传递实体管理器的构造函数:

<?php

  namespace Application\Form\Type;

  use Symfony\Component\Form\AbstractType;
  use Symfony\Component\Form\FormBuilderInterface;
  use Symfony\Bridge\Doctrine\Form\Type\EntityType;

 class ClientUserType extends AbstractType
 { 
   protected $entityManager;

   public function __construct($entityManager)
   {
      $this->entityManager = $entityManager;
    }

   public function buildForm(FormBuilderInterface $builder, array $options)
   {
     $builder
       ->add('title', EntityType::class, array(
         'class' => '\\Application\\Model\\Entity\\Title',
         'em' => $this->entityManager
       ))
      ->add('name')
      ->add('surname')
      ->add('contact')
      ->add('email');
    }

  public function getName()
  {
    return 'client_user_form';
   }
}

我继续在下面收到这个可捕获的致命错误,并且不知道我需要做什么才能从带有教条的数据库中获取标题的下拉列表。

  

捕获致命错误:传递给Symfony \ Bridge \ Doctrine \ Form \ Type \ DoctrineType :: __ construct()的参数1必须是Doctrine \ Common \ Persistence \ ManagerRegistry的实例,没有给出,在D:\ web \中调用第90行的playground-solutions \ vendor \ symfony \ form \ FormRegistry.php,第111行的D:\ web \ playground-solutions \ vendor \ symfony \ doctrine-bridge \ Form \ Type \ DoctrineType.php中定义

从该错误中读取我不知道我需要在哪里创建ManagerRegistry注册表的新实例,因为它看起来实体管理器不起作用。我也想也许我需要直接从实体经理本身获得ManagerRegistry。

有人可以帮助解释最简单的方法吗?我能错过什么?

3 个答案:

答案 0 :(得分:3)

似乎没有配置doctrine-bridge表单组件 添加课程

namespace Your\Namespace;

use Doctrine\Common\Persistence\AbstractManagerRegistry;
use Silex\Application;

class ManagerRegistry extends AbstractManagerRegistry
{
    protected $container;

    protected function getService($name)
    {
        return $this->container[$name];
    }

    protected function resetService($name)
    {
        unset($this->container[$name]);
    }

    public function getAliasNamespace($alias)
    {
        throw new \BadMethodCallException('Namespace aliases not supported.');
    }

    public function setContainer(Application $container)
    {
        $this->container = $container;
    }
}

并配置doctrine-bridge表单组件

$application->register(new Silex\Provider\FormServiceProvider(), []);

$application->extend('form.extensions', function($extensions, $application) {
    if (isset($application['form.doctrine.bridge.included'])) return $extensions;
    $application['form.doctrine.bridge.included'] = 1;

    $mr = new Your\Namespace\ManagerRegistry(
        null, array(), array('em'), null, null, '\\Doctrine\\ORM\\Proxy\\Proxy'
    );
    $mr->setContainer($application);
    $extensions[] = new \Symfony\Bridge\Doctrine\Form\DoctrineOrmExtension($mr);

    return $extensions;
});

array('em') - em是$application

中实体经理的关键

答案 1 :(得分:1)

对于可能会发现此问题的其他用户:如果您想使用EntityType而根本不使用框架,则需要将DoctrineOrmExtension添加到FormFactoryBuilder中,例如所以:

$managerRegistry = new myManagerRegistry(
    'myManager',
    array('connection'),
    array('em'),
    'connection',
    'em',
    \Doctrine\ORM\Proxy\Proxy::class
);

// Setup your Manager Registry or whatever...

$doctrineOrmExtension = new DoctrineOrmExtension($managerRegistry);
$builder->addExtension($doctrineOrmExtension);

使用EntityType时,将调用myManagerRegistry#getService($name)$name是它需要的服务的名称(“ em”或“连接”),它需要分别返回Doctrine实体管理器或Doctrine数据库连接。

答案 2 :(得分:0)

在你的控制器中,尝试调用这样的服务:

$em = $this->get('doctrine.orm.entity_manager');

希望它会对你有所帮助。

编辑:

对不起,我以为你在Symfony上......我读得太快了......