【问题标题】:How do you pass optional arguments to a Symfony2 service from a controller?如何将可选参数从控制器传递给 Symfony2 服务?
【发布时间】:2014-03-19 15:28:07
【问题描述】:

我目前正在使用 Symfony2 进行一个项目,遇到了一个我无法找到答案的情况。

我创建了一个用于验证和上传文件的模型。我最初实例化模型的方式是在我的控制器中执行类似的操作。

$constraints = array('maxSize'=>'1M','mimeTypes' => array('application/pdf','application/x-pdf'));
$uploadFiles = new UploadModel($this->get('validator'), $request, $editForm->getName(), 'filePaths', $constraints);

但是,这看起来不像“Symfony”,因为它有一个完整的服务层。事实上,在我运行 SensioLabs Insight 工具后,它建议我不要直接将验证器和请求服务直接传递给模型,而是将它们注入到服务中。所以现在我的文件看起来像这样。

services.yml

(AE/CaseDesignBundle/Resources/config/services.yml)

ae_case_design.uploadmodel:
    class: AE\CaseDesignBundle\Models\UploadModel
    arguments: [ @validator, @request_stack ]

上传模型.php

(AE/CaseDesignBundle/Models/UploadModel.php)

public function __construct($validator, $requestStack, $formName, $fileInput, $constraints = null)
{
}

CarrierController.php

(AE/CaseDesignBundle/Controller/CarrierController.php)

$constraints = array('maxSize'=>'1M','mimeTypes' => array('application/pdf','application/x-pdf'));
$uploadFiles = $this->get('ae_case_design.uploadmodel');

我现在的问题是如何将剩余的 3 个参数(2 个字符串和 1 个数组)传递给 UploadModel __construct? 我已经看到了一些其他示例,其中人们做了这样的事情:

$constraints = array('maxSize'=>'1M','mimeTypes' => array('application/pdf','application/x-pdf'));
$uploadFiles = $this->get('ae_case_design.uploadmodel')->init($editForm->getName(), 'filePaths', $constraints);

但对我来说,这是将非服务级别参数注入 __construct 的唯一方法似乎很奇怪,因为现在我必须在我的服务准备好使用之前运行一个 init() 函数。

【问题讨论】:

    标签: php symfony dependency-injection


    【解决方案1】:

    更改 init 以创建并假装您的上传模型是工厂。

    $uploadFiles = 
        $this->get('ae_case_design.uploadmodel_factory')->create($editForm->getName(), 
            'filePaths', $constraints);
    

    您实际上不需要有两个类, create 可以只返回 $this 但语义现在清楚地表明您永远不会单独使用 uploadmodel_factory。当然,如果你真的想要,你可以把它做成两个类,工厂返回一个上传模型类。

    此外,您还可以考虑让 ae_case_design.uploadmodel_factory.pdf 服务为您注入约束。这至少可以摆脱你的一个论点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      相关资源
      最近更新 更多