在我的项目中,我通过作曲家包含了第三方捆绑软件,其中包含多种形式,例如:
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
的字段。
有没有一种方法可以不触及原始代码?可能我还需要更改实体以添加其他数据库字段。
或者:由于我具有对第三方捆绑软件的写权限,也许有一种方法可以允许注入字段?
答案 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
标签。
但是,这只会在已经存在的子项之后添加表单类型。您能解释一下为什么将它插入特定位置很重要吗?