Можно ли использовать существующий / включенный Zend Framework Magento в другом приложении? - PullRequest
4 голосов
/ 17 марта 2011

Я хочу сделать небольшое приложение Zend, которое будет работать параллельно с нашей установкой Magento (Enterprise). Могу ли я использовать существующий код Zend, включенный в Magento? Или мне нужна еще одна отдельная копия Zend?

Боюсь, что Varien, вероятно, испортил код фреймворка. Просто глядя, кажется, они закомментировали все операторы require (), что вызывает много ошибок (очевидно). В любом случае Zend AutoLoader не будет работать. Есть ли способ использовать Varien AutoLoader вместо этого?

Я не особо хочу импортировать другую инфраструктуру (более 3000 файлов) в наш проект, если я могу избежать этого.

Спасибо!

EDIT:

Вот моя структура каталогов:

/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, которое нарушает Framework, нет? Похоже, почему это не работает у меня, по крайней мере? Как я могу обойти это и включить все закомментированные включает в себя ??

Еще раз спасибо

Ответы [ 4 ]

4 голосов
/ 17 марта 2011

добавить папку библиотеки 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)

Вот мое полное имя проекта / 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
}
3 голосов
/ 17 марта 2011

Хорошо, я понял!Zend Framework с Magento не на самом деле сломан ... но они делают что-то немного отличное от обычного.:

1) Это нормально нормально комментироватьинструкции require_once () в Zend, когда вы включаете «отложенную загрузку» с Zend Loader.Производительность:
http://framework.zend.com/manual/en/performance.classloading.html

2) не нормально комментировать их в классах Application.php и Loader.php, однако:

[сохранить] вызовы require_once () в Zend_Application и Zend_Loader_Autoloader, так как эти классы не будут работать без них.

Итак, ответ заключается в том, чтобы просто добавить 3 отсутствующих оператора require_once ()самостоятельно при включении Loader.php.Вот мой новый код, который работает (в моих приложениях 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();

Теперь я запущен!Проблема была в том, что я просто не знал, как был настроен автозагрузчик.Надеюсь, это кому-нибудь поможет!

1 голос
/ 11 августа 2011

Следующий код разрешил использование Zend-Framework в сценарии cli.Zend-Framework, поставляемый с Magento, использовался для сценария 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 и все его зависимые классы.

1 голос
/ 17 марта 2011

Боюсь, что Varien, вероятно, испортил код фреймворка.

Полагаю, это нарушит условия использования (за исключением удаления require_once).

Zend_Autoloader должен работать нормально IMO. Просто установите путь включения, и все в порядке;)

Обновление:

Из вашего кода видно, что у вас не определена константа BASE_PATH. Следовательно, путь включения не определен и Zend_Loader_Autoloader не может быть загружен. Если ваш включаемый путь будет в порядке, тогда можно написать require_once 'Zend/Loader/Autoloader.php'; без пути. Также нет необходимости требовать Zend_Loader, это устарело.

Также вы включаете Zend_Application, а не Loader. Зачем? Единственный класс, который когда-либо требовался для «жесткого кода» - это автозагрузчик, использующий строку require_once 'Zend/Loader/Autoloade.php'; - НИЧЕГО БОЛЬШЕ Если это не сработает, ваш включаемый путь испорчен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...