Skip to content

Instantly share code, notes, and snippets.

@mrezende
Last active January 29, 2018 21:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrezende/bea31a782bc92086928025102b5b7242 to your computer and use it in GitHub Desktop.
Save mrezende/bea31a782bc92086928025102b5b7242 to your computer and use it in GitHub Desktop.

Exercícios de fixação

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment