Halo semuanya! Kami melanjutkan serangkaian publikasi hak cipta untuk mengantisipasi dimulainya kursus 
"Framework Laravel" . Dalam 
artikel sebelumnya 
, kami melihat fondasi teoritis Laravel. Namun, teori kerangka kerja apa pun dapat dipelajari untuk waktu yang lama dan tidak memahami apa pun sampai Anda menulis apa pun dalam praktik.

Karena itu, mari kita menulis aplikasi di mana setiap pengguna dapat login, membuat album baru dan mengunggah foto di sana. 
Jika Anda belum tahu apa itu MVC, baca ini , segera Anda harus menggunakannya dalam praktek . 
Panduan semacam ini mulai dengan penjelasan tentang cara mengatur lingkungan Anda, dll. Masalahnya adalah bahwa pada setiap platform berbeda, tetapi saya ingin artikel tersebut menarik bagi semua orang. Saya hanya akan memberikan tautan ke yang diperlukan, dan Anda akan mencoba menginstal dan mengkonfigurasinya sendiri.
Jadi kita membutuhkan: Komposer
Komposer Bagi mereka yang ada di dalam tangki, Komposer adalah pengelola paket untuk PHP (ya, seperti npm untuk JavaScript). Anda dapat mengunduhnya di 
sini .
Laravel sendiri. Ada beberapa opsi paling populer di sini: Homestead dan Valet (dan sebenarnya, banyak lainnya). Namun, yang terakhir ini hanya cocok untuk Mac OS. Secara teknis, pembaca dapat menggunakan rakitan favorit apa saja, jika hanya memenuhi persyaratan 
ini .
Dan detail yang halus, tetapi 
Node.js juga akan diperlukan bagi kita untuk menginstal paket npm.
Jalankan perintah: 
composer global require laravel/installer untuk menginstal Laravel.
Ingatlah untuk meletakkan 
$Home/.composer/vendor/bin (atau yang setara pada OS Anda) ke dalam variabel 
PATH Anda sehingga perintah Laravel bekerja pada sistem Anda.
Jadi, proyek yang bagus dimulai dengan TOR yang bisa dimengerti. 
Mari kita coba merumuskan persyaratan dasar untuk aplikasi sederhana kita:
Pengguna memiliki kesempatan untuk mengunggah foto ke situs dalam album yang dibuat olehnya. Dia bisa mendaftar, dan bisa masuk. Basis datanya adalah MySQL. Kerangka kerja yang digunakan untuk menyederhanakan proses tata letak adalah Bootstrap, sebagai kerangka kerja tata letak yang paling umum.
Tindakan pertama yang Anda ambil segera setelah pembuatan adalah menghubungkan database. Jika Anda masih tidak mengerti cara menginstal dan menjalankan database Anda, gunakan solusi desktop yang sudah jadi dari Evil Corporation: di 
sini dan di 
sini . Ini akan cukup pada awalnya.
Jadi semuanya sudah siap. Kami pergi ke direktori favorit Anda dan memulai proyek dengan
 laravel new gallery 
Selanjutnya Anda perlu menghubungkan basis data kami. Untuk melakukan ini, buka Cabang MySQL dan buat database 
galeri baru (jangan lupa untuk mengatur Set Karakter ke utf-8, dan ollation ke 
utf_general_ci untuk menghindari masalah dengan bahasa Rusia).

Selanjutnya, buka file 
.ENV dan konfigurasikan koneksi serupa, ingat untuk mengubah variabel ke nama pengguna dan kata sandi Anda:
 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=gallery DB_USERNAME=pavel DB_PASSWORD= 
Setelah itu, kami akan dapat memigrasi basis data kami.
 php artisan migrate 
Jika Anda mengonfigurasi koneksi Anda di 
.ENV dengan benar, maka semuanya akan bekerja untuk Anda.
Saat kami menyetujui t / z, kami akan memiliki proses otorisasi, pendaftaran, dan juga pengguna akan memiliki kesempatan untuk membuat album dan mengunggah foto di sana. Untuk mengimplementasikan semua yang kita butuhkan tabel yang sesuai dalam database.
Buat tabel album
Jadi di mana backend mulai? Dari membuat tabel di basis data kami. Perintah ini di terminal akan menciptakan peluang bagi kita untuk bermigrasi ke database:
 php artisan make:migration CreateAlbumsTable 
Jadi, kita perlu menentukan kolom mana yang harus ada di tabel kita. Ini harus dilakukan dalam file yang Anda buat karena migrasi terakhir. Itu terletak di proyek Anda di folder 
gallery/database/migrations dan namanya dikaitkan dengan waktu pembuatannya. Itu harus diedit sebagai berikut:
 <?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');  
Jangan lupa lakukan
  php artisan migrate 
Sekarang tab dari database Anda di Cabang MySQL harus mengambil bentuk berikut:

Jadi, kami membuat basis data kami, sekarang kami harus menghubungkan basis data kami dengan model 
Eloquen , yang akan berinteraksi dengan basis data kami.
Buat Model Album

Sekarang kita perlu membuat model ORM Eloquent. Jika Anda tidak mengerti bagaimana kami bergerak begitu cepat dari satu ke yang lain, Anda harus membaca 
ini. Kami akan menggunakan pembantu Artisan yang sama untuk menghasilkan template model:
php artisan make: model Album
Selanjutnya, kita pergi ke 
gallery/app/Album.php dan mengeditnya:
 <?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'); } } 
Tabel gambar
Wow! Model album kami sudah siap, sekarang Anda dapat melakukan gambar kami. Di sini prosesnya akan diulangi lagi:
 php artisan make:migration CreateImagesTable 
Kami akan mengedit migrasi kami:
 <?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'); } } 
Dan lagi kami melakukan migrasi:
 php artisan migrate 
Saya harap migrasi Anda berhasil! Namun, kami perlu menjelaskan satu hal lagi yang akan terlalu lama untuk dituliskan di komentar: kami menggunakan kunci 
foreign untuk bergabung dengan dua tabel 
Album dan 
Gambar . Setiap album memiliki gambarnya sendiri, dan jika Anda ingin menghapus beberapa jenis album, Anda mungkin berpikir bahwa foto-foto itu juga akan dihapus.
Model Gambar
Saatnya membuat model yang akan bekerja dengan tabel 
gambar . Saya harap Anda sudah menebak apa yang harus dilakukan:
 php artisan make:model Image 
Templat dibuat, pergi ke 
gallery/app/Image.php untuk mengeditnya.
Di sini juga, semuanya harus jelas:
 class Image extends Model { protected $table = 'images'; // ,      protected $fillable = array('album_id','description','image'); // } 
Model 
gambar kami siap. Sekarang kita membutuhkan pengontrol untuk membuat album di basis data kita.
Pembuatan album
Untuk menyimpan, menampilkan, dan menghapus di album kami, kami memerlukan beberapa fungsi di controller kami. Tetapi pertama-tama Anda perlu controller itu sendiri:
 php artisan make:controller AlbumsController 
Pergi ke 
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'); } } 
Maka kita harus mendefinisikan kembali jalan kita. Bagi mereka yang tidak tahu, perutean sedang menyiapkan jalur yang ditampilkan kepada pengguna di browser dan tindakan yang harus dilakukan aplikasi kita. Kami pergi ke file 
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 Agar aplikasi kita menghasilkan uang, kita perlu memastikan bahwa kita memiliki tautan yang diperlukan ke label (alias) dari kelas yang kita butuhkan di akhir file gallery/config/app.php . Ini hanya pengaturan teknis:
 '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     ) 
Hebat! Sekarang kita perlu mendefinisikan ide-ide kita! Buka folder 
gallery/resources/views . Anda dapat menghapus 
welcome.blade.php , Anda dapat pergi, itu tidak masalah. Buat 
index.blade.php dan 
includes subfolder untuk menambahkan bagian tampilan yang berulang. Jadi, 
index.blade.php kami harus mengambil bentuk berikut:
 @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> 
Konten 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> 
Konten 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> 
Itu saja untuk hari ini! Ini, tentu saja, hanya bagian pertama dari aplikasi kita. Terima kasih atas perhatian Anda, pada bagian selanjutnya kami akan melengkapi 
view kami dan mendiskusikan masalah validasi gambar.
Tautan yang bermanfaat:Dokumentasi dalam bahasa RusiaPanduan bermanfaat dalam bahasa Inggris yang lebih baik daripada dokumentasi menjelaskan cara kerja warisan dan ekstensi templat BladeBanyak informasi yang berguna dan contoh-contoh praktis untuk membuat aplikasi