I call a route via AJAX and pass data to it. In a controller, I want to get $_POST['var']
, but it does seem to work on Drupal 8.
How I can get values contained in $_POST
from a controller?
From the change record:
$name = $_POST['name']; // form param
becomes
$name = \Drupal::request()->request->get('name'); // form param
Incidentally, for GET
vars, you would use:
$query = \Drupal::request()->query->get('name');
\Drupal::request()->request->all()
In a controller get the request with a type-hinted argument 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');
// POST requests are not cached, but for GET you need a cache context
return [
'#plain_text' => $foo,
'#cache' => ['contexts' => ['url.query_args:foo']],
];
}
}
More info https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes
Use #plain_text to escape the input data for HTML output. See https://www.drupal.org/node/2559263
Inject the RequestStack
into your controller.
The current request contains the query
attribute that in turn contains the GET parameters. request
contains the POST parameters.
<?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');
}
}
If you are using Content-Type: application/json
please use :
$post_data = json_decode( $this->request->getContent(),TRUE);
You can check the Request object like
\Drupal::request()->getMethod();
it will returns GET or POST or whatever. If you are working inside an object, remember to DI the Request service.
None of the other answers worked for me but I found this that did:
$request->getContent();
$request
you mean \Drupal::request()
. Any help would be appreciated.
This is an example for accessing URL parameters and passing them to a template. I am assuming you have already created your module and required files and that /test?fn=admin is the path your module is using.
In Your .module file implement hook_theme()
and define variables and template name. (Make sure you replace _ with - when creating the template file.)
function my_module_theme () {
return [
'your_template_name' => [
'variables' => [
'first_name' => NULL,
],
],
];
}
Now create your controller and put the following code in it.
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"
];
}
}
In template file, which should be my-template.html.twig, you can access this parameter as <h3>First Name: {{ first_name }}</h3>
.
_POST, _REQUEST
...) are empty (except forREQUEST[session]
) and\Drupal::request->request->all()
and all other combinations (->query ; ->get($name)
) return empty arrays or variables.