如何在 ZendFramework 1.12 的文件名中包含 "dashes"
How to have "dashes" in filenames in ZendFramework 1.12
我看过一些关于这个问题的帖子,但是 none 回答了他们被问到的主题。我有一个 ZendFramework 项目 (v 1.12),我想对文件命名约定做一些更改。
文件和文件夹以 Pascal 命名,我想进行以下更改:
- 将所有 files/folders 重命名为小写(有效)
- 我想要单词之间的破折号 (
"-"
)。 Zend maual 表示文件名中可能有破折号。但又说它们应该映射到 class 名称,(Class 名称不能包含 -
!!)。现在有 Zend Router
,它翻译 URL 中的 -
并将它们之间的单词连接回 Pascal 大小写。我该如何操作它?
例如,这里有一个文件名:TestingDemoController.php
,我想把名字改成testing-democontroller.php
(实际上我想把它改成testing-demo.controller.php
但是没有知道这怎么可能。)对于以前的文件名,URI
曾经类似于 Testing-Demo
。如何配置路由器不将 -
视为特殊字符?
Edit: Questions on PSR:
根据@apokryfos 的建议,我一直在通读 PSR 版本,主要是 PSR-0 和 PSR-4。
- 看我的 class 名称(目录用下划线分隔,直到 Terminating class 名称)我觉得我们在我们的项目中使用了 PSR-0。
- 关于我改变项目结构的方法(文件名之间有破折号)。这违背了 PSR-4,
The terminating class name corresponds to a file name ending in .php. The file name MUST match the case of the terminating class name.
以上是我反对的唯一一点吗?
- 这就是我对文件名(虚线)和自己编写文件名时可能发生的后果的感受
autoloader
:
在 libraries
中查找文件时,文件将由我的自动加载器查找,如果失败,搜索将回退到最终将解决它们的标准自动加载器?这会导致不必要的查找。
如果我理解有误或者遗漏了什么,请在这里纠正我?
您可以这样做,但是您需要使用 spl_autoload_register
创建您自己的自动加载器或手动 include
/require
。此外,即使这对您的文件名有帮助,class 名称也不会改变,您肯定会有自定义路由。
也就是说,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 . "", $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]+)/', "-", 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"
如果您使用共享资源,例如表单、模型等,那么您还需要在主 Bootstrap 中为这些资源注册 Zend_Loader_MyAutoloader,方法是添加:
protected function _initResourcesDirectoryPath()
{
$loader = new Zend_Loader_MyAutoloader(array(
'basePath' => dirname(__FILE__),
'namespace' => '',
));
}
现在您可以拥有一个文件,例如 forms/test-shared-search.php
请注意,class 名称在文件中保持不变(例如,在最后一种情况下为 Form_TestSharedSearch)
我看过一些关于这个问题的帖子,但是 none 回答了他们被问到的主题。我有一个 ZendFramework 项目 (v 1.12),我想对文件命名约定做一些更改。
文件和文件夹以 Pascal 命名,我想进行以下更改:
- 将所有 files/folders 重命名为小写(有效)
- 我想要单词之间的破折号 (
"-"
)。 Zend maual 表示文件名中可能有破折号。但又说它们应该映射到 class 名称,(Class 名称不能包含-
!!)。现在有Zend Router
,它翻译 URL 中的-
并将它们之间的单词连接回 Pascal 大小写。我该如何操作它?
例如,这里有一个文件名:TestingDemoController.php
,我想把名字改成testing-democontroller.php
(实际上我想把它改成testing-demo.controller.php
但是没有知道这怎么可能。)对于以前的文件名,URI
曾经类似于 Testing-Demo
。如何配置路由器不将 -
视为特殊字符?
Edit: Questions on PSR:
根据@apokryfos 的建议,我一直在通读 PSR 版本,主要是 PSR-0 和 PSR-4。
- 看我的 class 名称(目录用下划线分隔,直到 Terminating class 名称)我觉得我们在我们的项目中使用了 PSR-0。
- 关于我改变项目结构的方法(文件名之间有破折号)。这违背了 PSR-4,
The terminating class name corresponds to a file name ending in .php. The file name MUST match the case of the terminating class name.
以上是我反对的唯一一点吗?
- 这就是我对文件名(虚线)和自己编写文件名时可能发生的后果的感受
autoloader
: 在libraries
中查找文件时,文件将由我的自动加载器查找,如果失败,搜索将回退到最终将解决它们的标准自动加载器?这会导致不必要的查找。
如果我理解有误或者遗漏了什么,请在这里纠正我?
您可以这样做,但是您需要使用 spl_autoload_register
创建您自己的自动加载器或手动 include
/require
。此外,即使这对您的文件名有帮助,class 名称也不会改变,您肯定会有自定义路由。
也就是说,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 . "", $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]+)/', "-", 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"
如果您使用共享资源,例如表单、模型等,那么您还需要在主 Bootstrap 中为这些资源注册 Zend_Loader_MyAutoloader,方法是添加:
protected function _initResourcesDirectoryPath()
{
$loader = new Zend_Loader_MyAutoloader(array(
'basePath' => dirname(__FILE__),
'namespace' => '',
));
}
现在您可以拥有一个文件,例如 forms/test-shared-search.php 请注意,class 名称在文件中保持不变(例如,在最后一种情况下为 Form_TestSharedSearch)