将字段添加到第三方捆绑包的现有FormType和实体

时间:2018-08-16 22:54:15

标签: php symfony

在我的项目中,我通过作曲家包含了第三方捆绑软件,其中包含多种形式,例如:

namespace acme\ContactBundle\Form\Type;

class PersonType extends AbstractType {

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add('firstname', TextType::class, array(
                'label' => 'person.firstname'
            ))
            ->add('lastname', TextType::class, array(
                'label' => 'person.lastname'
            ));
    }
}

现在,我想在之前 firstname之前添加一个名为title的字段。

有没有一种方法可以不触及原始代码?可能我还需要更改实体以添加其他数据库字段。

或者:由于我具有对第三方捆绑软件的写权限,也许有一种方法可以允许注入字段?

2 个答案:

答案 0 :(得分:1)

我对FOSUserBundle做过同样的事情。 |

您需要创建一个控制器,该控制器将扩展第三方控制器。这样,我们可以覆盖其控制器并具有扩展功能。

我按如下所示导入了他们的控制器。

use \FOS\UserBundle\Controller\SecurityController as BaseController;

并使用BaseController扩展了MyController。您的方法名称应与第三方捆绑软件的名称相同。

class MyController extends BaseController
{
    //extending base loginActionMethod.
    public function loginAction(Request $request)
    {
         //my code
    }
}

类似的情况。

namespace acme\ContactBundle\Form\Type;

use path_to_your_third_party_formtype as BaseType;

class PersonType extends BaseType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add('title', TextType::class, array(
                'label' => 'person.title'
            ))
            ->add('firstname', TextType::class, array(
                'label' => 'person.firstname'
            ))
            ->add('lastname', TextType::class, array(
                'label' => 'person.lastname'
            ));
        }
}

您还需要照顾实体。

希望有帮助, 干杯。

答案 1 :(得分:1)

您可以创建一个form type extension,它将添加您要添加​​的字段,如下所示:

// ...
use Symfony\Component\Form\FormTypeExtensionInterface;

class TitleTypeExtension implements FormTypExtensionInterface
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('title', TextType::class);
    }

    public function getExtendedType()
    {
        return PersonType::class;
    }
}

请确保您的扩展程序已注册为服务并标记了form.type_extension标签。

但是,这只会在已经存在的子项之后添加表单类型。您能解释一下为什么将它插入特定位置很重要吗?