1
resposta

Duas rotas para a mesma URL? Como resolver o problema?

Olá, turma! Então, estou desenvolvendo uma view que resumidamente é um formulário de cadastrado de usuário com alguns inputs e dois desses inputs são do tipo select. Pois bem, para popular as opções de ambos os inputs já mencionados (nível do usuário e escolaridade), faço uso dos dados oriundos do banco de dados).

Criei dois controllers (EscolaridadeController, NivelController) e também dois models (Escolaridade e Nivel).

Abaixo os códigos (ou a parte mais importante deles):

EscolaridadeController:

<?php

namespace App\Http\Controllers;

use App\Models\Escolaridade;
use Illuminate\Http\Request;

class EscolaridadeController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $opcoesEscolaridades = Escolaridade::all();
        return view('paginas.novo-usuario', compact('opcoesEscolaridades'));
    }
}

Model Escolaridade

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Escolaridade extends Model
{
    use HasFactory;
}

NivelController

<?php

namespace App\Http\Controllers;

use App\Models\Nivel;
use Illuminate\Http\Request;

class NivelController extends Controller
{

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $opcoesNivelUsuario = Nivel::all();
        //dd($niveisUsuarios); // Adicione isso para depurar
        return view('paginas.novo-usuario', compact('opcoesNivelUsuario'));
    }
}

Model Nivel

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;


//Nível do usuário (sistema EducaGestor)
class Nivel extends Model
{
    protected $table = "nivel";

    use HasFactory;
}

Inicialmente, a view funcionava quando apenas um input era preenchido, porém com dos dois inputs não funcionam. Acredito que o problema esteja na questão das rotas. Ao que tudo indica (não tenho certeza) não é permitido ter duas rotas simultâneas, como no código abaixo:

Rotas:

Route::get('/novo-usuario', [EscolaridadeController::class, 'index']);//Retorna toda escolaridade
Route::get('/novo-usuario', [NivelController::class, 'index']); //Retorna todos os níveis sistemicos
Route::post('/novo-usuario/salvar', [UsuarioController::class, 'store']);

A mensagem de erro: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeSe eu trocar a ordem da rotas o erro muda também, de acordo com a imagem:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeLembrando que se eu optar por apenas um único input/rota, o view funciona tranquilamente. Alguém pode me ajudar?

1 resposta

Olá! Tudo certo?

O problema que você está enfrentando ocorre porque você está tentando definir duas rotas diferentes para a mesma URL (/novo-usuario) com controladores diferentes. Isso faz com que apenas a última rota definida seja considerada, o que causa o erro de variável indefinida na sua view.

Para resolver isso, você pode combinar a lógica dos dois controladores em um único método e passar ambas as listas de opções para a view. Veja como você pode fazer isso:

  1. Crie um novo controlador ou use um dos existentes para unificar a lógica:

    <?php
    
    namespace App\Http\Controllers;
    
    use App\Models\Escolaridade;
    use App\Models\Nivel;
    use Illuminate\Http\Request;
    
    class UsuarioController extends Controller
    {
        public function create()
        {
            $opcoesEscolaridades = Escolaridade::all();
            $opcoesNivelUsuario = Nivel::all();
    
            return view('paginas.novo-usuario', compact('opcoesEscolaridades', 'opcoesNivelUsuario'));
        }
    }
    
  2. Atualize suas rotas para usar o novo método:

    Route::get('/novo-usuario', [UsuarioController::class, 'create']);
    Route::post('/novo-usuario/salvar', [UsuarioController::class, 'store']);
    
  3. Verifique a view para garantir que as variáveis estão sendo usadas corretamente:

    @foreach ($opcoesEscolaridades as $opcaoEscolaridade)
        <option value="{{ $opcaoEscolaridade->CD_Escolaridade }}">
            {{ $opcaoEscolaridade->Categoria_Escolaridade }}
        </option>
    @endforeach
    
    @foreach ($opcoesNivelUsuario as $opcaoNivelUsuario)
        <option value="{{ $opcaoNivelUsuario->CD_Nivel }}">
            {{ ucwords(mb_strtolower($opcaoNivelUsuario->cargo_Nivel)) }}
        </option>
    @endforeach
    

Com essas alterações, você deve conseguir carregar as opções para ambos os selects sem problemas.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.