Je prends le cours de développement des bases de Magento 2 et l'exercice Admin Router / Controller semble obsolète. Le routeur fonctionne, mais pas le contrôleur, il réachemine toujours vers la page d'accueil d'administration. Code pour l' application routeur / 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 pour l' application du contrôleur Admin / 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;
}
}
Lorsque je vais dans l'url d'administration de admin / test / action / index, il ne fait que rediriger et rien ne se passe. Si j'ajoute un constructeur et utilise xdebug, cela montre qu'il atteint le constructeur du contrôleur, mais il ne fait jamais la partie d'exécution. Qu'est-ce que je rate?
Réponses:
Cela se produit car la «clé secrète» est manquante lorsque vous saisissez simplement l'URL manuellement. Fonction clé secrète est activée par défaut et peut être désactivé ici:
Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs
. Vous devriez alors pouvoir atteindre votre action.la source
Dans le
router.xml
fichier (companyName/customModule/etc/adminhtml/router.xml
) Pour moi, la solution consistait à avoir l'id de l'itinéraire et frontName la même valeur. Dans votre cas, ce serait:la source
<route id="Bmanager" frontName="bmanager">
en<route id="bmanager" frontName="bmanager">
et maintenant je peux faire fonctionner un contrôleur de base comme décrit le corps de la question. Toujours pas de chance avec mes contrôleurs personnalisés. Edit: En fait, l'un de mes contrôleurs personnalisés a commencé à donner des erreurs. Bien mieux que de rediriger sans erorrs.Il est peut-être préférable d'utiliser cette propriété:
la source
Lors de la tentative d'accès aux modules / fonctionnalités dans le backend (Adminhtml), Magento vérifie la présence du secret
Form Keys
, et si / quand quelqu'un tente d'accéder à une action et ne fournit pas de FormKey (par exemple: hotlinking l'url) et / ou fournit une clé de formulaire non valide - l'Adminhtml AbstractAction (Magento \ Backend \ App \ AbstractAction) acheminera la page de démarrage définie par l'utilisateur Admin UIX (qui est généralement la page du tableau de bord)[Ce mécanisme sert de «point de contrôle de sécurité» pour empêcher les utilisateurs d'accéder à des parties du backend auxquelles ils n'ont pas accès]
Lorsque vous accédez aux options du menu Admin UIX - Magento ajoute automatiquement la FormKey pour vous.
Pour empêcher la vérification de FormKey, vous avez deux options:
(a) Désactiver la validation FormKey
Navigation: Magasins -> Paramètres: Configuration -> Avancé: Admin -> Sécurité -> Configuration "Ajouter une clé secrète aux URL" à "Non"
Il est très important de se rappeler que cela désactivera la validation de la clé secrète et peut donc rendre votre application vulnérable.
(b) Désactivez la validation FormKey pour votre contrôleur
Spécifiez les actions que vous souhaitez exempter, de la vérification FormKey, dans l'attribut "$ _publicActions" de votre contrôleur d'administration.
protected $ _publicActions = ['ENTER_NAME_OF_ACTION'];
Exemple de code:
la source
Le problème de la redirection de routage avec la clé de sécurité activée est l'URL d'action définie dans le menu.xml sous / etc / adminhtml /
La valeur importante est le paramètre d'action dans l'élément de menu. Faites attention à définir le nom du module déclaré dans routes.xml dans le paramètre id. Dans mon cas: "mycompany_mymodule"
la source
<input name="form_key" type="hidden" value="<?php echo $block->escapeHtml($block->getFormKey()) ?>" />
aideramais vous pouvez ajouter un brickpoing à vendor / magento / module-backend / App / AbstractAction.php
la source