1 - Crie um projeto laravel chamado sessions.
cd /opt/php-verao
cp -r projetobase sessions
2 - Crie um projeto no Github chamado sessions.
git init
git add .
git commit -m "primeiro commit"
git remote add origin https://github.com/<USUARIO_GITHUB>/sessions.git
git push origin master
3 - Crie um database chamado loja.
mysql -u root -psenha
create database loja;
4 - Adicione as configurações do banco de dados no arquivo .env.
APP_ENV=local
APP_KEY=base64:tPVdqqLVO3UGle39PP2EllUV/gD+Q4ZlI4bbvh8ArcA=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
+ DB_DATABASE=loja
+ DB_USERNAME=root
+ DB_PASSWORD=senha
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
5 - Altere a classe AppServiceProvider que fica no diretório /app/providers. Para mais informações sobre o motivo da alteração desta classe acesse: Index Lengths & MySQL / MariaDB
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
+ use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
+ Schema::defaultStringLength(191);
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
6 - Crie um modelo chamado Produto junto com o arquivo de migration e controller.
php artisan make:model Produto -mc
7 - Acrescente as colunas nome e preco a tabela Produtos. Para isto, altere o arquivo YYYY_MM_DD_create_produtos_table que fica no diretório database/migrations.
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateProdutosTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('produtos', function (Blueprint $table) {
$table->increments('id');
+ $table->string('nome');
+ $table->decimal('preco', 15, 2);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('produtos');
}
}
8 - Execute o comando migrate para criar a tabela Produtos no banco de dados.
php artisan migrate
9 - Acrescente a url /produtos no arquivo routes/web.php*.
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
+ Route::get('/produtos', 'ProdutoController@index');
10 - Acrescente o método index na classe ProdutoController que fica no diretório /app/Http/Controllers.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
+ use App\Produto;
class ProdutoController extends Controller
{
//
+ public function index()
+ {
+ $produtos = Produto::all();
+ return view('produto.index', compact('produtos'));
+ }
}
11 - Crie uma pasta chamada layouts no diretório /resources/views.
12 - Crie um arquivo master.blade.php para ser o layout da nossa aplicação. Crie o arquivo dentro do diretório /resources/views/layouts.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>@yield('title')</title>
<link rel="stylesheet" href="/css/app.css" type="text/css" />
</head>
<body>
<div class="container">
<div class="page-header">
<h1>@yield('page-header-content')</h1>
</div>
@yield('content')
</div>
<script src="/js/app.js" type="text/javascript"></script>
</body>
</html>
13 - Crie a pasta produto dentro do diretório /resources/views.
14 - Crie o arquivo index.blade.php dentro do diretório /resources/views/produto.
@extends('layouts.master')
@section('title', 'Produtos')
@section('page-header-content', 'Produtos')
@section('content')
<div class="row">
<div class="col-md-3">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">Ações</h3>
</div>
<div class="panel-body">
<a href="/produtos/cria">
<span class="glyphicon glyphicon-plus"> Produtos</span>
</a>
</div>
</div>
</div>
<div class="col-md-6">
<table class="table table-striped">
<thead>
<tr>
<th>Id</th>
<th>Nome</th>
<th>Preço</th>
</tr>
</thead>
<tbody>
@foreach($produtos as $produto)
<tr>
<td>{{ $produto->id }}</td>
<td>{{ $produto->nome }}</td>
<td>{{ $produto->preco }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
@endsection
15 - Acrescente a url /produtos/cria no arquivo /routes/web.php.
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/produtos', 'ProdutoController@index');
+ Route::get('/produtos/cria', 'ProdutoController@cria');
16 - Acrescente o método cria na classe ProdutoController que fica no diretório /app/Http/Controllers.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Produto;
class ProdutoController extends Controller
{
//
public function index()
{
$produtos = Produto::all();
return view('produto.index', compact('produtos'));
}
+ public function cria()
+ {
+ return view('produto.cria');
+ }
}
17 - Crie a página cria.blade.php no diretório /resources/views/produto.
@extends('layouts.master')
@section('title', 'Cadastro de produto')
@section('page-header-content', 'Cadastro de produto')
@section('content')
<div class="row">
<div class="col-md-3">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel title">Ações</h3>
</div>
<div class="panel-body">
<a href="/produtos">
<span class="glyphicon glyphicon-th-list"> Produtos</span>
</a>
</div>
</div>
</div>
<div class="col-md-6">
<form action="/produtos" method="POST">
{{ csrf_field() }}
<div class="form-group">
<label for="nome">Nome</label>
<input type="text" class="form-control" name="nome" id="nome">
</div>
<div class="form-group">
<label for="preco">Preço</label>
<input type="text" class="form-control" name="preco" id="preco">
</div>
<button class="btn btn-primary" type="submit">Salvar</button>
</form>
</div>
</div>
@endsection
18 - Acrescente a rota /produtos para requisições do tipo POST.
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/produtos', 'ProdutoController@index');
Route::get('/produtos/cria', 'ProdutoController@cria');
+ Route::post('/produtos', 'ProdutoController@armazena');
19 - Acrescente o método armazena na classe ProdutoController que fica no diretório /app/Http/Controllers.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Produto;
class ProdutoController extends Controller
{
//
public function index()
{
$produtos = Produto::all();
return view('produto.index', compact('produtos'));
}
public function cria()
{
return view('produto.cria');
}
+ public function armazena()
+ {
+ Produto::create(request()->all());
+ return redirect('/produtos');
+ }
}
20 - Altere a classe Produto que fica no diretório /app para aceitar inserção de dados em massa.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Produto extends Model
{
//
+ protected $fillable = [
+ 'nome', 'preco'
+ ];
}
Acesse http://localhost:8000/produtos
21 - Crie o controller CarrinhoController.
php artisan make:controller CarrinhoController
22 - Adicione a url /carrinho/adiciona/{produto} no arquivo routes/web.php.
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/produtos', 'ProdutoController@index');
Route::get('/produtos/cria', 'ProdutoController@cria');
Route::post('/produtos', 'ProdutoController@armazena');
+ Route::get('/carrinho/adiciona/{produto}', 'CarrinhoController@adiciona');
23 - Acrescente o método adiciona na classe CarrinhoController que fica no diretório /app/Http/Controllers.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
+ use Session;
+ use App\Produto;
class CarrinhoController extends Controller
{
//
+ public function adiciona(Produto $produto)
+ {
+ if(Session::has('produtos'))
+ {
+ $produtos = Session::get('produtos');
+ $produtos->put($produto->id, $produto);
+ Session::put('produtos', $produtos);
+ }
+ else
+ {
+ $produtos = collect([$produto->id => $produto]);
+ Session::put('produtos', $produtos);
+ }
+ Session::flash('mensagem', 'Produto adicionado ao carrinho');
+ return redirect('/produtos');
+ }
}
24 - Altere a página master.blade.php que fica no diretório /resources/views/layouts para exibir a mensagem temporária.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>@yield('title')</title>
<link rel="stylesheet" href="/css/app.css" type="text/css" />
</head>
<body>
<div class="container">
<div class="page-header">
<h1>@yield('page-header-content')</h1>
</div>
+ @if (Session::has('mensagem'))
+ <div class="alert alert-success" role="alert">
+ {{ Session::get('mensagem') }}
+ </div>
+ @endif
@yield('content')
</div>
<script src="/js/app.js" type="text/javascript"></script>
</body>
</html>
25 - Altere o arquivo index.blade.php que fica no diretório /resources/views/produto.
@extends('layouts.master')
@section('title', 'Produtos')
@section('page-header-content', 'Produtos')
@section('content')
<div class="row">
<div class="col-md-3">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">Ações</h3>
</div>
<div class="panel-body">
+ <p>
<a href="/produtos/cria">
<span class="glyphicon glyphicon-plus"> Produtos</span>
</a>
+ </p>
+ @if(Session::has('produtos'))
+ <p>
+ <a href="/carrinho/exibe">
+ <span class="glyphicon glyphicon-shopping-cart"> {{ Session::get('produtos')->count() }} Produtos</span>
+ </a>
+ </p>
+ @endif
</div>
</div>
</div>
<div class="col-md-6">
<table class="table table-striped">
<thead>
<tr>
<th>Id</th>
<th>Nome</th>
<th>Preço</th>
+ <th></th>
</tr>
</thead>
<tbody>
@foreach($produtos as $produto)
<tr>
<td>{{ $produto->id }}</td>
<td>{{ $produto->nome }}</td>
<td>{{ $produto->preco }}</td>
+ <th><a href="/carrinho/adiciona/{{ $produto->id }}"><span class="glyphicon glyphicon-shopping-cart"></span></a></th>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
@endsection
26 - Acrescente a url /carrinhos/exibe no arquivo routes/web.php.
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/produtos', 'ProdutoController@index');
Route::get('/produtos/cria', 'ProdutoController@cria');
Route::post('/produtos', 'ProdutoController@armazena');
Route::get('/carrinho/adiciona/{produto}', 'CarrinhoController@adiciona');
+ Route::get('/carrinho/exibe', 'CarrinhoController@exibe');
27 - Acrescente o método exibe na classe CarrinhoController que fica no diretório /app/Http/Controllers.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Session;
use App\Produto;
class CarrinhoController extends Controller
{
//
public function adiciona(Produto $produto)
{
if(Session::has('produtos'))
{
$produtos = Session::get('produtos');
$produtos->put($produto->id, $produto);
Session::put('produtos', $produtos);
}
else
{
$produtos = collect([$produto->id => $produto]);
Session::put('produtos', $produtos);
}
Session::flash('mensagem', 'Produto adicionado ao carrinho');
return redirect('/produtos');
}
+ public function exibe()
+ {
+ return view('carrinho.exibe');
+ }
}
28 - Crie a pasta carrinho dentro do diretório /resources/views.
29 - Crie o arquivo exibe.blade.php dentro do diretório /resources/views/carrinho.
@extends('layouts.master')
@section('title', 'Produtos adicionados ao carrinho')
@section('page-header-content', 'Produtos adicionados ao carrinho')
@section('content')
<div class="row">
<div class="col-md-3">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">Ações</h3>
</div>
<div class="panel-body">
<a href="/produtos">
<span class="glyphicon glyphicon-th-list"> Produtos</span>
</a>
</div>
</div>
</div>
<div class="col-md-6">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="title">Produtos</h3>
</div>
@if(Session::has('produtos') and !Session::get('produtos')->isEmpty())
<ul class="list-group">
@foreach (Session::get('produtos') as $produto)
<li class="list-group-item">
{{ $produto->nome }}
<a class="pull-right" href="/carrinho/remove/{{ $produto->id }}" data-method="delete" data-token="{{ csrf_token() }}">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</a>
</li>
@endforeach
</ul>
@else
<div class="panel-body">
<h3>Não há produtos no carrinho<h3>
</div>
@endif
</div>
</div>
</div>
@endsection
@section('scripts')
<script type="text/javascript">
$(function(){
$("a[data-method='delete']").click(function(e){
e.preventDefault(); // impede o link de redirecionar para outra página
var link = $(this);
var method = link.data('method');
var token = link.data('token');
var url = link.attr('href');
var data = { '_method' : method, '_token' : token };
$.post(url, data)
.done(function(data){
link.parent().remove();
var links = $("a[data-method='delete']");
if(links.length ==0)
{
$(".panel ul").append("<div class='panel-body'><h3>Não há produtos no carrinho</h3></div>");
}
})
.fail(function(data){
alert("Fail: " + data);
});
});
});
</script>
@endsection
30 - Altere o arquivo master.blade.php que fica no diretório /resources/views/layouts.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>@yield('title')</title>
<link rel="stylesheet" href="/css/app.css" type="text/css" />
</head>
<body>
<div class="container">
<div class="page-header">
<h1>@yield('page-header-content')</h1>
</div>
@if (Session::has('mensagem'))
<div class="alert alert-success" role="alert">
{{ Session::get('mensagem') }}
</div>
@endif
@yield('content')
</div>
<script src="/js/app.js" type="text/javascript"></script>
+ @yield('scripts')
</body>
</html>
31 - Acrescente a rota /carrinho/remove/{produto} para requisições do tipo DELETE no arquivo routes/web.php.
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/produtos', 'ProdutoController@index');
Route::get('/produtos/cria', 'ProdutoController@cria');
Route::post('/produtos', 'ProdutoController@armazena');
Route::get('/carrinho/exibe', 'CarrinhoController@exibe');
Route::get('/carrinho/adiciona/{produto}', 'CarrinhoController@adiciona');
+ Route::delete('/carrinho/remove/{produto}', 'CarrinhoController@remove');
32 - Acrescente o método remove na classe CarrinhoController que fica no diretório /app/Http/Controllers.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Session;
use App\Produto;
class CarrinhoController extends Controller
{
//
public function adiciona(Produto $produto)
{
if(Session::has('produtos'))
{
$produtos = Session::get('produtos');
$produtos->put($produto->id, $produto);
Session::put('produtos', $produtos);
}
else
{
$produtos = collect([$produto->id => $produto]);
Session::put('produtos', $produtos);
}
Session::flash('mensagem', 'Produto adicionado ao carrinho');
return redirect('/produtos');
}
public function exibe()
{
return view('carrinho.exibe');
}
+ public function remove(Produto $produto)
+ {
+ if(Session::has('produtos'))
+ {
+ $produtos = Session::get('produtos');
+ $produtos->pull($produto->id);
+ Session::put('produtos', $produtos);
+ return response()->json($produtos);
+ }
+ else
+ {
+ return response()->json(['error' => 401, 'mensagem' => 'Carrinho vazio'], 401);
+ }
+ }
}
Acesse http://localhost:8000/produtos.
33 - Envie as alterações ao Github.
git add .
git commit -m "adição do cadastro de produtos e carrinho de compras"
git push origin master