我想制作一个与我们的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所做的改变打破了框架,不是吗?这似乎是为什么它至少不适合我?我怎样才能解决这个问题并将所有注释掉的内容包括在内?
再次感谢
答案 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及其所有依赖类。