Ir para conteúdo
Fórum Script Brasil
  • 0

Livewire: variável não definida


Frank K Hosaka

Pergunta

Eu pensei que bastava definir a variável na classe Liveware para ela mostrar o conteúdo dela no navegador.

O Copilot explicou que o Liveware não é nada disso, primeiro ela carrega o layout (onde está a variável que você quer mostrar), depois ela lê a classe (onde você define a variável) e finalmente ela carrega o resto do HTML. Ou seja, ela sempre vai reclamar que a variável não está definida.

Para resolver esse contratempo, o Copilot sugeriu isso:

public function render()
{
    return view('sua-visao-componente')
        ->layout('layouts.app', ['menu' => $this->menu]);
}

O Copilot é muito bacana, mas aí eu lembrei do código do login que vem embutido na hora de instalar o Laravel 12 com Liveware, e tentei usar no meu aplicativo:

<?php
namespace App\Livewire;
use Livewire\Component;
use Livewire\Attributes\Layout;

#[Layout('components.layouts.app',['menu'=>'Laranja'])]
class Lmenu extends Component { }

E deu certo! O único problema é que o arquivo lmenu.blade.php (note que o nome da classe está em maiúsculo e o do blade em minúsculo) tem que estar no diretório resources.views.liveware, eu não posso mais colocar no diretório raiz do resources.views.

Note que nessa classe, não existe nenhum comando; o arquivo blade também não tem nada. Tudo o que ele faz é botar a barra de navegação no topo da tela, mas ele precisa da variável $menu já definida.

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Ontem, eu gastei o dia todo só para mudar a data do lançamento contábil. Foram várias tentativas e erros, tem muitas dicas do Copilot e do portal do Livewire que não funcionam, até eu conseguir isso:

arquivo app > Livewire > Ldiario.php
<?php
namespace App\Livewire;
use App\Models\tbdiario;
use Livewire\Component;
use Livewire\Attributes\Layout;

#[Layout('components.layouts.app',['title'=>'Diário'])]
class Ldiario extends Component {
    public $dia, $mensagem, $dataAtual, $lctos, $somaDebito, $somaCredito;

    public function mount() {
        $this->dia=(session()->has('dia')) ? session('dia') : date('Y-m-d');
        session(['dia'=>$this->dia]);
        $this->mensagem="";
        $this->dataAtual=date('Y-m-d');
        if($this->dataAtual!==$this->dia) {
            $this->mensagem="Hoje é " . dbr($this->dataAtual) . " ";
        }
        $this->lctos=tbdiario::where('dia',$this->dia)->orderBy('lcto')->get();
        $this->somaDebito=tbdiario::where('contad','>',0)->where('dia',$this->dia)->sum('valor');
        $this->somaCredito=tbdiario::where('contac','>',0)->where('dia',$this->dia)->sum('valor');
    }

    public function ldiarioData() {
        session(['dia'=>$this->dia]);
        return $this->mount();
    }

}

arquivo resources > views > components > layouts > app.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>{{ $title ?? 'Page Title' }}</title>
    </head>
    @vite(['resources/css/app.css', 'resources/js/app.js'])
    <body class="w-[630px] m-0 m-auto">
        <div>
            <nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
              <div class="flex items-center justify-between h-16">
                <div class="flex items-center">
                  <a href="#" class="text-sm font-medium">Laravel 12</a>
                  <div class="ml-10 flex items-baseline space-x-4">
                    <div class="relative group">
                      <button class="px-3 py-2 rounded-md text-sm font-medium">
                        {{ $title }}
                      </button>
                      <div
                        class="hidden group-hover:block absolute bg-white text-gray-800 rounded-md shadow-lg w-40"
                      >
                        <a href="ldiario" class="block px-4 py-2 text-sm hover:bg-gray-200">Diário</a>
                        <a href="#" class="block px-4 py-2 text-sm hover:bg-gray-200">Opção 2</a>
                        <a href="#" class="block px-4 py-2 text-sm hover:bg-gray-200">Opção 3</a>
                      </div>
                    </div>
                    <div class="relative group">
                        <button class="px-3 py-2 rounded-md text-sm font-medium">
                          {{ auth()->user()->nome}}
                        </button>
                        <div
                          class="hidden group-hover:block absolute bg-white text-gray-800 rounded-md shadow-lg w-40"
                        >
                          <a href="#" class="block px-4 py-2 text-sm hover:bg-gray-200">Sair</a>
                          <a href="#" class="block px-4 py-2 text-sm hover:bg-gray-200">Mudar Senha</a>
                        </div>
                      </div>
                  </div>
                </div>
              </div>
            </nav>
          </div>
          
        {{ $slot }}
    </body>
</html>

arquivo resources > views > livewire > ldiario.blade.php (parcial)
<div>
	<input type="date" wire:model="dia" id="dia" value='<?=$dia?>' wire:change="ldiarioData"
        class="border-none font-semibold py-1 px-2 w-[130px] hover:bg-gray-200 rounded text-gray-500">
</div>

O mais importante é que consegui rodar na Hostinger (claro que precisei rodar npm install - onde recebi várias mensagens, bem como o npm run build pelo ssh do terminal VS Code). O que eu gostei é que não tem <form>, não tem @csrf e também não tem web.php para funcionar o método ldiarioData, e lá no controlador não tem nenhum Request, tudo é bem mágico mesmo. A variável $dia no controlador está amarrado com o <input wire:model="dia">, mas eu não consegui fazer funcionar o método updatedDia( ), eu desisti e improvisei, definindo mais um serviço no mesmo input, o wire:change="ldiarioData", e isso deu certo.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,4k
    • Posts
      652,2k
×
×
  • Criar Novo...