Php Symfony 2服务如何将我自己的数据提供给我的服务?

Php Symfony 2服务如何将我自己的数据提供给我的服务?,php,symfony,Php,Symfony,好的,我在pass中设置了一些服务,但不多,所以我对它们的了解是有限的 我是这样设置的 upload: class: MyBundle\Classes\Upload arguments: [@doctrine.orm.entity_manager, %FormData] 所以我试着建立我自己的类来上传我的文件数据。我正在这样做,有很多控制器需要上传数据。我也尝试过使用,@FormData和$FormData,但仍然没有将表单数据传递到我的服务中 表单数据设置如下: // get

好的,我在pass中设置了一些服务,但不多,所以我对它们的了解是有限的

我是这样设置的

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...
    }
} 
然后把我的数据和$em传进来

这就是为什么要设置此选项的最佳原因吗


谢谢

你真的很接近。您创建的服务背后的理念是它是可重用的——因此您不希望直接将单个表单的数据注入服务的构造函数中。您希望注入的唯一内容是您可能需要的任何其他服务—在本例中是

该服务是在执行任何控制器代码之前创建的,因此无论如何都无法将表单数据传递给构造函数。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;
    }
}
您现在可以选择为表单数据创建setter,但最好将其传递给服务中的
uploadFile()
函数,如下所示:

class Upload
{
    public function uploadFile($formData)
    {
        // do something with the form data here
    }
}
然后,您只需在控制器中执行以下操作:

$this->container->get('upload')->uploadFile($form->get('file')->getData());

看起来您正试图传递formData以获取并将其注入构造函数?不是那样的。get只接受一个参数。比如:$upload=$this->get('upload')->setFormData($formData);还有一篇关于上传文件的食谱文章值得一看。@Cerad-Dam,我想我不能那样做。我想如果我可以-我应该说我正在使用Symfony 2.7:)-我尝试一下您的“setFormData”并让您知道,那就太酷了。谢谢@Cerad-抱歉,伙计,这不起作用,试图调用一个名为“setFormData”的未定义方法-我有个主意,我发布一个更新Cerad的意思是您必须创建自己的
setFormData()
函数,然后调用该函数……或者在您的情况下,只需将所需的数据传递给服务中使用该表单数据的函数就更有意义了。您正在创建的那些服务是在运行任何代码之前实例化的,因此您以后不能以您想要的方式将数据传递给它们的构造函数。是的。杰森罗曼说了些什么。就您的编辑而言,它将起作用,但这意味着您需要访问$em并记住注入它。再多玩玩就行了。最终,服务的使用将变得更加清晰。这不仅是一个很好的例子,而且非常简单。非常感谢你。。。。我使用CakePHP已经很多年了,每次我深入Symfony的时候,它都会显得更加强大。不客气!是的,一定要花一些时间来阅读文档-服务一开始看起来令人望而生畏,但它们与常规类没有什么不同,除了Symfony会根据您的配置自动为您注入其他服务。我同意您的文档,但是Symfony文档,似乎只是针对一个已经知道该做什么的人。它们很好,只是其中一些措辞有时像,什么:(-我想他们可以再举一些例子……几年前,当我学习Symfony,以前没有真正使用过任何框架时,我发现最好从他们文档的开头开始,而不仅仅是阅读文档,而是仔细阅读每一个例子,然后去做。比如,创建一个Web服务器,安装Symfony,创建一个控制器,一个服务e、 集成数据库、细枝模板等。我发现这是学习框架的最佳方式。
$this->container->get('upload')->uploadFile($form->get('file')->getData());