2

我正在 cakePHP 中构建一个应用程序,并希望将 Zend Framework 2 与它一起使用。我特别想使用的 2 个组件是验证码和 lucene(我知道它是单独维护的)

我在 app/vendor 中添加了 ZF2 库文件夹。

我尝试使用在各个站点上找到的两种方法来使用 Zend 类。

方法一

在我的控制器方法中添加了行

App::import('Vendor', 'Zend_Captcha_Figlet', true, false, 'Zend/Captcha/Figlet.php');

这给了我一个错误

Error: Class 'Zend\Captcha\AbstractWord' not found 

然后我继续添加所有缺失的课程。

App::import('Vendor', 'Zend_Captcha', true, false, 'Zend/Captcha.php');
App::import('Vendor', 'Zend_Validator_ValidatorInterface', true, false, 'Zend/Validator/ValidatorInterface.php');
App::import('Vendor', 'Zend_Validator_Translator_TranslatorAwareInterface', true, false, 'Zend/Validator/Translator/TranslatorAwareInterface.php');
App::import('Vendor', 'Zend_Validator_AbstractValidator', true, false, 'Zend/Validator/AbstractValidator.php');
App::import('Vendor', 'Zend_Stdlib_ArrayObject_PhpReferenceCompatibility', true, false, 'Zend/Stdlib/ArrayObject/PhpReferenceCompatibility.php');

if (version_compare(PHP_VERSION, '5.3.4', 'lt')) {
  class_alias('Zend/Stdlib/ArrayObject/PhpLegacyCompatibility', 'Zend/Stdlib/AbstractArrayObject');
} else {
  class_alias('Zend_Stdlib_ArrayObject_PhpReferenceCompatibility', 'Zend/Stdlib/AbstractArrayObject');
}

App::import('Vendor', 'Zend\Stdlib\ArrayObject\PhpLegacyCompatibility', true, false, 'Zend/Stdlib/ArrayObject/PhpLegacyCompatibility.php');

App::import('Vendor', 'Zend_Stdlib_AbstractArrayObject',true,false,'Zend/Stdlib/AbstractArrayObject.php');
App::import('Vendor', 'Zend_Stdlib_ArrayObject', true, false, 'Zend/Stdlib/ArrayObject.php');
App::import('Vendor', 'Zend\Session\Container\PhpLegacyCompatibility', true, false, 'Zend/Session/Container/PhpLegacyCompatibility.php');

if (version_compare(PHP_VERSION, '5.3.4', 'lt')) {
  class_alias('Zend\Session\AbstractContainer', 'Zend\Session\AbstractBaseContainer');
} else {
  class_alias('Zend\Session\Container\PhpReferenceCompatibility', 'Zend\Session\AbstractBaseContainer');
}

App::import('Vendor', 'Zend_Session_Container', true, false, 'Zend/Session/Container.php');
App::import('Vendor', 'Zend_Captcha_Exception_ExceptionInterface', true, false, 'Zend/Captcha/Exception/ExceptionInterface.php');
App::import('Vendor', 'Zend_Captcha_Exception_InvalidArgumentException', true, false, 'Zend/Captcha/Exception/InvalidArgumentException.php');
App::import('Vendor', 'Zend_Captcha_AdapterInterface', true, false, 'Zend/Captcha/AdapterInterface.php');
App::import('Vendor', 'Zend_Captcha_AbstractAdapter', true, false, 'Zend/Captcha/AbstractAdapter.php');
App::import('Vendor', 'Zend_Captcha_AbstractWord', true, false, 'Zend/Captcha/AbstractWord.php');
App::import('Vendor', 'Zend_Text_Figlet_Figlet', true, false,'Zend/Text/Figlet/Figlet.php');
App::import('Vendor', 'Zend_Math_Rand', true, false, 'Zend/Math/Rand.php');
App::import('Vendor', 'Zend_Captcha_Figlet', true, false, 'Zend/Captcha/Figlet.php');

..直到我被困在这里:

Class 'Zend/Stdlib/ArrayObject/PhpReferenceCompatibility' not found线路错误class_alias('Zend_Stdlib_ArrayObject_PhpReferenceCompatibility', 'Zend/Stdlib/AbstractArrayObject');

在哪里 class_alias('Zend_Stdlib_ArrayObject_PhpReferenceCompatibility', 'Zend/Stdlib/AbstractArrayObject');解决这个' Error: Class 'Zend\Session\AbstractBaseContainer' not found'

方法 2 - 抱歉找不到链接

创建组件并添加方法

public function initialize(){
    $include = get_include_path();
    $include.= PATH_SEPARATOR. APP . 'vendors' . DS;
    $successful = set_include_path($include);

    if (!$successful) {
        throw new Exception('ZendComponent failed to set include path.', E_ERROR);
    }
    App::import('Vendor', 'Loader',true,false,'Zend/Loader.php');
}

public function loadClass($class, $dirs = null){
    Zend_Loader::loadClass($class, $dirs);
}

并在控制器方法中调用 $this->Zend->loadClass('Captcha');

声明组件后。

但它在给出错误后退出:Error: Class 'Zend_Loader' not found

对这两个代码中的任何一个的任何帮助或对最新文档/博客的任何指针都表示赞赏。

4

1 回答 1

0

您需要做的第一件事是将 ZF2 添加到包含路径中。您可以使用以下命令在 index.php 文件中执行此操作:

set_include_path(get_include_path().PATH_SEPARATOR.ROOT . DS . APP_DIR . DS . 'Vendor' . DS . 'zf2' . DS . 'library');

对我来说,我在 Vendor/zf2/library 中有框架。

然后你需要注册自动加载器。这也可以在您的 index.php 中完成(尽管我还不确定性能是否会受到影响,如果有的话)。

spl_autoload_register(function($class) {
$f = stream_resolve_include_path(str_replace('\\', '/', $class) . '.php');
if ($f !== false) {
    return include $f;
}
return false;
});

我的目标是覆盖缓存库并改用 Zend Cache。为此,我将 ZendCacheEngine.php 文件放在 Lib/Cache/Engine/ 中,并为此加载了适当的 Zend 类。

最终代码看起来像这样:

<?php
use Zend\Cache\StorageFactory;

class ZendCacheEngine extends CacheEngine {

    public function init($settings = array()) {
        $cache = StorageFactory::adapterFactory('apc', array('ttl' => 3600));
        $plugin = StorageFactory::pluginFactory('exception_handler', array('throw_exceptions' => false, ));
        $cache -> addPlugin($plugin);

        //This is just an example, the remainder of your code will go here..
    }
}

这对我有用。

我希望这有帮助。

于 2015-02-03T10:26:44.647 回答