लारवेल: हम मूल अवधारणाओं का विश्लेषण करते हैं। भाग तीन: अंतिम

OTUS - "फ्रेमवर्क लारवेल " से एक नया पाठ्यक्रम शुरू होने तक कुछ दिन शेष हैं। पाठ्यक्रम की शुरुआत की प्रत्याशा में, हम लारवेल में मूल अवधारणाओं पर लेखक के प्रकाशन के अंतिम भाग को साझा करते हैं। महत्वपूर्ण: प्रकाशनों की यह श्रृंखला पाठ्यक्रम के शैक्षिक कार्यक्रम से संबंधित नहीं है और शुरुआती लोगों के लिए थोड़ी उपयोगी सामग्री है पाठ्यक्रम कार्यक्रम यहां पाया जा सकता है




पिछले लेख में, हमने एक गैलरी लिखना शुरू किया जिसमें एक उपयोगकर्ता लॉग इन कर सकता है और पंजीकरण कर सकता है, एक विवरण, कवर और शीर्षक के साथ एल्बम बना सकता है। निर्मित एप्लिकेशन में हमारे view का प्राथमिक मूल्य है और अब इसे थोड़ा विस्तारित करना आवश्यक है।
इसके अलावा, मौजूदा कोड थोड़ा सुधार के लायक है:

हमारे पास पहले से ही दो नियंत्रक हैं - AlbumController और AlbumController । स्ट्रिंग्स के साथ काम करने के लिए जिम्मेदार एक अतिरिक्त वर्ग का आयात जोड़ें:

  use Illuminate\Support\Str; 

और हमारे डेटाबेस में एक यादृच्छिक छवि नाम उत्पन्न करने के लिए जिम्मेदार लाइन को बदलें:

  $random_name = Str::random(8); 

इसके अलावा, अब यह हमारे एप्लिकेशन की विश्वसनीयता बढ़ाने के लिए माइग्रेशन कोड को थोड़ा बदलने के लायक है, क्योंकि उपयोगकर्ता को हमारे description क्षेत्र को खाली छोड़ने का अधिकार होना चाहिए (अन्यथा डायनामाइट वाला लारवेल हमें एक त्रुटि की सूचना देगा)। आइए छवि तालिका से जुड़े माइग्रेशन में जाएं, और छवि विवरण से संबंधित रेखा को इस एक तक ठीक करें:

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

खैर, आवेदन के "रीफैक्टरिंग" के साथ समाप्त हो गया है। इसके बाद, आपको हमारे एप्लिकेशन का लुक पूरा करना होगा। एक फॉर्म बनाएँ जिसमें उपयोगकर्ता अपने एल्बम बनाने में सक्षम होगा:

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> 

आपको याद दिला दूं कि पृष्ठ के शीर्ष पर includes हमारे पास नेविगेशन और लाइब्रेरी का उपयोग किया गया है, जिन्हें पिछले भाग में वर्णित किया गया था।

इसके अलावा, हमें album.blade.php . album.blade.php के लुक को 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> 

इसके अलावा, हम अपने रूटिंग को अपडेट कर सकते हैं, उदाहरण के लिए, nav.blade.php :

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

एक नए और अधिक फैशनेबल विकल्प के लिए:

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

दूसरी ओर, पिछले संस्करण में 6 लारवेल पर काम किया गया था। तो, हमारे पास पहले से ही एक फॉर्म है जिसमें उपयोगकर्ता एल्बम में फ़ोटो जोड़ सकता है, और हमारे एल्बम view मुख्य view । अगला, हमें एक नियंत्रक जोड़ने की आवश्यकता है जो एक फोटो को संसाधित करने के लिए जिम्मेदार होगा।

इसलिए, हम एक नियंत्रक को व्यक्तिगत फ़ोटो के साथ काम करने के लिए जिम्मेदार बनाते हैं:

  php artisan make:controller ImageController 

तो, हमारे अंदर क्या होना चाहिए:

  <?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')]); } } 



पंजीकरण और प्राधिकरण


फिलहाल, हमारा आवेदन लगभग तैयार है। हालाँकि, हमें अभी भी अपने एप्लिकेशन में पंजीकरण करने, लॉग आउट करने और मौजूदा खाते में लॉग इन करने की क्षमता को कसने की आवश्यकता है।

पिछले भाग में, हम पहले ही दिखा चुके हैं कि हमारा includes/nav.blade.php कैसा दिखता है। क्योंकि हम चाहते हैं कि लॉगिन और बटन तब दिखाई दें जब उपयोगकर्ता ने अभी तक पंजीकृत नहीं किया है, और जब वह हमारे साथ पंजीकृत हो तो लॉग आउट करें बटन।

तो, यह है कि अब हम सूची में includes/nav.blade.php कैसे 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> 

Auth::check का उपयोग करना Auth::check निर्माण और प्राथमिक Auth::check if else , हम अपने view में परिवर्तन का निर्माण कर सकते view , इस पर निर्भर करता है कि हमारा उपयोगकर्ता पंजीकृत है या नहीं।

हालांकि, मॉडल और नियंत्रक बनाने से पहले view परिवर्तन के साथ, हम इंजन से थोड़ा आगे चलते हैं। हमारे प्रमाणीकरण को बनाने के लिए, हम सभी तैयार किए गए और त्वरित समाधानों का उपयोग करेंगे जो लारवेल 6 में हैं।

तो, उपयोगकर्ता मॉडल के बारे में - हम बॉक्स में आने वाले का उपयोग करेंगे। एक ओर, यह स्पष्ट रूप से एक पूर्ण अनुप्रयोग के लिए पर्याप्त नहीं है, दूसरी तरफ - मैं खुद को एक विशिष्ट अनुप्रयोग के दायरे में सीमित नहीं करना चाहता। आप किस तरह की गैलरी चाहते हैं? एक उपयोगकर्ता अपने निजी एल्बम कहां बना सकता है जो किसी के लिए सुलभ नहीं है? या हर कोई अपनी तस्वीरें कहाँ साझा करता है? हमारे आवेदन में हमारी सीमाएँ नहीं होंगी - मुझे लगता है कि पाठक अपने स्वाद और रंग के बिना किसी भी समस्या के उन्हें समाप्त करने में सक्षम होंगे।

इसलिए, Laravel 6 में, प्रमाणीकरण बनाना और भी आसान हो गया है। हम अपने आवेदन की कमांड लाइन पर जाते हैं:

  composer require laravel/ui —dev 

जो हमें आवश्यक पैकेज देता है। अब बनाएं:

  php artisan ui:auth 

यह टीम हमें क्या देती है? सबसे पहले, हमारे पास resources/views में एक नया resources/views फ़ोल्डर है, जिसमें हमारे पास सभी views जो उपयोगकर्ता को अधिकृत करने और उसे पंजीकृत करने के लिए आवश्यक हो सकते हैं: login , register और verifypasswords रीसेट करने और पुनर्प्राप्त करने के लिए समर्पित एक passwords सबफ़ोल्डर भी है। Http/Controllers फ़ोल्डर में, हमारे पास HomeController , जिसे उपयोगकर्ता पंजीकरण के बाद होम पेज पर रीडायरेक्ट करने की आवश्यकता है। हमारे पास एक सबफ़ोल्डर layouts भी होगा, जिसमें app.blade.php होगा, जिसे हम आज पार्स नहीं करेंगे, लेकिन यह स्क्रैच से बने एप्लिकेशन के लिए एक उत्कृष्ट आधार हो सकता है।

जनरेट किए गए ब्लेड टेम्प्लेट में पहले से Bootstrap लिए एक प्रारंभिक लेआउट है। हमारे पास पहले से ही header.blade.php . header.blade.php में जुड़ा हुआ है।
इसके अलावा, हमने routes/web.php में थोड़ा रूटिंग अपडेट किया है। निम्नलिखित पंक्तियों को जोड़ा गया था:

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

home रास्ता अपने आप उत्पन्न हो जाता है, और मैंने खुद को logout करने के लिए रीडायरेक्ट किया।

जनरेट किए गए टेम्प्लेट पर काम करने के लिए आपके लेआउट के लिए, हम अपने nav और header को उनसे कनेक्ट करेंगे:

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

बढ़िया, अब सब कुछ तैयार है। रजिस्टर करने का प्रयास करें। पासवर्ड पुष्टिकरण भी काम करना चाहिए:





भविष्य में, उपयोगकर्ता यह चुन सकता है कि वह उस सेवा के किस पृष्ठ पर जाना चाहता है (या पाठक अपने आप रीडायरेक्ट कर सकता है, यह बहुत मुश्किल नहीं है) हमें बस एक छोटी सी डिटेल तय करनी है: इसे बनाने के लिए ताकि केवल पंजीकृत और अधिकृत उपयोगकर्ता ही हमारे कीमती एल्बम देख सकें।

ऐसा करने के लिए, हम अपनी रूटिंग में एक शर्त जोड़ते हैं ताकि उपयोगकर्ता एल्बमों तक पहुंचने के लिए लॉग इन करें।

हमारे web.php अपडेट करना:

  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');; //   

मूल रूप से, इस स्तर पर हम पहले से ही खत्म कर सकते हैं। मैं इसे पाठक तक छोड़ दूंगा कि वह कौन सा आवेदन करना चाहता है: निजी एल्बमों या सार्वजनिक लोगों के साथ। विशुद्ध रूप से सैद्धांतिक रूप से, एप्लिकेशन का उपयोग पहले से ही किया जा सकता है यदि आपने पंजीकरण की संभावना को देखा और सीधे डेटाबेस में एक उपयोगकर्ता को अलग से बनाया - उदाहरण के लिए, यदि आप और आपके सहयोगी आपके निजी एल्बम को व्यवस्थित करने जा रहे हैं और किसी कारण से अन्य सेवाओं का उपयोग नहीं करना चाहते हैं।

ध्यान देने के लिए आप सभी का धन्यवाद! हमेशा की तरह, उपयोगी लिंक:

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


All Articles