forms - Symfony2 - 在包外使用奏鸣曲字段类型

标签 forms symfony sonata-admin sonata form-fields

我希望有好看的 EntityType 用于 multiple 选择,就像 Sonata 使用 sonata_type_model (ModelType) .

问题是,如何在自定义表单上的 SonataAdminBundle 之外使用 sonata_type_model

我试过:

->add('countries', 'sonata_type_model', array(
    'label' => 'Countries',
    'property' => 'name',
    'multiple' => true
))

我也试过:

use Sonata\AdminBundle\Form\Type\ModelType;

...

->add('countries', ModelType::class, array(
    'label' => 'Countries',
    'property' => 'name',
    'multiple' => true
))

但不幸的是我得到了一个错误:

Catchable Fatal Error: Argument 1 passed to Sonata\AdminBundle\Form\ChoiceList\ModelChoiceLoader::__construct() must implement interface Sonata\AdminBundle\Model\ModelManagerInterface, null given, called in C:\xampp\htdocs\trainingexperience_symfony\app\cache\dev\classes.php on line 18005 and defined

更新

我遵循了在表单类型选项中定义 model_manager 属性的建议:

protected $modelManager;

function __construct(ModelManager $modelManager)
{
    $this->modelManager = $modelManager;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('preferredCountries', ModelType::class, array(
            'label' => 'Countries',
            'property' => 'name',
            'multiple' => true,
            'model_manager' => $this->modelManager
        ));

    ...
}

我像这样从 Controller 传递它:

/** @var ModelManager $modelManager */
$modelManager = $this->get('sonata.media.admin.media.manager');
$formType = new FormType($modelManager);

...

但是现在我得到一个错误:

Class does not exist

500 Internal Server Error - ReflectionException

堆栈跟踪

in vendor\doctrine\common\lib\Doctrine\Common\Persistence\AbstractManagerRegistry.php at line 197   -

   $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; 
        } 
        $proxyClass = new \ReflectionClass($class); 
        if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { 
            if (! $parentClass = $proxyClass->getParentClass()) { 

at ReflectionClass ->__construct ('') 
in vendor\doctrine\common\lib\Doctrine\Common\Persistence\AbstractManagerRegistry.php at line 197   + 
at AbstractManagerRegistry ->getManagerForClass (null) 
in vendor\sonata-project\doctrine-orm-admin-bundle\Model\ModelManager.php at line 272   + 
at ModelManager ->getEntityManager (null) 
in vendor\sonata-project\doctrine-orm-admin-bundle\Model\ModelManager.php at line 64   + 
at ModelManager ->getMetadata (null) 
in vendor\sonata-project\doctrine-orm-admin-bundle\Model\ModelManager.php at line 377   + 
at ModelManager ->getIdentifierFieldNames (null) 
in vendor\sonata-project\admin-bundle\Form\ChoiceList\ModelChoiceLoader.php at line 75   + 
at ModelChoiceLoader ->__construct (object(ModelManager), null, 'name', null, array(), object(PropertyAccessor)) 
in vendor\sonata-project\admin-bundle\Form\Type\ModelType.php at line 113   + 
at ModelType ->Sonata\AdminBundle\Form\Type\{closure} (object(OptionsResolver), null) 
in vendor\symfony\symfony\src\Symfony\Component\OptionsResolver\OptionsResolver.php at line 859   + 
at OptionsResolver ->offsetGet ('choice_loader') 
in vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\Type\ChoiceType.php at line 320   + 
at ChoiceType ->Symfony\Component\Form\Extension\Core\Type\{closure} (object(OptionsResolver), null) 
in vendor\symfony\symfony\src\Symfony\Component\OptionsResolver\OptionsResolver.php at line 965   + 
at OptionsResolver ->offsetGet ('choice_list') 
in vendor\symfony\symfony\src\Symfony\Component\OptionsResolver\OptionsResolver.php at line 791   + 
at OptionsResolver ->resolve (array('label' => 'Countries', 'property' => 'name', 'multiple' => true, 'model_manager' => object(ModelManager))) 
in vendor\symfony\symfony\src\Symfony\Component\Form\ResolvedFormType.php at line 156   + 
at ResolvedFormType ->createBuilder (object(FormFactory), 'preferredCountries', array('label' => 'Countries', 'property' => 'name', 'multiple' => true, 'model_manager' => object(ModelManager))) 
in vendor\symfony\symfony\src\Symfony\Component\Form\Extension\DataCollector\Proxy\ResolvedTypeDataCollectorProxy.php at line 89  + 
at ResolvedTypeDataCollectorProxy ->createBuilder (object(FormFactory), 'preferredCountries', array('label' => 'Countries', 'property' => 'name', 'multiple' => true, 'model_manager' => object(ModelManager))) 
in vendor\symfony\symfony\src\Symfony\Component\Form\FormFactory.php at line 114   + 
at FormFactory ->createNamedBuilder ('preferredCountries', 'Sonata\AdminBundle\Form\Type\ModelType', null, array('label' => 'Countries', 'property' => 'name', 'multiple' => true, 'model_manager' => object(ModelManager))) 
in vendor\symfony\symfony\src\Symfony\Component\Form\FormBuilder.php at line 106   + 
at FormBuilder ->create ('preferredCountries', 'Sonata\AdminBundle\Form\Type\ModelType', array('label' => 'Countries', 'property' => 'name', 'multiple' => true, 'model_manager' => object(ModelManager))) 
in vendor\symfony\symfony\src\Symfony\Component\Form\FormBuilder.php at line 269   + 
at FormBuilder ->resolveChildren () 
in vendor\symfony\symfony\src\Symfony\Component\Form\FormBuilder.php at line 215   + 
at FormBuilder ->getForm () 
in vendor\symfony\symfony\src\Symfony\Component\Form\FormFactory.php at line 40   + 
at FormFactory ->create (object(InternshipType), object(Internship), array()) 
in vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller.php at line 282   + 
at Controller ->createForm (object(InternshipType), object(Internship)) 
in src\IndexBundle\Controller\TraineeController.php at line 194   + 
at TraineeController ->internshipsAction (object(Request)) 
at call_user_func_array (array(object(TraineeController), 'internshipsAction'), array(object(Request))) 
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\HttpKernel.php at line 144   + 
at HttpKernel ->handleRaw (object(Request), '1') 
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\HttpKernel.php at line 64   + 
at HttpKernel ->handle (object(Request), '1', true) 
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel.php at line 69   + 
at ContainerAwareHttpKernel ->handle (object(Request), '1', true) 
in vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Kernel.php at line 185   + 
at Kernel ->handle (object(Request)) 
in web\app_dev.php at line 30   + 

最佳答案

您应该尝试为类型提供 model_manager 选项。它可能是一项服务,因此请查看 debug:container 并尝试找出它。

关于forms - Symfony2 - 在包外使用奏鸣曲字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41219684/

相关文章:

php - Doctrine Symfony - 通过原始 SQL 使用实体映射

symfony - 从 Symfony2 和 Doctrine2 定义和使用 ENUM 类型的正确方法

php - Symfony 4 Doctrine,如何从数据库中加载用户角色

symfony - SonataAdminBundle 根据用户显示仪表板 block

symfony - 使用 Sonata Admin 更新以编程方式创建的对象的 ACL

forms - 带有系统阴影的圆形形式

javascript - Vanilla JavaScript 从选择框中获取值?

symfony - 按相关实体字段对 Sonata Admin 中的 ListView 进行排序

user-interface - 您如何处理针对不同客户的表单定制?

javascript - 禁用输入字段中的符号和非字母