Laravel: jelaskan konsep dasarnya. Bagian Dua: Berlatih

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 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 { /** * Run the migrations. * * @return void */ public function up() { Schema::create('albums', function(Blueprint $table) { $table->increments('id')->unsigned(); $table->string('name'); //   $table->text('description'); //    $table->string('cover_image'); //   $table->timestamps(); //  .   ,     }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('albums'); } } 

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 Rusia
Panduan bermanfaat dalam bahasa Inggris yang lebih baik daripada dokumentasi menjelaskan cara kerja warisan dan ekstensi templat Blade
Banyak informasi yang berguna dan contoh-contoh praktis untuk membuat aplikasi

Source: https://habr.com/ru/post/id471776/


All Articles