我想覆盖FOSUserBundle的RegistrationType形式,但是在registration_content.html.twig模板中我收到了这个错误:
属性"名字"也不是其中一种方法" firstname()"," getfirstname()" /" isfirstname()" /" hasfirstname()&# 34;或" __ call()"在课堂上存在并拥有公共访问权限#34; Symfony \ Component \ Form \ FormView"。
这是我的RegistrationType表格:
class RegistrationType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('firstname');
}
public function getParent() {
return 'fos_user_registration';
}
public function getName() {
return 'app_user_registration';
}
}
fos_user.yaml:
fos_user:
registration:
confirmation:
enabled: true
form:
name: app_user_registration
db_driver: orm
user_class: App\Entity\User
firewall_name: main
from_email:
address: foo@example.com
sender_name: bar@example.com
用户实体:
class User extends BaseUser {
//
/**
* @ORM\Column(type="string", length=50, nullable=true)
*/
protected $firstname;
}
registration_content.html.twig:
{{ form_start(form, {'method': 'post', 'action': path('fos_user_registration_register'), 'attr': {'class': 'fos_user_registration_register', 'id': 'form-sign-up'}}) }}
<div class="form-group form-group--float form-group--centered">
{{ form_widget(form.firstname, {'attr': {'class': 'form-control'}}) }}
<label>{{ 'firstname'|trans }}</label>
<i class="form-group__bar"></i>
</div>
{{ form_end(form) }}
在我的配置服务中,我已经说过:
app.form.registration:
class: App\Form\RegistrationType
tags:
- { name: form.type, alias: app_user_registration }
答案 0 :(得分:2)
我在遵循官方教程https://symfony.com/doc/current/bundles/FOSUserBundle/overriding_forms.html
时遇到了同样的问题我无法解释为什么我们遇到这个问题,但它似乎与别名有关。无论如何,我不能让它在Symfony4和Symfony 3.4中工作!
我使用以下代码来规避问题:
class RegistrationType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('firstname');
}
public function getParent() {
return 'FOS\UserBundle\Form\Type\RegistrationFormType';
}
}
然后将此行添加到您的fos_user.yaml:
fos_user:
registration:
form:
type: App\Form\Type\RegistrationType
我希望这会有所帮助,直到有人找到一种方法让它按预期工作。
答案 1 :(得分:1)
创建一个名为RegistrationFormType.php的文件并添加以下内容:
命名空间App \ Form;
使用Symfony \ Component \ Form \ AbstractType;
使用Symfony \ Component \ Form \ FormBuilderInterface;
使用FOS \ UserBundle \ Form \ Type \ RegistrationFormType作为BaseRegistrationFormType;
RegistrationFormType类扩展了AbstractType
{
公共函数buildForm(FormBuilderInterface $ builder,数组$ options) {
$builder
->add('first');
$builder
->add('last');
}
public function getParent()
{
return BaseRegistrationFormType::class;
}
}
以上内容是假设您已向用户实体添加了两个新字段,并且已经运行了Doctrine迁移以添加新字段。 提示:请将字段设置为可为空,以便您不要使用FOS命令行工具。
注册:
form:
type: App\Form\RegistrationFormType
将以下内容添加到services.yaml:
app.form.registration:
class: App\Form\RegistrationFormType
刷新您的表单,新字段将出现在表单中。
答案 2 :(得分:1)
Symfony 4.2.3 | friendsofsymfony /用户捆绑包v2.1.2
使用我们自己的类覆盖FOSUserBundle注册表单,并出于示例的目的删除“用户名”字段。
从您的symfony根目录:
mkdir ./src/Form/Type
cp ./vendor/friendsofsymfony/user-bundle/Form/Type/RegistrationFormType.php
./config/packages/fos_user.yaml
# fos_user.yaml
fos_user:
#... other configurations...
registration:
form:
type: App\Form\Type\RegistrationType
./src/Form/Type/RegistrationFormType.php
// Our specific example. edit this as you please...
<?php
namespace App\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseRegistrationFormType;
class RegistrationFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->remove('username');
}
public function getParent() {
return BaseRegistrationFormType::class;
}
}
注意: 由于我们的示例仅删除单个字段,因此我们删除了未更改的代码,并添加了以下方法以使事情保持简单:
public function getParent() {
return BaseRegistrationFormType::class;
}
getParent
方法,但是它似乎是从原始的RegistrationFormType.php
继承而来的,只是添加了在buildForm
方法中所做的更改。答案 3 :(得分:0)
就我而言,我做过与罗伯特·塞勒(Robert Saylor)相同的设计,但对此进行了编辑:
public function getBlockPrefix()
{
return 'app_user_registration';
}
对我来说很好!