Как получить параметры $POST и $GET
Я ajaxly вызываю маршрут и передаю ему данные, В моем контроллере я хочу получить $_POST['var']
, $_POST['var2']
, похоже, из-за использования HttpFoundation в drupal 8, $_POST
и $_GET
не существуют в старом методе, как я могу получить доступ к параметрам $_POST
в пользовательском контроллере?
7 answers
Из записи изменение:
$name = $_POST['name']; // form param
Становится
$name = \Drupal::request()->request->get('name'); // form param
Кстати, для GET
vars вы бы использовали:
$query = \Drupal::request()->query->get('name');
В контроллере получите запрос с аргументом с намеком на тип 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']],
];
}
}
Дополнительная информация https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes
Введите RequestStack
в свой контроллер.
Текущий запрос содержит атрибут query
, который, в свою очередь, содержит параметры GET. request
содержит параметры ЗАПИСИ.
<?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');
}
}
Вы можете проверить объект запроса, например
\Drupal::request()->getMethod();
Он вернет GET или POST или что-то еще. Если вы работаете внутри объекта, не забудьте позвонить в службу запросов.
Если вы используете Content-Type: application/json
, пожалуйста, используйте:
$post_data = json_decode( $this->request->getContent(),TRUE);
Ни один из других ответов не сработал для меня, но я нашел вот что:
$request->getContent();
Вот пример доступа к параметрам URL-адреса и передачи их в шаблон ветки, Я полагаю, что вы уже создали свой модуль и необходимые файлы и предположим, что "/test?fn=admin" - это ваш URL-адрес
- В файле .module реализуйте hook_theme и определите переменные и имя шаблона (убедитесь, что вы заменили "_" на "-" при создании файла шаблона)
function my_module_theme () { return [ 'your_template_name' => [ 'variables' => [ 'first_name' => NULL, ], ]; }
Теперь создайте свой контроллер и вставьте в него приведенный ниже код.
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"
];
}
}
Теперь в вашем Файл ВЕТКИ, который должен быть "my-template.html.twig", вы можете получить доступ к этому параметру как,
<h3>First Name: {{ first_name }}</h3>
И дело сделано. Надеюсь, это поможет.