Laravel Beispiel Tutorial - Schritt für Schritt

 

Wie in dem zuvor veröffentlichten Artikel "Übersicht Laravel Funktion" bereits angekündigt, habe ich für Laravel ein Praxis-Beispiel erstellt. Das Beispiel kann bestimmte Datenbankeinträge erstellen, anzeigen, bearbeiten und löschen. In einem nächsten Beispiel werde ich zu dem hier beschriebenen Beispiel eine Benutzeranmeldung und Berechtigung hinzufügen (Authentification, Authorization), vorerst starten wir ohne dieser ...

 

 

 

Für ein besseres Verständnis, hier nochmal die schematische Darstellung vom vorherigen Artikel: Laravel - Einleitung 

Erstellen des Models und der Migration:

Befehl:  

php artisan make:model Myinput --migration
vagrant@homestead:~/Code/Laravel$ php artisan make:model Myinput --migration
Model created successfully.
Created Migration: 2016_08_18_093759_create_myinputs_table
vagrant@homestead:~/Code/Laravel$

Der Befehl erstellt folgende Dateien:

  • database\migrations\DATUM_create_myinputs_table.php
  • app\Myinput.php

Die Dateien müssen natürlich auf unsere Bedürfnisse angepasst werden:

Timezone

File: config\app.php

laravel-beispiel-12.jpg?cache=2017-07-1020-49-54500326

key:generate

Wenn die Website kopiert wurde, sollte der App-Key neu generiert werden

php artisan key:generate

Anpassen der Datenbankmigration

Bevor die Datenbank angepasst wird, müssen wir Laravel unser gewünschtes Layout in der Migration mitteilen, dazu bearbeite ich die zuvor erstellte Datei: database\migrations\DATUM_create_myinputs_table.php.

Für die Erweiterung der Datenbanktabelle, füge ich zusätzliche Felder ein:

$table->string('string', 255);
$table->string('email', 255);
$table->integer('integer');

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateMyinputsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('myinputs', function (Blueprint $table) {
            $table->increments('id');
            $table->string('string', 255);
            $table->string('email', 255);
            $table->integer('integer');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('myinputs');
    }
}

Erstellen der Datenbank

Das eigentliche Anpassen der Datenbank erfolgt anhand der Migrations-Information mit folgendem Befehl: 

php artisan migrate

vagrant@homestead:~/Code/Laravel$  php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2016_08_18_093759_create_myinputs_table
vagrant@homestead:~/Code/Laravel$

Route

hier die bereit in der Einleitung erwähnte Datei: app\Http\routes.php (Laravel 5.2) oder routes\web.php (ab Laravel 5.3) siehe: Laravel - Beispiel - Übersicht 

Route::resource('myinputs', 'MyinputController');

Controller erstellen

Damit die routes.php-Datei nicht ins leere zeigt, erstellen wir einen zugehörigen Controller:

php artisan make:controller MyinputController -r

Der Befehl erstellt folgende Datei: app\Http\Controllers\MyinputController.php

In dieser Datei erfolgen die eigentlichen Aktionen:

Anpassen des Controllers:index, create, store, show, edit, update, destroy

Datei: app\Http\Controllers\MyinputController.php

<?php

namespace App\Http\Controllers;
use App\Myinput;
use View;
use Illuminate\Http\Request;



class MyinputController extends Controller
{
  /**
      * Display a listing of the resource.
      */
     public function index()
     {
       // get all the myinputs
       $myinputs = Myinput::latest()->paginate(10);
       // load the view and pass the myinputs
       return View('myinputs.index',compact('myinputs'));
     }

     /**
      * Show the form for creating a new resource.
      */
     public function create()
     {
       // load the create form (app/views/myinputs/create.blade.php)
       return View('myinputs.create');
     }

     /**
      * Store a newly created resource in storage.
      */
     public function store(Request $request)
     {
       // validate

               $this->validate($request, [
                   'string'       => 'required',
                   'email'      => 'required|email',
                   'integer' => 'required|numeric']);


                   // store
                  Myinput::create([
                   'string'      =>  $request->string,
                   'email'      =>  $request->email,
                   'integer' =>  $request->integer,
                 ]);
          return back();

     }

     /**
      * Display the specified resource.
      */  
     public function show($id)
     {
       // get the myinput
       $myinput = Myinput::find($id);

       // show the view and pass the myinput to it
       return View('myinputs.show',compact('myinput'));
     }

     /**
      * Show the form for editing the specified resource.
      */
     public function edit(myinput $myinput)
     {
	   return View('myinputs.edit',compact('myinput'));
     }

     /**
      * Update the specified resource in storage.
      */
     public function update(Request $request, myinput $myinput)
     {
       $this->validate($request, [
           'string'       => 'required',
           'email'      => 'required|email',
           'integer' => 'required|numeric']);
           
          $myinput->update($request->all());
          return back();
     }

     /**
      * Remove the specified resource from storage.
      */
     public function destroy(myinput $myinput)
     {
       $myinput->delete();
        return back();
     }
}

app\Myinput.php

Nachdem wir gerade mit dem Layout der Datenbanktabelle beschäftigt sind: Damit die Einträge in der Datenbank später gespeichert werden können, teilen wir das Layout dem Model mit:

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;
class Myinput extends Model
{
  protected $fillable = [
      'string', 'email', 'integer'
  ];
}

Anstelle von $fillable kann auch $guarded verwendet werden. $guarded verbietet nur bestimmte Variablen.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Myinput extends Model
{
    protected $guarded = [];
}
 

Bei dieser Variante muss sichergestellt werden, dass im Controller in der store-Funktion nur die erwarteten Werte übergeben werden. (auf keinen Fall Post::create(request()->all()); verwenden.)

Nochmal kurz zurück zur Controller-Datei:

Nicht ganz im Standard, aber anstelle von use App\Myinput; könnte die Model-Datei theoretisch auch im Controller hinterlegt werden:

use Illuminate\Database\Eloquent\Model as Eloquent;
class Myinput extends Eloquent
{
protected $guarded = [];
}

zugehörige Views

resources/views/ layouts/app.blade.php

Wer sich an dieser Stelle wundert: Die Datei app.blade.php habe ich bisher noch nicht erwähnt.

Der Sinn dieser Datei ist folgender:

Damit nicht in allen View-Dateien immer wieder der selbe Header und Footer geladen werden muss, kann dafür eine Vorlage erstellt werden. Die Vorlage kann von mehreren View-Dateien verwendet werden, diese ändern nur einen bestimmten Bereich in der Vorlage, an der Stelle:  @yield('content')

<!-- resources/views/layouts/app.blade.php -->
<!DOCTYPE html>
<html>
  <head>
      <title>Myinput Test</title>
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  </head>
  <body>
       @yield('content')
       <!-- JavaScripts -->
            <script   src="https://code.jquery.com/jquery-2.2.4.min.js"   integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="   crossorigin="anonymous"></script> 
     <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
  </body>
</html>

Die folgenden Dateien verwenden die Vorlage und rufen diese über @extends('layouts.app') auf, bzw. verwenden den Bereich @yield('content') mit dem Befehl:@section('content')

resources/views/ myinputs/index.blade.php

app/views/myinputs/edit.blade.php

<!-- resources/views/myinputs/index.blade.php -->
@extends('layouts.app')
@section('content')
<div class="container">
<nav class="navbar navbar-inverse">
    <ul class="nav navbar-nav">
        <li><a href="{{ URL::to('myinputs/create') }}">Create a Myinput</a>
    </ul>
</nav>
<h1>All the Myinputs</h1>

<!-- will be used to show any messages -->
@if (Session::has('message'))
    <div class="alert alert-info">{{ Session::get('message') }}</div>
@endif

<table class="table table-striped table-bordered">
    <thead>
        <tr>
            <td>ID</td>
            <td>String</td>
            <td>Email</td>
            <td>Integer</td>
            <td>Actions</td>
        </tr>
    </thead>
    <tbody>
    @foreach($myinputs as $key => $value)
        <tr>
            <td>{{ $value->id }}</td>
            <td>{{ $value->string }}</td>
            <td>{{ $value->email }}</td>
            <td>{{ $value->integer }}</td>

            <!-- we will also add show, edit, and delete buttons -->
            <td>

                <!-- show the myinput (uses the show method found at GET /myinputs/{id} -->
                <a class="btn btn-small btn-success" href="{{ URL::to('myinputs/' . $value->id) }}">Show this Myinput</a>

                <!-- edit this myinput (uses the edit method found at GET /myinputs/{id}/edit -->
                <a class="btn btn-small btn-info" href="{{ URL::to('myinputs/' . $value->id . '/edit') }}">Edit this Myinput</a>

                <!-- delete the myinput (uses the destroy method DESTROY /myinputs/{id} -->
                <form action="./myinputs/{{$value->id }}"  onsubmit="return confirm('Are you sure to delete: {{ $value->string}}')" method="POST">
                    {{ csrf_field() }}
                    {{ method_field('DELETE') }}
                    <button type="submit" class="btn btn-danger">
                        <i class="fa fa-btn fa-trash">Delete</i>
                    </button>
                </form>
            </td>
        </tr>
    @endforeach
    </tbody>
</table>
	 {!! $articles->render() !!}
</div>
@endsection

resources/views/ myinputs/show.blade.php

<!-- resources/views/myinputs/show.blade.php -->
@extends('layouts.app')
@section('content')
<div class="container">
      <nav class="navbar navbar-inverse">
          <ul class="nav navbar-nav">
              <li><a href="{{ URL::to('myinputs') }}">View All Myinputs</a></li>
          </ul>
      </nav>
<h1>Showing {{ $myinput->string }}</h1>
    <div class="jumbotron text-center">
        <h2>{{ $myinput->string }}</h2>
        <p>
            <strong>Email:</strong> {{ $myinput->email }}<br>
            <strong>Level:</strong> {{ $myinput->level }}
        </p>
    </div>
</div>
@endsection

resources/views/ myinputs/create.blade.php

<!-- resources/views/myinputs/create.blade.php -->
@extends('layouts.app')
@section('content')
<div class="container">
      <nav class="navbar navbar-inverse">
          <ul class="nav navbar-nav">
              <li><a href="{{ URL::to('myinputs') }}">View All Myinputs</a></li>
          </ul>
      </nav>
<h1>Create a Myinput</h1>
<!-- if there are creation errors, they will show here -->
@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
<form action="{{ url('myinputs') }}" method="POST" class="form-horizontal">
    {{ csrf_field() }}
    <div class="form-group">
        <label for="formGroupExampleInput">String:</label>
        <input type="text" name="string" class="form-control" value="{{ old('string') }}">
    </div>
    <div class="form-group">
        <label for="formGroupExampleInput">Email:</label>
        <input type="text" name="email" class="form-control" value="{{ old('email') }}">
    </div>
    <div class="form-group">
        <label for="formGroupExampleInput">Integer:</label>
        <input type="text" name="integer" class="form-control" value="{{ old('integer') }}">
    </div>
    <div class="form-group">
</div>
<!-- Add Button -->
 <div class="form-group">
     <div class="col-sm-offset-3 col-sm-6">
         <button type="submit" class="btn btn-default">
             <i class="fa fa-btn fa-plus"></i>Add
         </button>
     </div>
 </div>
</form>
</div>
@endsection

resources/views/ myinputs/edit.blade.php

<!-- resources/views/myinputs/edit.blade.php -->
@extends('layouts.app')
@section('content')
<div class="container">
      <nav class="navbar navbar-inverse">
          <ul class="nav navbar-nav">
              <li><a href="{{ URL::to('myinputs') }}">View All Myinputs</a></li>
          </ul>
      </nav>
<h1>Edit {{ $myinput->string }}</h1>
<!-- if there are creation errors, they will show here -->
@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
<form action="{{ url('myinputs') }}/{{$myinput->id }}" method="POST" class="form-horizontal">
    {{ csrf_field() }}
    {{ method_field('PATCH')}}
    <div class="form-group">
        <label for="formGroupExampleInput">String:</label>
        <input type="text" name="string" class="form-control" value="{{ $myinput->string }}">
    </div>
    <div class="form-group">
        <label for="formGroupExampleInput">Email:</label>
        <input type="text" name="email" class="form-control" value="{{ $myinput->email }}">
    </div>
    <div class="form-group">
        <label for="formGroupExampleInput">Level:</label>
        <input type="text" name="integer" class="form-control" value="{{ $myinput->integer }}">
    </div>
    <div class="form-group">
</div>
<!-- Update Button -->
 <div class="form-group">
     <div class="col-sm-offset-3 col-sm-6">
         <button type="submit" class="btn btn-default">
             <i class="fa fa-btn fa-plus">update</i>
         </button>
     </div>
 </div>
</form>
</div>
@endsection

 

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare


(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]

✍anonym
29.10.2018 10:56
User: Raßloff 
danke.

✍anonym
10.08.2018 13:20
User: Raßloff 
Danke fürs posten. Wenn ihr jetzt noch das ganze als REST-API mit Authentifizierung online stellen könntet, das wäre super.

✍anonym
12.04.2017 20:15
User: Jan K. 
Super, hat mit sehr geholfen.