web-dev-qa-db-fra.com

Comment faire une RedirectResponse avec un paramètre de requête de destination?

Cela marche:

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

Le problème est que je veux ceci:

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

Au moment où j'ai ajouté destination = quelque part, j'obtiens cette erreur:

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).

Cependant, si je fais cela:

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

Alors ça marche. En d'autres termes, cela casse spécifiquement si j'ajoute "destination = quelque part".

Pourquoi serait-ce une rupture avec cela et comment puis-je le contourner? C'est à dire. Comment rediriger vers une URL avec destination = quelque part dans la chaîne de requête.

FYI: Si je peux faire fonctionner cela, je peux utiliser des "Liens de panier" pour ajouter des trucs à un panier et rediriger l'utilisateur en même temps, ce qui rend ma vie beaucoup plus facile.

4
coderama

Mieux vaut utiliser une route, pour que le traitement du chemin dans Drupal puisse faire son travail. Si custom.cart_add est la route vers /cart/add/{page}, cela renvoie une réponse de redirection avec un paramètre de requête de destination à partir d'un contrôleur:

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

Essayez ce code.


$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);

Le code ci-dessus produit une double barre oblique avant l'élément cart, car base_path() ajoute toujours une barre oblique à la fin du chemin renvoyé. Vous devez supprimer la barre oblique de la variable $redirectURL Pour qu'elle fonctionne correctement.

3
ya.teck

Cet exemple complet pourrait aider:

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
Stef Van Looveren