Bonjour,

J'aimerais utiliser un Helper dans mon Controller. J'ai vu dans la doc' qu'on pouvait faire ceci de cette manière-là :

/* src/View/Helper/LinkHelper.php (utilisant d'autres helpers) */

namespace App\View\Helper;

use Cake\View\Helper;

class LinkHelper extends Helper
{
    public $helpers = ['Html'];

    public function makeEdit($title, $url)
    {
        // Utilise le Helper Html pour afficher la sortie
        // des données formatées:

        $link = $this->Html->link($title, $url, ['class' => 'edit']);

        return '<div class="editOuter">' . $link . '</div>';
    }
}

Quand j'essaie ceci, j'ai une erreur stipulant que le Helper n'est pas défini.
Je sais que les Helpers sont destinés à être utiliser dans une vue, cependant cette partie de mon application se fait en AJAX.

Quelqu'un aurait une idée ? Ou une autre manière de faire ?
Merci,
Cdlt,

DR

6 réponses


Ce que tu nous montres, c'est un exemple de la doc, pour utiliser d'autres helpers, depuis un autre helper.
Il n'est à aucun moment dit dans la doc que tu peux utiliser un Helper dans un Controller.

ciramor
Auteur

Oui exact Lartak, j'aimerais justement utiliser ce système d'employer un helper ailleurs que dans une vue. Et dans mon cas, c'est dans un controller que j'en ai besoin. Même si dans la doc', rien n'y fait allusion, est-il néanmoins possible de le faire ? Est-ce que quelqu'un a déjà trouver une solution pour répondre à cette attente ?

Je vous remercie pour le temps accordé à ma question.

Cdlt,
DR

Utiliser un Helper dans un Controller n'a pas trop de sens.
Techniquement tu peux toujours instancier ton Helper manuellement, il faut juste que tu lui donnes une instance de View.
Mais ça ne serait vraiment pas idéal comme solution.

Peux-tu donner plus de détails sur ce que tu cherches à faire ? Il y a problablement une meilleure solution.

ciramor
Auteur

Parfait. Pourriez-vous me montrer un exemple. Ce que je cherche à faire, c'est utiliser mon Helper pour redimensionner des images. Je veux l'utiliser dans le Controller, car le contenu sera généré par une méthode du controller en AJAX. Voilà pourquoi j'en ai besoin. Si vous connaissez une meilleure solution pour répondre à un problème de ce type, je serais ravi d'essayer votre solution.
Merci pour l'attention porté à mon sujet.

Cdlt,
DR

Je comprends mieux.
Mon conseil serait d'extraire la logique de redimensionnement du Helper dans une classe à part. Ensuite, soit tu utilises directement cette nouvelle classe dans ton Controller, soit tu crées un Component qui instanciera cette classe et utilisera ses méthodes via des méthodes proxy.

Qqch comme :

class MyComponent extends Component {
    protected $resizer;

    public function initialize(array $config)
    {
        // Soit en brut comme ça, soit éventuellement en utilisant un paramètre du Component
        // pour plus de flexibilité si tu as plusieurs choix de classes pour gérer ça
        $this->resizer = new Resizer();
    }

    public function resize($param1, $param2)
    {
        return $this->resizer->resize($param1, $param2);
    }

    public function crop($param1, $param2)
    {
        return $this->resizer->crop($param1, $param2);
    }
}

L'implémentation n'est certainement pas la plus parfaite en terme d'architecture, mais c'est pour que tu comprennes l'idée.
Par exemple, si ton Component ne fait que ça, tu pourrais utiliser __call() pour éviter de devoir tout répéter par exemple. Ou bien tu pourrais ne pas inscrire diretement la dépendence dans ta classe mais la passer via $config sur la méthode initialize() pour plus de souplesse et d'extensibilité.

Du coup, tu peux utiliser le même principe avec le Helper.
Et ainsi tu pourras utiliser le redimensionnement avec les deux, sans instancier ton Helper dans le Controller.

ciramor
Auteur

La grande classe Havok ! Merci pour ce complément d'informations et cette solution !
J'essaierai de cette manière lundi lorsque j'aurai à nouveau le projet entre mes mains.

Cdlt,
DR