Как вызвать действие контроллера за пределами magento?
Мы можем создавать php-скрипты, которые работают за пределами magento. А также используйте функции magento, используя в нем следующий фрагмент кода.
define('ROOT', '');
$mage_php_url = ROOT.'app/Mage.php';
if (!empty($mage_php_url) && file_exists($mage_php_url) && !is_dir($mage_php_url))
{
// Include Magento's Mage.php file.
require_once ( $mage_php_url );
umask(0);
Mage::app();
}
В сценариях такого типа мы можем напрямую вызывать модели, блоки, помощников и т.д. Но как мы можем вызвать здесь действие контроллера? Любые предложения будут оценены по достоинству.
2 answers
Magento на самом деле не предназначен для этого, что означает, что вы можете использовать объекты контроллера, как и любой другой объект, но возникнут сложности. Поскольку эти методы предназначены для вызова из контекста HTTP, они очень часто будут выполнять действия с объектами запроса и ответа или полагаться на некоторый фрагмент состояния сеанса, которого просто не существует, когда вы запускаете что-то из командной строки.
Тем не менее, будет работать следующее
// require you file
if(!class_exists('Mage_Customer_AccountController')) //in case the class already exists
{
require_once('Mage/Customer/controllers/AccountController.php');
}
// instantiate your controller, using the `Mage:app()` object to grab the required request and response
$controller = new Mage_Customer_AccountController(
Mage::app()->getRequest(),
Mage::app()->getResponse()
);
// grab request and response object to manipulate as needed
// (i.e. controller action expects post variables, etc.)
$request = $controller->getRequest();
$response = $controller->getResponse();
//manipulate things as per above
//call the action
$controller->someAction();
Вот способ сделать это:
file_get_contents('http://url.com/[...]/controller/action/');
Готово!:)
Или вы можете переопределить запрос (чтобы казалось, что запрос относится к этому действию), а затем просто позвонить Mage::run()
.
На более серьезной ноте, многое зависит от того, что вы на самом деле делаете в этом действии. Вам нужен экземпляр Magento, вам нужен весь поток запросов и так далее.
Если вам не нужен поток запросов и так далее, вы можете сделать:
Mage::app();
require_once 'path/to/controller.php';
$my_controller = new YourController;
$my_controller->doSomething();
Если вам нужно больше, вы можете начать копать посмотрев на функцию Mage::run()
.
Еще одной хорошей отправной точкой является api.php
, где вы можете увидеть, как создать экземпляр облегченной версии Magento. Затем просто следуйте потоку запросов.
Глядя на комментарий Алана:
Если ваш контроллер является экземпляром Mage_Core_Controller_Varien_Action
(и ваши контроллеры Magento должны быть), вам необходимо отправить объект запроса и объект ответа конструктору:
public function __construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = array())
{
$this->_request = $request;
$this->_response= $response;
Mage::app()->getFrontController()->setAction($this);
$this->_construct();
}