在 Zend 1.12 中使用 Composer 自动加载器(用于加载外部库)?

Usage of Composer auto-loader (for loading external libraries) in Zend 1.12?

基本上,我想使用 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 自动加载器有什么需要担心的吗?

您可以像这样在 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 returns 当目录存在时为真,但当 .php 文件存在

我不得不佩服你对ZF1的韧性,我们都在10年前就已经在那里了。 Zend Framework 1.x 在其 类 中充满了 require_once。 您可以随时 require_once 在 Bootstrap.php 文件上随时

另一个文件

我经常遇到这个问题,我相信这不是一个实际问题。

IMO 的最佳方法是在 public/index.php 中仅包含作曲家自动加载器,就像在 ZF2/3 中所做的那样。这不会改变自动加载的其余部分:https://github.com/zendframework/ZendSkeletonApplication/blob/master/public/index.php#L21

注意:如果您在应用程序中使用了另一个入口点(例如,对于 cron 脚本),您需要添加相同的行(基本上在应用程序的每个入口点)。

此外,如果您查看 phpmd 中的规则,则会给出以下消息:

A file should declare new symbols (classes, functions, constants, etc.) and cause no other side effects, or it should execute logic with side effects, but should not do both.

因此,在 bootstrap 中声明包含供应商自动加载器可以被视为一种不当行为(至少似乎是编写此规则的人和我本人的共同意见 :))。