Controllers - Têm a responsabilidade de controlar o fluxo das informações, para as views e models.
Métodos padrões de um controller, quando criado com a opção --resource
index - lista todos os registros disponíveis
create - chama a view create, que é um form (create.blade.php) para adicionar um registro
store - armazena no banco o registro do form em create, antes validando seus campos
show - mosra um único registro através da view show.blade.php
edit - chama o form na view edit.blade.php para editar um registro
update - Sua função é armazenar no banco o registro alterado na view acima
destroy - permite excluir um registro
Criar um controller numa pasta específica
php artisan make:controller Painel\\PainelController
Criar controller com esqueleto de métodos default
php artisan make:controller SiteController --resource
Exemplos:
Route::get('/', 'SiteController@index');
public function index()(
{
return 'Home page do site';
}
Route::get('contato', 'SiteController@contato');
public function contato()(
{
return 'Home page de contato';
}
public function index(Request $request)
{
return view('tarefas.index');
}
Criar controle e também um método
php artisan make:controller PhotoController --resource --model=Photo
Route::resource('photo', 'PhotoController', ['only' => [
'index', 'show'
]]);
Route::resource('photo', 'PhotoController', ['except' => [
'create', 'store', 'update', 'destroy'
]]);
Route::put('user/{id}', 'UserController@update');
Criar um controller SiteController
Criar um método index() que chama a view:
public function index()
{
return view('welcome')
}
Alterar o route
Route::get('/', 'SiteController@index');
Controller com Model
<?php
namespace App\Http\Controllers;
use DB;
use App\Carro;
class ProdutosController extends Controller
{
public function index()
{
// Retornar todos os registros da tabela carros
$carros = Carro->get();
return view('index', ['carros' => $carros]);
}
}
namespace App\Http\Controllers;
use DB;
class ProdutosController extends Controller
{
public function index()
{
// Retornar todos os registros da tabela carros
$carros = DB::table('carros')->get();
return view('index', ['carros' => $carros]);
}
}
//Adicionando novo registro
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|max:255',
]);
// Create The Task...
}
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|max:255',
]);
$request->user()->tasks()->create([
'name' => $request->name,
]);
return redirect('/tasks');
}
Criando uma pasta para controllers e movendo para ela um controller
Http
Painel
Site
SiteController.php
Mudar o namespace do controller
namespace App\Http\Controllers\Site;
use App\Http\Controllers\Controller;
Mudar o namespace nas rotas
Route::get('/', 'Site\SiteController@index');
Ou criar uma rota de grupo com o novo namespace
Route::group(['namespace' => 'site'], function(){
Route::get('/', 'SiteController@index');
Route::get('contato', 'SiteController@contato')->middleware('auth');
});
Assim todos os métodos/rotas exigem autenticação
public function __construct()
{
$this->middleware('auth');
}
Ou
Somente alguns métodos/rotas exigirão autenticação
$this->middleware('auth')
->only([
'contato',
'categoria'
]);
Ou filtrando com except
$this->middleware('auth')
->except([
'contato',
'index'
]);
Adicionar outro controller, adicionando seu namespace
public function store(Request $request, \App\User $user)
{
}
public function index()
{
$teste = 123;
$teste2 = 132;
$teste3 = 321;
return view('teste', compact('teste', 'teste2', 'teste3'));
}
Ao criar as views, criar pastas correspondentes às dos controllers:
painel
site
return view('site.teste', compact('teste', 'teste2', 'teste3'));
Criar formulário de cadastro
Criar nova rota (mudar para que esta seja a primeira rota)
Route::get('produtos/testes', 'Produtos\ProdutoController@testes');
Editar o controller e adicionar o método testes()
Adicionar use do Model no controller:
use App\Models\Produto;
Adicionar construtor
private $produto;
public function __construct(Produto $produto)
{
$this->produto = $produto;
}
O index muda para:
public function index()
{
$produtos = $this->produto->all();
return view('produtos.index');
}
Criar método teste
public function testes()
{
$prod = $this->produto;
$prod->nome = 'Nome do produto';
$prod->number = 123432;
$prod->active = true;
$prod->category = 'eletronicos';
$prod->description = 'Descrição do produto';
$insert = $prod->save();
if ($insert)
return 'Inserido com sucesso';
else
return 'Falha ao inserir';
}
Outra forma:
$this->produto->insert([
'nome' => 'Nome do produto',
'number' =>
...
])
Existem vários métodos assim: create(),
O create é importante pois obriga a existência de uma relação de colunas a adicionar ao banco
A relação de campos a serem preenchidos fica no model, assim:
protected $fillable = [
'nome', 'number', 'active', 'categoty', 'description'
];
Update do registro 5
$prod = $this->produto->find(5);
Debugar
dd($prod); // Não precisa de exit
dd($prod->nome);
$prod = $this->produto->find(5);
$prod->nome = 'Nome Update';
$prod->number = 123432;
$prod->active = true;
$prod->category = 'eletronicos';
$prod->description = 'Descrição do produto';
$update = $prod->save();
if ($update)
return 'Atualizado com sucesso';
else
return 'Falha ao atualizar';
Usamos o método save() também para atualizar
Outra forma é usando o método update() (requer lista de campos)
$prod = $this->produto->find(6);
$prod->update([
'nome' => 'Nome do produto6',
'number'
...
]);
Outro método útil para retornar por outro campo:
$prod = $this->produto
->where('nome', 'João Brito')
->where('number', 123543);
Delete
$prod = $this->produto->find(3)->delete();
ou
$prod = $this->produto->find(6);
$delete = $prod->delete();
ou
$prod = $this->produto->find(6);
$delete = $prod->destroy();
ou
$prod = $this->produto->destroy(3);
ou
$prod = $this->produto->destroy([3,5,8]);
ou
$delete = $this->produto->where('number', 123654)->delete();
Melhorar CSS
Criar paste template em views/produtos
Criar nesta pasta o arquivo template.blade.php, contendo
<table>
<head>
<title>{{$title or 'Curso de Laravel 5.3'}}</title>
</head>
<body>
@yield('content')
</body>
</html>
Em views/produtos criar
index.blade.php, contendo
@extends('produtos.templates.template')
@section('content')
<table>
<tr>
<th>Nome</th>
<th>Descrição</th>
</tr>
@foreach($produtos as $produto)
<tr>
<td>{{$produto->nome}}</td>
<td>{{$produto->descricao}}</td>
</r>
@endforeach
</table>
@endsection
No método index do controller podemos adicionar um título para a página:
$title = 'Listagem de produtos';
return view('produtos.index', compact('produtos', 'title'));
No controller, método create criar uma variável categoria, com um array com as categorias
No método create criar também a variável $title
<form class="form" mathod="post" action="{{route('produtos.store')}}">
<input type="hidden" name="_token" value="{{csrf_token}}">
<input type="text" name="nome" placeholder="Nome:" class="form-control">
<label>
<input type="checkbox" name="active"><br>
Ativo?
</label>
<input type="text" name="number" placeholder="Número:" class="form-control">
<select name="categoria" class="form-control">
<option value="">Escolha a categoria</option>
@foreach($categorias as $categoria)
<option>{{$categoria}}</opton>
@endforeach
</select>
<textarea name="descricao" placeholder="Descricao" class="form-control"></textarea>
</form>
No Laravel Todo form precisa de um campo com o token
ou substituir o campo por
{!! csrf_field() !!}
O método store
public function store(Request $request)
{
// Recupera todos os campos do form - $request->all();
}
Para recuperar apenas alguns campos:
$request->only(['nome', 'number']);
Recupererar todos, exceto alguns:
$request->except(['_token', 'categoria']);
Recuperar apenas um campo
$request->input('nome');
Recuperar campo pelo seu nome
$request->name;
Cadastrar os dados do form na tabela
public function store(Request $request)
{
// Pega todos os campos do form
$dataForm = $request->except('_token');
// Faz o cadastro
$insert = $this->product->insert($dataForm);
if($insert)
return redirect()->route('produtos.index');
else
return redirect()->back(); // Volta para onde veio
//ou
// return redirect()->route('produtos.create'); // Volta para onde veio
}
Para o avtive, que é requerido
if($dataForm['active'] == '')
$dataForm['active'] = 0;
else
$dataForm['active'] =1;
ou
$active['dataForm'] = (!isset($dataForm['active'])) ? 0 : 1;
Validação dos dados antes de submeter o form
Validar no método store antes de inserir no banco
As regras de validação devem ficar no model e não no controller
Editemos o model produto e adicionemos uma variável public (também pode ser um mátodo)
public $rules = [
'nome' => 'required|min:5|max:100',
'number' => 'required|numeric',
'categoria' => 'required',
'descricao' => 'min:3|max:1000'
];
Adicionar ao método store, antes de inserir:
$this->validate($request, $this->produto->rules);
Mostrar as mensagens de erro da validação na view create
Logo no início do form, abaixo da tag form
@if(isset($errors) && count($errors) >0)
<div class="alert alert-danger">
@foreach($errors->all(() as $error)
<p>{{$error}}</p>
@endforeach
</div>
@endif
Como manter os valores digitados nos campos do form após o submit?
Em cada campo
... value="{{old('nome')}}"
No método store, na validação podemos passar uma variável com as mensagens de erro
$this->validate($request, $this->produto->rules, $messages);
Personalizando as mensagens:
$mensagens = [
'nome.required' => 'Nome obrigatório',
'nome.min' => "Nome com pelo menos 3 caracteres',
'number.numric' => 'Number precisa ser numérico'
];
https://www.youtube.com/watch?v=fPs-PlQIWaw&index=6&list=PLVSNL1PHDWvR3PeLXz6nvBkDhv1IQk4wP
Comments fornecido por CComment