Laravel tutorial for begyndere
Hvad er Laravel?
Laravel er en open source web-MVC-ramme til PHP. Laravel er en robust ramme, der giver nem udvikling af PHP-webapplikationer med funktioner som et modulรฆrt pakkesystem med en dedikeret afhรฆngighedsmanager, adgang til relationelle databaser og andre hjรฆlpeprogrammer til applikationsimplementering og vedligeholdelse.
Laravel blev skabt af Taylor Otwell. Siden den fรธrste udgivelse i juni 2011 (version 1) er den stรธt vokset mere og mere populรฆr i PHP-framework-sektoren i webudviklingsindustrien. Meget af denne popularitet kan tilskrives de mange udvikler-fรธrstsindede funktioner, som den kommer med pรฅ lager.
Hvorfor Laravel?
Cirka 2000, de fleste PHP koder var proceduremรฆssigt og kunne findes i form af "scripts", der ville have et sammenfiltret rod af spaghettikode. Selv de simpleste sider havde nej adskillelse af bekymringer, og dermed var det ret nemt for en applikation hurtigt at vokse til et vedligeholdelsesmareridt. Verden havde brug for noget bedre ... Indtast PHP version 5 og en rรฆkke PHP-frameworks, der forsรธger at bringe nogle tiltrรฆngte lรธsninger og bedre lรธsninger pรฅ forskellige webapplikationsproblemer.
Siden da har vi set mange frameworks frigivet, som ville bane vejen for de populรฆre rammer, der eksisterer og anvendes i dag. I dag ville top tre (efter vores mening) vรฆre Zend Framework, Symfony og selvfรธlgelig Laravel. Selvom hver af disse rammer er baseret pรฅ lignende principper og er rettet mod at lรธse (dybest set) de samme fรฆlles problemer, ligger deres vigtigste forskelle i deres implementeringer. De har hver deres sรฆrheder om, hvordan man lรธser problemer. Nรฅr du ser pรฅ koden produceret af hver af dem, vil du se, at der er en ret ubrudt linje, der adskiller dem fra hinanden. Efter vores ydmyge mening er Laravel framework det bedste.
Lรฆr mere om Forskellen mellem Laravel og CodeIgniter
Sรฅdan downloades og installeres Laravel med Composer
BEMรRK Det antages, at du allerede har en kopi af PHP installeret pรฅ dit lokale system. Hvis ikke, kan du lรฆse, hvordan du installerer det link.
Composer er bรฅde en pakke- og afhรฆngighedsmanager. For at installere det skal du รฅbne en terminal og cd ind i en ny mappe. Kรธr denne kommando:
curl -Ss getcomposer.org/installer | php
Resultaterne af denne kommando vil se sรฅledes ud:
Bemรฆrk For mere omfattende instruktioner om opsรฆtning af Laravel henvises til Laravel-dokumentationen link..
Du vil se det downloade og kompilere composer.phar-scriptet, som er det, vi bruger til at installere Laravel. Selvom der er mange mรฅder at konfigurere en ny Laravel-applikation pรฅ, vil vi gรธre det via Laravel-komponist-scriptet. For at installere dette script skal du kรธre:
composer global require laravel/installer
Som kommer til at se sรฅdan ud:
Dette vil downloade og installere alle rammefilerne selv sรฅvel som alle afhรฆngigheder, som det krรฆver. Pakkerne vil blive gemt i leverandรธrbiblioteket. Nรฅr det fรธrst er downloadet og installeret, er det lige sรฅ nemt som at udstede fรธlgende kommando:
laravel new uploadApp
Du vil se noget i stil med fรธlgende output:
Composer installerer alle de pakker, som Laravel skal bruge for at kรธre. Det kan tage et par minutter, sรฅ hav tรฅlmodighed. Nรฅr det er fรฆrdigt, skal du kรธre en ls -al kommando for at se pรฅ, hvad der blev installeret.
Her er en kort oversigt over mapperne i en almindelig Laravel-applikation:
- app/: Dette er kildemappen, hvor vores applikationskode findes. Alle controllere, politikker og modeller er inde i denne mappe
- bootstrap/ : Indeholder applikationens opstartsscript og et par klassekortfiler
- config/: Indeholder appens konfigurationsfiler. Disse รฆndres normalt ikke direkte, men stoler i stedet pรฅ de vรฆrdier, der er indstillet i .env-filen (miljรธ) i roden af โโappen
- database/: Indeholder databasefilerne inklusive migrationer, frรธ og testfabrikker
- offentlig/: Offentligt tilgรฆngelig mappe med kompilerede aktiver og selvfรธlgelig en index.php-fil
- ressourcer/: Indeholder frontend-aktiver sรฅsom javascript-filer, sprogfiler, CSS/SASS-filer og alle skabeloner, der bruges i applikationen (kaldet bladeskabeloner)
- ruter/: Alle ruter i applikationen er inde her. Der er et par forskellige "omfang" af ruter, men den vi vil fokusere pรฅ er web.php-filen
- opbevaring/: Alle midlertidige cachefiler, der bruges af applikationen, sessionsfiler, kompilerede visningsscripts og logfiler
- test/: Indeholder testfiler til applikationen sรฅsom enhedstests og funktionelle tests.
- sรฆlger/: Alle afhรฆngighedspakker installeret med composer
Lad os nu bygge resten af โโappen og kรธre den med en speciel hรฅndvรฆrkerkommando (for at spare os selv for besvรฆret med at installere og konfigurere en webserver som Apache eller nginx). .env-filen indeholder alle de konfigurationsvรฆrdier, som filerne i /config-mappen bruger til at konfigurere programmet. Inde i det vil du bemรฆrke, at konfigurationsvรฆrdien for forskellige parametre, der bruges af applikationens interne.
Applikationsdesign: En hurtig gennemgang af vores krav
I denne online Laravel-tutorial vil vi bygge en meget enkel applikation, der kun gรธr to ting:
- hรฅndtere filuploads fra en webformular
- visning af de tidligere uploadede filer pรฅ en anden side.
Til dette projekt vil vores applikation vรฆre skrivebeskyttet, hvilket betyder, at brugeren kun kan skrive filer og se listen over filer, som de har uploadet. Denne applikation er ekstremt grundlรฆggende, men bรธr tjene som god praksis for dig at begynde at bygge dine Laravel fรฆrdigheder og viden pรฅ. Bemรฆrk, at jeg for korthedens skyld har udelukket enhver databasemodellering, migreringer og autentificering, men i en applikation i den virkelige verden er disse yderligere ting, du vil overveje.
Her er en liste over komponenter, som vi skal bruge for at fรฅ applikationen til at fungere som forventet:
- A rute som vil tillade omverdenen (internettet) at bruge applikationen samt specificere det endepunkt, der vil pege pรฅ, hvor logikken for at gemme den uploadede fil er placeret
- A controller der hรฅndterer anmodningen om at svare flow
- A skabelon som vil blive brugt til at vise en liste over tidligere uploadede filer og selve uploadformularen
- A anmode som den dataansvarlige vil bruge til at validere de data, der er videregivet fra webformularen
Hvad er en rute?
En rute i Laravel er dybest set et slutpunkt specificeret af en URI, der fungerer som en "pegepind" til en eller anden funktionalitet, som applikationen tilbyder. Oftest peger en rute blot pรฅ en metode pรฅ en controller og dikterer ogsรฅ, hvilke HTTP-metoder der er i stand til at ramme den URI. En rute betyder heller ikke altid controller-metode; det kunne bare videregive eksekveringen af โโapplikationen til en defineret lukning eller anonym funktion.
Hvorfor bruge rute?
Ruter gemmes i filer under mappen /routes inde i projektets rodmappe. Som standard er der et par forskellige filer, der svarer til de forskellige "sider" af applikationen ("sider" kommer fra den sekskantede arkitekturmetodologi). De omfatter:
- web.php De offentlige vendte "browser"-baserede ruter. Disse er de mest almindelige og er det, der bliver ramt af webbrowseren. De kรธrer gennem web-middleware-gruppen og indeholder ogsรฅ faciliteter til csrf beskyttelse (som hjรฆlper med at forsvare sig mod formbaserede ondsindede angreb og hacks) og generelt indeholder en grad af "tilstand" (med dette mener jeg, at de bruger sessioner)
- api.php Ruter, der svarer til en API-gruppe og dermed har API-middlewaren aktiveret som standard. Disse ruter er statslรธse og har ingen sessioner eller krydsanmodningshukommelse (รฉn anmodning deler ikke data eller hukommelse med nogen anden anmodning - hver enkelt er selvindkapslet).
- console.php Disse ruter svarer til brugerdefinerede hรฅndvรฆrkerkommandoer, som du har oprettet til din app
- channels.php Registrerer ruter til begivenhedsudsendelse
Nรธglefilen, der skal bekymre sig om pรฅ nuvรฆrende tidspunkt, er den browserspecifikke, web.php . Der er allerede en rute defineret som standard, som er den, du rammer rigtigt, nรฅr du navigerer til webroden af โโdin applikation (webroden er i den offentlige mappe). Vi skal bruge tre forskellige ruter for at vores upload-applikation kan fungere:
- /upload Dette vil vรฆre URI'en pรฅ hovedsiden, der viser vores webformular til upload af filer.
- /proces Det er her formularen placeret pรฅ /upload-URI'en sender sine formularindsendte data til (formularens "handling")
- /list Dette vil vise alle filer uploadet til webstedet
Bemรฆrk /list-slutpunktet er muligvis ikke nรธdvendigt, hvis vi รธnskede at placere al logikken for at vise uploadformularen og listen over filer pรฅ en enkelt side, men vi holdt dem adskilt indtil videre for at tilfรธje lidt mere sag til emnet. .
//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');
I denne Laravel-rammevejledning vil vi for hver รธnsket rute angive den eksplicit i rutefilen web.php ved hjรฆlp af en af โโde tilgรฆngelige HTTP-specifikke anmodningsmetoder (get(), post(), put() , delete(), patch() eller options() ). For en oversigt over hver af disse, tjek denne ud. Hvad disse metoder gรธr, er at specificere, hvilke HTTP-verber der har tilladelse til at fรฅ adgang til den givne rute. Hvis du har brug for en rute for at kunne acceptere mere end รฉt HTTP-verbum (hvilket kan vรฆre tilfรฆldet, hvis du bruger en enkelt side til bรฅde at vise de oprindelige data og sende indsendte formulardata), kan du bruge Route::any( ) metode.
Det andet argument til bรฅde Route::get()- og Route::post()-metoden (og enhver af de andre HTTP-verb-relaterede metoder pรฅ rutefacaden), er navnet pรฅ en specifik controller og metode, der er indeholdt i den controller, der bliver eksekveret ved at ramme rutens endepunkt med den tilladte HTTP-anmodning (GET, POST, PATCH osv.) Vi bruger UploadController til alle tre ruter og har specificeret dem pรฅ fรธlgende mรฅde:
Den sidste metode, vi kalder pรฅ hver rute, er dens name() funktion, som accepterer en enkelt streng som et argument og bruges til mere eller mindre at "tagge" en bestemt rute med et navn, der er let at huske (i vores tilfรฆlde, upload, bearbejd og liste). Jeg er klar over, at det ikke virker sรฅ fantastisk af en funktion at give hver rute sit eget navn, nรฅr URL'en hedder nรธjagtigt det samme, men det er virkelig praktisk, nรฅr du har en specifik rute som /users/profile/dashboard/config, som ville vรฆre nemmere at huske som profil-admin eller bruger-config.
En note om facader:
- Facader giver en "statisk" grรฆnseflade til klasser, der er tilgรฆngelige i applikationens servicebeholder."
- De giver en kortfattet, mindevรฆrdig syntaks, der giver dig mulighed for at bruge Laravels funktioner uden at huske lange klassenavne, der skal injiceres eller konfigureres manuelt.
Ovenstรฅende rutedefinitioner i denne Laravel-rammevejledning, vi bruger rutefacaden i stedet for manuelt at instansiere et nyt Illuminate/Routing/Router-objekt og kalde de tilsvarende metoder pรฅ det objekt. Det er bare en genvej, der sparer indtastning. Facader bruges flittigt i hele Laravel-rammen โ du kan og bรธr blive mere fortrolig med dem. Dokumenterne for Facader kan findes link..
Hvad er en controller?
En controller er "C" i "MVC" (Model-View-Controller) arkitekturen, hvilket er det, Laravel er baseret pรฅ. En controllers job kan koges ned til denne enkle definition: Den modtager anmodningen fra klienten og returnerer et svar til klienten. Dette er bare-bones-definitionen og er ogsรฅ minimumskravene for enhver given controller. Hvad den gรธr mellem disse to ting, betragtes generelt som "handlingen" af controlleren (eller "rutens implementering"). Det fungerer som det andet indgangspunkt til applikationen (det fรธrste er anmodningen) til klienten, som sender anmodningens nyttelast (som vi kommer til nรฆste gang) til applikationen og forventer en form for svar (i form af en successide, omdirigering, fejlside eller enhver anden form for HTTP-svar).
En controller gรธr (dybest set) det samme som en rutedefinition med en anonym funktion sat som "handlingen", nรฅr den rute rammes. Forskellen er, at en controller holder godt til adskillelsen af โโbekymringer, mens en rute er defineret inline til den faktiske url-definition, hvilket grundlรฆggende betyder, at vi kobler rutens tildelte URI med rutens implementering eller den kode, der udfรธres, nรฅr den rute er hit.
For eksempel vil fรธlgende to stykker kode opnรฅ det samme:
Eksempel #1: Rutens definition og implementering i et enkelt metodekald (i web.php-rutefilen)
//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);
});
Eksempel #2: Rutens definition er inde i routes/web.php, men dens implementering ligger i /app/Http/Controllers/HelloWorldController-klassen
//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);
}
}
Selvom Laravel-eksempel #2 virker som meget mere arbejde (hvilket det ikke er โ bare lidt mere kode er alt), sรฅ se pรฅ de fordele, vi opnรฅr ved at placere vores handlingslogik for den givne "hello-world"-rute inde i en controller i stedet for af med rutens definition som en tilbagekaldsfunktion:
- Vores logik er rent adskilt i sin egen klasse (adskillelse af bekymringer)
- Vores controller er sat op til udvidelse senere, hvis vi havde brug for at tilfรธje yderligere funktioner til den... Lad os sige, at vi mรฅske ville tilfรธje en "farvel-verden"-funktion... I dette tilfรฆlde ville vi omdรธbe controlleren til en mere generisk "HelloController" og derefter definere to separate metoder, Hej() og farvel(). Vi ville ogsรฅ vรฆre nรธdt til at definere to separate ruter, der kortlagde /Hej og / farvel URI'er til deres passende metode pรฅ controlleren. Dette er รธnskeligt sammenlignet med at opfede en rutefil med hver rutes implementering defineret som tilbagekaldsfunktioner.
- Laravel har den indbyggede evne til at cache alle rutedefinitionerne i applikationen, sรฅ det fremskynder den tid, det tager at finde en given rute (รธger applikationens ydeevne); imidlertid du vil kun kunne drage fordel af det, hvis alle dine definerede ruter inde i applikationen er konfigureret ved hjรฆlp af controller-specifikke kortlรฆgninger (se eksempel #2 ovenfor)
Lad os kรธre denne kommando, der vil generere en ny controller til os.
// ...inside the project's root directory: php artisan make:controller UploadController
I bund og grund, hvad denne kommando gรธr, er at generere en stub til en controller ved navn "UploadController" inde i hovedcontrollerbiblioteket pรฅ /app/Http/Controllers/UploadController.php. Du er velkommen til at รฅbne den fil og tage et kig. Det er meget enkelt, fordi det kun er en udtรธmt version af controlleren, med den korrekte navnerumssti og de pรฅkrรฆvede klasser, som den strรฆkker sig fra.
Generering af anmodningen
Fรธr vi gรฅr videre i denne PHP Laravel-tutorial og laver et par รฆndringer til UploadControllerens genererede stub, tror jeg, det vil give mere mening at oprette anmodningsklassen fรธrst. Dette skyldes, at controllermetoden, der hรฅndterer anmodningen, skal skrive hint til anmodningsobjektet i sin signatur, hvilket gรธr det muligt automatisk at validere de indgรฅende formulardata (som specificeret i regler()-metoden. Mere om det senere...) Lad os nu bruge hรฅndvรฆrkerkommandoen igen for at generere vores anmodningsstub:
php artisan make:request UploadFileRequest
Denne kommando genererer en fil kaldet UploadFileRequest inde i app/Http/Requests/UploadFileRequest. ร bn stubben og tag et kig... Du vil finde det meget simpelt, der kun indeholder to metoder, autorisere() og regler.
Oprettelse af valideringslogikken
Lad os รฆndre anmodningsstubben for at imรธdekomme behovene i vores applikation. Rediger filen, sรฅ den ser sรฅdan ud:
<?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'
];
}
}
Ikke mange รฆndringer, men lรฆg mรฆrke til, at authorize()-metoden nu returnerer sand i stedet for falsk. Denne metode afgรธr, om anmodningen skal gรฅ ind i applikationen eller ej. Hvis den er indstillet til falsk, stopper den anmodningen i at komme ind i systemet (hvilket normalt ville vรฆre en metode pรฅ controlleren). Dette ville vรฆre et meget praktisk sted at placere enhver godkendelseskontrol pรฅ brugeren eller enhver anden logik, der kan afgรธre, om anmodningen kan flyttes videre til controlleren. For nu vender vi bare tilbage her for at tillade alt og alt at bruge anmodningen.
Den anden metode, regler() er, hvor al magien kommer i spil med hensyn til validering. Ideen er enkel: returner et array, der indeholder et sรฆt regler i form af:
'formFieldName' => 'constraints this field has separated by pipe characters (|)'
Der er mange forskellige valideringsbegrรฆnsninger, der understรธttes af Laravel lige ud af boksen. For en komplet liste over dem, tjek onlinedokumentationen link.. Til vores uploadapplikation vil der vรฆre to felter, der sendes ind via POST-anmodning fra en formular pรฅ frontend. Filnavn-parameteren skal inkluderes inde i formularens krop (dvs. pรฅkrรฆvet) og bruges som det filnavn, vi vil gemme filen under i lageret (det gรธres i controlleren โ vi kommer til det lidt senere). Vi specificerer ogsรฅ, at filnavnet skal vรฆre en streng ved at tilfรธje et rรธrtegn (|) og ordet 'streng'. Begrรฆnsninger er altid afgrรฆnset af rรธr, sรฅ du kan angive eventuelle yderligere kriterier for det givne felt pรฅ en enkelt linje! Hvilken magt!
Den anden parameter, userFile , er den faktiske fil, som brugeren uploader fra en formular pรฅ en webside. UserFile er ogsรฅ pรฅkrรฆvet og skal vรฆre en fil. Bemรฆrk: Hvis vi forventede, at den uploadede fil var et billede, ville vi bruge billedbegrรฆnsningen i stedet, hvilket ville begrรฆnse de filtyper, der accepteres til at vรฆre en af โโde populรฆre billedtyper (jpeg, png, bmp, gif eller svg). Da vi รธnsker at tillade brugeren at uploade enhver type fil, vil vi bare holde os til filvalideringsbegrรฆnsningen.
Det er omtrent alt, der er til anmodningsobjektet. Dens hovedopgave er blot at holde det acceptable sรฆt af kriterier (begrรฆnsninger), som formularens kropsparametre skal opfylde for at komme dybere ind i ansรธgningen. En anden ting at bemรฆrke er, at disse to felter (brugerFil og filnavn) ogsรฅ skal angives inde i HTML-koden i form af inputfelter (med feltnavnet svarende til navnet inde i anmodningsobjektet).
Du spรธrger mรฅske: sikker pรฅ, at dette definerer karakteristikaene for, hvad en formularanmodning skal indeholde, men hvor foretages den faktiske kontrol af disse begrรฆnsninger? Det kommer vi ind pรฅ nรฆste gang.
รndring af controlleren
ร bn appen/Http/Controllers/UploadController og foretag fรธlgende รฆndringer i den:
<?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
}
}
Sรฅ det er en ret ligetil tilgang til at gemme de uploadede filer pรฅ disken. Her er en oversigt over upload()-metoden ovenfor:
- Indtast anmodningsklassen i controllermetoden, der udfรธrer 'kรธd og kartofler'-funktionaliteten, sรฅ vi kan autovalidere de indgรฅende data
- Grib filen ud af det (nu validerede) anmodningsobjekt inde i controllermetoden (i dette tilfรฆlde har vi kaldt det upload(), men det kunne ogsรฅ have fรฅet et mere standardiseret navn som store()).
- Grib filnavnet ud af anmodningen
- Generer det endelige filnavn, der skal bruges til at gemme filen under. GetClientOriginalExtension()-metoden griber simpelthen den originale udvidelse af den uploadede fil.
- Gem filen til det lokale filsystem ved hjรฆlp af dens storeAs()-metode, og indfรธr den navngivne sti inde i /storage-mappen som det 1. argument og filnavnet, der skal gemmes under som det andet.
- Returner et JSON-svar, der angiver, at anmodningen var vellykket
Bladskabelonen
Den sidste store brik i dette puslespil er bladskabelonen, som vil indeholde al HTML, CSS og javascript til vores simple applikation. Her er koden - vi vil forklare det senere.
<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>
Her er hvad vores / upload siden ser sรฅdan ud:
Dette er et meget typisk eksempel pรฅ en blade-fil, der indeholder en HTML-formular og javascript/jQuery til tilfรธjelse af asynkron funktionalitet (sรฅ siden ikke opdateres). Der er en grundlรฆggende tag uden metodeattribut (som jeg vil forklare pรฅ et sekund) og med en nysgerrig handlingsattribut med vรฆrdien {{route('file.upload')}}. I blade er dette, hvad der er kendt som en Direktivet. Et direktiv er bare et fancy navn for funktion - de er funktioner, der er specifikke for bladeskabeloner, der udfรธrer forskellige operationer, der er fรฆlles for at konstruere websider og webapplikationer. For en bedre forstรฅelse af alt det fede lort, som blade kan gรธre, tjek dokumenterne link.. I ovenstรฅende tilfรฆlde bruger vi rutedirektivet til at generere en URL til vores formularindsendelse.
Husk, at vi definerede vores ruter tidligere i applikationen inde i web.php-filen, og specificerede et let at huske navn for hver af dem. {{route()}}-direktivet accepterer et navn pรฅ en rute, slรฅr det op i den internt cachelagrede ruteliste og genererer en fuld URL baseret pรฅ definitionen af โโden rute i web.php-filen. I dette fรธrste tilfรฆlde specificerer vi, at vi รธnsker, at formularen skal sende de indsendte data til /proces URL'en for vores ansรธgning, som er defineret som en POST rute.
Den nรฆste mรฆrkelige ting, du mรฅske har bemรฆrket, er @csrf-tagget lige under รฅbningsformularmรฆrket. I blade genererer dette tag en _token-parameter pรฅ formularen, som bliver tjekket inde i applikationen, fรธr formulardataene fรฅr lov til at blive behandlet. Dette sikrer, at dataene i formularen er af en gyldig oprindelse og forhindrer angreb pรฅ tvรฆrs af websteder med anmodninger om forfalskning. For mere information om dette, se docs.
Efter dette definerer vi vores formular som normal, men bemรฆrk, at navnene pรฅ vores formularparametre, userFile og fileName er nรธjagtig samme som defineret i vores anmodningsobjekt. Hvis vi glemte at inkludere et input for en given parameter, der var defineret i forespรธrgselsobjektet (eller stavede det forkert), ville anmodningen mislykkes, og der ville blive returneret en fejl, hvilket forhindrer den oprindelige formularanmodning i nogensinde at ramme controllermetoden placeret pรฅ UploadController@ proces.
Gรฅ videre og prรธv det og send et par filer til ansรธgningen ved hjรฆlp af denne formular. Bagefter skal du navigere til /liste side for at se indholdet af uploadmappen med de filer, du uploadede, anfรธrt i en tabel:
Jo stรธrre billede
Lad os tage et skridt tilbage og se pรฅ, hvad vi har gjort i denne Laravel-tutorial.
Dette diagram viser applikationen, som den stรฅr lige nu (detaljer pรฅ hรธjt niveau ekskluderet):
Du skal huske pรฅ, at det anmodningsobjekt, vi konstruerede i begyndelsen af โโdenne Laravel-tutorial, skal have de samme parametre defineret i dens regelmetode, som er pรฅ formularen i bladskabelonen (hvis ikke genlรฆs afsnittet "Oprettelse af valideringslogikken"). . Brugeren indtaster formularen pรฅ en webside, der gengives via en bladeskabelonmotor (denne proces er selvfรธlgelig pรฅ autopilot, sรฅ vi behรธver ikke engang at tรฆnke pรฅ det) og indsender formularen. Skabelonens jQuery-kode nederst stopper standardindsendelsen (som automatisk vil omdirigere til en separat side), opretter en ajax-anmodning, indlรฆser anmodningen med formulardata og uploader filen og sender det hele til det fรธrste lag af vores ansรธgning: anmodningen.
Anmodningsobjektet bliver udfyldt ved at knytte parametrene inde i rule()-metoden med de indsendte formularparametre, hvorefter dataene valideres i henhold til hver specificeret regel. Hvis alle reglerne er opfyldt, sendes anmodningen videre til en hvilken som helst controllermetode, der svarer til vรฆrdierne defineret i rutefilen web.php. I dette tilfรฆlde er det proces()-metoden for UploadController, der gรธr arbejdet. Nรฅr vi har ramt controlleren, ved vi allerede, at anmodningen bestod valideringen, sรฅ vi behรธver ikke at teste igen, om det angivne filnavn i virkeligheden er en streng, eller om parameteren userFile faktisk indeholder en type fil... Vi kan fortsรฆtte som normal.
Controllermetoden griber derefter de validerede parametre ud af anmodningsobjektet, genererer et fuldt filnavn ved at sammenkรฆde parameteren bestรฅet i filnavn med brugerfilens oprindelige udvidelse, gemmer filen i en mappe i vores applikation og returnerer derefter en simpel JSON-kodet svar, der bekrรฆfter, at anmodningen var vellykket. Svaret modtages af jQuery-logikken, som udfรธrer et par flere brugergrรฆnseflade-relaterede opgaver, sรฅsom at vise succes- (eller fejl)-meddelelsen i 5 sekunder og derefter skjule den samt rydde de tidligere formularposter ud ... dette er sรฅ brugeren ved sikker pรฅ, at anmodningen var vellykket og kan uploade en anden fil, hvis de รธnsker det.
Bemรฆrk ogsรฅ i diagrammet ovenfor, hvor linjen er trukket mellem klienten og serveren. Dette koncept er helt afgรธrende for dig at forstรฅ og vil hjรฆlpe dig med at lรธse problemer og problemer, du mรฅtte have i fremtiden, nรฅr du for eksempel jonglerer med flere asynkrone anmodninger, der kan opstรฅ pรฅ ethvert givet tidspunkt. Adskillelsen er lige ved grรฆnsen af โโanmodningsobjektet. Selve anmodningsobjektet kan opfattes som "gatewayen" til resten af โโapplikationen... Det udfรธrer den indledende validering og registrering af formularvรฆrdier, der sendes ind fra webbrowseren. Hvis de anses for gyldige, sรฅ fortsรฆtter det til den registeransvarlige. Alt fรธr det er pรฅ forsiden (โklientenโ betyder bogstaveligt talt โpรฅ brugerens computerโ). Svaret returneres fra appen tilbage til klientsiden, hvor vores jQuery-kode tรฅlmodigt lytter efter dens ankomst og udfรธrer et par enkle UI-opgaver, nรฅr den modtager den.
Vi har dรฆkket nรฆsten 90+ vigtige ofte stillede spรธrgsmรฅl Laravel og PHP-relaterede interviewspรธrgsmรฅl for friske sรฅvel som erfarne kandidater til at fรฅ det rigtige job.







