Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wellington.alves

Chamar classe abstrata com call_user_func

Recommended Posts

Bom dia,

gostaria de uma ajuda para solucionar um problema.

 

Estou criando um esquema de rotas parecido com o do laravel:

Route::get('url','Controller@metodo')

 

Porém me esbarrei em um detalhe.

 

Tenho uma classe abstrata que estende  outra classe com métodos.


//classe abstrata

abstract class Request extends FormRequest{


}
//classe extendida
class FormRequest{


    public function all()
    {
        return 'teste';
    }
}

 

Como os parâmetros da rota são dinâmicos, criei uma função para pega-los:

if(class_exists($controller)){
        if(method_exists($controller,$method)){
            $class = new ReflectionClass($controller);
            $metodo = $class->getMethod($method)->getParameters();
            $typehint = explode('\\',$metodo[0]->getClass()->name); // App\Request

            $typehint = $typehint[1]; // Request



            call_user_func([new $controller,$method], $typehint); // Chamo a classe Aluno e o metodo 

 

E no controller está assim:

  class Aluno
    {

        protected $aluno;

        public function checaAluno(\App\Request $request)
        {
            echo $request->all();

        }

        public function __get($key){
         print_r($key);
        }
    }

Defini o typehint do método com o método abstrato Request.

 

Porém recebo o erro:

Argument 1 passed to Aluno::checaAluno() must be an instance of App\Request, string given

 

Ou seja, o type hint está como sendo chamado como string.

 

O laravel funciona de maneira semelhante, porém não consegui fazer essa parte para chamar um método abstrato no typeint. Sendo que não podemos chamar uma classe abstrata.

 

Poderiam me dar um help por favor.

 

Obrigado.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara não sei se vai funcionar, mas da forma que está fazendo você está passando uma string mesmo. Tenta algo do tipo.

call_user_func([new $controller,$method], $typehint::class);

Ou

$metodo = $class->getMethod($method)->getParameters();
call_user_func([new $controller,$method], $metodo[0]->getClass());

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, rockrgo disse:

Cara não sei se vai funcionar, mas da forma que está fazendo você está passando uma string mesmo. Tenta algo do tipo.


call_user_func([new $controller,$method], $typehint::class);

Ou


$metodo = $class->getMethod($method)->getParameters();
call_user_func([new $controller,$method], $metodo[0]->getClass());

 

 

Infelizmente não deu, mesmo erro :/

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Descobri o motivo.

Como eu estava tendo como base o laravel, no arquivos onde chamava a classe Request estava apontando para a classe abstrata do request e não para a classe concreta.

use App\Http\Requests\Request //apontava para esta, que é abstrata
use Illuminate\Http\Request //está é  a correta

Tendo em vista isso, somente removi o abstract da classe. Pois realmente ela não deve ser.

Obrigado a todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.