Laravel vodič za početnike
Što je Laravel?
Laravel je web MVC okvir otvorenog koda za PHP. Laravel je robustan okvir koji omogućuje jednostavan razvoj PHP web aplikacija sa značajkama kao što je modularni sustav pakiranja s namjenskim upraviteljem ovisnosti, pristupom relacijskim bazama podataka i drugim uslužnim programima za implementaciju i održavanje aplikacija.
Laravel je stvorio Taylor Otwell. Od svog prvog izdanja u lipnju 2011. (verzija 1), stalno je postajao sve popularniji u sektoru PHP okvira u industriji web razvoja. Velik dio ove popularnosti može se pripisati mnogim značajkama namijenjenim programerima koje dolazi sa zalihama.
Zašto Laravel?
Oko 2000., većina PHP kodovi bio je proceduralan i mogao se pronaći u obliku "skripti" koje bi imale zamršenu zbrku špageti koda. Čak su i najjednostavnije stranice imale br razdvajanje koncerna, pa je stoga bilo prilično lako da aplikacija brzo preraste u noćnu moru održavanja. Svijet je trebao nešto bolje...Uđite u PHP verziju 5 i razne PHP okvire koji pokušavaju donijeti prijeko potrebnu rezoluciju i bolja rješenja za razne probleme s web aplikacijama.
Od tada smo vidjeli mnoge izdane okvire koji bi utrli put popularnim okvirima koji postoje i danas se koriste. Danas bi prva tri (po našem mišljenju) bili Zend Framework, Symfony i naravno Laravel. Iako je svaki od ovih okvira utemeljen na sličnim načelima i usmjeren je na rješavanje (u osnovi) istih zajedničkih problema, njihove ključne razlike leže u njihovoj implementaciji. Svatko od njih ima svoje mane oko rješavanja problema. Kada pogledate kôd koji proizvodi svaki od njih, vidjet ćete da postoji prilično čvrsta linija koja ih dijeli jedne od drugih. Po našem skromnom mišljenju, Laravel framework je najbolji.
Saznajte više o Razlika između Laravela i CodeIgnitera
Kako preuzeti i instalirati Laravel s Composerom
BILJEŠKA Pretpostavlja se da već imate kopiju PHP-a instaliranu na vašem lokalnom sustavu. Ako nije, možete pročitati kako ga instalirati ovdje
Composer je i upravitelj paketa i ovisnosti. Da biste ga instalirali, otvorite terminal i CD u novi direktorij. Pokrenite ovu naredbu:
curl -Ss getcomposer.org/installer | php
Rezultati ove naredbe će izgledati ovako:
bilješke Opširnije upute o postavljanju Laravela potražite u Laravel dokumentaciji ovdje.
Vidjet ćete kako preuzima i kompajlira skriptu composer.phar, koju koristimo za instaliranje Laravela. Iako postoje brojni načini za postavljanje nove Laravel aplikacije, mi ćemo to učiniti putem skripte Laravel composer. Da biste instalirali ovu skriptu, pokrenite:
composer global require laravel/installer
Što će izgledati otprilike ovako:
Ovo će preuzeti i instalirati sve same datoteke okvira, kao i sve ovisnosti koje zahtijeva. Paketi će biti spremljeni unutar imenika dobavljača. Nakon što se preuzme i instalira, jednostavno je poput izdavanja sljedeće naredbe:
laravel new uploadApp
Vidjet ćete nešto poput sljedećeg izlaza:
Composer instalira sve pakete koje Laravel treba za rad. Može potrajati nekoliko minuta pa budite strpljivi. Nakon što završi, pokrenite naredbu ls -al da pogledate što je instalirano.
Ovdje je kratka analiza direktorija u uobičajenoj Laravel aplikaciji:
- aplikacija/ : Ovo je izvorna mapa u kojoj živi kod naše aplikacije. Svi kontroleri, pravila i modeli nalaze se unutar ove mape
- bootstrap/ : Sadrži skriptu za pokretanje aplikacije i nekoliko datoteka karte razreda
- konfiguracija/: Sadrži konfiguracijske datoteke aplikacije. Oni se obično ne mijenjaju izravno, već se umjesto toga oslanjaju na vrijednosti postavljene u datoteci .env (okruženje) u korijenu aplikacije
- baza podataka/ : Sadrži datoteke baze podataka uključujući migracije, sjeme i test tvornice
- javno/ : Javno dostupna mapa koja sadrži kompajlirana sredstva i naravno datoteku index.php
- resursi/ : Sadrži front-end sredstva kao što su javascript datoteke, jezične datoteke, CSS/SASS datoteke i svi predlošci koji se koriste u aplikaciji (zvani blade predlošci)
- rute/ : Sve rute u aplikaciji nalaze se ovdje. Postoji nekoliko različitih "opsega" ruta, ali onaj na koji ćemo se usredotočiti je datoteka web.php
- pohrana/ : Sve privremene datoteke predmemorije koje koristi aplikacija, datoteke sesije, kompajlirane skripte prikaza i datoteke dnevnika
- testovi/ : Sadrži testne datoteke za aplikaciju kao što su jedinični testovi i funkcionalni testovi.
- dobavljač/ : Svi paketi ovisnosti instalirani su sa skladateljem
Sada, napravimo ostatak aplikacije i pokrenimo je s posebnom artisan naredbom (kako bismo se uštedjeli gnjavaže oko instaliranja i konfiguriranja web poslužitelja poput Apachea ili nginxa). Datoteka .env sadrži sve konfiguracijske vrijednosti koje datoteke u direktoriju /config koriste za konfiguraciju aplikacije. Unutar njega primijetit ćete da je konfiguracijska vrijednost za razne parametre korištena od strane unutarnjeg dijela aplikacije.
Dizajn aplikacije: Kratak pregled naših zahtjeva
U ovom online vodiču za Laravel gradit ćemo vrlo jednostavnu aplikaciju koja će raditi samo dvije stvari:
- rukovanje učitavanjem datoteka s web obrasca
- prikazivanje prethodno učitanih datoteka na drugoj stranici.
Za ovaj projekt, naša će aplikacija biti samo za pisanje, što znači da korisnik može samo pisati datoteke i pregledavati popis datoteka koje je učitao. Ova je aplikacija iznimno osnovna, ali bi vam trebala poslužiti kao dobra praksa da na njoj počnete graditi svoje vještine i znanje o Laravelu. Imajte na umu da sam radi sažetosti isključio bilo kakvo modeliranje baze podataka, migracije i provjeru autentičnosti, ali u aplikaciji u stvarnom svijetu ovo su dodatne stvari koje biste trebali razmotriti.
Ovdje je popis komponenti koje će nam trebati kako bi aplikacija radila kako se očekuje:
- A put koji će omogućiti vanjskom svijetu (internetu) korištenje aplikacije kao i odrediti krajnju točku koja će upućivati na to gdje se nalazi logika za spremanje učitane datoteke
- A kontrolor koji obrađuje tok zahtjeva za odgovor
- A Predložak koji će se koristiti za prikaz popisa prethodno učitanih datoteka i samog obrasca za učitavanje
- A zatražiti koje će voditelj obrade koristiti za provjeru valjanosti podataka proslijeđenih s web obrasca
Što je ruta?
Ruta u Laravelu je u osnovi krajnja točka određena URI-jem koja djeluje kao "pokazivač" na neki dio funkcionalnosti koju nudi aplikacija. Najčešće ruta jednostavno ukazuje na metodu na kontroleru i također diktira koje HTTP metode mogu pogoditi taj URI. Ruta ne znači uvijek ni metodu kontrolera; mogao bi samo proslijediti izvršenje aplikacije definiranoj Closure ili anonimnoj funkciji.
Zašto koristiti Route?
Rute su pohranjene unutar datoteka u mapi /routes unutar korijenskog direktorija projekta. Prema zadanim postavkama, postoji nekoliko različitih datoteka koje odgovaraju različitim "stranama" aplikacije ("strane" dolaze iz metodologije heksagonalne arhitekture). Oni uključuju:
- web.php Putevi koji su okrenuti javnosti temeljeni na "pregledniku". To su najčešći i ono što web-preglednik pogađa. Prolaze kroz web međuprogramsku grupu i također sadrže sadržaje za csrf zaštita (što pomaže u obrani od zlonamjernih napada i hakiranja temeljenih na obrascima) i općenito sadrže određeni stupanj "stanja" (pod ovim mislim da koriste sesije)
- api.php Rute koje odgovaraju grupi API-ja i stoga imaju API međuprogram uključen prema zadanim postavkama. Ove rute su bez statusa i nemaju sesije ili memoriju za unakrsne zahtjeve (jedan zahtjev ne dijeli podatke ili memoriju s bilo kojim drugim zahtjevom – svaki je samoinkapsuliran).
- console.php Ove rute odgovaraju prilagođenim umjetničkim naredbama koje ste izradili za svoju aplikaciju
- channels.php Registrira rute za emitiranje događaja
Ključna datoteka o kojoj se u ovom trenutku treba brinuti je ona specifična za preglednik, web.php. Već postoji jedna ruta definirana prema zadanim postavkama, a to je ona koju pritisnete prilikom navigacije do web korijena vaše aplikacije (web korijen je u javnom direktoriju). Trebat će nam tri različite rute da bi naša aplikacija za prijenos funkcionirala:
- /upload Ovo će biti URI glavne stranice koja prikazuje naš web obrazac za učitavanje datoteka.
- /process Ovo će biti mjesto gdje obrazac koji se nalazi na /upload URI objavljuje svoje podatke poslane putem obrasca (“akcija” obrasca)
- /list Ovo će izlistati sve datoteke učitane na stranicu
bilješke Krajnja točka /list možda neće biti potrebna ako želimo staviti svu logiku za prikaz obrasca za učitavanje i popisa datoteka na jednoj stranici, međutim, zasad smo ih držali odvojene kako bismo dodali malo više sadržaja temi koja je pri ruci .
//inside routes/web.php Route::get('/upload', 'UploadController@upload')->name('upload'); Route::get('/download, 'UploadController@download)->name(‘download'); Route::post('/process', 'UploadController@process')->name('process'); Route::get('/list', 'UploadController@list')->name('list');
U ovom vodiču za Laravel framework, za svaku željenu rutu, eksplicitno ćemo je navesti u datoteci ruta web.php koristeći jednu od dostupnih metoda zahtjeva specifičnih za HTTP (get(), post(), put() , delete(), patch() ili options() ). Za raščlambu svakog od njih provjerite to van. Ono što ove metode rade je specificiranje kojim je HTTP glagolima dopušten pristup toj datoj ruti. Ako vam je potrebna ruta da biste mogli prihvatiti više od jednog HTTP glagola (što bi mogao biti slučaj ako koristite jednu stranicu za prikaz početnih podataka i podataka obrasca za objavu), možete koristiti Route::any( ) metoda.
Drugi argument za metodu Route::get() i Route::post() (i bilo koju drugu metodu povezanu s HTTP glagolom na fasadi Route), naziv je određenog kontrolera i metode smještene unutar toga kontroler koji se izvršava nakon što dopušteni HTTP zahtjev (GET, POST, PATCH, itd.) pogodi krajnju točku rute. Koristimo UploadController za sve tri rute i odredili smo ih na sljedeći način:
Posljednja metoda koju pozivamo na svakoj ruti je njezina funkcija name(), koja prihvaća jedan niz kao argument i koristi se za više-manje "označavanje" određene rute imenom koje je lako zapamtiti (u našim slučajevima, učitavanje, obrada i popis). Shvaćam da se ne čini tako dobrom značajkom dati svakoj ruti vlastito ime kada je URL nazvan potpuno isto, ali stvarno je zgodno kada imate određenu rutu kao što je /users/profile/dashboard/config, što bi bilo lakše zapamtiti kao profile-admin ili user-config.
Napomena o fasadama:
- Fasade pružaju “statično” sučelje klasama koje su dostupne u servisnom spremniku aplikacije.”
- Oni pružaju sažetu, pamtljivu sintaksu koja vam omogućuje korištenje Laravelovih značajki bez pamćenja dugih naziva klasa koje morate ručno umetnuti ili konfigurirati.
Gornje definicije rute u ovom vodiču za okvir Laravel, koristimo fasadu rute umjesto da ručno instanciramo novi objekt Illuminate/Routing/Router i pozivamo odgovarajuće metode na tom objektu. To je samo prečac koji štedi tipkanje. Fasade se uvelike koriste u Laravel okviru – možete i trebate se bolje upoznati s njima. Dokumentaciju za Fasade možete pronaći ovdje.
Što je kontrolor?
Kontroler je "C" u "MVC" (Model-View-Controller) arhitekturi, na čemu se temelji Laravel. Posao kontrolora može se svesti na ovu jednostavnu definiciju: Prima zahtjev od klijenta i vraća odgovor klijentu. Ovo je osnovna definicija i minimalni zahtjevi bilo kojeg kontrolera. Ono što radi između te dvije stvari općenito se smatra "radnjom" kontrolora (ili "implementacijom rute"). Djeluje kao druga ulazna točka u aplikaciju (prva je zahtjev) za klijenta, koji šalje korisni teret zahtjeva (do kojeg ćemo doći sljedeći) aplikaciji, očekujući neku vrstu odgovora (u obliku stranica uspjeha, preusmjeravanje, stranica pogreške ili bilo koja druga vrsta HTTP odgovora).
Kontroler radi (u osnovi) isto što i definicija rute s anonimnom funkcijom postavljenom kao "akcija" kada se ta ruta pogodi. Razlika je u tome što se kontroler dobro drži odvajanja problema dok je ruta definirana unutar stvarne definicije url-a, što u osnovi znači da povezujemo dodijeljeni URI rute s implementacijom rute ili kodom koji se izvršava kada je ta ruta pogoditi.
Na primjer, sljedeća dva dijela koda postići će istu stvar:
Primjer #1: Definicija i implementacija rute unutar jednog poziva metode (u web.php datoteci ruta)
//inside routes/web.php <?php Route::get('/hello-world', function(Request $request) { $name = $request->name; return response()->make("<h1>Hello World! This is ".$name, 200); });
Primjer #2: definicija rute nalazi se unutar routes/web.php, ali njezina implementacija nalazi se unutar klase /app/Http/Controllers/HelloWorldController
//inside routes/web.php <?php Route::get('/hello-world', 'HelloWorldController@index')->name('hello-world'); ------------------------------------------------------------------------------------ //inside app/Http/Controllers/HelloWorldController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloWorldController extends Controller { public function index(Request $request) { $name = $request->name; return response()->make("<h1>Hello World! This is ".$name, 200); } }
Iako se Laravelov primjer #2 čini kao puno više posla (što nije – samo malo više koda je sve), pogledajte prednosti koje dobivamo stavljanjem naše akcijske logike za zadanu rutu "hello-world" unutar kontrolera umjesto s definicijom rute kao funkcije povratnog poziva:
- Naša logika je jasno odvojena u vlastitu klasu (razdvajanje briga)
- Naš kontroler je postavljen za proširenje kasnije ako mu budemo trebali dodati dodatne mogućnosti... Recimo da smo možda htjeli dodati značajku "zbogom svijete"... U ovom slučaju preimenovali bismo kontroler u općenitiji "HelloController", a zatim definirali dvije odvojene metode, zdravo() i Doviđenja(). Također bismo trebali definirati dvije odvojene rute koje su mapirale /zdravo i / Doviđenja URI-je njihovoj odgovarajućoj metodi na kontroleru. To je poželjno u usporedbi s povećavanjem datoteke ruta s implementacijom svake rute definiranom kao funkcije povratnog poziva.
- Laravel ima ugrađenu mogućnost predmemoriranja svih definicija ruta u aplikaciji tako da ubrzava vrijeme potrebno za pronalaženje dane rute (povećava performanse aplikacije); međutim, to ćete moći iskoristiti samo ako su sve vaše definirane rute unutar aplikacije konfigurirane pomoću preslikavanja specifičnih za kontroler (pogledajte primjer #2 gore)
Pokrenimo ovu naredbu koja će za nas generirati novi kontroler.
// ...inside the project's root directory: php artisan make:controller UploadController
U suštini, ono što ova naredba radi je generiranje stubića za kontroler pod nazivom "UploadController" unutar glavnog direktorija kontrolera na /app/Http/Controllers/UploadController.php. Slobodno otvorite tu datoteku i pogledajte. Vrlo je jednostavno jer je to samo izbačena verzija kontrolera, s ispravnom stazom prostora imena i potrebnim klasama iz kojih se proširuje.
Generiranje zahtjeva
Prije nego što nastavimo s ovim PHP Laravel vodičem i napravimo nekoliko promjena u generiranom stubu UploadControllera, mislim da bi imalo više smisla prvo stvoriti klasu zahtjeva. To je zato što metoda kontrolora koja rukuje zahtjevom mora upisati nagovještaj objekta zahtjeva u svoj potpis, dopuštajući mu da automatski provjeri valjanost dolaznih podataka obrasca (kao što je navedeno u metodi rules(). Više o tome kasnije…) Za sada, koristimo ponovno naredbu artisan za generiranje našeg dopunskog zahtjeva:
php artisan make:request UploadFileRequest
Ova naredba će generirati datoteku pod nazivom UploadFileRequest unutar app/Http/Requests/UploadFileRequest. Otvorite dopunu i zavirite... Vidjet ćete da je vrlo jednostavan, sadrži samo dvije metode, authorize() i rules.
Stvaranje logike provjere valjanosti
Modificirajmo dopunu zahtjeva kako bi zadovoljio potrebe naše aplikacije. Izmijenite datoteku tako da izgleda ovako:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UploadFileRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'fileName' => 'required|string', 'userFile' => 'required|file' ]; } }
Nema puno promjena, ali primijetite da metoda authorize() sada vraća true umjesto false. Ova metoda odlučuje hoće li se dopustiti zahtjevu da uđe u aplikaciju. Ako je postavljeno na false, zaustavlja zahtjev da uđe u sustav (što bi inače bila metoda na kontroleru). Ovo bi bilo vrlo zgodno mjesto za postavljanje bilo kakvih autorizacijskih provjera korisnika ili bilo koje druge logike koja može odlučiti može li se zahtjev proslijediti kontroloru. Za sada ovdje samo vraćamo true kako bismo dopustili svemu i svačemu korištenje zahtjeva.
Druga metoda, rules() je mjesto gdje sva magija dolazi u igru s obzirom na provjeru valjanosti. Ideja je jednostavna: vrati niz koji sadrži skup pravila u obliku:
'formFieldName' => 'constraints this field has separated by pipe characters (|)'
Postoji mnogo različitih ograničenja provjere valjanosti koje Laravel podržava odmah po vađenju iz kutije. Potpuni popis potražite u mrežnoj dokumentaciji ovdje. Za našu aplikaciju za prijenos, postojat će dva polja koja se prosljeđuju putem POST zahtjeva iz obrasca na prednjem kraju. Parametar fileName mora biti uključen unutar tijela obrasca (tj. obavezan) i koristi se kao naziv datoteke pod kojim ćemo pohraniti datoteku u pohranu (ovo se radi u kontroleru – do njega ćemo doći malo kasnije). Također navodimo da naziv datoteke mora biti niz dodavanjem crte (|) i riječi 'string'. Ograničenja su uvijek razgraničena crtom, što vam omogućuje da navedete dodatne kriterije za dano polje u jednom retku! Kakva moć!
Drugi parametar, userFile , je stvarna datoteka koju korisnik učitava iz obrasca na web stranici. UserFile je također potreban i morate biti datoteka. Bilješka: Ako smo očekivali da će učitana datoteka biti slika, tada bismo umjesto toga upotrijebili ograničenje slike, što bi ograničilo prihvaćene vrste datoteka kao jednu od popularnih vrsta slika (jpeg, png, bmp, gif ili svg). Budući da korisniku želimo omogućiti učitavanje bilo koje vrste datoteke, držat ćemo se samo ograničenja provjere valjanosti datoteke.
To je otprilike sve što se tiče objekta zahtjeva. Njegov glavni posao je jednostavno držati prihvatljiv skup kriterija (ograničenja) koje parametri tijela obrasca moraju zadovoljiti kako bi se nastavilo dublje u aplikaciju. Još jedna stvar koju treba napomenuti je da ova dva polja (userFile i filename) također moraju biti specificirana unutar HTML koda u obliku polja za unos (pri čemu naziv polja odgovara nazivu unutar objekta zahtjeva).
Možda se pitate: svakako da ovo definira karakteristike onoga što zahtjev za obrazac treba sadržavati, ali gdje se vrši stvarna provjera ovih ograničenja? Ući ćemo u to sljedeće.
Modificiranje kontrolera
Otvorite aplikaciju/Http/Controllers/UploadController i napravite sljedeće promjene u njoj:
<?php namespace App\Http\Controllers; use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Http\Request; use App\Http\Requests\UploadFileRequest; //our new request class use Illuminate\Support\Facades\Storage; class UploadController extends Controller { /** * This is the method that will simply list all the files uploaded by name and provide a * link to each one so they may be downloaded * * @param $request : A standard form request object * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws BindingResolutionException */ public function list(Request $request) { $uploads = Storage::allFiles('uploads'); return view('list', ['files' => $uploads]); } /** * @param $file * @return \Symfony\Component\HttpFoundation\BinaryFileResponse * @throws BindingResolutionException */ public function download($file) { return response()->download(storage_path('app/'.$file)); } /** * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws BindingResolutionException */ public function upload() { return view('upload'); } /** * This method will handle the file uploads. Notice that the parameter's typehint * is the exact request class we generated in the last step. There is a reason for this! * * @param $request : The special form request for our upload application * @return array|\Illuminate\Http\UploadedFile|\Illuminate\Http\UploadedFile[]|null * @throws BindingResolutionException */ public function store(UploadFileRequest $request) { //At this point, the parameters passed into the $request (from form) are //valid--they satisfy each of the conditions inside the rules() method $filename = $request->fileName; //parameters have already been validated $file = $request->file('userFile'); //that we don't need any additional isset() $extension = $file->getClientOriginalExtension(); //grab the file extension $saveAs = $filename . "." . $extension; //filename to save file under $file->storeAs('uploads', $saveAs, 'local'); //save the file to local folder return response()->json(['success' => true]); //return a success message } }
Dakle, to je prilično jednostavan pristup spremanju prenesenih datoteka na disk. Ovdje je pregled gornje metode upload():
- Upišite-hint za klasu zahtjeva u metodi kontrolera koja radi funkciju "meso i krumpir" kako bismo mogli automatski potvrditi dolazne podatke
- Zgrabite datoteku iz (sada potvrđenog) objekta zahtjeva unutar metode kontrolera (u ovom slučaju nazvali smo je upload(), ali je mogla biti imenovana i standardiziranijim imenom kao što je store()).
- Izvucite naziv datoteke iz zahtjeva
- Generirajte konačni naziv datoteke koji će se koristiti za spremanje datoteke pod. Metoda getClientOriginalExtension() jednostavno hvata originalni nastavak učitane datoteke.
- Pohranite datoteku u lokalni datotečni sustav koristeći njegovu storeAs() metodu, prosljeđujući imenovani put unutar direktorija /storage kao prvi argument i naziv datoteke pod koji će se spremiti kao drugi.
- Vrati JSON odgovor koji pokazuje da je zahtjev bio uspješan
Predložak oštrice
Posljednji veliki dio ove slagalice je predložak oštrice, koji će sadržavati sav HTML, CSS i javascript za našu jednostavnu aplikaciju. Evo koda – objasnit ćemo ga kasnije.
<body> <h1>Upload a file</h1> <form id="uploadForm" name="uploadForm" action="{{route('upload')}}" enctype="multipart/form-data"> @csrf <label for="fileName">File Name:</label> <input type="text" name="fileName" id="fileName" required /><br /> <label for="userFile">Select a File</label> <input type="file" name="userFile" id="userFile" required /> <button type="submit" name="submit">Submit</button> </form> <h2 id="success" style="color:green;display:none">Successfully uploaded file</h2> <h2 id="error" style="color:red;display:none">Error Submitting File</h2> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> $('#uploadForm').on('submit', function(e) { e.preventDefault(); var form = $(this); var url = form.attr('action'); $.ajax({ url: url, type: "POST", data: new FormData(this), processData: false, contentType: false, dataType: "JSON", success: function(data) { $("#fileName").val(""); $("#userFile").val(""); } }).done(function() { $('#success').css('display', 'block'); window.setTimeout(()=>($("#success").css('display', 'none')), 5000); }).fail(function() { $('#error').css('display', 'block'); window.setTimeout(()=>($("#error").css('display', 'none')), 5000); }); }); </script> </body> </html>
Evo što je naše / Učitaj stranica izgleda ovako:
Ovo je vrlo tipičan primjer blade datoteke koja sadrži HTML obrazac i javascript/jQuery za dodavanje asinkrone funkcije (tako da se stranica ne osvježava). Postoji osnovna oznaku bez atributa metode (što ću objasniti za sekundu) i s atributom neobične radnje s vrijednošću {{route('file.upload')}}. U oštrici, to je ono što je poznato kao a Direktiva. Direktiva je samo fensi naziv za funkciju – to su funkcije specifične za blade predloške koje izvode različite operacije koje su uobičajene za izradu web stranica i web aplikacija. Za bolje razumijevanje svih cool sranja koje blade može napraviti, pogledajte dokumente ovdje. U gornjem slučaju koristimo direktivu rute za generiranje URL-a za slanje obrasca.
Imajte na umu da smo naše rute definirali ranije u aplikaciji unutar datoteke web.php, navodeći naziv koji se lako pamti za svaku od njih. Direktiva {{route()}} prihvaća naziv rute, traži je unutar interno predmemorirane liste ruta i generira puni URL na temelju definicije te rute u datoteci web.php. Za ovaj prvi slučaj specificiramo da želimo da obrazac šalje svoje poslane podatke na /process URL naše aplikacije, koji je definiran kao POST ruta.
Sljedeća čudna stvar koju ste možda primijetili je oznaka @csrf odmah ispod oznake uvodnog obrasca. U oštrici, ova oznaka generira parametar _token na obrascu, koji se provjerava unutar aplikacije prije nego što se dopusti obrada podataka obrasca. Time se osigurava da su podaci unutar obrasca valjanog podrijetla i sprječavaju se napadi krivotvorenja zahtjeva na različitim mjestima. Za više informacija o tome pogledajte docs.
Nakon ovoga definiramo naš obrazac kao normalan, međutim, imajte na umu da su imena naših parametara obrasca, userFile i fileName potpuno isto kako je definirano unutar našeg objekta zahtjeva. Ako smo zaboravili uključiti unos za dani parametar koji je definiran u objektu zahtjeva (ili ga pogrešno napisali), zahtjev ne bi uspio i vratila bi se pogreška, sprječavajući izvorni zahtjev obrasca da ikada pogodi metodu kontrolera koja se nalazi na UploadController@ postupak .
Isprobajte ga i pošaljite nekoliko datoteka aplikaciji pomoću ovog obrasca. Nakon toga idite na /popis da biste vidjeli sadržaj mape za učitavanje, s datotekama koje ste učitali navedenima u tablici:
Veću sliku
Vratimo se korak unatrag i pogledajmo što smo učinili u ovom vodiču za Laravel.
Ovaj dijagram prikazuje aplikaciju kakva trenutno stoji (isključeni detalji visoke razine):
Trebali biste se prisjetiti da bi objekt zahtjeva koji smo konstruirali na početku ovog vodiča za Laravel trebao imati iste parametre definirane u svojoj metodi pravila kao što je na obrascu u predlošku oštrice (ako niste, ponovno pročitajte odjeljak "Stvaranje logike provjere valjanosti") . Korisnik unosi obrazac na web-stranicu koja se prikazuje putem blade predloška (ovaj proces je naravno na auto-pilotu tako da ne moramo ni razmišljati o tome) i šalje obrazac. jQuery kod predloška na dnu zaustavlja zadanu predaju (koja bi automatski preusmjeravala na zasebnu stranicu), stvara ajax zahtjev, učitava zahtjev s podacima obrasca i prenesenu datoteku, te šalje cijelu stvar u prvi sloj našeg primjena: zahtjev.
Objekt zahtjeva popunjava se pridruživanjem parametara unutar metode rules() s poslanim parametrima obrasca, a zatim provjerava valjanost podataka prema svakom navedenom pravilu. Ako su sva pravila zadovoljena, zahtjev se prosljeđuje bilo kojoj metodi kontrolera koja odgovara vrijednostima definiranim u datoteci rute web.php. U ovom slučaju, metoda process() UploadControllera je ta koja radi. Nakon što pritisnemo kontroler, već znamo da je zahtjev prošao provjeru valjanosti, tako da ne moramo ponovno testirati je li navedeni naziv datoteke zapravo niz ili parametar userFile zapravo sadrži neku vrstu datoteke... Možemo nastaviti kao normalan.
Metoda kontrolera zatim grabi potvrđene parametre iz objekta zahtjeva, generira puni naziv datoteke ulančavanjem proslijeđenog parametra FileName s originalnom ekstenzijom userFile, pohranjuje datoteku unutar direktorija u našoj aplikaciji, zatim vraća jednostavan JSON kodiran odgovor koji potvrđuje da je zahtjev bio uspješan. Odgovor prima jQuery logika, koja obavlja još nekoliko zadataka povezanih s korisničkim sučeljem, kao što je prikazivanje poruke o uspjehu (ili pogrešci) na 5 sekundi, a zatim njezino skrivanje, kao i brisanje prethodnih unosa obrasca...to je tako da korisnik zna sigurni da je zahtjev bio uspješan i mogu učitati drugu datoteku, ako žele.
Također, obratite pažnju na gornji dijagram gdje je povučena linija između klijenta i poslužitelja. Ovaj koncept je od apsolutno ključne važnosti za razumijevanje i pomoći će vam u rješavanju problema i problema koje biste mogli imati u budućnosti kada žonglirate, na primjer, više asinkronih zahtjeva koji se mogu pojaviti u bilo kojem trenutku. Razdvajanje je točno na granici objekta zahtjeva. Sam objekt zahtjeva može se smatrati "pristupnikom" do ostatka aplikacije... On vrši početnu provjeru valjanosti i registraciju vrijednosti obrazaca proslijeđenih iz web preglednika. Ako se smatraju važećima, nastavlja se do kontrolora. Sve prije toga je na front endu ("klijent" doslovno znači "na korisnikovom računalu"). Odgovor se iz aplikacije vraća natrag na stranu klijenta, gdje naš jQuery kod strpljivo čeka njegov dolazak i obavlja nekoliko jednostavnih zadataka korisničkog sučelja nakon što ga primi.
Pokrili smo gotovo 90+ važnih često postavljanih pitanja Pitanja za intervju vezana uz Laravel i PHP za brucoše kao i iskusne kandidate kako bi dobili pravi posao.