Invocar metodo Private por reflexion

31 views
Skip to first unread message

pAk0s

unread,
Apr 27, 2012, 11:12:01 AM4/27/12
to php-m...@googlegroups.com
Saludos!!!

La pregunta es si alguien sabe si se puede invocar un metodo private por reflexion.

el punto es que tengo un controlador encargado de eliminar todas la entidades.. la gran mayoria con un delete a un campo de db basta pero algunas veces hay que hacer otras cosas antes de eliminar la entidad, para ello en primera instancia se me ocurrio algo asi:

<?php

namespace controles;
-------------------------------------
class Del {
    public $em;
    public function index() {
        $entitie = $_GET["e"];
        $ob = $this->em->find($entitie, $_GET["id"]);       
        switch ($_GET["e"]) {
            case 'Entidad1':
                   //logica previa a eliminar la entidad Entidad1.
                break;
                 .
                 .
                 .
            case 'EntidadN:                          
            default:
        }
        $this->em->remove($ob);
        $this->em->flush();
        if (isset($_POST["ajax"])) {
            header("Content-type:application/json");
            die(json_encode(array("error" => false)));
        }
        header("Location:" . $_SERVER["HTTP_REFERER"]);
    }

}
---------------------------------------------------

luego se me ocurio que seria mas limpio tener por separado la logica de cada entidad que requiriera una logica extra. eso lo logro colocando la logica en otros metodos dentro del controlador pero como el controlador es visible desde url haciendo los metodos privados vasta para que no puedan ser invocados desde URL, el provema es que al parecer ReflectMethod no puede invocar metodos privados :S

esto es lo que intento hacer:
 
-----------------------------------------------------

<?php

namespace controles;

class Del {

    public $em;
    private function Entidad1{
      //logica previa para eliminar Entidad1
    }
    private function Entitdad....
    .
    .
    .
    private function EntidadN{
      //logica previa para eliminar EntidadN
    }
    public function index() {
        $entitie = $_GET["e"];
        $ob = $this->em->find($entitie, $_GET["id"]);
        if(method_exists($this, $entitie)){
            $refecMeth = new \ReflectionMethod($this, $entitie);        
            $refecMeth->invoke($this, $ob);
        }
        $this->em->remove($ob);
        $this->em->flush();
        if (isset($_POST["ajax"])) {
            header("Content-type:application/json");
            die(json_encode(array("error" => false)));
        }
        header("Location:" . $_SERVER["HTTP_REFERER"]);
    }

}

-----------------------------------------------------

y lo que obtengo es un Exception :

Fatal error: Uncaught exception 'ReflectionException' with message 'Trying to invoke private method controles\Del::Entidad1() from scope ReflectionMethod'

por lo pronto lo solucion haciendo public el metodo con la logica previa.. pero me gustaria mas que esto quedarán privado... -_- ... ¿alguien sabe como invocar esos metodos privados :S.... ?, entido por que no se podria invocar un metodo privado desde otra clase.. pero en este caso se supone que lo estoy tratando de invocar desde la misma clase, lo unico que tendria que decirle a ReflectionMethod que usara el scope de la clase donde esta siendo invocada.. pero no se si se pueda.. por lo pronto lo que se me ha ocurrido no ha funcionado...

Reply all
Reply to author
Forward
0 new messages