Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] Méthode protégée ou private dans un contrôleur

Posted by Nesswaw on 08/24/2011 09:57

Bonjour,

Si j'appelle une méthode "protected" ou "private" qui se trouve dans mon contrôleur direct depuis l'url, une fatal error s'affiche à l'écran.

Cela ne devrait pas retourné la page erreur 500 de Jelix?

Exemple: app/controllers/default.classic.php

<?php
class defaultCtrl extends jController
{
<code>
    protected function check() {
        $rep = $this->getResponse('html');
        $rep->body->assignZone('MAIN', 'jelix~check_install');
        return $rep;
    }

}

</code>

On appelle cette url: /?module=app&action=default:check

Merci

  [Opened] Méthode protégée ou private dans un contrôleur

Reply #1 Posted by foxmask on 08/24/2011 12:32

cew methodes doivent etre publiques me semble


@GitHub - Forum HaveFnuBB! powered by Jelix - Le Booster Jelix !

  [Opened] Re: Méthode protégée ou private dans un contrôleur

Reply #2 Posted by Nesswaw on 08/24/2011 13:09

Publique si on veux les appeler direct depuis une url...sinon pas...

  [Opened] Méthode protégée ou private dans un contrôleur

Reply #3 Posted by laurentj on 08/24/2011 14:21

On ne peut pas "catcher" une erreur fatale dans PHP. donc non, on ne peut pas afficher la page d'erreur de jelix ou de ton appli.

De toute façon, si erreur fatale il y a (quelle qu'elle soit), c'est qu'il y a à priori quelque chose qui ne va vraiment pas dans ton appli (donc ne devrait pas arriver en prod si l'appli a bien été testée auparavant), ou alors c'est l'internaute qui a fait volontairement une "mauvaise" manipulation, (comme dans ton exemple) dans ce cas, il n'y a pas de raison qu'on soit "poli" avec lui :-)

Et si les détails de l'erreur fatale te gênent (pour des raisons de sécurité ou autre), il est possible de ne pas les afficher en modifiant la configuration de php (display_errors=off si mes souvenirs sont bons). En production seulement bien entendu.

  [Opened] Re: Méthode protégée ou private dans un contrôleur

Reply #4 Posted by Nesswaw on 08/24/2011 14:33

Bonjour,

Merci pour la réponse, c'est ce que je voulais savoir :)

PS: Si je désactive display_errors, elle fonctionneront toujours dans jLog?

Merci

  [Opened] Re: Méthode protégée ou private dans un contrôleur

Reply #5 Posted by Nesswaw on 08/25/2011 08:58

Re,

J'ai trouvé une meilleure réponse: Comme Jelix bloque l'appelle des méthodes qui commence par "deux_tiret_du_bas" (typique pour l'appelle de construct), alors il suffit de nommée les méthode en commençant par "deux_tiret_du_bas" => __check().

Ainsi Jelix renvoie une 404^^ pas de vilaine fatal erreur qui s'affiche :)

PS: J'ai du mettre "deux_tiret_du_bas" au lieu de "__", le forum transforme ces char pour mettre en gras...

  [Opened] [Résolu] Méthode protégée ou private dans un contrôleur

Reply #6 Posted by laurentj on 08/26/2011 12:13

Pour l'astuce du "", pourquoi pas. Mais faut faire attention tout de même. Ce prefixe est censé être reservé à PHP (il n'y a pas que construct, mais aussi set, get et autres methodes magiques).

PS: pour éviter que le forum interprète certains signes spécifiques, il faut les échapper par un \ devant.

  [Opened] Re: [Résolu] Méthode protégée ou private dans un contrôleur

Reply #7 Posted by Nesswaw on 08/26/2011 13:31

Alors pourquoi pas modifié Jelix et dire que toutes les fonctions qui commencent par un "_" ne sont pas autorisé à être appelé direct via l'url?

Il suffirait de modifier une ligne dans jelix/core/selector/jSelectorActFast.class.php ligne 40:

if ($this->method{0} == '_')

Mais cela viens poser un autre "problème": Ont peut appeler les méthodes qui sont dans jController:

/?module=app&action=default:param
/?module=app&action=default:intParam
/?module=app&action=default:getResponse

Du coup il faudrait vérifier que la fonction soit "public" pour être appelé depuis l'url, mais ça consiste à plus de modification.

Qu'en pensez-vous?

EDIT: Pour tester si la méthode peut-être appelé, il faudrait modifier jelix/core/jCoordinator.class.php entre la ligne 204 et 205, rajouter ce genre de code:

if(!is_callable(array($ctrl, $this->action->method))) {
<code>
     Exception

}

</code>
 
Page
  1. jQuery et jForms >
  2. Méthode protégée ou private dans un contrôleur