これは機能します:
$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にリダイレクトするにはどうすればよいですか。
参考:これを機能させることができれば、「カートリンク」を使用してアイテムをカートに追加すると同時にユーザーをリダイレクトできるので、ライブがずっと簡単になります。
Drupalでのパス処理がそのジョブを実行できるように、ルートを使用することをお勧めします。custom.cart_add
が/cart/add/{page}
へのルートである場合、これは宛先を含むリダイレクト応答を返しますコントローラからのクエリパラメータ:
return $this->redirect(
'custom.cart_add',
['page' => 'p2'],
[
'query' => ['destination' => 'somewhere'],
'absolute' => TRUE,
]
);
このコードを試してください。
$path = Drupal\Core\URL::fromUserInput('/cart/add/p2', array('query' => array('SOMETHING_ELSE' => 'somewhere')))->toString();
$response = new RedirectResponse($path);
$response->send();
_$redirectURL = '/cart/add/p2';
return new RedirectResponse(base_path().$redirectURL);
_
base_path()
は常に返されるパスの末尾にスラッシュを追加するため、上記のコードはcartアイテムの前に二重スラッシュを生成します。正しく機能させるには、_$redirectURL
_変数からスラッシュを削除する必要があります。
この完全な例は役立つかもしれません:
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();