Laravel: kami menganalisis konsep dasar. Bagian Tiga: Final

Beberapa hari tersisa sampai dimulainya kursus baru dari OTUS - "Framework Laravel" . Untuk mengantisipasi dimulainya kursus, kami membagikan bagian terakhir dari publikasi penulis tentang konsep-konsep dasar di Laravel. Penting: seri publikasi ini tidak terkait dengan program pendidikan kursus dan sedikit bahan yang berguna untuk pemula . Program kursus dapat ditemukan di sini .




Di artikel terakhir , kami mulai menulis galeri tempat pengguna dapat masuk dan mendaftar, membuat album dengan deskripsi, sampul, dan judul. Dalam aplikasi yang dibuat ada nilai utama dari view kita dan sekarang perlu untuk sedikit memperluasnya.
Juga, kode yang ada patut sedikit ditingkatkan:

Kami sudah memiliki dua pengontrol - AlbumController dan ImageController . Tambahkan impor kelas tambahan yang bertanggung jawab untuk bekerja dengan string:

  use Illuminate\Support\Str; 

Dan ubah baris yang bertanggung jawab untuk menghasilkan nama gambar acak di basis data kami:

  $random_name = Str::random(8); 

Selain itu, sekarang ada baiknya sedikit mengubah kode migrasi untuk meningkatkan keandalan aplikasi kami, karena pengguna harus memiliki hak untuk membiarkan bidang description kami kosong (jika tidak, Laravel with dynamite akan memberi tahu kami tentang kesalahan tersebut). Mari kita masuk ke migrasi yang terkait dengan tabel gambar, dan perbaiki di sana garis yang terkait dengan deskripsi gambar untuk yang ini:

  $table->string('description')->nullable(); 

Nah, dengan "refactoring" aplikasi selesai. Selanjutnya, Anda harus menyelesaikan tampilan aplikasi kami. Buat formulir di mana pengguna dapat membuat album mereka:

file addimage.blade.php

  @include('includes.header') <body> @include('includes.nav') <div class="container" style="text-align: center;"> <div class="span4" style="display: inline-block; margin-top:100px;"> @if (isset($errors) && $errors->has('')) <div class="alert alert-block alert-error fade in"id="error-block"> <?php $messages = $errors->all('<li>:message</li>'); ?> <button type="button" class="close"data-dismiss="alert">Γ—</button> <h4>Warning!</h4> <ul> @foreach($messages as $message) {{$message}} @endforeach </ul> </div> @endif <form name="createnewalbum" method="POST"action="{{route('create_album')}}" enctype="multipart/form-data"> {{ csrf_field() }} <fieldset> <legend> </legend> <div class="form-group"> <label for="name"> </label> <input name="name" type="text" class="form-control"placeholder=" " value="{{old('name')}}"> </div> <div class="form-group"> <label for="description"> </label> <textarea name="description" type="text"class="form-control" placeholder=" ">{{old('descrption')}}</textarea> </div> <div class="form-group"> <label for="cover_image">   </label> {{Form::file('cover_image')}} </div> <button type="submit" class=Β«btn btn-default">!</button> </fieldset> </form> </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/js/bootstrap.min.js"></script> </body> </html> 

Biarkan saya mengingatkan Anda bahwa di includes di bagian atas halaman kami memiliki navigasi dan perpustakaan yang digunakan, yang dijelaskan di bagian terakhir.

Selain itu, kita perlu menambahkan tampilan album.blade.php

  @include('includes.header') <body> @include('includes.nav') <div class="container"> <div class="starter-template"> <div class="media"> <img class="media-object pull-left"alt="{{$album->name}}" src="/albums/{{$album->cover_image}}" width="350px"> <div class="media-body"> <h2 class="media-heading" style="font-size: 26px;"> :</h2> <p>{{$album->name}}</p> <div class="media"> <h2 class="media-heading" style="font-size: 26px;">  :</h2> <p>{{$album->description}}<p> <a href="{{route('add_image',array('id'=>$album->id))}}"><button type="button"class="btn btn-primary btn-large">    </button></a> <a href="{{route('delete_album',array('id'=>$album->id))}}" onclick="return confirm(' ?')"><button type="button"class="btn btn-danger btn-large"> </button></a> </div> </div> </div> </div> <div class="row"> @foreach($album->Photos as $photo) <div class="col-lg-3"> <div class="thumbnail" style="max-height: 350px;min-height: 350px;"> <img alt="{{$album->name}}" src="/albums/{{$photo->image}}"> <div class="caption"> <p>{{$photo->description}}</p> <p> : {{ date("d FY",strtotime($photo->created_at)) }}at {{ date("g:ha",strtotime($photo->created_at)) }}</p> <a href="{{route('delete_image',array('id'=>$photo->id))}}" onclick="returnconfirm(' ?')"><button type="button"class="btn btn-danger btn-small"> </button></a> <p>     :</p> <form name="movephoto" method="POST"action="{{route('move_image')}}"> {{ csrf_field() }} <select name="new_album"> @foreach($albums as $others) <option value="{{$others->id}}">{{$others->name}}</option> @endforeach </select> <input type="hidden" name="photo"value="{{$photo->id}}" /> <button type="submit" class="btn btn-smallbtn-info" onclick="return confirm(' ?')"> </button> </form> </div> </div> </div> @endforeach </div> </div> <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/js/bootstrap.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> </body> </html> 

Selain itu, kami dapat sedikit memperbarui perutean kami, misalnya, di nav.blade.php :

  <li><a href="{{URL::route('create_album_form')}}">  </a></li> 

Ke opsi yang lebih baru dan lebih modis:

  <li><a href="{{route('create_album_form')}}">  </a></li> 

Di sisi lain, versi sebelumnya bekerja pada 6 Laravel. Jadi, kami sudah memiliki formulir di mana pengguna dapat menambahkan foto ke album, dan ada view utama album kami. Selanjutnya, kita perlu menambahkan controller yang akan bertanggung jawab untuk memproses satu foto.

Jadi, kami membuat pengontrol yang bertanggung jawab untuk bekerja dengan foto individual:

  php artisan make:controller ImageController 

Jadi, apa yang harus ada dalam diri kita:

  <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\MessageBag; use Validator; //       use App\Album; use App\Image; use Illuminate\Support\Str; class ImageController extends Controller { public function getForm($id) { $album = Album::find($id); return view('addimage') ->with('album',$album); //  ,          } public function postAdd(Request $request) { //    ,       $rules = [ 'album_id' => 'required|numeric|exists:albums,id', 'image'=>'required|image' ]; $input = ['album_id' => null]; $validator = Validator::make($request->all(), $rules); if($validator->fails()){ return redirect()->route('add_image', ['id' => $request->get('album_id')])->withErrors($validator)->withInput(); } $file = $request->file('image'); //   $random_name = Str::random(8); //  $destinationPath = 'albums/'; $extension = $file->getClientOriginalExtension(); $filename=$random_name.'_album_image.'.$extension; $uploadSuccess = $request->file('image')->move($destinationPath, $filename); Image::create(array( 'description' => $request->get('description'), //   'image' => $filename, //   'album_id'=> $request->get('album_id') //         )); return redirect()->route('show_album',['id'=>$request->get('album_id')]); } public function getDelete($id) //       { $image = Image::find($id); $image->delete(); return redirect()->route('show_album',['id'=>$image->album_id]); } //       public function postMove(Request $request) { $rules = array( 'new_album' => 'required|numeric|exists:albums,id', 'photo'=>'required|numeric|exists:images,id' ); //    $validator = Validator::make($request->all(), $rules); if($validator->fails()){ return redirect()->route('index'); } $image = Image::find($request->get('photo')); $image->album_id = $request->get('new_album'); $image->save(); return redirect()->route('show_album', ['id'=>$request->get('new_album')]); } } 



Registrasi dan otorisasi


Saat ini, aplikasi kami hampir siap. Namun, kita masih perlu memperketat kemampuan untuk mendaftar dalam aplikasi kita, logout, dan login ke akun yang ada.

Pada bagian terakhir, kami telah menunjukkan bagaimana includes/nav.blade.php . Karena kami ingin tombol Login dan muncul ketika pengguna belum mendaftar, dan tombol Keluar ketika dia terdaftar di kami.

Jadi, ini adalah bagaimana kita sekarang melihat daftar di includes/nav.blade.php :

  <ul class="nav navbar-nav"> @if (Auth::check()) <li> <button type="button" class="btn btn-primary"> <!--   ,  ->   --> {{{ Auth::user()->name}}} </button> </li> <li><a href="{{route('create_album_form')}}">  </a></li> @else <!--    --> <li><a href="{{route('register')}}"></a></li> <li><a href="{{route('login')}}"></a></li> @endif @if (Auth::check()) <!--  ,       --> <!--      --> <li> <a href="{{url('/logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">  </a> <form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;"> {{ csrf_field() }} </form> </li> @endif </ul> 

Dengan menggunakan Auth::check construction dan element if else , kita dapat membuat perubahan dalam view kita, tergantung pada apakah pengguna kita terdaftar atau tidak.

Namun, dengan perubahan pada view sebelum membuat model dan pengontrol, kami menjalankan sedikit di depan mesin. Untuk membuat otentikasi kami, kami akan menggunakan semua solusi siap pakai dan cepat yang ada di Laravel 6.

Jadi, tentang model Pengguna - kami akan menggunakan model yang ada di dalam kotak. Di satu sisi, itu jelas tidak cukup untuk aplikasi penuh, di sisi lain - saya tidak ingin membatasi diri pada lingkup satu aplikasi tertentu. Galeri seperti apa yang Anda inginkan? Di mana pengguna dapat membuat album pribadinya sendiri yang tidak dapat diakses oleh siapa pun? Atau di mana semua orang membagikan foto mereka? Kami tidak akan memiliki batasan dalam aplikasi kami - saya pikir pembaca akan dapat menyelesaikannya tanpa masalah dengan selera dan warnanya.

Jadi, di Laravel 6, membuat otentikasi menjadi lebih mudah. Kita pergi ke baris perintah aplikasi kita:

  composer require laravel/ui β€”dev 

Yang memberi kami paket yang diperlukan. Sekarang buat:

  php artisan ui:auth 

Apa yang diberikan tim ini kepada kita? Pertama, kami memiliki folder auth baru dalam resources/views , di mana kami memiliki semua views yang mungkin diperlukan untuk mengotorisasi pengguna dan mendaftarkannya: login , register dan verify . Ada juga subfolder passwords didedikasikan untuk mengatur ulang dan memulihkan kata sandi. Dalam folder Http/Controllers , kami memiliki HomeController , yang diperlukan untuk mengalihkan ke halaman rumah setelah pendaftaran pengguna. Kami juga akan memiliki layouts subfolder, yang akan berisi app.blade.php , yang tidak akan kami bongkar hari ini, tetapi ini bisa menjadi dasar yang sangat baik untuk aplikasi yang dibuat dari awal.

Templat blade yang dibuat sudah memiliki tata letak awal yang dirancang khusus untuk Bootstrap . Kami sudah menghubungkannya di header.blade.php .
Selain itu, kami telah memperbarui sedikit perutean di routes/web.php . Baris berikut ditambahkan:

  Auth::routes(); Route::get('/home', 'HomeController@index')->name('home'); Route::post('/logout', 'Auth\LoginController@logout')->name('logout'); 

Jalur ke home dihasilkan secara otomatis, dan saya melakukan pengalihan untuk logout sendiri.

Agar tata letak Anda berfungsi pada templat yang dihasilkan, kami akan menyambungkan nav dan header dengannya:

  @include('includes.header') <body> @include('includes.nav') @extends('layouts.app') 

Hebat, sekarang semuanya sudah siap. Cobalah mendaftar. Konfirmasi kata sandi juga harus berfungsi:





Di masa mendatang, pengguna dapat memilih halaman layanan mana yang ingin ia kunjungi (atau pembaca dapat membuat arahan sendiri, itu tidak terlalu sulit) Kami hanya perlu memperbaiki detail kecil: untuk membuatnya sehingga hanya pengguna terdaftar dan resmi yang dapat melihat album berharga kami.

Untuk melakukan ini, kami menambahkan kondisi ke perutean kami sehingga pengguna masuk untuk mengakses album.

Memperbarui web.php kami:

  Route::get('/', array('as' => 'index','uses' => 'AlbumsController@getList')) ->middleware('auth');; //middleware     http    Route::get('/createalbum', array('as' => 'create_album_form','uses' => 'AlbumsController@getForm')) ->middleware('auth');; //    Route::post('/createalbum', array('as' => 'create_album','uses' => 'AlbumsController@postCreate')) ->middleware('auth');; //   Route::get('/deletealbum/{id}', array('as' => 'delete_album','uses' => 'AlbumsController@getDelete')) ->middleware('auth');; //   Route::get('/album/{id}', array('as' => 'show_album','uses' => 'AlbumsController@getAlbum')) ->middleware('auth');; //   

Pada dasarnya, pada tahap ini kita sudah bisa menyelesaikannya. Saya akan menyerahkan kepada pembaca aplikasi apa yang ingin ia buat: dengan album pribadi atau dengan album publik. Secara teori, aplikasi ini sudah dapat digunakan jika Anda melihat kemungkinan registrasi dan membuat pengguna secara langsung di dalam basis data - misalnya, jika Anda dan kolega Anda akan mengatur album pribadi Anda dan karena alasan tertentu tidak ingin menggunakan layanan lain.

Terima kasih atas perhatian Anda! Seperti biasa, tautan bermanfaat:

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


All Articles