是否可以在另一个应用程序中使用Magento现有/包含的Zend Framework?

时间:2011-03-17 14:34:14

标签: zend-framework magento

我想制作一个与我们的Magento(Enterprise)安装一起运行的Zend应用程序。我可以使用Magento附带的现有Zend代码吗?或者我需要另一份Zend的副本吗?

我担心Varien可能搞乱了框架代码。看起来它们似乎已经注释掉了所有的require()语句,这显然会引发很多错误(显然)。无论如何,Zend AutoLoader将无法工作。有没有办法使用Varien AutoLoader?

如果可以避免,我不想特别想要将另一个框架(3000多个文件)导入到我们的项目中。

谢谢!

编辑:

这是我的目录结构:

/localsite/ -- root
/localsite/products -- Magento install
/localsite/products/lib/Zend --Zend in Mage folder
/localsite/fbtest -- my Zend Framework app root
/localsite/fbtest/application -- my Zend Framework app

这是我正在尝试的代码(/localsite/fbtest/public/index.php):

<?php
define('DS', DIRECTORY_SEPARATOR);

defined('APPLICATION_PATH')
  || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

defined('APPLICATION_ENV')
  || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

set_include_path(implode(PATH_SEPARATOR, array(
  BASE_PATH . DS . 'products' . DS . 'lib' . DS . 'Zend',
  get_include_path(),
)));

require_once('../../products/lib/Zend/Application.php');

$application = new Zend_Application(
  APPLICATION_ENV,
  APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
        ->run();

这是错误:

Fatal error: Class 'Zend_Loader_Autoloader' not found in C:\xampp\htdocs\localsite\products\lib\Zend\Application.php on line 81

这是include_path:

C:\xampp\htdocs\localsite\products\lib\Zend;.;C:\php\pear

这里应该包含AutoLoader(在/products/lib/Zend/Application.php中):

#require_once 'Zend/Loader/Autoloader.php';
$this->_autoloader = Zend_Loader_Autoloader::getInstance();

^^^看到'#'在哪里注释了require_once?我认为Varien所做的改变打破了框架,不是吗?这似乎是为什么它至少不适合我?我怎样才能解决这个问题并将所有注释掉的内容包括在内?

再次感谢

4 个答案:

答案 0 :(得分:4)

添加magento的库文件夹以包含index.php中的路径:

//define shortcut for DIRECTORY_SEPARATOR
defined('DS') || define('DS', DIRECTORY_SEPARATOR);
//define base bath obtainable throughout the whole application
defined('BASE_PATH')
    || define('BASE_PATH', realpath(dirname(__FILE__) . DS . '..' . DS . 'basedir' . DS));

//define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', BASE_PATH . DS . 'app');

//set include path to libraries
set_include_path(BASE_PATH . DS . 'library' . PATH_SEPARATOR . MAGENTO_DIR . DS . 'lib' . PATH_SEPARATOR . get_include_path());

但是使用这种方法你不能使用最新的ZF版本。所以单独安装是我的选择。

自动加载器工作,这里的简单方法是将原始Zend / Loader /放入应用程序库,或手动包含所有必需的自动加载器类(仅3:加载器,自动加载器,Zend_Exception)

这是我的完整projectName / public / index.php:

if (get_magic_quotes_gpc()) {
  function stripslashes_deep($value)
  {
    $value = is_array($value) ?
          array_map('stripslashes_deep', $value) :
          stripslashes($value);

    return $value;
  }

  $_POST = array_map('stripslashes_deep', $_POST);
  $_GET = array_map('stripslashes_deep', $_GET);
  $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
  $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}

//define shortcut for DIRECTORY_SEPARATOR
defined('DS') || define('DS', DIRECTORY_SEPARATOR);

//define base bath obtainable throughout the whole application
defined('BASE_PATH')
    || define('BASE_PATH', realpath(dirname(__FILE__) . DS . '..' . DS . 'basedir'));

//define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', BASE_PATH . DS . 'app');

//set include path to libraries
set_include_path(BASE_PATH . DS . 'library' . PATH_SEPARATOR . get_include_path());

//bootstrap, and run application
try {
    require_once 'Zend/Application.php';
    //create application and configure it.
    $application = new Zend_Application(
        getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production',
        array('config' => array(APPLICATION_PATH . DS . 'configs' . DS . 'application.ini'))
    );
    //run application
    $application->bootstrap()->run();
} catch (Exception $e) {
 //here was logging logic
}

这是你的/localsite/fbtest/public/index.php的样子:

if (get_magic_quotes_gpc()) {
  function stripslashes_deep($value)
  {
    $value = is_array($value) ?
          array_map('stripslashes_deep', $value) :
          stripslashes($value);

    return $value;
  }

  $_POST = array_map('stripslashes_deep', $_POST);
  $_GET = array_map('stripslashes_deep', $_GET);
  $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
  $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}

//define shortcut for DIRECTORY_SEPARATOR
defined('DS') || define('DS', DIRECTORY_SEPARATOR);

//define base bath obtainable throughout the whole application
//keep your libraries and application out of public directory
defined('BASE_PATH')
    || define('BASE_PATH', realpath(dirname(__FILE__) . DS . '..' . DS . 'basedir'));

//define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', BASE_PATH . DS . 'application');

//if index.php in /localsite/fbtest/public/
defined('MAGENTO_PATH')
    || define('MAGENTO_PATH', realpath(dirname(__FILE__) . DS . '..' . DS . '..' . DS . 'products'));

//set include path to libraries
//noticed magento library added? 
set_include_path(BASE_PATH . DS . 'library' . PATH_SEPARATOR . MAGENTO_PATH . DS . 'lib' . PATH_SEPARATOR . get_include_path());

//bootstrap, and run application
try {
    require_once 'Zend/Application.php';
    require_once 'Zend/Loader.php';
    require_once 'Zend/Loader/Autoloader.php';
    require_once 'Zend/Exception.php';
    //create application and configure it.
    $application = new Zend_Application(
        getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production',
        array('config' => array(APPLICATION_PATH . DS . 'configs' . DS . 'application.ini'))
    );
    //run application
    $application->bootstrap()->run();
} catch (Exception $e) {
 //here was logging logic
}

答案 1 :(得分:3)

好吧,我明白了!使用Magento的Zend框架并非真正损坏......但它们的做法与正常情况略有不同。:

1)当您使用Zend Loader启用“延迟加载”时, 正常以在Zend中注释掉require_once()语句。这是表演的事情:
http://framework.zend.com/manual/en/performance.classloading.html

2)在Application.php和Loader.php类中注释它们正常但是:

  

[保留]在Zend_Application和Zend_Loader_Autoloader中调用require_once(),因为这些类在没有它们的情况下会失败。

因此,答案是在启用Loader.php时自己添加3个缺少的require_once()语句。这是我的新代码(在我的应用程序index.php中):

<?php
define('DS', DIRECTORY_SEPARATOR);

defined('APPLICATION_PATH')
  || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

defined('APPLICATION_ENV')
  || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

set_include_path(implode(PATH_SEPARATOR, array(
  BASE_PATH . DS . 'products' . DS . 'lib',
  '.',
)));

require_once 'Zend/Loader.php';

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

require_once APPLICATION_PATH.'/Bootstrap.php';

$application = new Zend_Application(
  APPLICATION_ENV,
  APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
    ->run();

现在我开始跑了!问题是我只是不知道如何设置自动加载器。我希望这有助于某人!

答案 2 :(得分:1)

  

我担心Varien可能搞乱了框架代码。

我猜这会违反使用条款(剥离require_once除外)。

Zend_Autoloader应该可以正常运行IMO。只需设置包含路径,你就可以了;)

<强>更新

我可以从您的代码中看到您没有定义BASE_PATH常量。因此,未定义包含路径,并且无法加载Zend_Loader_Autoloader。如果你的包含路径没问题,那么没有路径就可以写require_once 'Zend/Loader/Autoloader.php';。此外,不需要{@ 1}}它已被弃用。

此外,您还要Zend_Loader而不是Zend_Application。为什么?只需要“硬编码”所需的类是自动加载器,使用行Loader - 没有更多。如果它不起作用,则您的包含路径会混乱。

答案 3 :(得分:1)

以下代码启用了cli脚本中Zend-Framework的使用。与Magento一起提供的Zend-Framework已用于cli脚本。

// 1. point libPath to the <magento-root>/lib directory
$libPath=realpath(dirname(__FILE__).'../../../lib') ;

// 2. set the Zend-Framework include-path
set_include_path($libPath . PATH_SEPARATOR . get_include_path());

// 3. manual includes 

require_once 'Zend/Loader.php';
require_once 'Zend/Loader/Autoloader.php';

// 4. instantiate the autoloader
Zend_Loader_Autoloader::getInstance();

这使得能够使用Zend_Http_Client及其所有依赖类。