fosuserbundle覆盖寄存器表单,并使用配置变量

时间:2015-12-16 05:54:39

标签: symfony parameters override fosuserbundle

我正在覆盖注册表并且工作正常:

services.yml
general_user.registration.form.type:
        class: General\GeneralBundle\Form\Type\RegistrationFormType
        arguments: [%fos_user.model.user.class%]
        tags:
            - { name: form.type, alias: general_user_registration }

我在config.yml中有一个变量我想从RegistrationFormType访问:

# interested in options    
profile.lookingfor: 
    - part 1
    - part 2

我读到这可以使用服务完成,所以我定义了另一个:

general_user.registration.form.type.lookingfor:
        class: General\GeneralBundle\Form\Type\RegistrationFormType
        arguments: [%profile.lookingfor%]
        tags:
            - { name: form.type, alias: general_user_registration  }

我希望能够使用以下内容从RegistrationFormType访问参数:

$lookingFor = $this->get('general_user.registration.form.type');

我不知道如何将两种服务混合在一起。现在我收到错误:

Attempted to call an undefined method named "get" of class "General\GeneralBundle\Form\Type\RegistrationFormType".
Did you mean to call e.g. "getBlockPrefix", "getName" or "getParent"?

当我注释掉来电时,我得到另一个错误:

Cannot read index "email" from object of type "...\CoreBundle\Entity\User" because it doesn't implement \ArrayAccess

2 个答案:

答案 0 :(得分:0)

将变量作为参数传递给服务的方式仅适用于参数(parameters:config.ymlparameters.yml下定义的变量)。在这种情况下,您不需要第二项服务。

要在您的服务中访问它,您只需在服务中定义构造函数参数,并将参数get自动注入为数组。

protected $lookingFor;
public function __constructor($lookingFor) {
    $this->lookingFor = $lookingFor;
}

如果你想为你的捆绑使用配置块,它会变得有点复杂。请参阅:http://symfony.com/doc/master/cookbook/bundles/configuration.html

答案 1 :(得分:0)

最后我使用了Setter Injection。来自http://symfony.com/doc/current/book/service_container.html#optional-dependencies-setter-injection

如果你有一个类的可选依赖项,那么" setter injection"可能是一个更好的选择。这意味着使用方法调用而不是通过构造函数来注入依赖项。我在RegistrationFormType

中添加了一个setter方法
protected $lookingFor;

    public function setLookingfor($lookingFor) {

        $this->lookingFor = $lookingFor;
    }

通过setter方法注入依赖项只需要添加'调用'部分:

的应用程序/配置/ services.yml

general_user.registration.form.type:
    class: General\GeneralBundle\Form\Type\RegistrationFormType
    arguments: [%fos_user.model.user.class%]
    tags:
        - { name: form.type, alias: general_user_registration }
    calls:
        - [setLookingfor, ['%profile.lookingfor%']]