我有一个很长的php数组,我循环并创建一个表单。我将为它创建一个YAML文件,以便于维护。我的问题是我不知道存储此文件的适当位置,以及如何从视图中调用它。
答案 0 :(得分:3)
您已声明希望以YAML格式存储此数据。在MVC术语中,现在这是您的数据源。
您可以将YAML文件存储在系统的任何位置,但假设您希望将这些文件存储在版本控制之下并且不希望它们可以公开访问,那么{{1}可以放在合适的位置。在app/
之外的目录。
据我所知,目前没有任何设计用于从YAML文件读取(和/或写入)的数据源,因此如果您希望严格遵守MVC结构,这将是您自己的事。< / p>
有几个示例数据源可用on github和other places供您参考。值得注意的是,创建数据源有两种常用方法。
app/webroot/
或find('list')
等常见任务时发挥其魔力。我个人建议从这样简单的方法开始:
paginate()
:
app/config/database.php
var $yaml = array(
'datasource' => 'yaml',
'path' => 'data/yaml', // relative to app/ directory, no trailing slash
);
:
app/models/category.php
// app/models/category.php
class Category extends AppModel {
public $useDbConfig = 'yaml';
/**
* cake should automatically set $model->table to 'categories' on construct
* (http://api.cakephp.org/view_source/model/#l-419) hence $useTable will not
* be necessary (convention over configuration)
*/
// public $useTable = 'categories';
/**
* since datasource doesn't strictly adhere to cake's api, the core find
* method may cause errors. to combat this we can redefine this method with
* a much simpler version, but functionality will be lost in doing so.
*/
public function find($type = 'all', $options = array()) {
// get an instance of our datasource
$ds = ConnectionManager::getDataSource($this->useDbConfig);
// $type is usually handled by model, but we will pass it to datasource
$options['type'] = $type;
// query the datasource
return $ds->read($this, $options);
}
}
:
app/models/datasources/yaml_source.php
class YamlSource extends DataSource {
public function read(&$model, $queryData = array()) {
// determine path to yaml file
$yamlPath = APP . $this->config['path'] . DS . $model->table . '.yaml';
// parse the yaml file
$results = $this->_parseYaml($yamlPath);
// perform any array manipulation (determined by $queryData)
...
// handle $queryData['type'] (would normally have been done in Model)
...
// return results in a typical Model data array
return array($model->alias => array(
$results // your results go here
));
}
}
:
app/controllers/categories_controller.php
您将能够随着时间的推移扩展此数据源(使其与API更兼容),因为您需要更多功能(分页,回调过滤器,关系等)。任何其他应用程序(s')模型都可以立即重用此数据源。
答案 1 :(得分:0)
一个更简单的方法(阅读:更基本)仍然回答你的问题,但忽略了你想将静态数据存储在yaml文件中的事实,如下:
// app/models/category.php
class Category extends AppModel {
public $name = 'yaml';
public $data = array(
array(
'id' => '1',
'name' => 'Category 1',
),
array(
'id' => '2',
'name' => 'Category 2',
),
...
);
public function find($type = 'all', $options = array()) {
if ($type == 'all') {
return $this->data;
}
// .. otherwise do some array manipulation on $this->data ..
return $results;
}
}
此方法与使用数据源具有相同的可扩展性或可重用性。
答案 2 :(得分:0)
我不会这样做。我也不会使用YAML。我会创建你的“长PHP数组”作为一个等待它的长PHP数组。
将数据存储为PHP数组以将其存储为YAML没有太大区别。此外,如果将其存储为数组,则不需要将其从YAML转换为数组以循环它。
此阵列的适当位置是使用Configure类加载的文件。例如。 /app/config/form.php:
<?php
$config = array(
'Form' => array(
...
)
);
?>
然后,您可以在应用中的任意位置加载数组并访问它
<?php
Configure::load('form'); // Loads app/config/form.php file and stores $config in Configure class
$form = Configure::read('Form');
foreach ($form as $field) {
...
}
?>