Php “如何拥有”;破折号“;在ZendFramework 1.12中的文件名中

Php “如何拥有”;破折号“;在ZendFramework 1.12中的文件名中,php,zend-framework,zend-route,psr-4,psr-0,Php,Zend Framework,Zend Route,Psr 4,Psr 0,我看过一些关于这个问题的帖子,但是没有一篇是关于他们被问到的主题的。我有一个ZendFramework项目(V1.12),我想对文件命名约定做一些更改 文件和文件夹以Pascal case命名,我想做以下更改: 将所有文件/文件夹重命名为小写(此操作有效) 我希望单词之间有破折号(“-”)。文件名中可能有破折号。但是,再次指出,它们应该映射到类名(类名不能包含-!!)。现在有了Zend Router,它将URL中的-翻译过来,并将它们之间的单词连接回Pascal大小写。我如何操纵它 例如,这里有

我看过一些关于这个问题的帖子,但是没有一篇是关于他们被问到的主题的。我有一个ZendFramework项目(V1.12),我想对文件命名约定做一些更改

文件和文件夹以Pascal case命名,我想做以下更改:

  • 将所有文件/文件夹重命名为小写(此操作有效)
  • 我希望单词之间有破折号(
    “-”
    )。文件名中可能有破折号。但是,再次指出,它们应该映射到类名(类名不能包含
    -
    !!)。现在有了
    Zend Router
    ,它将URL中的
    -
    翻译过来,并将它们之间的单词连接回Pascal大小写。我如何操纵它
  • 例如,这里有一个文件名:
    TestingDemoController.php
    ,我想将名称更改为
    TestingDemoController.php
    (实际上我想将其设置为
    testing demo.controller.php
    ,但不知道有多大可能),
    URI
    过去类似于
    测试演示
    。如何将路由器配置为不将
    -
    视为特殊字符

    编辑:关于PSR的问题:

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

    • 看着我的类名(在终止类名之前用下划线分隔的目录),我觉得我们在项目中使用了PSR-0
    • 关于我改变项目结构的方法(文件名之间有破折号)。这与PSR-4背道而驰
    终止类名对应于以.php结尾的文件名。文件名必须与终止类名的大小写匹配

    这是我唯一反对的观点吗

    • 这就是我对我使用文件名(虚线)和编写自己的
      autoloader
      的后果的感受: 在
      中查找文件时,我的自动加载程序将查找这些文件,如果搜索失败,将返回标准自动加载程序,该程序将最终解决这些问题?这会导致不必要的查找

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

    您可以这样做,但是您需要使用
    spl\u autoload\u register
    创建您自己的自动加载器,或者手动使用
    包含
    /
    要求
    。此外,即使这对文件名有帮助,类名也不会改变,而且您肯定需要自定义路由


    也就是说,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 . "$1", $class)), self::DELIMITER); //str_replace('Controller', '-controller', $class);
            return str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
        }
    
    }
    
    通过这种方式,您可以找到带有-的控制器,例如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]+)/', "$1-$2", end($classParts))), '-');
            $class = implode('_', $classParts);
            $classPath = $this->getClassPath($class);
            if (false !== $classPath) {
                return include $classPath;
            }
            return false;
        }
    }
    
    这将允许使用模块资源,例如“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)

    对于它的价值,您所做的与您应该遵循的PHP编码标准背道而驰。好的,谢谢,尝试理解它。@apokryfos:我已经更新了问题,关于我对PSR的理解,能否请您提供一些意见?违反PSR-0/4自动加载标准的唯一后果是,您必须自己实现自动加载,而不是使用许多现有的PSR-0或PSR-4兼容自动加载程序中的一个。如果不将您自己的自动加载程序捆绑为每个模块的依赖项,您也无法将项目转换为更模块化的结构。明白了,虽然我会亲自查看,但您能否说,如果我说的正确,加载库文件时,它会退回到标准自动加载程序,导致不必要的查找?太好了,我自己查阅了所有的文件和资料,谢谢你的详细回答。我现在没有带我的代码,但明天一定会告诉你它是如何运行的。我唯一犹豫的是在Zend库中创建文件。我不能覆盖应用程序本身的功能吗?无论如何,我明天会看一看。实际上你不必在zend库中创建文件。您可以将这些类命名为Mylibrary\u MyAutoloader和Mylibrary\u Dispatcher\u Custom,将它们放在Mylibrary目录下,并使用autoloader的registerNamespace()注册这个新库。非常感谢,尽管我遇到了一些问题,但现在我知道如何继续。很好的解决方案:)有了共享资源,您是指不在特定模块下的模型、表单等吗?我猜您错过了共享资源的
    $this->setResourceLoader($loader)
    。另外,您是否知道了解路由、Rest控制器和普通Zend操作控制器的使用的好链接?(Zend手册除外)
    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),
            )));
        }
    }
    
    protected function _initResourcesDirectoryPath()
    {
        $loader = new Zend_Loader_MyAutoloader(array(
                    'basePath'  => dirname(__FILE__),
                    'namespace' => '',
        ));
    }