magento外でコントローラーアクションを呼び出す方法は?


7

magento外で実行されるphpスクリプトを作成できます。また、次のコードスニペットを使用して、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();
    }

これらのタイプのスクリプトでは、モデル、ブロック、ヘルパーなどを直接呼び出すことができますが、ここでコントローラーアクションを呼び出すにはどうすればよいでしょうか。任意の提案をいただければ幸いです。


なぜこれが必要で、そのコントローラー/アクションに直接リクエストしないのですか?
FlorinelChis 2013

回答:


25

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();

どうもありがとうございました。コードをテストしました。それは完全に機能しました。
スケシニ2013年

$ controller-> someAction();を使用して、コアコントローラーのパラメーター化されていないアクションでParamを渡す方法 私の場合のように、インデックスコントローラーのremoveAction()からウィッシュリストアイテムを削除する必要があります
Magento 2 Learner

Plsは、magento 2での使用方法を教えてくれますか?includeコントローラークラスを__construct関数に使用しようとしていますが、渡されませんmust be an instance
xanka

1

これを行う方法は次のとおりです。

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()機能を調べて掘り始めることができます。もう1つの良い出発点はapi.php、Magentoの軽量バージョンをインスタンス化する方法を確認できるところです。次に、要求フローに従ってください。

Alanのコメントを見てください:コントローラーがのインスタンスである場合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();
    }

4
コントローラーオブジェクトには、コンストラクターに要求オブジェクトと応答オブジェクトが必要です。
アランストーム

2
一度に2つの推奨されない方法:-(自分のuriを呼び出してfopen&coでこれを行うことでデータを要求する
bukart
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.