繁体   English   中英

如何使用symfony2表单在远程API上发送表单

[英]How to send a form on a distant API using symfony2 forms

我在symfony2项目中捆绑了一个软件包,以处理用于将文件保存在云中的所有Web服务(例如Amazon S3)。 其中一些Web服务允许直接在其服务器上发送文件,而无需将我的文件用于以下形式:

<form action="api.thecloud.com/specificId?redirectUrl=MyUrlToGetTheResponse" >
    <input type="file" name="file" />
    <input type="submit" />
</form>

给定的redirectUrl参数允许我从上载获取信息并将其保存在数据库中。

我的问题是,我想使它对其他捆绑包透明且可自定义,例如使用标准的symfony表单类型。 有一个好的方法吗?

我发现的解决方案有点复杂,我认为有一种更干净的方法可以做到这一点:

我创建一个指定操作网址的表单类型:

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('file', 'file');
    $builder->add('otherPostUploadInformation', 'hidden');
    $builder->setAction( $this->Cloudservice->generateUploadUrl( 'my_redirect_url' ) ) ;
}
public function getName(){
    return '';
}

动作路线以其他方式(php或twig函数)给出,并保存在会话中。

在my_redirect_url的操作中,我从Web服务获取并保存信息,然后重定向到session中保存的操作:

    public function myRedirectUrlAction() {

        $request = $this->getRequest() ;

        // Recreate a form with received information
        $rsrc = new CloudUploadRessource( $request->query->get( 'id' ), $request->query->get( 'url' ) );
        $form = $this->createForm(new CloudUploadType(), $rsrc );

        // transform it to array and add it to the request like if it has been posted
        $formArray = $this->transformFormArray( $form->createView() ) ;
        $request->request->add( $formArray);

        // redirect to the client action url with the request
        // So he can do $form->bind($request); $form->isValid(); ... 
        $clientActionRoute = $request->getSession()->get( 'clientActionRoute' ) ;
        return $this->forward($clientActionRoute, array('request' => $request ) );
    }

谢谢

对于我来说,使用这种方法(将文件直接上传到第三方资源)有点奇怪。 您为什么不只使用捆绑包: https : //github.com/KnpLabs/KnpGaufretteBundle 您可以根据需要配置任意数量的适配器。 但是在这种情况下,您只需更改test / dev env的addapters配置就可以测试整个应用程序/项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM