Symfony: как получить URL запроса в расширении формы - PullRequest
0 голосов
/ 22 ноября 2018

Есть ли какое-либо решение для получения текущего URL в расширении формы в Symfony?
Я нашел эту ссылку , но она недостаточно ясна.
Например, у меня есть этот URL "someurl / customer / update / 1"
Так что мне нужно получить этот URL, или, по крайней мере, мне нужно получить customer_id = "1" в этом URL.

Спасибо за чтение, хорошего дня


РЕДАКТИРОВАТЬ 1:
Я пытаюсь использовать решение requestStack , и получил эту ошибку:

слишком мало аргументов для функции MyCode \ Bundle \ CustomerBundle \ Form \ Extension \ AdminCustomerUserUpdateTypeExtension :: __ construct (), 0 передано в / home / www / g2 / directo / var / cache / dev / ContainerXjfz6hz /getForm_ExtensionService.php в строке 1502 и ровно 1 ожидаемый

Вот мой код:

MyCode \ Bundle \ CustomerBundle \ Form \ Extension \ AdminCustomerUserUpdateTypeExtension

class AdminCustomerUserUpdateTypeExtension extends AbstractTypeExtension
{
    protected $requestStack;

    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

    /**
     * {@inheritDoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $request = $this->requestStack->getCurrentRequest();
        var_dump($request); exit;
    }
}

services.yml

directo.form.extension.admin_customer_user_update_extension:
      class: Directo\Bundle\CustomerBundle\Form\Extension\AdminCustomerUserUpdateTypeExtension
      tags:
          - { name: form.type_extension, extended_type: 'Oro\Bundle\CustomerBundle\Form\Type\CustomerUserType' }

Я думаю, что необходимо использовать вызов некоторых аргументов в этом services.yml
Например:

directo.form.extension.admin_customer_user_update_extension:
      class: Directo\Bundle\CustomerBundle\Form\Extension\AdminCustomerUserUpdateTypeExtension
arguments:
          - '@oro_customer_user.manager'
      tags:
          - { name: form.type_extension, extended_type: 'Oro\Bundle\CustomerBundle\Form\Type\CustomerUserType' }

Могу ли я узнать, какие аргументы мне нужно импортировать?спасибо.

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

По указанной вами ссылке вы можете определить расширение формы как услугу, например:

# config/services.yaml
services:
    App\Form\Extension\SampleTypeExtension:
        tags:
            - { name: form.type_extension }

, используя это определение, вы можете внедрить RequestStack в свою службу.

Нет: если вы используете функцию автоматического подключения, вам не нужно передавать ее в качестве аргумента в службу.Если нет, вы должны передать его.

Расширение образца формы:

namespace App\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\HttpFoundation\RequestStack;

class SampleTypeExtension extends AbstractTypeExtension
{
    /** @var RequestStack */
    private $requestStack;

    public function __construct(RequestStack $requestStack) {
        $this->requestStack = $requestStack;
    }
}

Вы можете сделать это, как хотите, с $this->requestStack.

удачи.

Ссылка: https://symfony.com/doc/current/form/create_form_type_extension.html#registering-your-form-type-extension-as-a-service

0 голосов
/ 22 ноября 2018

Вместо URL я бы получил название маршрута, более надежный, вы сможете легче справляться со многими условиями.

Контроллер

public function newAction(Request $request, ExtraFunctionService $extraFunction) {
    $route=$request->attributes->get('_route');
    $form=$this->createForm(UtilisateurType::class, $utilisateur, array(
        'action'=>$this->generateUrl($route),
        'method'=>'POST',
        'data_route'=>$route, //Send route information to form
    ));
}

FormType

public function buildForm(FormBuilderInterface $builder, array $options) {
    $dataRoute=$option['data_route'];
    $builder->add();
    if($dataRoute == 'route_name_a')) {
        $builder->add();
    } else if($dataRoute == 'route_name_b') {
        $builder->add();
    } else if($dataRoute == 'route_name_c') {
        $builder->add();
    }
}

public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults(array(
        'data_class'=>'AppBundle\Entity\EntityName',
        'data_route'=>null, //Set default to null in case param is not passed
    ));
}
0 голосов
/ 22 ноября 2018

Введите RequestStack в ваш тип формы следующим образом:

protected $requestStack;

public function __construct(RequestStack $requestStack)
{
    $this->requestStack = $requestStack;
}

И чтобы получить текущий запрос, вы можете использовать это:

$request = $this->requestStack->getCurrentRequest();

Подробнее об этом можно прочитать вДокументы Symfony: https://symfony.com/doc/current/service_container/request.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...