在MVC结构中存储大型静态数组的位置?

时间:2009-08-20 06:26:44

标签: model-view-controller cakephp

我有一个很长的php数组,我循环并创建一个表单。我将为它创建一个YAML文件,以便于维护。我的问题是我不知道存储此文件的适当位置,以及如何从视图中调用它。

3 个答案:

答案 0 :(得分:3)

您已声明希望以YAML格式存储此数据。在MVC术语中,现在这是您的数据源。

您可以将YAML文件存储在系统的任何位置,但假设您希望将这些文件存储在版本控制之下并且不希望它们可以公开访问,那么{{1}可以放在合适的位置。在app/之外的目录。

据我所知,目前没有任何设计用于从YAML文件读取(和/或写入)的数据源,因此如果您希望严格遵守MVC结构,这将是您自己的事。< / p>

有几个示例数据源可用on githubother places供您参考。值得注意的是,创建数据源有两种常用方法。

  • 简单方法(最常见)主要涉及数据的读/写,并倾向于在其数据源中使用自定义方法,模型可以调用。这是最快的方法,允许您提供不必要的数据,以及所有CakePHP的约定。
  • 更高级的方法(蛋糕核心开发人员可能更喜欢)是正确地重新实现您要扩展的类中的大多数方法(DataSource或者在数据库的情况下DboSource )。这允许CakePHP在执行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) {
  ...
}
?>

请参阅http://book.cakephp.org/view/415/load