web-dev-qa-db-ja.com

宛先クエリパラメータを使用してRedirectResponseを実行する方法

これは機能します:

$redirectURL = '/cart/add/p2';
return new RedirectResponse(base_path().$redirectURL);

問題は、これが欲しい:

$redirectURL = '/cart/add/p2?destination=somewhere';

Destination = somewhereを追加した瞬間、次のエラーが発生します。

InvalidArgumentException: The internal path component 'http://localhost/XXXX/public_html/XXXX/XXXX' is invalid. Its path component must have a leading slash, e.g. internal:/foo. in Drupal\Core\Url::fromInternalUri() (line 404 of C:\ampps\www\XXXX\public_html\core\lib\Drupal\Core\Url.php).

ただし、これを行うと:

$redirectURL = '/cart/add/p2?SOMETHING_ELSE=somewhere';

その後、動作します。言い換えると、「destination = somewhere」を追加すると、特に壊れます。

なぜこれがうまくいかず、どうすれば回避できますか?つまりクエリ文字列のどこかにdestination = somewhereを含むURLにリダイレクトするにはどうすればよいですか。

参考:これを機能させることができれば、「カートリンク」を使用してアイテムをカートに追加すると同時にユーザーをリダイレクトできるので、ライブがずっと簡単になります。

4
coderama

Drupalでのパス処理がそのジョブを実行できるように、ルートを使用することをお勧めします。custom.cart_add/cart/add/{page}へのルートである場合、これは宛先を含むリダイレクト応答を返しますコントローラからのクエリパラメータ:

  return $this->redirect(
    'custom.cart_add',
    ['page' => 'p2'],
    [
      'query' => ['destination' => 'somewhere'],
      'absolute' => TRUE,
    ]
  );
7
4k4

このコードを試してください。


$path = Drupal\Core\URL::fromUserInput('/cart/add/p2', array('query' => array('SOMETHING_ELSE' => 'somewhere')))->toString();
$response = new RedirectResponse($path);
$response->send();
4
Jeetendra Kumar
_$redirectURL = '/cart/add/p2';
return new RedirectResponse(base_path().$redirectURL);
_

base_path()は常に返されるパスの末尾にスラッシュを追加するため、上記のコードはcartアイテムの前に二重スラッシュを生成します。正しく機能させるには、_$redirectURL_変数からスラッシュを削除する必要があります。

3
ya.teck

この完全な例は役立つかもしれません:

use Symfony\Component\HttpFoundation\RedirectResponse;

$target = 65; // a parameter you want to add
$url = Url::fromUri('internal:/node/add/page'); // choose a path
$link_options = array(
  'attributes' => array(
     'class' => array(
        'btn',
     ),
   ),
   'query' => array(
     'target' => $target
   )
);
$url->setOptions($link_options);
$destination = $url->toString();

$response = new RedirectResponse($destination);
$response->send();
2