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

How to have "dashes" in filenames in ZendFramework 1.12

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

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

  1. 将所有 files/folders 重命名为小写(有效)
  2. 我想要单词之间的破折号 ("-")。 Zend maual 表示文件名中可能有破折号。但又说它们应该映射到 class 名称,(Class 名称不能包含 -!!)。现在有 Zend Router,它翻译 URL 中的 - 并将它们之间的单词连接回 Pascal 大小写。我该如何操作它?

例如,这里有一个文件名:TestingDemoController.php,我想把名字改成testing-democontroller.php(实际上我想把它改成testing-demo.controller.php但是没有知道这怎么可能。)对于以前的文件名,URI 曾经类似于 Testing-Demo。如何配置路由器不将 - 视为特殊字符?

Edit: Questions on PSR:

根据@apokryfos 的建议,我一直在通读 PSR 版本,主要是 PSR-0 和 PSR-4。

The terminating class name corresponds to a file name ending in .php. The file name MUST match the case of the terminating class name.

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

如果我理解有误或者遗漏了什么,请在这里纠正我?

您可以这样做,但是您需要使用 spl_autoload_register 创建您自己的自动加载器或手动 include/require。此外,即使这对您的文件名有帮助,​​class 名称也不会改变,您肯定会有自定义路由。

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

我已经为一个项目做过一次。

需要做两件事才能使它起作用:

覆盖 Zend Dispatcher

为了覆盖标准 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 . "", $class)), self::DELIMITER); //str_replace('Controller', '-controller', $class);
        return str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
    }

}

并在您的应用程序路径的 Bootstrap.php 中,添加此功能:

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

通过这种方式,您将获得带有 - 的控制器,例如 demo-controller.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]+)/', "-", 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"

如果您使用共享资源,例如表单、模型等,那么您还需要在主 Bootstrap 中为这些资源注册 Zend_Loader_MyAutoloader,方法是添加:

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

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