ToDoVel [Parte 23] Refatorando as Listas

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

No começo, quando tudo era task, criamos a lista.
Refatoramos as tasks.
Agora, tudo é lista e criamos os usuários.
Precisamos refatorar as listas.
E também as tasks (depois).

Agora as listas pertencem a um usuário.
Quando o usuário autenticado no sistema vai para a página de listas, ele só pode ver as listas dele e não todas as listas do sistema, como está ocorrendo.

Refatorando Models

Precisamos declarar o relacionamento entre os usuários e as listas.
declaramos relacionamentos uma vez, lembra?
app/models/User.php

public function listas() {
   return $this->hasMany('Lista', 'user_id');
}

app/models/Lista.php

public function usuario() {
   return $this->belongsTo('User', 'user_id');
}

Refatorando o Controller

Com carinho, vamos refatorar o ListController.php.
Para ninguém se perder, vou fazer por etapas.
Primeiro, vamos refatorar o método postCreate(), que cria novas listas, para criar listas que recebam um ID de usuário.

else {
   $list = new Lista;
   $list->titulo = Input::get('titulo');
   $list->user_id = Auth::user()->id;
   $list->save();
   
   return View::make('add_list')->with('sucesso', TRUE);
}

O que eu fiz foi, dentro do else, que começa na linha 21 do método postCreate(), inseri a linha 24, que pega da sessão o id do usuário logado.

Agora, facilmente, pode-se entender como refatorar o método listar(), que está listando todas as listas do sistema, mas que desejamos que liste apenas as listas do usuário.

public function listar() {
   return View::make('list_lists')->with('lists', User::find(Auth::user()->id)->listas);
}

OMGWTFBBQ?!
Ficou complicado de entender?
Simples, o que User::find(Auth::user()->id)->listas está fazendo é:

  1. Procurando um usuário (User::find()) onde o id do usuário é Auth::user()->id.
  2. A busca retorna um objeto do tipo User.
  3. Pega as listas do usuário, objeto_user->listas.

Vamos refatorar o método listarTasks, que lista as tasks de uma lista específica.
Novamente, qualquer usuário está podendo ver qualquer lista.
Mas agora NÃO MAIS!

public function listarTasks($lista_id = 0) {
   if ($lista_id == 0)
      return $this->listar();
   
   return View::make('lista')->with('lista', User::find(Auth::user()->id)->listas()->where('id', '=', $lista_id)->first());
}

E ai, ficou tenso?
Se você ler da esquerda para a direita, com carinho, vai conseguir entender sem problemas.
Mas, se ficar na dúvida, recorra a documentação sobre relacionamento.

  1. Procurando um usuário (User::find()) onde o id do usuário é Auth::user()->id.
  2. A busca retorna um objeto do tipo User.
  3. Pega as listas do usuário, objeto_user->listas().
  4. Refina a busca das listas com uma cláusla where.
  5. Pega o primeiro resultado da busca.

Tá ficando da hora o nosso aplicativo 😀

Deixe um comentário

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