如何从控制器向Symfony2服务传递可选参数?

时间:2014-03-19 15:28:07

标签: php symfony dependency-injection

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

我创建了一个验证和上传文件的模型。我最初实例化模型的方式是在我的控制器中做这样的事情。

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

然而,这似乎并非如此,而且#34; Symfony"喜欢因为有一个完整的服务层。事实上,在我运行SensioLabs Insight工具之后,它建议我不直接将验证器和请求服务直接传递给模型,而是将它们注入服务中。所以现在我的文件看起来像这样。

services.yml

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

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

UploadModel.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()函数。

1 个答案:

答案 0 :(得分:0)

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

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

你实际上并不需要有两个类,create只能返回$ this但是语义现在清楚地表明你永远不会使用uploadmodel_factory。当然,如果你真的想要,你可以创建两个类,工厂返回一个uploadmodel类。

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