如何在 ZendFramework 1.12 中的文件名中包含"dashes"



我看过一些关于这个问题的帖子,但没有一篇回答他们被问到的主题。我有一个 ZendFramework 项目(v 1.12(,我想对文件命名约定进行一些更改。

文件和文件夹以 Pascal 大小写命名,我想进行以下更改:

  1. 将所有文件/文件夹重命名为小写(这有效(
  2. 我想在单词之间加破折号("-"(。Zend maual说文件名中可能存在破折号。但话又说,它们应该映射到类名,(类名不能包含-!!现在有Zend Router,它将 URL 中的-翻译,并将它们之间的单词连接回 Pascal 案例。我该如何操纵它?

例如,这里有一个文件名:TestingDemoController.php,我想将名称更改为testing-democontroller.php(实际上我正在考虑将其设置为testing-demo.controller.php但不知道它有多大可能。对于以前的文件名,URI曾经是类似于Testing-Demo。如何将路由器配置为不将-视为特殊字符?

编辑:关于PSR的问题:

在@apokryfos的建议下,我一直在阅读PSR版本,PSR-0和PSR-4。

  • 查看我的类名(在终止类名之前用下划线分隔的目录(,我觉得我们在项目中使用了 PSR-0。
  • 关于我更改项目结构的方法(文件名之间有破折号(。这违背了PSR-4,

终止类名对应于以 .php 结尾的文件名。文件名必须与终止类名的大小写匹配。

以上一点是我唯一反对的观点吗?

  • 这就是我对我做文件名(破折号(和编写自己的autoloader可能发生的后果的看法: 在libraries中查找文件时,我的自动加载器将查找这些文件,如果搜索失败,搜索将回退到标准自动加载器,最终会解决它们?这会导致不必要的查找。

如果我理解错误并且遗漏了什么,请在这里纠正我?

我曾经为一个项目做过这个。

需要做两件事才能正常工作:

覆盖 Zend 调度程序

为了覆盖标准的Zend Dispatcher,请在"Zend/Controller/Dispatcher"下创建一个名为Custom.php文件,其中包含以下内容:

<?php
class Zend_Controller_Dispatcher_Custom extends Zend_Controller_Dispatcher_Standard {
const DELIMITER = '-';
public function classToFilename($class)
{
$class = trim(strtolower(preg_replace('/([A-Z]+)/', self::DELIMITER . "$1", $class)), self::DELIMITER); //str_replace('Controller', '-controller', $class);
return str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
}
}

并在应用程序路径的引导.php中添加此函数:

protected function _initControllerDirectoryPath()
{
$frontController = Zend_Controller_Front::getInstance();
$frontController->setDispatcher(new Zend_Controller_Dispatcher_Custom());
}

这样,您将获得带有-的控制器,例如演示控制器.php。在这种情况下,您必须将所有控制器更改为新格式。

覆盖模块资源加载器

这很棘手,因为您需要定义自己的自动加载机。 在"Zend/Loader"下创建一个文件"MyAutoloader.php"并添加以下代码:

<?php
class Zend_Loader_MyAutoloader extends Zend_Application_Module_Autoloader {
public function autoload($class)
{
$classParts = explode('_', $class);
$classParts[count($classParts) - 1] = trim(strtolower(preg_replace('/([^_])([A-Z]+)/', "$1-$2", end($classParts))), '-');
$class = implode('_', $classParts);
$classPath = $this->getClassPath($class);
if (false !== $classPath) {
return include $classPath;
}
return false;
}
}

在每个模块Bootstrap.php中,您需要添加:

class Mymodule_Bootstrap extends Zend_Application_Module_Bootstrap
{
public function __construct($application)
{
parent::__construct($application);
$r    = new ReflectionClass($this);
$path = $r->getFileName();
$this->setResourceLoader(new Zend_Loader_MyAutoloader(array(
'namespace' => $this->getModuleName(),
'basePath'  => dirname($path),
)));
}
}

这将允许使用模块资源,例如。"modules/mymodulename/forms/search-test.php">

如果您使用共享资源,例如表单、模型等,那么您还需要通过添加以下内容在主引导程序中为这些资源注册Zend_Loader_MyAutoloader:

protected function _initResourcesDirectoryPath()
{
$loader = new Zend_Loader_MyAutoloader(array(
'basePath'  => dirname(__FILE__),
'namespace' => '',
));
}

现在你可以有一个文件,例如forms/test-shared-search.php请注意,类名在文件中保持不变(例如在最后一种情况下Form_TestSharedSearch(

你可以这样做,但是你要么需要使用spl_autoload_register来创建自己的自动加载器,要么手动include/require。此外,即使这对您的文件名有所帮助,类名也不会改变,并且您肯定会有一个自定义路由。

也就是说,apokryfos对PSR-4的看法绝对是正确的。

相关内容

最新更新