Php “如何拥有”;破折号“;在ZendFramework 1.12中的文件名中
我看过一些关于这个问题的帖子,但是没有一篇是关于他们被问到的主题的。我有一个ZendFramework项目(V1.12),我想对文件命名约定做一些更改 文件和文件夹以Pascal case命名,我想做以下更改: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大小写。我如何操纵它 例如,这里有
“-”
)。文件名中可能有破折号。但是,再次指出,它们应该映射到类名(类名不能包含-
!!)。现在有了Zend Router
,它将URL中的-
翻译过来,并将它们之间的单词连接回Pascal大小写。我如何操纵它TestingDemoController.php
,我想将名称更改为TestingDemoController.php
(实际上我想将其设置为testing demo.controller.php
,但不知道有多大可能),URI
过去类似于测试演示
。如何将路由器配置为不将-
视为特殊字符
编辑:关于PSR的问题:
根据@apokryfos的建议,我一直在阅读PSR版本,主要是PSR-0和PSR-4
- 看着我的类名(在终止类名之前用下划线分隔的目录),我觉得我们在项目中使用了PSR-0
- 关于我改变项目结构的方法(文件名之间有破折号)。这与PSR-4背道而驰
- 这就是我对我使用文件名(虚线)和编写自己的
的后果的感受: 在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' => '',
));
}