4

その目的はform[id=thisAwesomeRemoteForm][action=#]、リモート Web サイトにデータを入力することです。入力するフィールド ( ) は 1 つだけinput[name=awesomeField]で、フォームを送信する必要があります。最終的な要件として、リモート Web サイトでフォームを送信したかのように、ユーザーを私の Web サイトからこのリモート Web サイトにリダイレクトする必要があります。

簡単に言えば、ユーザーが私のリンクをクリックし、PHP にジョブを実行させ、リモート Web サイトでフォームに入力して送信したかのように、このリモート Web サイトにリダイレクトできるようにする必要があります。ユーザーが自分でリモートフォームに入力する必要はありません。

これまでのコードは次のとおりです。

use Goutte\Client;
// ...
public function gotoAction($data)
{
    $client = new Client();
    $crawler = $client->request('GET', self::MY_URL);

    $form = $crawler->filter('form[id=thisAwesomeRemoteForm]')->form();

    $form->setValues(array('awesomeField' => $data));
    $crawler = $client->submit($form);

    return $this->redirect($form->getUri());
}

これまでのところ、がつながるはずformの場所ではなく、 が存在する最初の URL にリダイレクトされます。formただし、フィールドには適切なデータが入力されています。

私のコードは私の目的を達成するのに正しいですか (したがって、JavaScript を使用してフォームなどを送信するのはリモート Web サイトです)、それともかなり明らかな何かが欠けていますか?

4

1 に答える 1

1

Goutte は概して、Guzzle のSymfony\BrowserkitAPI へのアダプターです。Goutte\Clientのソースコードの大まかな分析に基づいて、effectiveUrl()使用または引き継がれません。これは、リダイレクトが発生した場合、「それを拾う」ことができないことを意味します。

次のコード スニペットを使用して、基本コンポーネント (Guzzle、DomCrawler) を使用して同じ機能を簡単に実行できます。

$client = new GuzzleHttp\Client([
    'debug' => true, // only to troubleshoot
);

// Obtain the html page with the form
$request = $client->createRequest('GET', $url);
$response = $client->send($request);
// or $response = $client->get($url);

// create crawler and obtain the form.
$crawler = new Symfony\Component\DomCrawler\Crawler(null, $response->getEffectiveUrl());
$crawler->addContent(
    $response->getBody()->__toString(),
    $response->getHeader('Content-Type')
);

$form = $crawler->form('form_identifier');
$form->setValues($data_array);

//form submission
$request = $client->createRequest(
    $form->getMethod(),
    $form->getUrl(),
    [
        'body' => $form->getPhpValues(),
]);

$response = $client->send($request);
于 2015-04-30T14:25:44.970 に答える