【问题标题】:How to have "dashes" in filenames in ZendFramework 1.12如何在 ZendFramework 1.12 中的文件名中包含“破折号”
【发布时间】:2017-12-18 05:46:59
【问题描述】:

我看过一些关于这个问题的帖子,但没有人回答他们被问到的主题。我有一个 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。

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

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

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

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

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

【问题讨论】:

  • 不管怎样,你所做的与PSR-4 相违背,这是你应该遵循的 PHP 编码标准。
  • 好的,谢谢,试着理解它..
  • @apokryfos:我已经更新了问题,能否请您提供一些关于我对 PSR 的理解的意见?
  • 违反 PSR-0/4 自动加载标准的唯一后果是您必须自己实现自动加载,而不是使用许多现有的 PSR-0 或 PSR-4 兼容自动加载器之一.如果不将自己的自动加载器捆绑为每个模块的依赖项,您也将无法将项目转换为更加模块化的结构。
  • 明白了,虽然我自己会看一下,但你能说如果我说的正确的话,在加载库文件时,它会回退到标准自动加载器,导致不必要的查找吗?

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


【解决方案1】:

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

为此需要做两件事:

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

覆盖模块资源加载器

这很棘手,因为您需要定义自己的自动加载器。 在“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)

【讨论】:

  • 太好了,我自己正在浏览所有文档和资源,感谢您的详细回答。我现在没有我的代码,但明天肯定会让你知道它是怎么回事。
  • 我唯一犹豫的是在 Zend 库本身中创建文件。我不能覆盖我的应用程序本身的功能吗?不管怎样,我明天去看看。
  • 实际上您不必在 zend 库本身中创建文件。您可以命名类,例如 Mylibrary_MyAutoloader 和 Mylibrary_Dispatcher_Custom,将它们放在 Mylibrary 目录下,并使用自动加载器的 registerNamespace() 注册这个新库。
  • 非常感谢,虽然我遇到了一些问题,但现在我知道如何进行了。很好的解决方案:)
  • 对于共享资源,您是指不在特定模块下的模型、表单等吗?我猜你错过了共享资源的$this-&gt;setResourceLoader($loader)。您还知道了解路由、使用 Rest 控制器和普通 Zend 动作控制器的任何好的链接吗? (Zend 手册除外)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2012-12-12
    • 2015-03-27
    相关资源
    最近更新 更多