Symfony:如何获取表单扩展名中的请求URL

时间:2018-11-22 12:49:11

标签: symfony url

在symfony中以表单扩展名获取当前网址是否有任何解决方案?
我发现了this link,但还不够清楚。
例如,我的网址是“ someurl / customer / update / 1”
所以我需要获取此URL,或者至少需要在该URL中获取 customer_id =“ 1”

感谢阅读,祝您有愉快的一天


编辑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 :(得分:1)

像这样将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

答案 1 :(得分:1)

您引荐的链接说您可以将表单扩展定义为服务,如下所示:

self.mapView.animate(toBearing: CLLocationDirection((self.getHeadingForDirection(fromCoordinate: self.pickUpMarker.position, toCoordinate: self.dropOffMarker.position) + 100) ))

通过该定义,您可以向服务中注入# 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; } } 随心所欲。

祝你好运。

参考链接:https://symfony.com/doc/current/form/create_form_type_extension.html#registering-your-form-type-extension-as-a-service

答案 2 :(得分:0)

我将获得路由名称,而不是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
    ));
}