I ajaxly call a route and pass data to it, In my controller, I want to get $_POST['var']
, $_POST['var2']
, it seems because of using HttpFoundation in drupal 8, $_POST
and $_GET
are not exists in old method, How I can access $_POST
parameters in custom Controller?
-
2$_POST still exists, you just shoudn't use it directly. If $_POST is empty, then the request object will also be empty and your error happens earlier. Often, this is for example because mod_rewrite is not enabled/configured correctly and the page is redirect through the not found directive, which drops post data. – Berdir Jul 14 '16 at 17:44
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');
-
2thanks, and do you know how can I get all items? I mean $_POST completely not one item. – Yuseferi Jul 14 '16 at 9:59
-
4I haven't checked, but knowing Symfony I'd assume:
\Drupal::request()->request->all()
– Clive♦ Jul 14 '16 at 10:02 -
3Thanks, this is true answer to my question although I didn't get expected result ( maybe there is a problem in another place ,I ask it in another question. – Yuseferi Jul 14 '16 at 10:08
-
2I can confirm that you can use \Drupal::request()->query->all() to get all $_GET variables. – oknate Jul 13 '17 at 14:26
-
1Request should be like this $name = \Drupal::request()->get('name'); // form param – Srikanth Jun 1 '20 at 10:11
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 [
'#markup' => $foo,
'#cache' => ['contexts' => ['url.query_args:foo']],
];
}
}
More info https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes
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');
}
}
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.
If you are using Content-Type: application/json
please use :
$post_data = json_decode( $this->request->getContent(),TRUE);
None of the other answers worked for me but I found this that did:
$request->getContent();
Here's the example of accessing URL parameters and passing them to a TWIG template, I am considering you have already created your module and required files and suppose "/test?fn=admin" is your URL
- 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 below 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"
];
}
}
Now in your TWIG file which should be "my-template.html.twig" you can access this parameter as,
<h3>First Name: {{ first_name }}</h3>
And its done. Hope this helps.