我已经看过几个关于这个问题的帖子,但没有人回答他们被问到的话题。我有一个ZendFramework项目(v 1.12),我想在文件命名约定中做一些更改。
文件和文件夹以Pascal为单位命名,我想进行以下更改:
"-"
)。 Zend maual表示文件名中可能有破折号。但后来又说它们应该映射到类名,(A Class Name不能包含-
!!)。现在有Zend Router
,它会在URL中翻译-
,并将它们之间的单词连接回Pascal大小写。我该如何操纵呢?例如,以下是文件名:TestingDemoController.php
,我想将名称更改为testing-democontroller.php
(实际上我想将其更改为testing-demo.controller.php
但不要忘记知道它有多可能。)对于以前的文件名,URI
曾经是Testing-Demo
。如何将路由器配置为不将-
视为特殊字符?
编辑:关于PSR的问题:
根据@apokryfos的建议,我一直在阅读PSR版本,主要是PSR-0和PSR-4。
终止类名对应于以.php结尾的文件名。文件名必须与终止类名称的大小写匹配。
上述观点是我反对的唯一一点吗?
autoloader
时可能发生的后果的看法:
在libraries
中查找文件时,我的自动加载器会查找这些文件,如果失败,搜索将回退到标准自动加载器,最终会解决它们?这导致不必要的查找。如果我理解错误并错过了什么,请在此纠正我?
答案 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的。