gpt4 book ai didi

php - 编译错误 : Cannot declare class because the name is already in use

转载 作者:行者123 更新时间:2023-12-04 16:29:08 28 4
gpt4 key购买 nike

我正在将网站从 symfony 2.6 迁移到 3.4,但在注册表和 FOSUserBundle 方面遇到了一些问题。我有这个错误弹出。我检查了他的代码,在他的 src\Pix\UserBundle\Form\RegistrationFormType.php 下看到了另一个文件夹“Type”,其中有一个同名的文件:“RegistrationFormType.php”
我尝试使用从那里获取的最新样式修改表单:https://github.com/symfony/symfony/blob/2.8/UPGRADE-2.8.md#form
应用程序/配置/配置.yml:

fos_user:
db_driver: orm
firewall_name: main
user_class: Pix\UserBundle\Entity\User
registration:
form:
type: Pix\UserBundle\Form\RegistrationFormType
validation_groups: [ pix_registration, Default ]
Pix/UserBundle/Resources/config/services.yml下的服务文件
services:
pix_userbundle_registrationformtype:
class: Pix\UserBundle\Form\Type\RegistrationFormType
arguments: ["%fos_user.model.user.class%"]
tags:
- { name: form.type }
Pix/UserBundle/Form/RegistrationFormType.php:
namespace Pix\UserBundle\Form;

use FOS\UserBundle\Form\Type\RegistrationFormType as BaseRegistrationFormType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;


class RegistrationFormType extends AbstractType
{

public function __construct($class = "User")
{
parent::__construct($class);
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);

$builder
->add('username', 'text', array(
'label' => 'Pseudonyme',
))
->add('email', 'text', array(
'label' => 'Adresse mail',
))
->add('plainPassword', 'repeated', array(
'type' => 'password',
'first_options' => array('label' => 'Mot de passe'),
'second_options' => array('label' => 'Confirmation'),
'invalid_message' => 'Mot de passe incorrect',
))
->add('enabled', 'checkbox', array(
'label' => "Activé",
'required' => false
))

->add('firstname', 'text', array(
'label' => 'Prénom',
))
->add('lastname', 'text', array(
'label' => 'Nom',
))
->add('phone', 'text', array(
'label' => 'Téléphone',
))
->add('street', 'text', array(
'label' => "Adresse postale",
'required' => true
))
->add('number', 'text', array(
'label' => "Numéro d'adresse",
'required' => true
))
->add('npa', 'text', array(
'label' => "Code postal",
'required' => true
))
->add('city', 'text', array(
'label' => "Ville",
'required' => true
))
->add('state', 'text', array(
'label' => "Canton",
'required' => true
))
->add('country', 'text', array(
'label' => "Pays",
'required' => true
))
->add('latitude', 'text', array(
'label' => "Latitude",
'required' => true
))
->add('longitude', 'text', array(
'label' => "Longitude",
'required' => true
))
->add('code', 'text', array(
'label' => 'Code de parrainage',
'required' => false
))
->add('pro', 'choice', array(
'label' => "Professionel",
'choices' => array(
true => 'Oui',
false => 'Non',
),
'expanded' => false,
'multiple' => false,
'required' => true
))

->add('iban', 'text', array(
'label' => 'IBAN',
'required' => false
))
->add('distance', 'text', array(
'label' => "Rayon d'intervention",
'required' => false
))
->add('picture', new DocumentType(), array('required' => false))
->add('curriculum', new DocumentType(), array('required' => false))
->add('motivation', new DocumentType(), array('required' => false))
->add('document', new DocumentType(), array('required' => false))
;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Pix\UserBundle\Entity\User'
));
}
public function getParent()
{
return BaseRegistrationFormType::class;
}
public function getBlockPrefix()
{
return 'pix_userbundle_registrationformtype';
}
}

最后是 Pix/UserBundle/Form/Type/RegistrationFormType.php:
namespace Pix\UserBundle\Form\Type;

use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use FOS\UserBundle\Form\Type\RegistrationFormType;
use Symfony\Component\Form\AbstractType;
use Pix\UserBundle\Form\DocumentType;
use Pix\UserBundle\Entity\AbilityRepository;
use Symfony\Component\Form\Extension\Core\Type\TextType;

class RegistrationFormType extends AbstractType
{

public function __construct($class = "User")
{
parent::__construct($class);
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder->remove('username');
$builder
->add('firstname', TexType::class, array(
'label' => 'Prénom',
))
->add('lastname', TexType::class, array(
'label' => 'Nom',
))
->add('phone', TexType::class, array(
'label' => 'Téléphone',
))
->add('street', 'hidden')
->add('number', 'hidden')
->add('npa', 'hidden')
->add('city', 'hidden')
->add('state', 'hidden')
->add('country', 'hidden')
->add('latitude', 'hidden')
->add('longitude', 'hidden')
->add('code', TexType::class, array(
'label' => 'Code de parrainage',
'required' => false
))
/*
->add('contact', 'choice', array(
'label' => 'Moyen de contact favorisé',
'choices' => array(
true => 'Par téléphone',
false => 'Par e-mail',
),
'expanded' => true,
'multiple' => false,
'required' => true
))
*/
->add('pro', 'choice', array(
'label' => false,
'choices' => array(
true => 'Oui',
false => 'Non',
),
'expanded' => false,
'multiple' => false,
'required' => true
))

->add('iban', TexType::class, array(
'label' => 'IBAN',
'required' => false
))
->add('distance', TexType::class, array(
'label' => "Rayon d'intervention",
'required' => false
))
->add('picture', new DocumentType(), array('required' => false))
->add('curriculum', new DocumentType(), array('required' => false))
->add('motivation', new DocumentType(), array('required' => false))
->add('document', new DocumentType(), array('required' => false))

->add('abilities', 'entity', array(
'label' => 'Domaines de compétence',
'attr' => array(
'class'=>'form-control multiselect'
),
'class' => 'PixUserBundle:Ability',
'property' => 'title',
'multiple' => true,
'expanded' => true,
'required' => false,
'query_builder' => function(AbilityRepository $er) {
return $er->getAbilities();
},
))
->add('condition', 'checkbox', array('label' => "J'ai lu et j'accepte les conditions générales."))
;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Pix\UserBundle\Entity\User',
'intention' => 'registration'
));
}
public function getBlockPrefix()
{
return 'pix_userbundle_registrationformtype';
}
public function getParent()
{
return RegistrationFormType::class;
}
}

最佳答案

这主要是由于您的 import 或 use 语句与您定义的类同名:

use FOS\UserBundle\Form\Type\RegistrationFormType;

class RegistrationFormType extends AbstractType
{

例如拿这个代码:
namespace foo{

class class1{

}

}
namespace bar{
//use foo\class1;

class class1{

}
}

Sandbox

这工作正常并且不会产生错误(正如预期的那样),但是如果您取消注释此行:
use foo\class1;

输出
<br />
<b>Fatal error</b>: Cannot declare class bar\class1 because the name is already in use in <b>[...][...]</b> on line <b>14</b><br />

Sandbox

我们应该同意上面的例子大致等同于你正在做的事情(它是)。

所以基本上发生的事情是你定义这个使用语句:
use FOS\UserBundle\Form\Type\RegistrationFormType; 

允许你使用这个类 RegistrationFormType没有命名空间,但由于您还定义了相同的类名,因此会出现错误(请参阅下面的歧义)。

你可以给它起别名,像这样:
 use FOS\UserBundle\Form\Type\RegistrationFormType as FOSRegistrationFormType;

然后,当您需要该命名空间中的某些内容时,您只需使用 FOSRegistrationFormType .也就是说,您使用它的唯一地方(也许)是这种方法:
public function getParent()
{
return RegistrationFormType::class;
}

我说“也许”是因为它是这样的 暧昧 .我不知道你是否想要名为 RegistrationFormType 的当前对象的类或者如果你想要 FOS\UserBundle\Form\Type\RegistrationFormType::class . PHP 也不知道这一点。如果它是对象的类,那么只需执行 __CLASS__并删除 use声明。如果它是另一个(或者你在我看不到的地方需要那个类),那么只需将它别名并执行 FOSRegistrationFormType::class .

我同意这个错误信息可能会更好,它应该类似于使用类名 RegistrationFormType是模棱两可之类的。但事实并非如此,所以我们必须处理它......这个问题让我绊倒了几次,这就是为什么我基本上立即意识到了这一点。

我将分享对我的简单沙箱代码的最后修改:
namespace foo{

class class1{

}

}
namespace bar{
use foo\class1 as f;

class class1{
public function test(){
echo f::class;
}
}

(new class1)->test();
}

输出
 foo\class1

Sandbox

显然使用比 f 更详细的别名但是,这显示了如何为它设置别名,然后从别名中获取类,类似于您的代码所做的。

PS 虽然它很丑,但如果你只使用它一次,没有理由你不能只使用完全限定名称(命名空间/类),只要确保有一个前导 \ (想想相对路径是如何工作的)如:
  \FOS\UserBundle\Form\Type\RegistrationFormType::class

希望能帮助到你。

关于php - 编译错误 : Cannot declare class because the name is already in use,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55464088/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com