erreur d'assistance de vue personnalisée dans Zend Framework 2
-
12-12-2019 - |
Question
Je n'arrive pas à enregistrer un assistant de vue personnalisé dans Zend Framework 2.02. J'ai essayé toutes les solutions publiées ici et tout ce que je pense devoir faire, mais j'obtiens toujours cette erreur :
Erreur fatale:Classe 'ModuleName\view\Helper\mylinkhelper' introuvable dans C:\wamp\vhosts\projectName\vendor\zendframework\zendframework\library\Zend\ServiceManager\AbstractPluginManager.php à la ligne 177
Et voici à quoi ressemble mon module.config.php :
return array{
'controllers'=>array(
....
),
'view_manager' => array(
'template_path_stack' => array(
'ModuleName' => __DIR__ . '/../view',
),
),
'view_helpers' => array(
'invokables' => array(
'mylink' => 'ModuleName\view\Helper\mylinkhelper',
),
),
};
dans mon fichier de vue, j'ai :
echo $this->mylink($someparameter);
J'apprécie tout commentaire à ce sujet.Je ne sais pas vraiment quoi faire d'autre ici.
La solution
<?php
// ./module/Application/src/Application/View/Helper/AbsoluteUrl.php
namespace Application\View\Helper;
use Zend\Http\Request;
use Zend\View\Helper\AbstractHelper;
class AbsoluteUrl extends AbstractHelper
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function __invoke()
{
return $this->request->getUri()->normalize();
}
}
Vous remarquerez que cette aide particulière a une dépendance - un objet Zend \ http \ requête.Pour injecter cela, nous devrons mettre en place une usine avec la logique d'initialisation de notre aide d'affichage:
<?php
// ./module/Application/Module.php
namespace Application;
use Application\View\Helper\AbsoluteUrl;
class Module
{
public function getViewHelperConfig()
{
return array(
'factories' => array(
// the array key here is the name you will call the view helper by in your view scripts
'absoluteUrl' => function($sm) {
$locator = $sm->getServiceLocator(); // $sm is the view helper manager, so we need to fetch the main service manager
return new AbsoluteUrl($locator->get('Request'));
},
),
);
}
// If copy/pasting this example, you'll also need the getAutoloaderConfig() method; I've omitted it for the sake of brevity.
}
C'est ça!Maintenant, vous pouvez appeler votre aide dans vos scripts de vue:
L'URL complète à la page en cours est la suivante: <?php echo $this->absoluteUrl(); ?>
Merci à Evan pour créer ce tutoriel
Autres conseils
Il semble que View Helper soit correctement ajouté au ServiceManager
depuis l'invocation mylink()
essaie de créer ModuleName\view\Helper\mylinkhelper
.
Je m'assurerais que la classe est créable avec new College\view\Helper\mylinkhelper();
à partir d'un contrôleur, cela est susceptible de donner des indices.Vérifiez également que le nom de fichier et le nom de classe sont corrects.
Votre approche est correcte, mais deux choses peuvent vous causer ce problème :
Vous parlez d'un espace de noms de niveau supérieur
ModuleName
, mais dans votre exemple de configuration, vous avez l'espace de noms de niveau supérieurCollege
.Quand tu as unModuleName
espace de noms et vous essayez de chargerCollege
, ça ne marche évidemment pasVotre assistant de visualisation ne peut pas être chargé automatiquement.Êtes-vous sûr que le nom de la classe est correct (
MyLinkHelper
), l'espace de noms est correct (College\View\Helper
, voir aussi ci-dessus) et le nom du fichier est correct (MyLinkHelper.php
).Et avez-vous activé le chargement automatique du nom de classe pour ce module dans votre classe de module ?
Une troisième option pourrait être les minuscules « view » et « mylinkhelper », comme vous l'écrivez habituellement. College\View\Helper\MyLinkHelper
avec un V, M, L et H majuscules.Mais puisque vous êtes sous Windows, cela ne devrait pas avoir d’importance, autant que je sache.Je sais que pour Linux, vous devez être conscient de la sensibilité à la casse des noms de classe.
Le problème est que le fichier de classe n'est pas chargé .C'est censé être inclus dans AUTOLOAD_CLASSMAP.PHP.
<?php
return array(
'{module}\View\Helper\{helper}' => __DIR__ . '\View\Helper\{helper}.php',
);
?>
J'ai couru dans le même problème et cette page m'a aidé.
Comme je suis nouveau à Zf, je ne sais pas s'il y a une autre façon d'ajouter les chemins en autoload_classmap, je pense probablement qu'il y en a, mais je viens de modifier le fichier manuellement.
a eu le même problème, découvert par moi-même que View Helper File n'était pas inclus.Tout en le mettant dans le contrôleur pour tester cela fonctionnait
E.g.: require_once('module/Pages/view/Helper/RenderNav.php');
Pourquoi il n'a pas été fait automatiquement?