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.