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

[Dúvida] Enviar parâmetros para um Menu

Eu tenho um menu que é carregado a partir do layout.blade.php baseado na rota artistas da seguinte forma:

    @if (request()->is('artistas/*'))
        @include('components/menu-artistas')
    @else
        @include('components/menu')
    @endif

Dentro dessa página eu estou usando rotas com o parâmetro de id do artista para que eu possa editar dados sobre ele especificamente, e o menu lateral deve ter o id do artista que eu estou editando, porém quando eu envio o parâmetro, por exemplo, {{route('perfil', $artistaID->artistaID)}}, ele diz que a variável não existe.

menu-artistas.blade.php

<- ... ->
        <li class="sidebar-title"><i class="fa-solid fa-pen-to-square"></i> Editar</li>
        <li class="sidebar-item {{ (request()->is('artistas/2Pac/perfil')) ? 'active' : '' }}">
            <a href="{{route('perfil', $artistaID->artistaID)}}" class="sidebar-link">
                <i class="fa-solid fa-user"></i><span>Perfil</span>
            </a>
        </li>
<- ... ->

ArtistasController.php

<?php
namespace App\Http\Controllers;
use App\Models\Gravadoras;
use Illuminate\Http\Request;
use App\Http\Requests\ArtistasFotoPerfilRequest;
use App\Models\Artista;

class ArtistasController extends Controller
{
    public function novoArtista()
    {
        $gravadoras = Gravadoras::all();
        return view('artistas.novo-artista')->with('gravadoras', $gravadoras);
    }
    public function gerenciarArtista()
    {
        $artistas = Artista::all();
        return view('artistas.gerenciar-artista')->with('artistas', $artistas);
    }
    public function perfil(Artista $artistaID)
    {
        return view('artistas.index')->with('artistaID', $artistaID);
    }
    public function historia(Artista $artistaID)
    {
        return view('artistas.historia')->with('artistaID', $artistaID);
    }
    public function fotoPerfil()
    {
        return view('artistas.fotoPerfil');
    }
    public function uploadFoto(ArtistasFotoPerfilRequest $request)
    {
        $input = $request->file('artistCover');
        $fotoPerfil = $input->getClientOriginalName();
        $input->storeAs('/uploads/artistas', $fotoPerfil, 'images');
        return view('artistas.fotoPerfil')->with('sucesso', 'A foto de perfil foi enviada com sucesso.');
    }
    public function detalhes(Artista $artistaID)
    {
        $gravadoras = Gravadoras::all();
        return view('artistas.detalhes', compact('gravadoras', 'artistaID'));
    }
}

Como eu poderia enviar o parâmetro corretamente para o menu? Eis o git do projeto.

3 respostas

Olá, Elisame!

Pelo que entendi, você está tentando passar o ID do artista para o menu lateral. O problema que você está enfrentando é que a variável $artistaID não está disponível no escopo do seu arquivo menu-artistas.blade.php.

Uma maneira de resolver isso seria passar a variável $artistaID para a view menu-artistas da mesma forma que você está passando para as outras views no seu controlador. No entanto, como você está incluindo o menu diretamente no layout, essa abordagem não funcionará.

Uma solução alternativa seria usar o serviço de injeção de dependências do Laravel diretamente na sua view. Isso permitirá que você acesse o Artista atualmente sendo manipulado sem ter que passá-lo explicitamente para a view.

Aqui está um exemplo de como você pode fazer isso:

@inject('artistasController', 'App\Http\Controllers\ArtistasController')

<div class="sidebar-menu">
    <ul class="menu">
        <!-- ... -->
        <li class="sidebar-item {{ (request()->is('artistas/2Pac/perfil')) ? 'active' : '' }}">
            <a href="{{route('perfil', $artistasController->getArtistaID()->artistaID)}}" class="sidebar-link">
                <i class="fa-solid fa-user"></i><span>Perfil</span>
            </a>
        </li>
        <!-- ... -->
    </ul>
</div>

No exemplo acima, estou usando o método @inject para injetar o ArtistasController na view. Em seguida, estou chamando o método getArtistaID() no controlador para obter o ID do artista atualmente sendo manipulado.

Note que você precisará adicionar o método getArtistaID() ao seu controlador ArtistasController. Esse método deve retornar o Artista que você deseja editar.

Espero ter ajudado e bons estudos!

Se eu entendi bem, eu precisarei criar uma função - método - na minha Controller que retorne o id e ele possa ser acessado pelo menu, correto?

Eu cheguei a mais ou menos essa situação:

menu-artistas.blade.php

@inject('artistasController', 'App\Http\Controllers\ArtistasController')

<!-- ... -->
<li class="sidebar-item {{ (request()->is('artistas/2Pac/perfil')) ? 'active' : '' }}">
            <a href="{{route('perfil', $artistasController->getArtistaID()->artistaID)}}" class="sidebar-link">
                <i class="fa-solid fa-user"></i><span>Perfil</span>
            </a>
        </li>
<!-- ... -->

ArtistasController.php

public function getArtistaID(Artista $artistaID){
        return view('components/menu-artistas')->with('artistaID', $artistaID);
    }

Porém, o Laravel me diz que passei poucos argumentos: Too few arguments to function App\Http\Controllers\ArtistasController::getArtistaID(), 0 passed in \Traduções BR\Admin v3\storage\framework\views\431b25a2de48e8585abf54b8103ef339.php on line 14 and exactly 1 expected

E a linha 14 refere-se justamente ao método criado, então, fiquei agora sem muita ideia do que fazer...

Uma dúvida, ao invés de buscar esse menu específico através do layout, teria uma forma de se renderizar ele a partir de uma rota específica sem estar no layout?

Por exemplo, se a rota for: '/artistas/1/perfil ele carregaria o menu exclusivamente para edição do artista, e se fosse qualquer outra diferente, como a raiz, ele carregaria o menu padrão.

solução!

Eu achei a solução para da seguinte forma:

{{route('discografia', request()->artistaID)}}

Basicamente, eu peço para a requisição busque pelo id do artista que estou carregando neste momento. Funcionou maravilhosamente!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software