对可能的n00b问题道歉但是我们走了。我目前正在symfony2中编写一个服务类,它使用ajax收集数据。数据基本上由表单提交时发送的两个时间戳组成。我当时想要做的是将它传递给我的控制器并将其写入自定义的parameters.yml文件,这样我就可以将值存储在此文件中,并在每次用户提交表单时更新此文件。我收到这样的错误:
Impossible to call set() on a frozen ParameterBag
Google上的一些搜索告诉我,一旦编译完成后我就无法修改它。引起这种情况的特别是:
$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;
}
也许我应该在编译容器之前这样做?但我不知道容器的编译位置到底在哪里...... 或许我应该以另一种方式做到这一点......?
答案 0 :(得分: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);
在app.php文件中定义了WEB_DIRECTORY - >但是,你应该使用
%kernel.root_dir%
在服务配置中。
答案 1 :(得分:2)
据我了解,您使用的parameters.yml
文件错误。 The official documentation州:
这样做的一个用途是将值注入您的服务。这允许您在应用程序或基于相同类的多个服务之间配置不同版本的服务,但在单个应用程序中配置不同。
因此,文件不是用于存储服务状态,而是用于配置初始状态。如果多个应用程序使用相同的源代码,则使用它。一个示例是 staging 和 production 环境,或一个应用程序中的多个服务,例如需要不同连接参数的两个ORM。有了这个说你应该使用entity来存储你的时间戳。
如果真的需要一个文件,你可以使用,例如Symfony's YAML component管理自定义.yml
文件。