Ich nehme am Magento 2-Grundlagen-Entwicklungskurs teil und die Übung zum Admin-Router / Controller scheint veraltet zu sein. Der Router funktioniert, der Controller jedoch nicht. Er leitet immer nur zur Admin-Homepage um. Code für die Router- App / code / Training / Test / etc / adminhtml / routes.xml :
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/framework/App/etc/routes.xsd">
<router id="admin">
<route id="test" frontName="test">
<module name="Training_Test" before="Magento_Backend" />
</route>
</router>
</config>
Code für die Admin-Controller- App / code / Training / Test / Controller / Adminhtml / Action / Index.php :
<?php
namespace Training\Test\Controller\Adminhtml\Action;
class Index extends \Magento\Backend\App\Action
{
public function execute()
{
die("test reached controller");
}
protected function _isAllowed() {
return true;
}
}
Wenn ich zur Admin-URL von admin / test / action / index gehe, wird sie einfach umgeleitet und es passiert nichts. Wenn ich einen Konstruktor hinzufüge und xdebug verwende, wird angezeigt, dass er den Controller-Konstruktor erreicht, aber den Execute-Teil nie ausführt. Was vermisse ich?
Antworten:
Dies liegt daran, dass der geheime Schlüssel fehlt, wenn Sie die URL nur manuell eingeben. Geheimschlüssel - Funktion ist standardmäßig aktiviert und kann hier deaktiviert werden:
Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs
. Dann sollten Sie in der Lage sein, Ihre Aktion zu erreichen.quelle
In
router.xml
file (companyName/customModule/etc/adminhtml/router.xml
) bestand die Lösung darin, dass die Routen-ID und der Frontname den gleichen Wert haben. In Ihrem Fall wäre dies:quelle
<route id="Bmanager" frontName="bmanager">
zu<route id="bmanager" frontName="bmanager">
und jetzt kann ich einen Basis-Controller wie beschrieben zum Fragetext machen. Immer noch kein Glück mit meinen benutzerdefinierten Controllern. Bearbeiten: Tatsächlich hat einer meiner benutzerdefinierten Controller einige Fehler ausgegeben. Viel besser als ohne Fehler umzuleiten.Vielleicht ist es besser, diese Eigenschaft zu verwenden:
quelle
Beim Versuch, auf Module / Funktionen im Backend (Adminhtml) zuzugreifen, prüft Magento
Form Keys
, ob das Geheimnis vorhanden ist und ob / wann jemand versucht, auf eine Aktion zuzugreifen und keinen FormKey angibt (z. B. Hotlinking der URL) und / oder liefert einen ungültigen FormKey - die Adminhtml AbstractAction (Magento \ Backend \ App \ AbstractAction) leitet die definierte Startup-Seite des Benutzers Admin UIX weiter (normalerweise die Dashboard-Seite)[Dieser Mechanismus dient als "Sicherheitskontrolle", um zu verhindern, dass Benutzer auf Teile des Backends zugreifen, auf die sie keinen Zugriff haben.]
Beim Zugriff auf Optionen über das Admin UIX-Menü fügt Magento den FormKey automatisch für Sie hinzu.
Um die Prüfung auf FormKey zu verhindern, haben Sie zwei Möglichkeiten:
(a) Deaktivieren Sie die FormKey-Validierung
Navigation: Stores -> Einstellungen: Configuration -> Advanced: Admin -> Security -> Setup "Add Secret Key to URLs" bis "No"
Es ist sehr wichtig, sich daran zu erinnern, dass dadurch die Überprüfung des geheimen Schlüssels deaktiviert und Ihre Anwendung möglicherweise angreifbar wird.
(b) Deaktivieren Sie die FormKey-Überprüfung für Ihren Controller
Geben Sie im Attribut "$ _publicActions" Ihres Admin-Controllers die Aktionen an, die Sie von der FormKey-Prüfung ausnehmen möchten.
protected $ _publicActions = ['ENTER_NAME_OF_ACTION'];
Code Beispiel:
quelle
Das Problem der Routing-Umleitung bei aktiviertem Sicherheitsschlüssel ist die in der Datei menu.xml unter / etc / adminhtml / festgelegte Aktions-URL.
Der wichtige Wert ist der Aktionsparameter im Menüpunkt. Achten Sie darauf, den Namen des in der routes.xml deklarierten Moduls in den id-Parameter zu setzen. In meinem Fall: "mycompany_mymodule"
quelle
<input name="form_key" type="hidden" value="<?php echo $block->escapeHtml($block->getFormKey()) ?>" />
wird helfenSie können jedoch ein Brickpoing zu vendor / magento / module-backend / App / AbstractAction.php hinzufügen
quelle