我目前正在使用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工具之后,它建议我不直接将验证器和请求服务直接传递给模型,而是将它们注入服务中。所以现在我的文件看起来像这样。
(AE / CaseDesignBundle / Resources / config / services.yml)
ae_case_design.uploadmodel:
class: AE\CaseDesignBundle\Models\UploadModel
arguments: [ @validator, @request_stack ]
(AE / CaseDesignBundle / Models / UploadModel.php)
public function __construct($validator, $requestStack, $formName, $fileInput, $constraints = null)
{
}
(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()函数。
答案 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服务为您注入约束。这至少会消除你的一个论点。