基本上,我想使用Composer自动加载器(用于加载第三方库),但我想继续使用内置机制在Zend 1.12中自动加载
我添加了以下代码:
<?php // File path: index.php
// ...
$composerAutoloaderPaths = array(
'../vendor/autoload.php',
'../../common/vendor/autoload.php' // store common libraries used by multiple projects, currently that's working by adding the directory in set_include_path()
);
foreach($composerAutoloaderPaths as $composerAutoloaderPath)
{
if(file_exists($composerAutoloaderPath))
{
require_once $composerAutoloaderPath;
}
else
{
// handle the error gracefully
}
}
// ...
另外,我正在使用Zend_Loader_Autoloader
这样:
<?php // File path: Bootstrap.php
// ...
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('Plugin_');
$autoloader->registerNamespace('Helper_');
// etc.
// ...
使用像这样的Composer和Zend自动加载器有什么值得担心的吗?
答案 0 :(得分:2)
我经常遇到这个问题,我认为这不是一个实际问题。
IMO的最佳方式是在public/index.php
中将作曲家自动加载器包含在ZF2 / 3中。这不会改变自动加载的其余部分:https://github.com/zendframework/ZendSkeletonApplication/blob/master/public/index.php#L21
注意:如果您在应用程序中使用了另一个入口点(例如,对于cron脚本),则需要添加相同的行(基本上在应用程序的每个入口点)。
另外,如果你看一下phpmd中的规则,就会给出这样的信息:
文件应声明新符号(类,函数,常量等)并且不会产生其他副作用,或者它应该执行带副作用的逻辑,但不应该同时执行这两种操作。
因此,在引导程序中声明供应商自动加载器的包含可能被视为一种弊端(至少似乎是编写此规则的人与我之间的共同意见:)。
答案 1 :(得分:1)
您可以在bootstrap.php中自动加载供应商:
<?php // File path: Bootstrap.php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
/**
* Inits Vendor
*/
protected function _initVendor()
{
require_once APPLICATION_PATH . '/../vendor/autoload.php';
// require_once APPLICATION_PATH . '/new/path/autoload.php';
}
...
autoload whatever you want with Zend 1
...
}
我必须建议您使用is_file()而不是file_exists(),因为file_exists在目录存在时返回true,但在.php
文件存在时不需要
答案 2 :(得分:1)
我不得不佩服你对ZF1的适应能力,我们都在10年前去过那里。 Zend Framework 1.x在其类中充满了require_once。 您可以随时随时在Bootstrap.php文件中require_once另一个文件