好的,我在通行证中设置了一些服务,但并不多,所以我对它们的了解有些限制。
我已经这样设置了,
upload:
class: MyBundle\Classes\Upload
arguments: [@doctrine.orm.entity_manager, %FormData]
所以我尝试设置自己的类来上传我的文件数据。我这样做有很多控制器需要上传数据。我还尝试过使用@FormData
和$FormData
,但仍未将表单数据传递到我的服务中?
表格数据的设定如下:
// getting just the file non mapped, form element
$FormData = $form->get('file')->getData();
这是我在控制器中调用它的方式,
$this->get('upload', $FormData)
然而,FormData
似乎总是转储变量名,而不是将数据传递到我的类中。
所以我的Upload
课程设置如下:
class Upload
{
private $Data;
public function __construct(EntityManager $em, $Data) {
$this->em = $em;
$this->data = $Data; <-*Note 1
}
public function UploadFile() {
// ...do something and save path/data into File Entity...
}
}
是的,我正在将'EntityManager'命名空间加载到我的班级......
那么为什么我的$this->data
不包含传递给它的表单数据?
注意1:这就是我在var_dump()
上进行的操作,它只显示$FormData
或@FormData
。
欢迎所有人帮助......
感谢。
我在想的是将它设置为普通类,如
$UploadData = new Upload($Data, $em);
传递我的数据,然后传递$ em?
这是最好的原因吗?
由于
答案 0 :(得分:2)
你真的很亲密。您创建的服务背后的想法是它可重用 - 因此您不希望直接在服务的构造函数中注入单个表单的数据。您要注入的唯一内容是您可能需要的任何其他服务 - 在这种情况下,Doctrine entity manager。
该服务是在执行任何控制器代码之前创建的,因此无论如何都无法将表单数据传递给构造函数。 Symfony使用dependency injection为您完成所有繁重的工作,传入Doctrine实体管理器,因此您不必手动执行此操作,就像您尝试的那样。因此,您的服务定义将会简化:
upload:
class: MyBundle\Classes\Upload
arguments: ["@doctrine.orm.entity_manager"]
您的服务定义也得到了简化:
use Doctrine\Orm\EntityManager;
class Upload
{
private $em;
public function __construct(EntityManager $em) {
$this->em = $em;
}
}
您现在可以选择为表单数据创建一个setter,但最好将它传递给服务中的uploadFile()
函数,如下所示:
class Upload
{
public function uploadFile($formData)
{
// do something with the form data here
}
}
然后您只需在控制器中执行以下操作:
$this->container->get('upload')->uploadFile($form->get('file')->getData());