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

Erro ao instanciar a classe

Ola Estou seguindo as suas aulas, mas estou fazendo um cadastro de livros e usando o mysql. Criei o banco bd_livraria e a tabela livro no mysql Até a parte que pegamos o request e imprimimos na tela está tudo funcionando.

Quando tento instanciar o objeto da classe Livro no controlador aparece um erro e não consigo prosseguir. Você tem alguma dica do que poderia ser? Tem alguma forma de eu testar a minha conexao sem precisar incluir nada? Seria só com o new sem o save? Eu tentei isso também mas o erro é no new().

O erro é o seguinte (na linha do new Livro() ):

Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR)
    Class 'App\Http\Controllers\Livro' not found

O código do Controlador é o seguinte:

public function store(Request $request){
        $nome = $request->nome;
        //cria o objeto Livro
        $novoLivro = new Livro();
        $novoLivro->nome = $nome;
        //executa o método salvar da classe Livro
        var_dump($novoLivro->save());
    }

O código da classe Livro:

<?php
use illuminate\Database\Eloquent\Model;
class Livro extends  Model{
     // se o nome não for indicado será utilizado o nome da classe no plural iniciado em minúsculo
     protected $table = 'livro';
     public $timestamps = false;
}
?>
14 respostas

Tentei fazer também com o sqlite e aparece o mesmo erro

Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR)
Class 'App\Http\Controllers\Livro' not found

Olá, Ana.

Você se esqueceu de importar (com use) a classe Livro do namespace correto lá no início do arquivo.

:-)

Eu já havia colocado. A classe Livro está no raiz do app. Estou colocando assim, está correto?

use App\Livro;

obrigada

Posta o conteúdo completo do arquivo aqui, ou manda um link do projeto completo no github, Ana?

oi Vinicius Coloquei o projeto no meu google drive Segue o link para você acessar

https://drive.google.com/file/d/1xIW9ZvBQ2KnrH8HrCQfUg8NyTwe6YRPT/view?usp=sharing

Obrigada

Olá, Ana. O drive não é um bom lugar para compartilhar código.

Coloca no GitHub, ou coloca aqui só o contéudo da classe Controller...

Segue o conteudo da classe controller O erro está no new Livro() do método store Veja que eu ja tentei importar a classe Livro usando o use de duas formas (uma está comentada), mas nenhuma delas funciona.

<?php
namespace App\Http\Controllers;
use illuminate\Http\Request;
//use App\Livro;
use Livro;

class LivroController extends Controller{
    public function index(Request $request){

        $livros = ['Algoritmos estruturados',
                  'Matematica basica',
                  'Origem',
                  'Introdução ao PHP',
                  'Livro de teste'
                ];

        //all retorna uma coleção dos livros
     //   $livros = Livro::all();
       // return view ('Livros.index',['livros'=>$livros]);
        return view ('Livros.index',compact('livros'));
    }

    public function create(){
        return view('Livros.create');
    }

    public function store(Request $request){
        $nome = $request->nome;

        //cria o objeto Livro e seta o nome
        $novoLivro = new Livro();
        $novoLivro->nome = $nome;

        //executa o método salvar da classe Livro para incluir no bd
        var_dump($novoLivro->save());

    }
}
?>

Beleza, Ana. Manda, por favor, o conteúdo da classe Livro.

PS.: Seu código não está seguindo nenhum padrão. Leia sobre a PSR-12 e cuide um pouquinho melhor dele. :-D

oi Vinicius

Segue o conteúdo da classe Livro. Por enquanto estou querendo entender o processo e fazer funcionar. Utilizarei padrões depois que estiver com isso funcionando. Obrigada pela dica.

<?php
use illuminate\Database\Eloquent\Model;

class Livro extends  Model{

   // se o nome não for indicado será utilizado o nome da classe no plural iniciado em minúsculo
   protected $table = 'livros';
   public $timestamps = false;
}

?>

Aí está o problema, Ana.

Sua classe Livro não tem nenhum namespace. As classes do Laravel precisam seguir a PSR-4, onde o vendor namespace é App. Se sua classe Livro estivesse na pasta Model, por exemplo, o namespace deveria ser App\Model.

Notei pelo seu perfil que você não fez os treinamentos que são pré-requisitos para este de Laravel. Nos treinamentos anteriores estes conceitos são explicados com mais detalhes. ;-)

Oi Vinicius

Obrigada pela ajuda. Esse erro foi resolvido, mas continuo sem conseguir acessar o banco de dados. Lembrando que estou utilizando o MySql. Quando eu executo o comando $novoLivro->save(); aparece o seguinte erro:

Illuminate \ Database \ QueryException (2054)
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: insert into `livros` (`nome`) values (meu livro))
Previous exceptions
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (2054)
PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] (0)

Existe uma maneira de saber primeiro se eu estou conseguindo me conectar antes de tentar incluir um registro na tabela? Eu estou usando os mesmos dados de conexao usados quando acesso pelo workbench. Essa mesma conexão eu consigo acessar através de um código php que não usa o Laravel, que cria a conexao na mão usando o PDO. Por isso eu gostaria de testar somente a conexão primeiro.

Aqui você encontra uma possível solução, Ana. Vê se resolve:

https://cursos.alura.com.br/forum/topico-the-server-requested-authentication-method-unknown-to-the-client-61738

Oi Vinicius Funcionou! consegui incluir no banco. Vou continuar fazendo as demais funcionalidades. Qualquer coisa entro em contato. Muito Obrigada!

solução!

Que bom, Ana.

Não se esqueça de marcar esse tópico como solucionado