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

时间:2017-04-21 11:09:19

标签: php zend-framework composer-php autoload

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

3 个答案:

答案 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另一个文件