如何拥有"破折号"在ZendFramework 1.12中的文件名中

时间:2017-07-13 12:30:59

标签: php zend-framework zend-route psr-4 psr-0

我已经看过几个关于这个问题的帖子,但没有人回答他们被问到的话题。我有一个ZendFramework项目(v 1.12),我想在文件命名约定中做一些更改。

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

  1. 将所有文件/文件夹重命名为小写(可行)
  2. 我希望在单词之间留下破折号("-")。 Zend maual表示文件名中可能有破折号。但后来又说它们应该映射到类名,(A Class Name不能包含- !!)。现在有Zend Router,它会在URL中翻译-,并将它们之间的单词连接回Pascal大小写。我该如何操纵呢?
  3. 例如,以下是文件名:TestingDemoController.php,我想将名称更改为testing-democontroller.php(实际上我想将其更改为testing-demo.controller.php但不要忘记知道它有多可能。)对于以前的文件名,URI曾经是Testing-Demo。如何将路由器配置为不将-视为特殊字符?

      

    编辑:关于PSR的问题:

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

    • 查看我的类名(用下划线分隔的目录,直到Terminating类名)我觉得我们在项目中使用了PSR-0。
    • 关于我改变项目结构的方法(文件名之间有破折号)。这与PSR-4相反,
      

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

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

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

    如果我理解错误并错过了什么,请在此纠正我?

2 个答案:

答案 0 :(得分:2)

我曾为一个项目做过一次。

为此,需要做两件事:

覆盖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 . "$1", $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 。在这种情况下,您必须将所有控制器更改为新格式。

覆盖模块资源加载程序

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

<?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),
        )));
    }
}

这样也可以使用模块资源,例如。的&#34;模块/ mymodulename /形式/搜索test.php的&#34;

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

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

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

答案 1 :(得分:0)

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

那就是说,apokryfos绝对是关于PSR-4的。