首页 文章

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

提问于
浏览
2

我目前正在使用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 ]

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');

The question I have now is how can I pass the remaining 3 arguments (2 strings and 1 array) to the 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

    更改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服务为您注入约束 . 这至少会消除你的一个论点 .

相关问题