Jump to content
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.

 

Share this post


Link to post
Share on other 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());

 

Share this post


Link to post
Share on other 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 :/

 

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.