无法在冻结的ParameterBag上调用set()

时间:2013-03-12 14:59:17

标签: symfony

在我的config.yml中,我有这个:

parameters:
    gitek.centro_por_defecto: 1

现在,我想使用表单从控制器更改此值,如下所示:

public function seleccionAction(Request $request)
{
  $entity  = new Centro();
  $form = $this->createForm(new SeleccionType(), $entity);
  $centro = $this->container->getParameter('gitek.centro_por_defecto');

  if ($this->getRequest()->getMethod() == 'POST') {
    $form->bind($this->getRequest());
    if ($form->isValid()) {
      $miseleccion = $request->request->get('selecciontype');
      $this->container->setParameter('gitek.centro_por_defecto', $miseleccion['nombre']);

      // return $this->redirect($this->generateUrl('admin_centro'));
    }
  }

  return $this->render('BackendBundle:Centro:seleccion.html.twig', array(
    'entity' => $entity,
    'form'   => $form->createView(),
    ));
}

我一直收到Impossible to call set() on a frozen ParameterBag.错误。 任何帮助或线索?

2 个答案:

答案 0 :(得分:7)

编译后,您无法修改Container,这是在调用控制器之前完成的。

DIC参数用于配置目的 - 不是全局变量的替代。此外,您似乎希望坚持某种永久性修改。在这种情况下,考虑使用会话,如果它是每用户修改或持久化(例如进入DB),如果它应该是应用程序范围。

如果需要修改DIC参数或服务,可以使用编译器传递来完成。有关如何编写自定义编译器传递的更多信息,请访问: http://symfony.com/doc/master/cookbook/service_container/compiler_passes.html

答案 1 :(得分:0)

您可以设置$ _ENV变量并在之后获取它

putenv("VAR=1");

并获得

getenv("VAR");