ToDoVel [Parte 17] Refatorando a Criação das Tasks

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

Quando tudo começou, há um tempo atrás, na ilha do sol…
Criamos as tasks.
Nossa app era centrada na task.
Tudo aqui era task.

Mas ai, os ventos da mudança sopraram (sempre quis utilizar esse termo desde que o li num livro sobre metodologias ágeis).
Passamos a ter a necessidade de utilizar listas de tasks.
Assim, as tasks DEVEM fazer parte de uma lista.
E, por causa disso, vamos ter que refatorar o nosso código.

Mas, tudo bem.
É Laravel.

Routes

Primeiro precisamos alterar nossas rotas para passar como parâmetro a lista que conterá a task.
Antes, o nosso arquivo routes.php era assim:

/*    adding tasks routes    */
Route::get('task/add', array("as" => "addTask", "uses" => 'TaskController@getAdd'));
Route::post('task/add', 'TaskController@postAdd');

Vamos alterá-lo para ficar assim:

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

Controller

Vamos precisar alterar dois métodos do controller TaskController.php.
O primeiro método é o getAdd() que exibe a página para adiconar uma task.
Antes:

public function getAdd() {
	return View::make('add_task');
}

Depois:

public function getAdd($lista_id) {
	//verifica se a lista existe
	Lista::findOrFail($lista_id);
	
	return View::make('add_task')->with('lista_id', $lista_id);
}

O outro controller é o postAdd(), que executa a ação de criar uma nova task.
Antes:

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);
	}
	//se a validação deu certo
	else {
		$task = new Task;
		$task->titulo = Input::get('titulo');
		$task->save();
		
		return View::make('add_task')->with('sucesso', TRUE);
	}
}

Depois:

public function postAdd($lista_id) {
	//verifica se a lista existe
	Lista::findOrFail($lista_id);
	
	
	//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/' . $lista_id)->withErrors($validacao);
	}
	//se a validação deu certo
	else {
		$task = new Task;
		$task->titulo = Input::get('titulo');
		$task->list_id = $lista_id;
		$task->save();
		
		return View::make('add_task')->with('sucesso', TRUE)->with('lista_id', $lista_id);
	}
}

View

E ai, é só alterar a linha 20 do arquivo add_task.blade.php, ficando assim:

@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
            
            @if ( isset($sucesso) )
                <h3>FUNCIONOU!</h3>
            @endif
            
            <form method="post" action="{{ URL::to('task/add') }}/{{ $lista_id }}">
                {{ Form::label('titulo', 'Tarefa a ser cumprima:') }}
                    {{ Form::text('titulo') }}
                
                {{ Form::submit('OK') }}
            </form>
            
        </div>
    </div>
@stop

Pronto, facilmente refatoramos a nossa aplicação.
Se você desejar, pode refatorar os outros links das tasks para ficar bonitinho.
Eu to com preguiça e não o farei.
Talvez eu faça, mas não vou escrever um post sobre isso.
Fica como dever de casa.

Qualquer coisa, é só acompanhar esse projeto no GitHub:
https://github.com/frenetic/todovel

8 thoughts on “ToDoVel [Parte 17] Refatorando a Criação das Tasks

  1. Então, nesse momento estou com um problema e não estou sabendo o que pode ser, se puder me ajudar. É o seguinte, até então fiz bem da forma que disse e tudo certo, mas na hora que alterei as rotas esta dando um problema, tenho essas 3 linhas
    1 Route::get(‘task/add/{lista_id}’, array(“as” => “addTask”, “uses” => ‘TaskController@getAdd’));
    2 Route::get(‘task/add/{lista_id}’, ‘TaskController@getAdd’);
    3 Route::post(‘task/add/{lista_id}’, ‘TaskController@postAdd’);

    mas se eu deixar a 2ª e 3ª conforme fala no post me da um erro: Some mandatory parameters are missing (“lista_id”) to generate a URL for route “get task/add/{lista_id}”.

    dai pensei em colocar o ? no lista_id o ? assim {lista_id?} igual tinha em outros lugares que se passa parametros mas dai me da outro erro: Unable to generate a URL for the named route “addTask” as such route does not exist.

    e dai o que tentei foi deixar a 1ª e 3ª linha e tbm me da o mesmo primeiro erro, mas dai quando deixo {lista_id?} da certo, estou fazendo algo errado?

    Será que conseguiu me entender?

    Valew

    1. IUAHEOIUAEHOIAEUHOIUAH
      Me perdi, mas acho que entendi.

      No primeiro caso, quando você deixou só a segunda e a terceira, o teu método TaskController@getAdd está lá no controller como function getAdd($lista_id)?
      Pois, quando você começa a aceitar parâmetros, a função tem que estar apta para isso.
      Se você fosse fazer sua rota com um parâmetro que pode ou não ser enviado
      exemplo Route::get(‘task/add/{lista_id?}’, array(“as” => “addTask”, “uses” => ‘TaskController@getAdd’));
      você teria que ter no seu método um valor default getAdd($lista_id = valor_default)

      Sacou?
      Testa ai para ver se esse era o caso.
      😀

      1. Meio que entendi sim o q disse, fiz alguns ajustes e entendi os pontos, não sei se fui eu que viajei muito ai ou até mesmo vc no correr dos posts que pode ter deixado de colocar um detalhe ou outro, não sei, mas enfim, o importante aqui e poder entender como funciona o Laravel em si, e isso estou conseguindo.

        Valew

        1. Se as vezes eu pareço muito confuso nos tutoriais, eu sinto muito.
          Alguns artigos eu escrevia no fim do dia, lá pelas altas horas da madrugada, e ai o sono tava batendo.
          Em outros, eu escrevia quando estava entediado no trabalho. Escrever escondido do chefe tem seu preço 😛

          Mas, no fim das contas, continua experimentando com Laravel.
          Eu futuquei bastante antes de escrever este tutorial.
          E, até depois de escrito, eu continuo fazendo experimentações e loucuras para ver o que funciona e o que não funciona.

          Boa sorte!!!

    1. Gabriel,
      não me lembro se foi por gosto ou se foi por motivo de mostrar uma forma simples.
      Vou chutar que foi por gosto, pois EU prefiro fazer assim.
      Mas é gosto, o framework apresenta a facilidade do Form::open, e ai cada um faz como gostar ou achar mais legível 🙂

  2. Para mim esta dando um erro assim, como faço para consertar?

    =========== ERROR =============

    ErrorException
    Missing argument 1 for TaskController::getAdd()

    with(‘lista_id’, $lista_id);
    }

    ======== FINAL ERRO ==========

    1. Tá ai uma boa pergunta.
      Eu realmente não sei…
      Mas podemos investigar!

      O código fonte do projeto funcionando está aqui: https://github.com/frenetic/todovel
      Ai, nas dúvidas, você pode dar uma lida.

      No caso esse código em questão, na imagem que você me mandou, está igual ao exemplo que está funcionando no todovel.frenetic.com.br -> https://github.com/frenetic/todovel/blob/master/app/controllers/TaskController.php

      Será que não está faltando algum argumento na sua rota?
      https://github.com/frenetic/todovel/blob/master/app/routes.php (linha 12)

      Se não for nenhum dos casos, me avisa, que a gente pode pensar em outras possibilidades.

      boa sorte!

Deixe um comentário

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