Laravel 5 do começo ao fim [parte 3]

· 7 minutos de leitura
Laravel 5 do começo ao fim [parte 3]

Fala pessoal, hoje veremos finalmente a parte de Model e View do laravel 5, caso você não esteja familiarizado com o conceito de MVC veja as outras partes dessa série nos links abaixo:

Considerando que anteriormente na parte 2 criamos um controller chamado TarefaController, criaremos agora o Model Tarefa que representará os registros da tabela Tarefa.

Execute o comando abaixo na raiz do projeto para criar um novo Model:

php artisan make:model Tarefa

Esse comando criará basicamente duas coisas, o Model propriamente dito no diretório app/ e criará uma nova migration em database/migrations. Vamos antes de mais nada adicionar alguns campos a nossa migration.

Abrindo o arquivo de migration criado (algo como create_table_tarefa) você verá basicamente uma classe que estende de outra classe chamada Migration, e dois métodos up e down como já explicado anteriormente, edite esse arquivo para ficar como abaixo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTableTarefa extends Migration {

  /**
   * Run the migrations.
   *
   * @return void
   */
  public function up()
  {
    Schema::create('Tarefa', function(Blueprint $table)
    {
      $table->increments('id');
      $table->string('titulo');
      $table->string('corpo');
      $table->timestamps();
    });
  }

  /**
   * Reverse the migrations.
   *
   * @return void
   */
  public function down()
  {
    Schema::drop('Tarefa');
  }
}

Basicamente adicionamos dois novos campos a migration, titulo e corpo das nossas tarefas, além disso o comando make já nos adiciona um campo chamado id do tipo inteiro para ser nossa chave primária com auto incremento, ou seja, sempre que for adicionado um novo registro não é preciso setar o campo id, pois esse é gerado pelo banco. E no final são adicionados os campos created_at e updated_at que como você provavelmente deve suspeitar um é a data e hora de criação e o outro da última atualização respectivamente, sendo o tipo normalmente timestamp para esses dois campos. Feito a adição dos campos vamos migrar nosso banco para que ele crie a tabela com o comando abaixo:

php artisan migrate

Obs.: Estou considerando que você viu as outras partes dessa série, porém caso ocorra algum erro normalmente podem ser duas coisas, configuração incorreta do arquivo .env na raiz do projeto ou provavelmente você não executou o comando

php artisan migrate:install

para criar a tabela de migrations no banco. Com o comando executado com sucesso temos certeza que a tabela foi criada com os devidos campos, com isso podemos partir para o Model propriamente. Abra o arquivo chamado Tarefa.php no diretório app/, nesse arquivo está presente uma classe chamada Tarefa que estende da classe Model, a classe base do Eloquent para criar models. Nesse ponto apenas para facilitar adicionaremos os campos de nossa tabela numa variável da classe chamada $fillable como mostrado abaixo:

protected $fillable = array(’titulo’, ‘corpo’);

Na documentação do laravel disponível aqui isso disponibilizará essas colunas como Mass Assignment que possibilitará criar novos registros simplesmente usando o método create e outros da classe Model passando um array associativo as colunas da classe, como no exemplo abaixo:

$tarefa = Tarefa::create([’titulo’=>‘Título da tarefa’,‘corpo’=>‘Corpo da tarefa…’]);

Pois bem, uma vez adicionado as colunas a essa variável podemos partir para o controller e também criar nossas Views. Vamos então criar um novo arquivo chamado index.blade.php no diretório resources/views/tarefa, que fará a listagem das nossas tarefas, como mostrado abaixo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html>
<html lang="pt-br">
<head>
  <meta charset="utf-8">
  <title>Lista de Tarefas</title>
</head>
<body>
  <ul>
  <?php foreach ($tarefas as $tarefa): ?>
    <li>
        Id: <?php echo $tarefa->id ?>
        <br/>
        Título: <?php echo $tarefa->titulo ?>
        <br/>
        Corpo: <?php echo $tarefa->corpo ?>
    </li>
  <?php endforeach ?>
  </ul>
  <a href="{!!URL::route('tarefa.create')!!}">Cadastro</a>
</body>
</html>

Observem que não estou entrando em grandes detalhes, pois a própria documentação do laravel é suficiente para estudos mais profundos.

Agora que temos nossa view de listagem precisamos enviar os dados para ela, lembre-se no MVC a View tem a única responsabilidade de mostrar dados passados pelo controller, portanto no nosso TarefaController na função index vamos adicionar o seguinte código:

1
2
$tarefas = Tarefa::orderBy('id')-&gt;get();
return view('tarefa.index',compact('tarefas'));

Isso passará um objeto chamado Collection padrão do laravel para representar uma coleção, essa Collection possui diversas funções interessantes que você pode verificar na documentação ou na API do laravel no site.

Para ter certeza que nenhum erro está ocorrendo, execute o comando php artisan serve e acesse o endereço http://localhost:8000/tarefa.

Obviamente nesse momento como não temos nenhuma tarefa cadastrada nada será mostrado, vamos então criar um formulário para cadastro de tarefas.

Primeiramente crie um novo arquivo chamado create.blade.php na mesma pasta tarefa onde está localizado o arquivo index, dentro desse arquivo virá nosso formulário com os campos para cadastro.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html lang="pt-br">
<head>
  <meta charset="utf-8">
  <title>Cadastro de Tarefa</title>
</head>
<body>
  <form action="{!!URL::route('tarefa.store')!!}" method="post">
    <label for="titulo">Título:</label>
    <input type="text" name="titulo">
    <label for="corpo">Corpo:</label>
    <input type="text" name="corpo">
    <input type="hidden" name="_token" id="csrf-token" value="{ Session::token() }" />
    <input type="submit">
  </form>
</body>
</html>

Apenas algumas considerações, para criarmos formulários no laravel poderíamos utilizar a classe utilitária Form que no laravel 5 não vem por padrão, porém optei por usar dessa forma por simplicidade no entendimento. O campo _token precisa ser coloca pois o laravel possui um tratamento de ataque de CSRF, que basicamente é evitar que alguém mal intencionado consiga realizar requisições POST,PUT e DELETE de fora do site. Por fim estou usando a classe helper URL para me retornar a URL completa para o método store do controller TarefaController. O método store do controller fará o cadastro efetivamente, ficando da seguinte forma:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Tarefa;
use Input, Redirect;

class TarefaController extends Controller {

  /**
   * Display a listing of the resource.
   *
   * @return Response
   */
  public function index()
  {
    $tarefas = Tarefa::orderBy('id')->get();
    return view('tarefa.index',compact('tarefas'));
  }

  /**
   * Show the form for creating a new resource.
   *
   * @return Response
   */
  public function create()
  {
    return view('tarefa.create');
  }

  /**
   * Store a newly created resource in storage.
   *
   * @return Response
   */
  public function store()
  {
    $tarefa = Tarefa::create(Input::all());
    return Redirect::route('tarefa.index');
  }

  /**
   * Display the specified resource.
   *
   * @param  int  $id
   * @return Response
   */
  public function show($id)
  {
    //
  }

  /**
   * Show the form for editing the specified resource.
   *
   * @param  int  $id
   * @return Response
   */
  public function edit($id)
  {
    //
  }

  /**
   * Update the specified resource in storage.
   *
   * @param  int  $id
   * @return Response
   */
  public function update($id)
  {
    //
  }

  /**
   * Remove the specified resource from storage.
   *
   * @param  int  $id
   * @return Response
   */
  public function destroy($id)
  {
    //
  }
}

Isso criará uma nova tarefa e redirecionará para a página de index do controller.

Bem pessoal esse foi um exemplo usando Model, View e Controller, claro que é um exemplo apenas ilustrativo, faltaria outras funcionalidades, porém peço que para informações mais profundas sempre tenham em mãos a documentação do laravel, lembre-se que ela é sua bíblia, estarei na próxima parte mostrando um pouco sobre a parte de testes do laravel e um exemplo de workflow muito utilizado atualmente que é o TDD ou Desenvolvimento Dirigido por Testes em tradução livre, escrevam nos comentários o que acharam e até a próxima pessoal.