J'appelle un itinéraire et lui transmets des données, Dans mon contrôleur, je veux obtenir $_POST['var']
, $_POST['var2']
, il semble en raison de l'utilisation de HttpFoundation dans drupal 8, $_POST
et $_GET
n'existe pas dans l'ancienne méthode, comment accéder à $_POST
paramètres dans le contrôleur personnalisé?
À partir de modifier l'enregistrement :
$name = $_POST['name']; // form param
devient
$name = \Drupal::request()->request->get('name'); // form param
Par ailleurs, pour GET
vars, vous utiliseriez:
$query = \Drupal::request()->query->get('name');
Dans un contrôleur, obtenez la demande avec un argument de type _ Request $request
:
<?php
namespace Drupal\mymodule\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\Request;
class ExampleController extends ControllerBase {
/**
* Controller to return a POST or a GET parameter.
*/
public function action(Request $request) {
// get your POST parameter
$foo = $request->request->get('foo');
// or get your GET parameter
$foo = $request->query->get('foo');
return ['#markup' => $foo];
}
}
Plus d'informations https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes
Injectez le RequestStack
dans votre contrôleur.
La demande actuelle contient l'attribut query
qui à son tour contient les paramètres GET. request
contient les paramètres POST.
<?php
namespace Drupal\example_module\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* An example controller.
*/
class ExampleController extends ControllerBase {
/**
* @var Symfony\Component\HttpFoundation\RequestStack
*/
private $requestStack;
/**
* Constructor.
*
* @param Symfony\Component\HttpFoundation\RequestStack $request_stack
*/
public function __construct(RequestStack $request_stack) {
$this->requestStack = $request_stack;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('request_stack')
);
}
/**
* {@inheritdoc}
*/
public function action() {
// Get your GET parameter here.
$this->requestStack->getCurrentRequest()->query->get('foo');
}
}
Vous pouvez vérifier l'objet Request comme
\Drupal::request()->getMethod();
il retournera GET ou POST ou autre chose. Si vous travaillez à l'intérieur d'un objet, pensez à DI le service Request.
Si vous utilisez Content-Type: application/json
veuillez utiliser :
$post_data = json_decode( $this->request->getContent(),TRUE);
Aucune des autres réponses n'a fonctionné pour moi, mais j'ai trouvé que cela fonctionnait:
$request->getContent();
Voici l'exemple d'accès aux paramètres d'URL et de les transmettre à un modèle TWIG, je considère que vous avez déjà créé votre module et les fichiers requis et supposez que "/ test? Fn = admin" est votre URL
function my_module_theme () { return [ 'your_template_name' => [ 'variables' => [ 'first_name' => NULL, ], ]; }
Créez maintenant votre contrôleur et insérez-y le code ci-dessous.
namespace Drupal\my_module\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\Request;
class MyModule extends ControllerBase {
public function content(Request $request) {
return [
'#theme' => 'my_template',
'#first_name' => $request->query->get('fn'), //This is because the parameters are in $_GET, if you are accessing from $_POST then use "request" instead "query"
];
}
}
Maintenant, dans votre fichier TWIG qui devrait être "my-template.html.twig", vous pouvez accéder à ce paramètre en tant que,
<h3>First Name: {{ first_name }}</h3>
Et c'est fait. J'espère que cela t'aides.