我看过一些关于这个问题的帖子,但没有一篇回答他们被问到的主题。我有一个 ZendFramework 项目(v 1.12(,我想对文件命名约定进行一些更改。
文件和文件夹以 Pascal 大小写命名,我想进行以下更改:
- 将所有文件/文件夹重命名为小写(这有效(
- 我想在单词之间加破折号(
"-"
(。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的看法绝对是正确的。