【问题标题】:Using the Zend Framework should the file system be accessed via the controller or a model如果通过控制器或模型访问文件系统,则使用 Zend 框架
【发布时间】:2012-03-21 07:32:57
【问题描述】:

应该通过控制器直接访问服务器或网络共享还是创建某种模型?

我可以在控制器中使用这样的代码:

$path = '/var/www/uploads';
$fileArray = array();
$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
  if (!$fileinfo->isDot()) {
    $fileArray[] = array('filename' => $fileinfo->getFilename(), 'extension' => $fileinfo->getExtension(), 'size' => $this->bytesToSize($fileinfo->getSize(),2), 'modified' => date('d/m/Y H:i', $fileinfo->getMTime())); 
  }
}
$this->view->fileList = $fileArray;

这意味着每次都重复,这似乎是在 MVC 中做事的错误方式。我应该创建一个映射文件系统的模型,还是 Zend 有可以做到这一点的东西?

例如//伪代码

$directory = new Zend_Directory();
$this->view->filelist = $directory->listFiles();
$directory->addFile('filepath');
$directory->deleteFile('filepath');

具有类似的功能,上传、删除、重命名、移动、复制等。

有什么想法吗?

【问题讨论】:

  • 如果您只是要像示例中那样将此数组传递给视图,请创建一个视图助手。如果您只想检索相同的数组并在您的控制器中使用,请创建一个操作助手。如果您需要更多功能,那么您已经在这里展示了,请制作一个模型。
  • 我一直在寻找的主要功能之一是将文件保存到特定文件结构的能力。例如当给出发票时,它应该保存在路径为 /basepath/customer/invoice/file 的文件夹中。这个路径必须即时创建,我希望在某个地方创建一个可以转换文档类型的函数,即将发票和客户 ID 放入路径中,然后保存文件。

标签: php zend-framework filesystems


【解决方案1】:

让它成为一个模型。这样您就可以进行单元测试,轻松更换新的控制器,并在其他项目中重用该模型。

一个好的经验法则是:如果它直接与数据(数据库、服务、文件等)交互,则将其设为模型。

实际上有一个关于Zend_DirectoryZend_File (link) 的提案,但看起来自 2009 年以来就没有任何工作。

您可能需要考虑将您的代码打包为其他人可以使用的插件。也许可以使用我上面发布的链接作为起点。

【讨论】:

  • 听起来像个模型。一旦完成,我会去看看是否值得贡献。由于您给我的链接非常稀疏,您会在 Zend 目录/文件模型中包含什么?
  • 向下滚动,有一个名为“Class Skeletons”的部分,您可以对其进行建模。不过,正如其中一位 cmets 指出的那样,此功能已经存在于 SPL 中(DirectoryIterator:php.net/manual/en/class.directoryiterator.php,一般参考:php.net/manual/en/book.spl.php)。由于这个原因,您可能不想制作自己的插件。您的模型应该直接与 SPL 迭代器和对象交互。但是,您不应该在 Controller 中使用 SPL 对象,因为实际的数据存储平台在 Controller 中并不重要,而在 Model 中并不重要
  • 感谢您的帮助。我去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多