ToDoVel [Parte 08]: Adicionando uma Task (Parte 1)

Observação: Este tutorial refere-se ao Laravel-4-BETA, estando totalmente DESATUALIZADO para a versão atual. Muita coisa mudou no framework…

Vamos começar a acelerar o passo agora, chega de blá-blá-blá e lenga-lenga sobre como as coisas funcionam.
Vamos praticar.

Primeiro, para o nosso todo precisamos criar um “formulário” para criar tasks para a to-do list.

Criando as rotas para adicionar tasks

Primeiro, vou criar as rotas para adicionar as tasks.
Arquivo app/routes.php

/*    adding tasks routes    */
Route::get('task/add', 'TaskController@getAdd');
Route::post('task/add', 'TaskController@postAdd');

Criando o TaskController

Como é possível entender a intenção a partir das rotas, preciso criar um controller de nome Task que irá executar ações, tanto para GET quanto para POST.
Crio o arquivo app/controllers/TaskController.php

<?php

class TaskController extends BaseController {
	public function getAdd() {
		return View::make('add_task');
	}
	public function postAdd() {
		
	}
}

Criei apenas apenas o método para o GET, depois faremos para o post.

Criando a view com formulário

Vamos criar o arquivo add_task.blade.php para exibir o formulário de criação de uma task.
Para isso, vamos utilizar as facilidades de criação de formulários do Laravel 4.
add_task.blade.php

@extends('template')

@section('conteudo')

    <div class="row-fluid marketing">
        <div class="span6">
            
            {{ Form::open( array("url" => "task/add") ) }}
                {{ Form::label('titulo', 'Tarefa a ser cumprima:') }}
                    {{ Form::text('titulo') }}
                
                {{ Form::submit('OK') }}
            {{ Form::close() }}
            
        </div>
    </div>
@stop

Note que você não é obrigado a utilizar a facilidade de Formulários do Laravel 4, mas ela é uma mão na roda, principalmente o método Form::open().
O método open aceita também que seja passado o controller@metodo que irá receber o post.
Posso reescrever o formulário para ficar assim:

{{ Form::open( array("action" => "TaskController@postAdd") ) }}
   <label>
       Tarefa a ser cumprida:
       <input type="text" name="titulo" />
   </label>
   
   {{ Form::submit('OK') }}
</form>

Validando o Formulário Enviado

Laravel 4 possui um componente de validação nativo.
Uma super mão biônica na roda!
O que vamos fazer é criar as regras de validação e depois aplicá-las.

public function postAdd() {
   //criando regras de validação
   $regras = array('titulo' => 'required');
   
   //executando validação
   $validacao = Validator::make(Input::all(), $regras);
   
   //se a validação deu errado
   if ($validacao->fails()) {
           return Redirect::to('task/add')->withErrors($validacao);
   }
   
   //sucesso
   return "sucesso";
}

Devagar para não endoidar:

Exibindo as Mensagens de Erro de Validação

Quando a nossa validação encontrou um erro, fizemos um redirecionamento para a página na qual mostramos o formulário de criação de task.
Junto com o redirecionamento, utilizamos o método withErrors passando uma instância do validator.
O que o Laravel 4 está fazendo é o seguinte:

  • Grava uma sessão com a mensagem de erro e executa o redirecionamento.
  • Na página que recebe o redirecionamento, quando executamos um View::make, comoca no contexto da view uma variável de nome $errors
  • Limpa a sessão

Na verdade, o nome $errors está sempre presente na visão, mesmo que seja vazio, mesmo que não haja erro, mesmo que não seja um redirect.
Ele está sempre lá.

Assim sendo, só o que temos que fazer é imprimir a mensagem na view add_task.blade.php

@extends('template')

@section('conteudo')

    <div class="row-fluid marketing">
        <div class="span6">
            @if ( count($errors) > 0)
                Erros encontrados:<br />
                <ul>
                    @foreach ($errors->all() as $e)
                        <li>{{ $e }}</li>
                    @endforeach
                </ul>
            @endif
            
            {{ Form::open( array("action" => "TaskController@postAdd") ) }}
                {{ Form::label('titulo', 'Tarefa a ser cumprima:') }}
                    {{ Form::text('titulo') }}
                
                {{ Form::submit('OK') }}
            {{ Form::close() }}
            
        </div>
    </div>
@stop

Por hora tá bom.
É tudo fácil demais.
Cadê o desafio?

6 thoughts on “ToDoVel [Parte 08]: Adicionando uma Task (Parte 1)

  1. Ao acessar a url “/task/add” eu recebia um : NotFoundHttpException.

    Verifiquei nome dos metodos, do controller, permissão de leitura dos arquivos e até as configurações do Nginx e não descobria por que diabos a porra do Laravel estava lançando essa exceção.

    Foi então que percebi que o Routes::any também trata requests “get”, e como existiam duas routes com mesmo nome, poderia estar causando algum conflito. Mudei o nome da rota para:

    Route::any(‘task/desgraça’);

    E quando acessei “localhost/task/add” funcionou! \o

    Na documentação (http://laravel.com/docs/routing) vi que existe o Route::post, então substitui o ::any por ::post.

    1. O tutorial do ToDoVel foi feito para o beta do Laravel 4.
      Algumas poucas coisas mudaram na versão oficial do 4, e mais ainda no estado atual, 4.2.
      Infelizmente essas mudanças podem afetar o processo de aprendizado descrito no ToDoVel…

  2. Estou com um problema.
    Mas primeiro, apenas para entender, porque na versão que baixei do Laravel, a pasta de Controllers está em app/http/controllers.
    Por algum motivo a minha classe TaskController não está sendo encontrada quando requisito /task/add, da o erro “Class TaskController does not exist”, porém criei a classe nesta pasta junto com a HomeController e mesmo assim não funcionou.

    1. FReNeTiC, pesquisando encontrei que toda vez que uma classe for criada ou tiver seu nome alterado, é necessário atualizar o class loader utilizando o comando php artisan dump-autoload.

      Meu problema foi resolvido, obrigado!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *