Symfony2:如何在Form类中获取配置参数

时间:2012-04-18 06:45:38

标签: symfony symfony-forms

如果我在控制器内,我可以使用:

轻松读取配置参数
$this->container->getParameter('profession');

但是当我在其他课程中,说一个Form类型时,我怎样才能掌握配置参数?

$container = new Container(); 
$container->getParameter('profession');

上述代码不应该也不起作用。

8 个答案:

答案 0 :(得分:8)

另一个类似的解决方案是让您的表单类型为服务并注入所需的参数。然后你的控制器需要做的就是获取服务。用百分号括起参数名称。

在services.xml中

    <service
        id     = "zayso_area.account.create.formtype"
        class  = "Zayso\AreaBundle\Component\FormType\Account\AccountCreateFormType"
        public = "true">
        <argument type="service" id="doctrine.orm.accounts_entity_manager" />
        <argument type="string">%zayso_core.user.new%</argument>
    </service>

如果你真的想要那么你可以注射完整的容器,尽管不鼓励。

答案 1 :(得分:5)

现在您可以使用ContainerAwareInterface:

class ContactType extends AbstractType implements ContainerAwareInterface
{
        use ContainerAwareTrait;

        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('choice_field', ChoiceType::class, [
                            'choices' => $this->container->get('yourservice')->getChoices()
                          ]);
        }
}

在services.yml中:

app.contact_type:
    class: AppBundle\Form\ContactType
    calls:
      - [setContainer, ['@service_container']]
    tags:
        - { name: form.type, alias: 'container_aware' }

答案 2 :(得分:3)

一个简单的解决方案是为您的Type提供一个新变量,用于存储config参数的值。您可以将其公开(不推荐),添加构造函数参数或使用setter:

class MyType extends AbstractType{

    private $profession;

    public function __construct($profession){
        $this->profession = $profession;
    }

    // ...

}

您可以在控制器中使用此功能:

$myType = new MyType($this->container->getParameter('profession'));
// use mytype with form

毕竟,表格根本不应该知道容器,因为你将它们系在一起,这使得很难测试或更换容器。这将违背容器的整个想法。

另一方面,使用构造函数/ setter来注入参数是相当不错的,因为你不需要知道它们在测试时的来源,可以随时改变它们的来源,如上所述,不要对容器有依赖性。

答案 3 :(得分:1)

在Symfony 4中,您应首先将表单定义为服务,然后在config/services.yaml中将适当的参数传递给它

parameters:
    locale: 'en'
    upload_dir: '%kernel.project_dir%/public/uploads/avatars'

services:
    App\Form\FilemanagerType:
        arguments: ['%upload_dir%']
        tags: [form.type]

并在你的表单类中获取参数(此处为upload dir),如下所示

class FilemanagerType extends AbstractType
{
    private $upload_dir;
    function __construct(string $upload_dir)
    {
        $this->upload_dir= $upload_dir;
    }
}

我希望它有所帮助

答案 4 :(得分:0)

您也可以使用Setter Injection。来自http://symfony.com/doc/current/book/service_container.html#optional-dependencies-setter-injection

如果你有一个类的可选依赖项,那么&#34; setter injection&#34;可能是一个更好的选择。这意味着使用方法调用而不是通过构造函数来注入依赖项。这个课程看起来像这样:

namespace AppBundle\Newsletter;

use AppBundle\Mailer;

class NewsletterManager
{
    protected $mailer;

    public function setMailer(Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    // ...
}

通过setter方法注入依赖项只需更改语法:

# app/config/services.yml
services:
    app.mailer:
        # ...

    app.newsletter_manager:
        class:     AppBundle\Newsletter\NewsletterManager
        calls:
            - [setMailer, ['@app.mailer']]

答案 5 :(得分:0)

在Symfony3中,可以这样做 -

  

在控制器

$form = $this->createForm(FormType::class, $abc, array('firstargument' => $firstargumentvalue, 'second' => $secondvalue));
  

在FormType

public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array('data_class' => abc::class, 'firstargument' => null, 'second' => null));
    }

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

        $first = $options['firstargument'];
        $second = $options['second'];
}

您可以使用

形式的上述值

答案 6 :(得分:0)

在Symfony 4.1中

services:
    # ...
    _defaults:
        bind:
            $projectDir: '%kernel.project_dir%'
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class MessageGenerator
{
    private $params;

    public function __construct(ParameterBagInterface $params)
    {
        $this->params = $params;
    }

    public function someMethod()
    {
        $parameterValue = $this->params->get('parameter_name');
        // ...
    }
}

请参阅此https://symfony.com/blog/new-in-symfony-4-1-getting-container-parameters-as-a-service

答案 7 :(得分:0)

在Symfony> = 4.1中,您只需要向表单构造函数添加ParameterBagInterface

public function __construct(ParameterBagInterface $parameterBag)
{
    $this->parameterBag = $parameterBag;
}

然后获取您的参数:

$profession = $this->parameterBag->get('profession');