簡體   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