Don't you speak portuguese? Translate this site with Google Translator

Pensamento do Dia

Os que acreditam que com dinheiro tudo se pode fazer, estão indubitavelmente dispostos a fazer tudo por dinheiro.(Beauchène)

Laravel - Controller

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

Novo Testamento

E foi com ele, e seguia-o uma grande multidão, que o apertava.
(Mc, 5:24)

Rotas no Mapa do Google

© 2015 Ribamar FS. All Rights Reserved. Designed By JoomShaper