Je veux appeler une fonction du contrôleur à partir d'une vue. Est-ce possible en Cake PHP ?
Réponses
Trop de publicités?Il est possible de le faire par l'intermédiaire de la méthode requestAction mais elle n'est pas recommandée en raison d'une légère baisse de performance. Utilisez-la à bon escient.
En tant que Xr comme indiqué dans le commentaire, l'utilisation de requestAction signifie souvent des problèmes de conception (séparation MVC).
Oui, utiliser requestMethod avec la mise en cache
$out = Cache::read('savedincache');
if(empty($out)){
$out = $this->requestAction('/articles/myfunction');
Cache::write('savedincache', $out);
}
dans /app/controllers/articles_controller.php
function myfunction(){
$out = $this->Article->find('all');
return $out
}
J'ai réussi à faire ce qui suit (CakePHP 2.3).
Supposons que vous ayez "MyController" avec une fonction publique nommée "functionToRun()".
A partir de votre fichier View :
$variable = new MyController();
$variable->functionToRun($parameter);
Notez que l'objet "$this->request" ne sera pas disponible, donc si vous avez besoin de ces données dans la fonction, vous devrez les passer en paramètre, et peut-être apporter des modifications à la fonction pour le permettre.
Je ne vais pas débattre de la question de savoir si c'est une bonne idée ou non, bien qu'il faille noter que, parfois, le bâtiment est en feu et qu'il faut l'éteindre hier. Je concède que la conception générale aurait probablement dû être meilleure, mais nous n'avons pas le temps de reconstruire les étages un à trois simplement parce que nous avons découvert le problème lorsque nous sommes arrivés à l'étage cinq.
Si l'on me donne le choix d'enfreindre une règle, je préfère de loin enfreindre cette règle plutôt que celle qui concerne la duplication du code, qui, à ma connaissance limitée, est la seule alternative restante. La duplication du code conduit à des cauchemars bien pires en matière de maintenance.
requestAction
est une mauvaise idée, si vous avez besoin de définir une variable à partir du contrôleur, je pense qu'il est préférable de déplacer le code du contrôleur dans le modèle et ensuite dans app_controller.php, à partir de beforeFilter
vous pouvez utiliser votre modèle et appeler votre fonction à partir de votre modèle.