好的,我已经在通行证中设置了一些服务,但并不多,所以我对它们的了解是有限的。
我已经这样设置了,
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...
}
}
是的,我正在将"实体管理器"命名空间加载到我的类中......
那么,为什么我的$this->data
不包含传递给它的表单数据呢?
注1:这是我正在做的var_dump()
,它只是显示$FormData
或@FormData
。
所有帮助最受欢迎...
谢谢。
更新
我的想法是把它设置为一个普通的班级,
$UploadData = new Upload($Data, $em);
然后传入我的数据,然后传递$em?
这是设置这个的最佳原因吗?
谢谢
你真的很接近。 您创建的服务背后的想法是它是可重用的 - 因此您不希望直接在服务的构造函数中注入单个表单的数据。 您唯一想要注入的是您可能需要的任何其他服务 - 在本例中为 Doctrine 实体管理器。
该服务是在执行任何控制器代码之前创建的,因此无论如何都无法将表单数据传递给构造函数。 Symfony使用依赖注入来为你完成所有繁重的工作,传递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;
}
}
现在,您可以选择为表单数据创建资源库,但最好将其传递给服务中的uploadFile()
函数,如下所示:
class Upload
{
public function uploadFile($formData)
{
// do something with the form data here
}
}
然后,您只需在控制器中执行以下操作:
$this->container->get('upload')->uploadFile($form->get('file')->getData());