Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Usar redirect dentro de uma classe própria

Bom dia a todos,

Estou desenvolvendo uma aplicação utilizando Laravel e preciso criar algumas classes para controlar o acesso dos usuários de acordo com o nível de permissão. Minha ideia é implementar o Pattern Strategy de modo que cada tipo de usuário possua uma classe que implementa uma interface IPessoaAcesso, responsável por definir o acesso e redirecionar o usuário, eu criei as classes dentro dentro do seguinte path (app\http\class), Já defini o namespace no auto load do composer e já consegui instanciar as classes, contudo dentro da classe eu preciso redirecionar o usuário usando redirect do laravel mas não estou conseguindo, quando uso o redrect nenhum erro é retornado mas a página não é redirecionada. O que é necessário para utilizar a função redirect ?

Agradeço a atenção, caso não tenha sido claro eu posso detalhar mais a dúvida.

5 respostas

Oi Marlon, tudo bom?

Em qual classe você está realizando esse redirect? Tem como você compartilhar o código aqui com a gente? Assim fica mais fácil de entender e dar algumas ideias =)

Aguardo retorno.

Abraço.

Oi Marlon, tudo bem? De acordo com a documentação, Redirects são feitos por instâncias da classe RedirectResponse do Laravel. Você pode criar uma instância e tentar executar o redirect, já tentou?

https://laravel.com/docs/5.5/redirects

Eu tentei utilizar a classe RedirectReponse mas mesmo assim não funcionou, não retorna erro nenhum, contudo também não redireciona ele continua dentro da pagina LoginController .

Segue o código das classes

Classe abstrata mãe das classes de controle de acesso

<?php
namespace LibTeste; 
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;

abstract class PessoaAcesso{
    private $nivelAcesso;
    protected $request;

    public function __construct($arrayDadosPessoa, Request $request){
        $this->request = $request;
        $this->request->session()->put('pessoa',$arrayDadosPessoa);
    }

     abstract  function Acessar();

     function getNivelAcesso(){
        $acessoId =    $this->eventos_acesso_id->where('evento_id',$evento_id)
                        ->where('pessoa_id',$pessoa['id'])
                        ->select('acesso_id')
                        ->get()->id;
        $this->nivelAcesso = $acessoId;
        return $this->nivelAcesso;                

    }
}
 ?>

Classe que controla o acesso e redireciona quando o usuário for um autor.

<?php
namespace LibTeste; 

use App\Http\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
class AutorAcesso extends PessoaAcesso{
    public function acessar(){
        return redirect('/autor/home');

    }
}
 ?>

classe que controla o login

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\model\Pessoa;
use App\model\AdmEvento;
use LibTeste\AdminAcesso;
use LibTeste\AutorAcesso;
use LibTeste\AvaliadorAcesso;

class LoginController extends Controller
{
    //Função para controle de login no sistema
    public function login(Request $request){
        $login = $request->all(); //Recebe dados do form login
        $search = Pessoa::where('email',  $login['email'])->get()->all(); //consultado email no banco de dados
        if(isset($search[0])){ //Se encontrado no banco de dados
            $pessoa = $search[0]; //Variavel pessoa recebe informações da tabela pessoa
            $pessoa_id = $pessoa['id'];
            if($login['email'] == $pessoa['email'] and md5($login['senha']) == $pessoa['senha']){ //Se email e senha do form login confere


                $acesso =    AdmEvento::where('pessoa_id',$pessoa_id)->get();
                if(isset($acesso[0])){
                    $adminAcesso = new AdminAcesso($pessoa,$request);
                    $adminAcesso->acessar();
                }else{
                    $autorAcesso = new AutorAcesso($pessoa,$request);
                    $autorAcesso->acessar();
                }
            }else{
                $msg_erro = "A senha não confere!";
                return view('site/login', compact('msg_erro'));
            }
        }else{ //Se não encontrado no banco de dados
            $msg_erro = "E-mail não encontrado na base de dados!";
            return view('site/login', compact('msg_erro'));
        }
    }
    // fim da função de login
}

Aguardo uma nova sugestão, desde já agradeço.

solução!

Já consegui solucionar o problema, Na verdade era muito simples do que eu imaginei eu estava apenas invocando o metodo acessa da classe AutorAcesso quando na verdade eu deveria retorna-lo, A solução foi foi colocar o return antes da invocação do metodo:

return AutorAcesso->acessar();

Ótimo Marlon, o retorno precisa ser feito por que se não, nenhuma ação de fato é realizada, você retornou o redirect, mas ele não voltou até a ação do controller.

Qualquer coisa, estamos por aqui, abraço.