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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public function listas() {
return $this->hasMany('Lista', 'user_id');
}
public function listas() { return $this->hasMany('Lista', 'user_id'); }
public function listas() {
   return $this->hasMany('Lista', 'user_id');
}

app/models/Lista.php

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public function usuario() {
return $this->belongsTo('User', 'user_id');
}
public function usuario() { return $this->belongsTo('User', 'user_id'); }
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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);
}
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); }
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public function listar() {
return View::make('list_lists')->with('lists', User::find(Auth::user()->id)->listas);
}
public function listar() { return View::make('list_lists')->with('lists', User::find(Auth::user()->id)->listas); }
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!

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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());
}
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()); }
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 *