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:
- Primeiro criei um conjunto de regras de validação
- Depois apliquei essas regras utilizando a facilidade de validação do Laravel 4.
- Os dados são passados para a aplicação através do objeto INPUT
- Por fim, verifico se a validação falhou. Se falhou, redireciona com erros para a página em que está o formulário
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?
To curtindo demais seus posts cara, aprendendo muito. Parabens.
muito bom! to empolgado!
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.
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…
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.
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!