Symfony 2服务如何将我自己的数据输入我的服务?

时间:2016-02-08 15:07:04

标签: php symfony

好的,我在通行证中设置了一些服务,但并不多,所以我对它们的了解有些限制。

我已经这样设置了,

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?

这是最好的原因吗?

由于

1 个答案:

答案 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());