2015-04-15 4 views
2

Я хочу переопределить поведение контроллера существующего модуля Magento/*. Я хочу создать свою собственную Magento/Customer/Controller/Account/LoginPost.php-реализацию.Как переопределить контроллер в Magento2?

  1. Как это сделать?
  2. Зависимость Инъекция, по-видимому, хороша для классов моделей, но как насчет контроллеров? Могу ли я внедрить свой собственный класс контроллера LoginPost, чтобы какой-то объект использовал мою собственную реализацию?
+0

Если бы я мог использовать маршрутизатор, чтобы просто маршрутизировать клиент/учетную запись/loginPost в мой контроллер, было бы хорошо. Но опять же, как определить это в routes.xml? – wit0ld

ответ

3

Я нашел решение после некоторого расследования ;-).

Этот ресурс был очень полезным: https://github.com/tzyganu/Magento2SampleModule.

Sample модуль для этого решения здесь: https://github.com/nuclearhead/M2OverrideAction

Эффект в том, что если вы идете в URI:/клиент/счет/Логин: метод из пользовательского модуля уволят вместо метода по умолчанию от модуля Magento_Customer , а URL останется прежним. Конечно, вы можете сделать то же самое с действием loginPost.

Я сделал это с переопределением класса маршрутизатора в di.xml. Я упростил версию модуля SampleNews от tzyganu, чтобы уточнить решение. класс маршрутизатор проверяет, что URI возвращает запрос- метод $> getPathInfo(), а затем устанавливает новые конфиги в $ запросу:


    $request->setModuleName('overrideaction') 
      ->setControllerName('view') 
      ->setActionName('index'); 
    $request->setDispatched(true); 
    $this->dispatched = true; 
    return $this->actionFactory->create(
     'Magento\Framework\App\Action\Forward', 
     ['request' => $request] 
    ); 
 

ЦЭТ/интерфейс/di.xml моего пользовательского модуля:

<?xml version="1.0"?> 
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd"> 
    <type name="Magento\Framework\App\RouterList"> 
     <arguments> 
      <argument name="routerList" xsi:type="array"> 
       <item name="customer" xsi:type="array"> 
        <item name="class" xsi:type="string">MiniSamples\OverrideAction\Controller\Router</item> 
        <item name="disable" xsi:type="boolean">false</item> 
        <item name="sortOrder" xsi:type="string">9</item> 
       </item> 
      </argument> 
     </arguments> 
    </type> 
</config> 
3

Вы можете использовать функцию Magento2's Plugins.

Magento позволяет изменять или расширять поведение любого открытого способа в любом классе Magento. Вы можете изменить поведение исходного метода , создав расширение. Эти расширения используют класс Plugin и поэтому называются плагинами.

написать в вашем модуле приложения/коде/YourNamespace/YourModule/и т.д./di.xml файл:

<?xml version="1.0"?> 
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">  
    <type name="Magento\Customer\Controller\Account\LoginPost"> 
     <plugin name="yourModuleAccountLoginPost" 
       type="YourNamespace\YourModule\Plugin\Customer\LoginPost" 
       sortOrder="10" 
       disabled="false"/> 
    </type> 
</config> 

Создать новый файл приложения/код/​​YourNamespace/YourModule/Plugin /Customer/LoginPost.php и напишите в нем следующий код.

<?php 

namespace YourNamespace\YourModule\Plugin\Customer; 

class LoginPost 
{ 
    public function aroundExecute(\Magento\Customer\Controller\Account\LoginPost $subject, \Closure $proceed) 
    { 
     // your custom code before the original execute function 
     $this->doSomethingBeforeExecute(); 

     // call the original execute function 
     $returnValue = $proceed(); 

     // your custom code after the original execute function 
     if ($returnValue) { 
      $this->doSomethingAfterExecute(); 
     } 

     return $returnValue; 
    } 
} 
?> 

Кроме того, вы можете также использовать beforeExecute() & afterExecute() функций указанного класса. Посмотрите на http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html для деталей.

Смежные вопросы