Wie rufe ich eine Controller-Aktion außerhalb von Magento auf?

7

Wir können PHP-Skripte erstellen, die außerhalb von Magento ausgeführt werden. Verwenden Sie auch Magento-Funktionen, indem Sie das folgende Codefragment verwenden.

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

In solchen Skripten können wir Modelle, Blöcke, Helfer usw. direkt aufrufen. Aber wie können wir hier eine Controller-Aktion aufrufen? Anregungen werden geschätzt.

Sukeshini
quelle
Warum sollten Sie dies benötigen und nicht direkt eine Anfrage an diesen Controller / diese Aktion senden?
FlorinelChis

Antworten:

25

Magento ist nicht wirklich entwickelt , um dies zu tun, das heißt , Sie können Controller - Objekte wie jedes andere Objekt verwenden, aber es wird Komplikationen sein. Da diese Methoden aus einem HTTP-Kontext aufgerufen werden sollen, tun sie sehr oft Dinge mit den Anforderungs- und Antwortobjekten oder stützen sich auf einen Sitzungsstatus, der einfach nicht vorhanden ist, wenn Sie Dinge über den Befehl ausführen Linie.

Das heißt, das Folgende wird funktionieren

// 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();
Alan Storm
quelle
Vielen Dank. Ich habe den Code getestet. Es hat perfekt funktioniert.
Sukeshini
Wie man Param in einer nicht parametrisierten Aktion des Core Controllers mit $ controller-> someAction () übergibt; Wie in meinem Fall muss ich das Wunschliste-Element aus der removeAction ()
Magento 2 Learner
Bitte lassen Sie mich wissen, wie man in Magento 2 verwendet? Ich versuche, die Include-Controller-Klasse in die __construct-Funktion zu verwenden, aber sie wird nicht bestanden must be an instance.
Xanka
1

Hier ist ein Weg, dies zu tun:

file_get_contents('http://url.com/[...]/controller/action/');

Erledigt! :) :)

Oder Sie können die Anforderung überschreiben (es scheint also, dass sich die Anforderung auf diese Aktion bezieht) und dann einfach aufrufen Mage::run().

Im Ernst, hängt viel davon ab, was Sie tatsächlich in dieser Aktion tun. Benötigen Sie Magento instanziiert, benötigen Sie den gesamten Anforderungsfluss und so weiter?

Wenn Sie den Anforderungsfluss usw. nicht benötigen, können Sie Folgendes tun:

Mage::app();
require_once 'path/to/controller.php';
$my_controller = new YourController;
$my_controller->doSomething();

Wenn Sie mehr brauchen, können Sie mit dem Graben beginnen, indem Sie sich die Mage::run()Funktion ansehen. Ein weiterer guter Ausgangspunkt ist api.php, wo Sie sehen können, wie Sie eine leichtgewichtige Version von Magento instanziieren. Folgen Sie dann einfach dem Anforderungsablauf.

Betrachten Sie Alans Kommentar: Wenn Ihr Controller eine Instanz von ist Mage_Core_Controller_Varien_Action(und Ihre Magento-Controller sollten es sein), müssen Sie ein Anforderungsobjekt und ein Antwortobjekt an den Konstruktor senden:

 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();
    }
FlorinelChis
quelle
4
Controller-Objekte erfordern ein Anforderungs- und Antwortobjekt in ihrem Konstruktor.
Alan Storm
2
zwei nicht empfohlene Möglichkeiten auf einmal :-( Anfordern von Daten durch Aufrufen der eigenen uri und dies mit fopen & co
bukart