Как вызвать действие контроллера за пределами 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();
    }

В сценариях такого типа мы можем напрямую вызывать модели, блоки, помощников и т.д. Но как мы можем вызвать здесь действие контроллера? Любые предложения будут оценены по достоинству.

Author: Sukeshini, 2013-09-30

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();
 25
Author: Alan Storm, 2013-09-30 19:45:37

Вот способ сделать это:

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();
    }
 1
Author: FlorinelChis, 2013-10-01 08:52:25