0

为可能的 n00b 问题道歉,但我们开始吧。我目前正在 symfony2 中编写一个使用 ajax 收集数据的服务类。数据基本上由表单提交时发送的两个时间戳组成。然后我想要做的是将它传递给我的控制器并将其写入自定义parameters.yml 文件,以便我可以将值存储在此文件中并在每次用户提交表单时更新此文件。我收到这样的错误:

Impossible to call set() on a frozen ParameterBag

在谷歌上的一些搜索告诉我,一旦容器编译完成,我就无法修改它。特别是导致这种情况的行是:

$this->container->setParameter('quicksign.start.off', $startOff);

好的是时候展示我的代码了。这是我的控制器:

public function updateServiceSigAction() {

$logger = $this->get('logger');
$request = $this->get('request');
$errors = array();

if (WebserviceController::POST_ONLY && $request->getMethod() != 'POST') {
    $errors[] = "Not allowed !";
    return $this->sendResponse($errors);
}

$params = $request->request->all();

if (count($params) == 0) {
    $errors[] = "Missing parameters !";
    return $this->sendResponse($errors);
} else {

    $servicesig_services = $this->get('servicesigservice');
    $errors = $servicesig_services->updateServiceSig($params, false);

}

return $this->sendResponse($errors, array(), true);

}

这是我的服务类的相关方法:

public function updateServiceSig($params, $need_to_flush = true) {

$errors = array();

$startOff = $params['date_debut'];
$endOff = $params['date_fin'];

if (empty($startOff) || empty($endOff)) {
    $errors[] = "Missing parameters from query !";
} else {

    $this->container->setParameter('quicksign.start.off', $startOff);
    $this->container->setParameter('quicksign.end.off', $endOff);
}
return $errors;
}

也许我应该在编译容器之前这样做?但我不知道容器究竟是在哪里编译的......或者我应该用另一种方式......?

4

2 回答 2

3

所以这就是我完成它的方法:

use Symfony\Component\Yaml\Dumper; //I'm includng the yml dumper. Then :
$ymlDump = array( 'parameters' => array( 
   'quicksign.active' => 'On', 
   'quicksign.start.off' => $startOff, 
   'quicksign.end.off' => $endOff ), 
 );
$dumper = new Dumper(); 
$yaml = $dumper->dump($ymlDump);
$path = WEB_DIRECTORY . '/../app/config/parameters.sig.yml'; 
file_put_contents($path, $yaml);

WEB_DIRECTORY 在 app.php 文件中定义的地方 -> 但是,您应该使用

%kernel.root_dir%

在服务配置中。

于 2013-08-09T14:10:45.017 回答
2

据我了解,您使用的parameters.yml文件错误。官方文档指出:

这样做的一种用途是将值注入您的服务。这允许您在应用程序之间配置不同版本的服务,或者基于同一类但在单个应用程序中配置不同的多个服务。

因此该文件不是用于存储服务状态,而是用于配置初始状态。如果多个应用程序使用相同的源代码,您可以使用它。一个示例是暂存环境和生产环境,或者一个应用程序中的多个服务,例如需要不同连接参数的两个 ORM。话虽如此,您可能应该使用一个实体将您的时间戳存储在其中。

如果你真的需要一个文件,你可以使用例如Symfony 的 YAML 组件来管理一个自定义.yml文件。

于 2013-07-30T10:42:09.790 回答