Hallo allerseits! Wir setzen die Reihe der urheberrechtlichen Veröffentlichungen im Vorgriff auf den Beginn des Kurses
„Framework Laravel“ fort . In einem früheren
Artikel haben wir uns mit den theoretischen Grundlagen von Laravel befasst. Die Theorie eines Frameworks kann jedoch lange studiert werden und versteht nichts, bis Sie etwas in der Praxis schreiben.

Schreiben wir daher eine Anwendung, in der sich jeder Benutzer anmelden, neue Alben erstellen und dort Fotos hochladen kann.
Wenn Sie noch nicht wissen, was MVC ist, lesen Sie dies , bald müssen Sie es in der Praxis verwenden .
Anleitungen dieser Art beginnen mit einer Erklärung zum Einrichten Ihrer Umgebung usw. Das Problem ist, dass es auf jeder Plattform anders ist, aber ich möchte, dass der Artikel für alle interessant ist. Ich werde nur Links zu den notwendigen geben, und Sie werden versuchen, es selbst zu installieren und zu konfigurieren.
Also brauchen wir:
Komponist Für diejenigen im Tank ist Composer ein Paketmanager für PHP (ja, wie npm für JavaScript). Sie können es
hier herunterladen.
Laravel selbst. Hier gibt es einige der beliebtesten Optionen: Homestead und Valet (und in der Tat viele andere). Letzteres ist jedoch nur für Mac OS geeignet. Technisch kann der Leser jede bevorzugte Baugruppe verwenden, wenn sie nur
diese Anforderungen erfüllt.
Und ein subtiles Detail, aber
Node.js wird auch benötigt, damit wir npm-Pakete installieren können.
Führen Sie den folgenden Befehl aus:
composer global require laravel/installer
, um Laravel zu installieren.
Denken Sie daran, das
$Home/.composer/vendor/bin
(oder das entsprechende
$Home/.composer/vendor/bin
auf Ihrem Betriebssystem) in Ihre
PATH
Variable
PATH
, damit der Befehl Laravel auf Ihrem System funktioniert.
Ein gutes Projekt beginnt also mit einem verständlichen TOR.
Versuchen wir, die Grundvoraussetzungen für unsere einfache Anwendung zu formulieren:
Der Benutzer hat die Möglichkeit, Fotos in von ihm erstellten Alben auf die Website hochzuladen. Er kann sich registrieren und anmelden. Die Datenbank ist MySQL. Das Framework, das zur Vereinfachung des Layoutprozesses verwendet wird, ist Bootstrap, das am häufigsten verwendete Layout-Framework.
Die erste Aktion, die Sie unmittelbar nach der Erstellung ausführen, ist das Verbinden der Datenbank. Wenn Sie immer noch nicht verstehen, wie Sie Ihre Datenbank installieren und ausführen, verwenden Sie vorgefertigte Desktop-Lösungen der Evil Corporation:
hier und
hier . Dies wird zunächst ausreichen.
Also ist alles fertig. Wir gehen in Ihr Lieblingsverzeichnis und starten das Projekt mit
laravel new gallery
Als nächstes müssen Sie unsere Datenbank verbinden. Gehen Sie dazu durch den MySQL-Zweig und erstellen Sie eine neue
Galeriedatenbank (vergessen Sie nicht, den Zeichensatz auf utf-8 und ationollation auf
utf_general_ci
zu
utf_general_ci
, um Probleme mit der russischen Sprache zu vermeiden).

.ENV
Nächstes zur
.ENV
Datei und konfigurieren Sie eine ähnliche Verbindung.
.ENV
daran, die Variablen in Ihren Benutzernamen und Ihr Kennwort zu ändern:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=gallery DB_USERNAME=pavel DB_PASSWORD=
Danach können wir unsere Datenbanken migrieren.
php artisan migrate
Wenn Sie Ihre Verbindung in
.ENV
richtig
.ENV
haben, sollte alles für Sie funktionieren.
Wie wir uns auf t / z geeinigt haben, haben wir einen Autorisierungs- und Registrierungsprozess, und der Benutzer hat auch die Möglichkeit, dort Alben zu erstellen und Fotos hochzuladen. Um alles zu implementieren, benötigen wir die entsprechenden Tabellen in der Datenbank.
Erstellen Sie die Albumtabelle
Wo beginnt das Backend? Vom Erstellen einer Tabelle in unserer Datenbank. Dieser Befehl im Terminal bietet uns die Möglichkeit, in die Datenbank zu migrieren:
php artisan make:migration CreateAlbumsTable
Wir müssen also bestimmen, welche Spalten in unserer Tabelle enthalten sein sollen. Dies muss in der Datei erfolgen, die Sie aufgrund der letzten Migration erstellt haben. Es befindet sich in Ihrem Projekt im Ordner
gallery/database/migrations
und sein Name ist mit dem Zeitpunkt seiner Erstellung verknüpft. Es muss wie folgt bearbeitet werden:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateAlbumsTable extends Migration { public function up() { Schema::create('albums', function(Blueprint $table) { $table->increments('id')->unsigned(); $table->string('name');
Vergiss nicht zu tun
php artisan migrate
Nun sollte die Registerkarte Ihrer Datenbank in MySQL Branch die folgende Form annehmen:

Also haben wir unsere Datenbank erstellt. Jetzt müssen wir unsere Datenbank mit dem
Eloquen- Modell verbinden, das mit unserer Datenbank interagiert.
Erstellen Sie ein Albummodell

Jetzt müssen wir ein eloquentes ORM-Modell erstellen. Wenn Sie nicht verstehen, wie schnell wir von einem zum anderen gewechselt sind, sollten Sie
dies lesen
. Wir werden denselben Artisan-Helfer verwenden, um die Modellvorlage zu generieren:
PHP Artisan machen: Modell Album
Als nächstes gehen wir zu
gallery/app/Album.php
und bearbeiten es:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Album extends Model { protected $table = 'albums'; protected $fillable = array('name','description','cover_image'); public function Photos(){ return $this->hasMany('App\Image'); } }
Bildtabelle
Wow! Unser Albummodell ist fertig, jetzt können Sie unsere Bilder machen. Hier wird der Vorgang noch einmal wiederholt:
php artisan make:migration CreateImagesTable
Wir werden unsere Migration bearbeiten:
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateImagesTable extends Migration { public function up() { Schema::create('images', function (Blueprint $table) { $table->increments('id'); $table->integer('album_id')->unsigned(); $table->string('image'); $table->string('description'); $table->foreign('album_id')->references('id')->on('albums')->onDelete('CASCADE')->onUpdate('CASCADE'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('images'); } }
Und wieder machen wir die Migration:
php artisan migrate
Ich hoffe Ihre Migration ist ein Erfolg! Wir müssen jedoch noch etwas erklären, das zu lang gewesen wäre, um es in den Kommentaren aufzuschreiben: Wir haben den
foreign
, um die beiden Tabellen
Alben und
Bilder zu verbinden . Jedes Album hat seine eigenen Bilder. Wenn Sie eine Art Album löschen möchten, denken Sie wahrscheinlich, dass die Fotos auch gelöscht werden.
Bildmodell
Es ist Zeit, ein Modell zu erstellen, das mit der
Bildtabelle funktioniert. Ich hoffe, Sie raten bereits, was zu tun ist:
php artisan make:model Image
Die Vorlage wird erstellt. Gehen Sie zu
gallery/app/Image.php
, um sie zu bearbeiten.
Auch hier sollte alles klar sein:
class Image extends Model { protected $table = 'images'; // , protected $fillable = array('album_id','description','image'); // }
Unser
Bildmodell ist fertig. Jetzt brauchen wir einen Controller, um Alben in unserer Datenbank zu erstellen.
Albumerstellung
Um in unserem Album zu speichern, anzuzeigen und zu löschen, benötigen wir einige Funktionen in unserem Controller. Aber zuerst brauchen Sie den Controller selbst:
php artisan make:controller AlbumsController
Gehen Sie zu
gallery/app/Http/Controllers/AlbumsController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\MessageBag; use Validator; use App\Album; class AlbumsController extends Controller { public function getList() // { $albums = Album::with('Photos')->get(); return view('index')->with('albums',$albums); } public function getAlbum($id) { $album = Album::with('Photos')->find($id); $albums = Album::with('Photos')->get(); return view('album', ['album'=>$album, 'albums'=>$albums]); } public function getForm() { return view('createalbum'); // } public function postCreate(Request $request) { $rules = ['name' => 'required', 'cover_image'=>'required|image']; // $input = ['name' => null]; // $validator = Validator::make($request->all(), $rules); if($validator->fails()){ return redirect()->route('create_album_form')->withErrors($validator)->withInput(); } $file = $request->file('cover_image'); $random_name = str_random(8); $destinationPath = 'albums/'; $extension = $file->getClientOriginalExtension(); $filename=$random_name.'_cover.'.$extension; $uploadSuccess = $request->file('cover_image')->move($destinationPath, $filename); $album = Album::create(array( 'name' => $request->get('name'), 'description' => $request->get('description'), 'cover_image' => $filename, )); return redirect()->route('show_album',['id'=>$album->id]); } public function getDelete($id) // { $album = Album::find($id); $album->delete(); return Redirect::route('index'); } }
Dann müssen wir unsere Wege neu definieren. Für diejenigen, die es nicht wissen, umfasst das Routing die Pfade, die dem Benutzer im Browser angezeigt werden, und die Aktionen, die unsere Anwendung ausführen soll. Wir gehen zur Datei
web.php
:
<?php // Route::get('/', array('as' => 'index','uses' => 'AlbumsController@getList')); // Route::get('/createalbum', array('as' => 'create_album_form','uses' => 'AlbumsController@getForm')); // Route::post('/createalbum', array('as' => 'create_album','uses' => 'AlbumsController@postCreate')); // Route::get('/deletealbum/{id}', array('as' => 'delete_album','uses' => 'AlbumsController@getDelete')); // Route::get('/album/{id}', array('as' => 'show_album','uses' => 'AlbumsController@getAlbum')); // // Route::get('/addimage/{id}', array('as' => 'add_image','uses' => 'ImageController@getForm')); // Route::post('/addimage', array('as' => 'add_image_to_album','uses' => 'ImageController@postAdd')); // Route::get('/deleteimage/{id}', array('as' => 'delete_image','uses' => 'ImageController@getDelete')); // Route::post('/moveimage', array('as' => 'move_image', 'uses' => 'ImageController@postMove'));
Wow. Damit unsere Anwendung Geld verdienen kann, müssen wir sicherstellen, dass wir die erforderlichen Links zu den Bezeichnungen (Alias) der Klassen haben, die wir am Ende der gallery/config/app.php
. Dies sind nur technische Einstellungen:
'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, 'Blade' => Illuminate\Support\Facades\Blade::class, 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, 'Bus' => Illuminate\Support\Facades\Bus::class, 'Cache' => Illuminate\Support\Facades\Cache::class, 'Config' => Illuminate\Support\Facades\Config::class, 'Cookie' => Illuminate\Support\Facades\Cookie::class, 'Crypt' => Illuminate\Support\Facades\Crypt::class, 'DB' => Illuminate\Support\Facades\DB::class, 'Eloquent' => Illuminate\Database\Eloquent\Model::class, 'Event' => Illuminate\Support\Facades\Event::class, 'File' => Illuminate\Support\Facades\File::class, 'Gate' => Illuminate\Support\Facades\Gate::class, 'Hash' => Illuminate\Support\Facades\Hash::class, 'Lang' => Illuminate\Support\Facades\Lang::class, 'Log' => Illuminate\Support\Facades\Log::class, 'Mail' => Illuminate\Support\Facades\Mail::class, 'Notification' => Illuminate\Support\Facades\Notification::class, 'Password' => Illuminate\Support\Facades\Password::class, 'Queue' => Illuminate\Support\Facades\Queue::class, 'Redirect' => Illuminate\Support\Facades\Redirect::class, 'Redis' => Illuminate\Support\Facades\Redis::class, 'Request' => Illuminate\Support\Facades\Request::class, 'Response' => Illuminate\Support\Facades\Response::class, 'Route' => Illuminate\Support\Facades\Route::class, 'Schema' => Illuminate\Support\Facades\Schema::class, 'Session' => Illuminate\Support\Facades\Session::class, 'Storage' => Illuminate\Support\Facades\Storage::class, 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, 'Form' => Collective\Html\FormFacade::class, 'Html' => Collective\Html\HtmlFacade::class, ], // FORM )
Großartig! Jetzt müssen wir unsere Ideen definieren! Wechseln Sie in den Ordner
gallery/resources/views
. Sie können
welcome.blade.php
löschen, Sie können gehen, es spielt keine Rolle. Erstellen Sie
index.blade.php
und
includes
Unterordner, um die sich wiederholenden Teile der
view
hinzuzufügen. Unsere
index.blade.php
sollte also die folgende Form haben:
@include('includes.header') <body> @include('includes.nav') <div class="container"> <div class="starter-template"> <div class="row"> @foreach($albums as $album) <div class="col-lg-3"> <div class="thumbnail" style="min-height: 514px;"> <img alt="{{$album->name}}" src="/albums/{{$album->cover_image}}"> <div class="caption"> <h3>{{$album->name}}</h3> <p>{{$album->description}}</p> <p>{{count($album->Photos)}} image(s).</p> <p>Created date: {{ date("d FY",strtotime($album->created_at)) }} at {{date("g:ha",strtotime($album->created_at)) }}</p> <p><a href="{{route('show_album', ['id'=>$album->id])}}" class="btn btn-big btn-default"> </a></p> </div> </div> </div> @endforeach </div> </div><!-- /.container --> </div> </body> </html>
Inhalt includes/header.blade.php
:
<!doctype html> <html lang="ru"> <head> <meta charset="UTF-8"> <title> </title> <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/css/bootstrap.min.css" rel="stylesheet"> <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/js/bootstrap.min.js"></script> <style> body { padding-top: 50px; } .starter-template { padding: 40px 15px; text-align: center; } </style> </head>
Inhalt includes/nav.blade.php
:
<div class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <button type="button" class="navbar-toggle"data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/"> </a> <div class="nav-collapse collapse"> <ul class="nav navbar-nav"> <li><a href="{{URL::route('create_album_form')}}"> </a></li> </ul> </div><!--/.nav-collapse --> </div> </div>
Das ist alles für heute! Dies ist natürlich nur der erste Teil unserer Bewerbung. Vielen Dank für Ihre Aufmerksamkeit. Im nächsten Teil werden wir unsere
view
ergänzen und das Thema Bildvalidierung diskutieren.
Nützliche Links:Dokumentation in russischer SpracheEine nützliche Anleitung auf Englisch, die besser als die Dokumentation erklärt, wie die Vererbung und Erweiterung von Blade-Vorlagen funktioniertViele nützliche Informationen und praktische Beispiele zum Erstellen von Anwendungen