Laravel opetusohjelma aloittelijoille
โก รlykรคs yhteenveto
Laravel on Taylor Otwellin luoma avoimen lรคhdekoodin PHP MVC -kehys web-sovellusten nopeaan ja siistiin rakentamiseen. Tรคmรค tutoriaali selittรครค, mikรค Laravel on, miten se asennetaan Composerilla ja miten se rakentaa toimivan tiedostojen lataussovelluksen reittien, ohjainten, lomakepyyntรถjen validoinnin ja Blade-mallien avulla.

Mikรค on Laravel?
Laravel on avoimen lรคhdekoodin web MVC -kehys PHP:lle. Laravel on vankka kehys, joka tarjoaa helpon PHP-verkkosovellusten kehittรคmisen ominaisuuksilla, kuten modulaarisella pakkausjรคrjestelmรคllรค, jossa on oma riippuvuushallinta, pรครคsy relaatiotietokantoihin ja muihin apuohjelmiin sovellusten kรคyttรถรถnottoa ja yllรคpitoa varten.
Laravelin loi Taylor Otwell. Julkaisustaan โโkesรคkuussa 2011 (versio 1) lรคhtien se on tasaisesti kasvattanut suosiotaan PHP-kehysten sektorilla web-kehitysalalla. Suuri osa tรคstรค suosiosta voidaan katsoa johtuvan monista kehittรคjรคkeskeisistรค ominaisuuksista, jotka siinรค on oletuksena.
Miksi Laravel?
Noin 2000, suurin osa PHP koodi oli menettelyllinen, ja se voi lรถytyรค "skriptien" muodossa, joissa olisi sotkuinen spagettikoodi. Jopa yksinkertaisimmilla sivuilla ei ollut huolenaiheiden erottaminen toisistaan, ja nรคin ollen sovelluksen oli melko helppo nopeasti kasvaa yllรคpidon painajaiseksi. Maailma tarvitsi jotain parempaa. Esiin astui PHP-versio 5 ja useat PHP-kehykset, jotka pyrkivรคt tuomaan kaivattua rakennetta ja parempia ratkaisuja erilaisiin verkkosovellusten ongelmiin.
Siitรค lรคhtien olemme nรคhneet monia frameworkeja, jotka tasoittivat tietรค nykyรครคn kรคytรถssรค oleville suosituille frameworkeille. Nykyรครคn kolme parasta olisivat (mielestรคmme) Zend Framework, Symfony ja tietenkin Laravel. Vaikka jokainen nรคistรค frameworkeista perustuu samankaltaisiin periaatteisiin ja on suunnattu ratkaisemaan (periaatteessa) samoja yleisiรค ongelmia, niiden keskeiset erot ovat toteutuksissa. Jokaisella on omat omituisuutensa ongelmien ratkaisemisessa. Kun tarkastelet kunkin tuottamaa koodia, huomaat, ettรค niiden vรคlillรค on melko selkeรค raja. Vaatimattoman mielipiteemme mukaan Laravel-framework on paras.
Lue lisรครค ero Laravelin ja muiden vรคlillรค Codesytytin.
Kuinka ladata ja asentaa Laravel Composerilla
Huomautus: Tรคmรค tutoriaali on kirjoitettu Laravel 5.8:lle, mutta reititys-, ohjain-, pyyntรถ- ja Blade-konseptit pysyvรคt samoina nykyisissรค julkaisuissa. Vuonna 2026 uusin versio on Laravel 13 (julkaistu maaliskuussa 2026), joka vaatii PHP 8.3:n tai uudemman, kun taas Laravel 12 vaatii PHP 8.2:n.
Huomautus: Oletetaan, ettรค sinulla on jo PHP asennettuna paikalliseen jรคrjestelmรครคn. Jos ei, voit lukea ohjeet sen asentamiseen. tรครคltรค.
Composer on sekรค paketti- ettรค riippuvuushallinta. Asenna se avaamalla pรครคte ja CD-levy uuteen hakemistoon. Suorita tรคmรค komento:
curl -Ss getcomposer.org/installer | php
Tรคmรคn komennon tulokset nรคyttรคvรคt tรคltรค:
Huomautus: Katso tarkemmat ohjeet Laravelin asentamiseen Laravelin dokumentaatiosta. tรครคltรค.
Nรคet sen lataavan ja kรครคntรคvรคn composer.phar-skriptin, jota kรคytรคmme Laravelin asentamiseen. Vaikka uuden Laravel-sovelluksen voi asentaa monella eri tavalla, teemme sen Laravelin composer-skriptin avulla. Asentaaksesi tรคmรคn skriptin, suorita:
composer global require laravel/installer
Joka nรคyttรครค suunnilleen tรคltรค:
Tรคmรค lataa ja asentaa kaikki kehystiedostot sekรค kaikki tarvittavat riippuvuudet. Paketit tallennetaan toimittajan hakemistoon. Kun se on ladattu ja asennettu, se on yhtรค helppoa kuin seuraavan komennon antaminen:
laravel new uploadApp
Nรคet jotain seuraavanlaisen tulosteen kaltaista:
Composer asentaa kaikki Laravelin tarvitsemat paketit toimiakseen. Se voi kestรครค muutaman minuutin, joten ole kรคrsivรคllinen. Kun se on valmis, suorita ls -al -komento tarkistaaksesi asennetut paketit.
Tรคssรค on lyhyt erittely yleisen Laravel-sovelluksen hakemistoista:
- sovellus/ : Tรคmรค on lรคhdekoodikansio, jossa sovelluskoodimme sijaitsee. Kaikki ohjaimet, kรคytรคnnรถt ja mallit ovat tรคmรคn kansion sisรคllรค.
- bootstrap/ : Sisรคltรครค sovelluksen kรคynnistysskriptin ja muutamia luokkakarttatiedostoja.
- config/ : Sisรคltรครค sovelluksen mรครคritystiedostot. Nรคitรค ei yleensรค muokata suoraan, vaan ne perustuvat sovelluksen juuressa olevaan .env (ympรคristรถ) -tiedostoon mรครคritettyihin arvoihin.
- tietokanta/ : Sisรคltรครค tietokantatiedostot, mukaan lukien migraatiot, siemenet ja testitehtaat.
- julkinen/ : Julkisesti saatavilla oleva kansio, joka sisรคltรครค kรครคnnettyjรค resursseja ja tietenkin index.php-tiedoston.
- resurssit/ : Sisรคltรครค kรคyttรถliittymรคn resursseja, kuten JavaSkriptitiedostot, kielitiedostot, CSS/SASS-tiedostot ja kaikki sovelluksessa kรคytetyt mallit (joita kutsutaan blade-malleiksi).
- reitit/ : Kaikki sovelluksen reitit lรถytyvรคt tรครคltรค. Reittejรค on muutamia erilaisia โโ"laajuusalueita", mutta keskitymme tรคssรค web.php-tiedostoon.
- varastointi/ : Kaikki sovelluksen kรคyttรคmรคt vรคliaikaiset vรคlimuistitiedostot, istuntotiedostot, kรครคnnetyt nรคkymรคkomentosarjat ja lokitiedostot.
- testit/: Sisรคltรครค sovelluksen testitiedostoja, kuten yksikkรถtestejรค ja toiminnallisia testejรค.
- myyjรค/: Kaikki riippuvuuspaketit asennetaan composerin mukana.
Nyt sitten rakennetaan loput sovelluksesta ja suoritetaan se erityisellรค Artisan-komennolla (jotta sรครคstyisimme web-palvelimen, kuten Apachen tai nginxin, asentamisen ja konfiguroinnin vaivalta). .env-tiedosto sisรคltรครค kaikki mรครคritysarvot, joita /config-hakemiston tiedostot kรคyttรคvรคt sovelluksen konfigurointiin.
Sovellussuunnittelu: Vaatimuksemme nopea selvitys
Tรคssรค Laravelin online-opetusohjelmassa rakennamme hyvin yksinkertaisen sovelluksen, joka tekee vain kaksi asiaa:
- kรคsitellรค tiedostojen latauksia verkkolomakkeesta
- nรคyttรครค aiemmin ladatut tiedostot eri sivulla.
Tรคssรค projektissa sovelluksemme on vain kirjoitusoikeutta kรคyttรคvรค, mikรค tarkoittaa, ettรค kรคyttรคjรค voi vain kirjoittaa tiedostoja ja tarkastella lataamiensa tiedostojen luetteloa. Tรคmรค sovellus on erittรคin yksinkertainen, mutta sen pitรคisi toimia hyvรคnรค harjoituksena Laravel-taitojen ja -tietรคmyksen kehittรคmisen aloittamiseen. Huomaa, ettรค lyhyyden vuoksi olemme jรคttรคneet pois tietokantamallinnuksen, migraatiot ja todennuksen, mutta todellisessa sovelluksessa nรคmรค ovat lisรคasioita, jotka sinun kannattaa ottaa huomioon.
Tรคssรค on luettelo komponenteista, joita tarvitsemme saadaksemme sovelluksen toimimaan odotetulla tavalla:
- A reitti joka sallii ulkomaailman (internetin) kรคyttรครค sovellusta ja mรครคrittรครค pรครคtepisteen, joka osoittaa ladatun tiedoston tallennuslogiikan sijaintiin.
- A ohjain joka kรคsittelee pyyntรถ-vastaus-prosessin.
- A sapluuna jota kรคytetรครคn aiemmin ladattujen tiedostojen luettelon ja itse latauslomakkeen nรคyttรคmiseen.
- A pyyntรถ jota ohjain kรคyttรครค verkkolomakkeelta vรคlitettyjen tietojen validointiin.
Mikรค on reitti?
Laravelissa reitti on pohjimmiltaan URI:n mรครคrittรคmรค pรครคtepiste, joka toimii "osoittimena" johonkin sovelluksen tarjoamaan toiminnallisuuteen. Yleisimmin reitti yksinkertaisesti osoittaa ohjaimen metodiin ja sanelee myรถs, mitkรค HTTP-metodit voivat osua kyseiseen URI:in. Reitti ei aina tarkoita ohjaimen metodia; se voi yksinkertaisesti vรคlittรครค sovelluksen suorituksen mรครคritellylle Closure- tai anonyymille funktiolle.
Miksi kรคyttรครค reittiรค?
Reitit tallennetaan tiedostoihin /routes-kansioon projektin juurihakemistossa. Oletusarvoisesti sovelluksen eri "puolia" vastaavia tiedostoja on muutama ("puolet" tulee kuusikulmaisen arkkitehtuurin metodologiasta). Niihin kuuluvat:
- web.php: julkisesti saatavilla olevat "selainpohjaiset" reitit. Nรคmรค ovat yleisimmรคt ja ne joutuvat verkkoselaimen osumien kohteeksi. Ne kulkevat verkkovรคliohjelmistoryhmรคn kautta ja sisรคltรคvรคt myรถs ominaisuuksia, jotka CSRF-suojaus (mikรค auttaa puolustautumaan lomakepohjaisia โโhaitallisia hyรถkkรคyksiรค vastaan) ja yleensรค sisรคltรคvรคt jonkin verran "tilaa" (tรคssรค tarkoitamme, ettรค ne kรคyttรคvรคt istuntoja).
- api.php: reitit, jotka vastaavat API-ryhmรครค ja joilla API-vรคliohjelmisto on siten oletuksena kรคytรถssรค. Nรคmรค reitit ovat tilattomia, eikรค niillรค ole istuntoja tai ristipyyntรถmuistia (yksi pyyntรถ ei jaa tietoja tai muistia minkรครคn toisen pyynnรถn kanssa; jokainen pyyntรถ on itsekapseloitu).
- console.php: nรคmรค reitit vastaavat sovelluksellesi luomiasi mukautettuja Artisan-komentoja.
- channels.php: rekisterรถi reitit tapahtumien lรคhetystรค varten.
Tรคrkein tiedosto, josta tรคssรค vaiheessa on huolehdittava, on selainkohtainen tiedosto, web.php. Oletusarvoisesti on jo mรครคritetty yksi reitti, joka on se, jota napsautat oikealla painikkeella siirryttรคessรคsi sovelluksesi web-juurihakemistoon (web-juurihakemisto on julkisessa hakemistossa). Tarvitsemme kolme eri reittiรค, jotta lataussovelluksemme toimii:
- /upload: tรคmรค on pรครคsivun URI, jolla nรคytetรครคn verkkolomake tiedostojen lataamista varten.
- /process: tรคhรคn kohtaan /upload-URI-osoitteessa sijaitseva lomake lรคhettรครค lomakkeella lรคhetetyt tiedot (lomakkeen "toiminto").
- /list: tรคmรค listaa kaikki sivustolle ladatut tiedostot.
Huomautus: /list-pรครคtepistettรค ei ehkรค tarvita, jos haluamme sijoittaa kaikki latauslomakkeen ja tiedostoluettelon nรคyttรคmiseen tarvittavat tiedot yhdelle sivulle. Pidรคmme ne kuitenkin toistaiseksi erillรครคn lisรคtรคksemme hieman enemmรคn sisรคltรถรค kรคsillรค olevaan aiheeseen.
//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');
Tรคssรค Laravel-kehysopastuksessa listaamme jokaisen halutun reitin erikseen reittitiedostossa web.php kรคyttรคmรคllรค yhtรค kรคytettรคvissรค olevista HTTP-kohtaisista pyyntรถmetodeista (get(), post(), put(), delete(), patch() tai options()). Katso erittely kustakin nรคistรค tรคtรค ulos. Nรคmรค metodit mรครคrittรคvรคt, millรค HTTP-verbeillรค on lupa kรคyttรครค tiettyรค reittiรค. Jos reitin on voitava hyvรคksyรค useampi kuin yksi HTTP-verbi (mikรค voi olla mahdollista, jos kรคytรคt yhtรค sivua sekรค alkuperรคisten tietojen nรคyttรคmiseen ettรค lรคhetettyjen lomaketietojen lรคhettรคmiseen), voit kรคyttรครค Route::any()-metodia.
Toinen argumentti sekรค Route::get()- ettรค Route::post()-metodeille (ja kaikille muille HTTP-verbiin liittyville Route-julkisivun metodeille) on tietyn ohjaimen nimi ja ohjaimen sisรคllรค oleva metodi, joka suoritetaan, kun sallittu HTTP-pyyntรถ (GET, POST, PATCH jne.) osuu reitin pรครคtepisteeseen. Kรคytรคmme UploadControlleria kaikille reiteille ja olemme mรครคritelleet ne seuraavalla tavalla:
Viimeinen metodi, jota kutsumme kullekin reitille, on sen name()-funktio, joka hyvรคksyy yhden merkkijonon argumenttina ja jota kรคytetรครคn enemmรคn tai vรคhemmรคn "tunnistamaan" tietty reitti helposti muistettavalla nimellรค (tรคssรค tapauksessa upload, process ja list). Ei ehkรค vaikuta kovin hyvรคltรค ominaisuudelta antaa jokaiselle reitille oma nimi, kun URL on nimetty tรคsmรคlleen samalla tavalla, mutta siitรค on todella hyรถtyรค, kun kรคytรถssรค on tietty reitti, kuten /users/profile/dashboard/config, joka on helpompi muistaa muodossa profile-admin tai user-config.
Huomioita julkisivuista:
- Facadet tarjoavat "staattisen" rajapinnan sovelluksen palvelusรคiliรถssรค kรคytettรคvissรค oleville luokille.
- Ne tarjoavat tiiviin, mieleenpainuvan syntaksin, jonka avulla voit kรคyttรครค Laravelin ominaisuuksia muistamatta pitkiรค luokkien nimiรค, jotka on lisรคttรคvรค tai mรครคritettรคvรค manuaalisesti.
Yllรค olevissa reittimรครคritelmissรค kรคytรคmme Route-julkisivua sen sijaan, ettรค luomme manuaalisesti uuden Illuminate/Routing/Router-objektin ja kutsumme vastaavia metodeja kyseiselle objektille. Se on vain oikotie, joka sรครคstรครค aikaa.pingFacadeja kรคytetรครคn paljon Laravel-kehyksessรค; niihin kannattaa tutustua paremmin. Facadeja koskevat dokumentit lรถytyvรคt osoitteesta tรครคltรค.
Mikรค on ohjain?
Ohjain on "C" "MVC" (Model-View-Controller) -arkkitehtuurissa, johon Laravel perustuu. Ohjaimen tyรถ voidaan tiivistรครค tรคhรคn yksinkertaiseen mรครคritelmรครคn: se vastaanottaa pyynnรถn asiakkaalta ja palauttaa vastauksen asiakkaalle. Tรคmรค on periaatteellinen mรครคritelmรค ja myรถs minkรค tahansa ohjaimen vรคhimmรคisvaatimus. Se, mitรค se tekee nรคiden kahden asian vรคlillรค, katsotaan yleensรค ohjaimen "toiminnoksi" (tai "reitin toteutukseksi"). Se toimii toisena saapumiskohtana sovellukseen (ensimmรคinen on pyyntรถ) asiakkaalle, joka lรคhettรครค pyynnรถn hyรถtykuorman (johon palataan seuraavaksi) sovellukselle odottaen jonkinlaista vastausta (onnistumissivun, uudelleenohjauksen, virhesivun tai muun HTTP-vastauksen muodossa).
Ohjain tekee (periaatteessa) saman asian kuin reittimรครคrittely, jossa anonyymi funktio on asetettu "toiminnoksi", kun reittiin osutaan. Ero on siinรค, ettรค ohjain pitรครค huolen siitรค, ettรค vastuualueet on erotettu toisistaan, kun taas reitti mรครคritellรครคn varsinaisen reitin mukaisesti. URL mรครคritelmรค, mikรค pohjimmiltaan tarkoittaa, ettรค yhdistรคmme reitin mรครคritetyn URI:n reitin toteutukseen eli koodiin, joka suoritetaan, kun kyseiseen reittiin osutaan.
Esimerkiksi seuraavat kaksi koodinpalaa saavuttavat saman asian:
Esimerkki 1: Reitin mรครคrittely ja toteutus yhden menetelmรคkutsun sisรคllรค (web.php routes -tiedostossa)
//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);
});
Esimerkki 2: Reitin mรครคritelmรค on tiedostossa routes/web.php, mutta sen toteutus sijaitsee /app/Http/Controllers/HelloWorldController-luokassa.
//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);
}
}
Vaikka Laravel-esimerkki #2 vaikuttaa paljon tyรถlรครคmmรคltรค (mitรค se ei ole, vain hieman enemmรคn koodia), katsotaanpa etuja, joita saamme sijoittamalla tietyn "hello-world"-reitin toimintalogiikan ohjaimen sisรคlle sen sijaan, ettรค reitti mรครคriteltรคisiin takaisinkutsufunktiona:
- Logiikkamme on selkeรคsti eroteltu omaan luokkaan (huolenaiheiden erottelu).
- Ohjaintamme on mรครคritetty laajennettavaksi myรถhemmin, jos siihen tarvitaan lisรคominaisuuksia. Oletetaan, ettรค haluamme lisรคtรค "hyvรคstit maailma" -ominaisuuden. Tรคssรค tapauksessa nimeรคmme ohjaimen uudelleen yleisemmรคksi "HelloController"-muotoon ja mรครคritรคmme sitten kaksi erillistรค metodia, Hei() ja Hyvรคsti(). Meidรคn olisi myรถs mรครคritettรคvรค kaksi erillistรค reittiรค, jotka kartoittavat /Hei ja / Hyvรคsti URI:t niiden asianmukaiseen metodiin ohjaimessa. Tรคmรค on toivottavaa verrattuna reittitiedoston lihottamiseen, jossa jokaisen reitin toteutus mรครคritellรครคn takaisinkutsufunktioiksi.
- Laravelilla on sisรครคnrakennettu kyky tallentaa kaikki sovelluksen reittimรครคritykset vรคlimuistiin, jotta se nopeuttaa tietyn reitin lรถytรคmiseen kuluvaa aikaa (lisรครค sovelluksen suorituskykyรค); kuitenkin, voit hyรถdyntรครค sitรค vain, jos kaikki sovelluksessa mรครคritetyt reitit on konfiguroitu ohjainkohtaisen kartan avulla.pings (katso esimerkki 2 yllรค).
Suoritetaan tรคmรค komento, joka luo meille uuden ohjaimen.
// ...inside the project's root directory: php artisan make:controller UploadController
Pohjimmiltaan tรคmรค komento luo tynkรคn ohjaimelle nimeltรค "UploadController" pรครคohjaimen hakemistossa osoitteessa /app/Http/Controllers/UploadController.php. Voit vapaasti avata tiedoston ja katsoa sitรค. Se on hyvin yksinkertainen, koska se on vain tynkรคversio ohjaimesta, jolla on oikea nimiavaruuden polku ja vaaditut luokat, joista se jatkuu.
Pyynnรถn luominen
Ennen kuin jatkamme tรคssรค PHP Laravel -tutoriaalissa ja teemme muutamia muutoksia UploadControllerin luomaan tynkรครคn, on jรคrkevรคmpรครค luoda ensin request-luokka. Tรคmรค johtuu siitรค, ettรค pyyntรถรค kรคsittelevรคn ohjainmetodin on tyyppivihjettรคvรค request-objekti allekirjoituksessaan, jolloin se voi automaattisesti validoida saapuvat lomaketiedot (kuten rules()-metodissa on mรครคritetty; lisรครค siitรค myรถhemmin). Kรคytรคmme nyt uudelleen artisan-komentoa pyyntรถtynkรคn luomiseen:
php artisan make:request UploadFileRequest
Tรคmรค komento luo tiedoston nimeltรค UploadFileRequest kansioon app/Http/Requests/UploadFileRequest. Avaa tynkรค ja tutustu siihen. Se on hyvin yksinkertainen, sillรค se sisรคltรครค vain kaksi metodia, authorize() ja rules().
Validointilogiikan luominen
Muokataan pyyntรถtynkรครค sovelluksemme tarpeiden mukaan. Muokkaa tiedostoa tรคltรค nรคyttรคmรครคn:
<?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'
];
}
}
Ei paljoa muutoksia, mutta huomaa, ettรค authorize()-metodi palauttaa nyt arvon true (tosi) eikรค arvon false (epรคtosi). Tรคmรค metodi pรครคttรครค, sallitaanko pyynnรถn pรครคsy sovellukseen. Jos se asetetaan arvoon false (epรคtosi), se estรครค pyynnรถn pรครคsyn jรคrjestelmรครคn. Tรคmรค olisi erittรคin kรคtevรค paikka asettaa kรคyttรคjรคn valtuutustarkistuksia tai muita logiikoita, jotka voivat pรครคttรครค, voiko pyyntรถ siirtyรค eteenpรคin ohjaimelle. Toistaiseksi palautamme tรคssรค vain arvon true (tosi), jotta kaikki voi kรคyttรครค pyyntรถรค.
Toinen metodi, rules(), on se, missรค kaikki validoinnin taika astuu esiin. Idea on yksinkertainen: palauta taulukko, joka sisรคltรครค joukon sรครคntรถjรค muodossa:
'formFieldName' => 'constraints this field has separated by pipe characters (|)'
Laravel tukee monia erilaisia โโvahvistusrajoituksia heti kรคyttรถรถnoton jรคlkeen. Tรคydellinen luettelo niistรค on online-dokumentaatiossa tรครคltรคLataussovelluksessamme on kaksi kenttรครค, jotka vรคlitetรครคn POST-pyynnรถn kautta kรคyttรถliittymรคn lomakkeelta. fileName-parametrin on oltava lomakkeen rungon sisรคllรค (eli pakollinen), ja sitรค kรคytetรครคn tiedostonimenรค, jonka alle tallennamme tiedoston tallennustilaan (tรคmรค tehdรครคn ohjaimessa; palaamme siihen hieman myรถhemmin). Mรครคritรคmme myรถs, ettรค tiedostonimen on oltava merkkijono, lisรครคmรคllรค pystyviivan (|) ja sanan 'string'. Rajoitukset erotetaan aina pystyviivoilla, jolloin voit mรครคrittรครค mahdolliset lisรคehdot tietylle kentรคlle yhdellรค rivillรค.
Toinen parametri, userFile, on varsinainen tiedosto, jonka kรคyttรคjรค lataa verkkosivun lomakkeelta. userFile on myรถs pakollinen ja tรคytyy olla tiedosto. Huomautus: Jos odottaisimme ladattavan tiedoston olevan kuva, kรคyttรคisimme kuvarajoitetta, joka rajoittaisi tiedostotyyppejรค, jotka hyvรคksytรครคn yhdeksi suosituimmista kuvatyypeistรค (jpeg, png, bmp, gif tai svg). Koska haluamme antaa kรคyttรคjรคn ladata minkรค tahansa tyyppisiรค tiedostoja, pidรคmme kiinni tiedoston validointirajoitteesta.
Siinรคpรค suunnilleen kaikki, mitรค request-objektissa on. Sen pรครคtehtรคvรคnรค on yksinkertaisesti pitรครค sisรคllรครคn hyvรคksyttรคvรคt kriteerit (rajoitteet), jotka lomakkeen runkoparametrien on tรคytettรคvรค, jotta sovelluksessa voidaan edetรค syvemmรคlle. Toinen huomionarvoinen asia on, ettรค nรคmรค kaksi kenttรครค (userFile ja fileName) on myรถs mรครคritettรคvรค HTML-koodin sisรคllรค syรถttรถkenttien muodossa (kentรคn nimen vastatessa request-objektin sisรคllรค olevaa nimeรค).
Saatat kysyรค: tรคmรค mรครคrittelee lomakepyynnรถn sisรคllรถn ominaisuudet, mutta missรค nรคiden rajoitusten varsinainen tarkistus tehdรครคn? Palaamme siihen seuraavaksi.
Ohjaimen muokkaaminen
Avaa sovellus/Http/Controllers/UploadController ja tee siihen seuraavat muutokset:
<?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 process(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'); //so 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
}
}
Ladattujen tiedostojen tallentaminen levylle on siis melko yksinkertainen tapa. Tรคssรค on erittely yllรค olevasta process()-metodista:
- Kirjoita vihje pyyntรถluokasta ohjainmetodiin, joka suorittaa pรครคtoiminnon, jotta voimme automaattisesti validoida saapuvan datan.
- Hae tiedosto (nyt validoidusta) request-objektista ohjainmetodin sisรคllรค.
- Ota tiedostonimi pyynnรถstรค.
- Luo lopullinen tiedostonimi, jota kรคytetรครคn tiedoston tallentamiseen. GetClientOriginalExtension()-menetelmรค yksinkertaisesti nappaa ladatun tiedoston alkuperรคisen laajennuksen.
- Tallenna tiedosto paikalliseen tiedostojรคrjestelmรครคn kรคyttรคmรคllรค storeAs()-metodia ja vรคlitรค nimetty polku /storage-hakemiston sisรคllรค ensimmรคisenรค argumenttina ja tiedostonimi, jonka alle se tallennetaan toiseksi.
- Palauttaa JSON-vastauksen, joka osoittaa pyynnรถn onnistuneen.
Blade-malli
Viimeinen tรคrkeรค palanen tรคssรค palapelissรค on terรคmallipohja, joka sisรคltรครค kaikki HTML:n, CSS:n ja JavaSkripti yksinkertaiselle sovelluksellemme. Tรคssรค on koodi; selitรคmme sen myรถhemmin.
<body>
<h1>Upload a file</h1>
<form id="uploadForm" name="uploadForm" action="{{route('process')}}" 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>
Tรคssรค on mitรค meidรคn / lataa sivu nรคyttรครค tรคltรค:
Tรคmรค on hyvin tyypillinen esimerkki HTML-lomakkeen sisรคltรคvรคstรค blade-tiedostosta ja JavaSkripti/jQuery asynkronisen toiminnallisuuden lisรครคmiseksi (jotta sivu ei pรคivity). Peruskรคyttรถliittymรค on kรคytettรคvissรค. tagi ilman method-attribuuttia (jonka selitรคmme hetken kuluttua) ja omituisella action-attribuutilla, jonka arvo on {{route('process')}}. Bladessa tรคtรค kutsutaan Direktiivi. Direktiivi on vain hieno nimi funktiolle; ne ovat Blade-malleille ominaisia โโfunktioita, jotka suorittavat erilaisia โโtoimintoja, jotka ovat yleisiรค verkkosivujen ja verkkosovellusten rakentamisessa. Saadaksesi paremman kรคsityksen kaikista Bladen hyรถdyllisistรค ominaisuuksista, tutustu dokumentaatioon. tรครคltรคYllรค olevassa tapauksessa kรคytรคmme reittidirektiiviรค luodaksemme URL lomakkeen lรคhettรคmistรค varten.
Muista, ettรค mรครคrittelimme reittimme aiemmin sovelluksessa web.php-tiedostossa ja annoimme kullekin helposti muistettavan nimen. {{route()}}-direktiivi hyvรคksyy reitin nimen, etsii sen sisรคisesti vรคlimuistissa olevasta reittiluettelosta ja luo tรคyden... URL web.php-tiedostossa olevan reitin mรครคritelmรคn perusteella. Tรคssรค ensimmรคisessรค tapauksessa mรครคritรคmme, ettรค haluamme lomakkeen lรคhettรคvรคn lรคhetetyt tiedot /process-prosessiin. URL sovelluksestamme, joka on mรครคritelty POST reittiรค.
Seuraavaksi olet ehkรค huomannut @csrf-tagin heti avauslomaketagin alapuolella. Bladessa tรคmรค tagi luo lomakkeelle _token-parametrin, joka tarkistetaan sovelluksen sisรคllรค ennen kuin lomakedatan kรคsittely sallitaan. Tรคmรค varmistaa, ettรค lomakkeen sisรคltรคmรคt tiedot ovat kelvollista alkuperรครค ja estรครค sivustojenvรคliset pyyntรถvรครคrennรถshyรถkkรคykset. Lisรคtietoja tรคstรค on osoitteessa docs.
Tรคmรคn jรคlkeen mรครคrittelemme lomakkeen normaaliksi; huomaa kuitenkin, ettรค lomakeparametriemme nimet, userFile ja fileName, ovat tรคsmรคlleen sama kuten pyyntรถobjektissamme on mรครคritelty. Jos unohdimme sisรคllyttรครค syรถtteen tietylle pyyntรถobjektissa mรครคritellylle parametrille (tai kirjoitamme sen vรครคrin), pyyntรถ epรคonnistuu ja palautetaan virhe, mikรค estรครค alkuperรคistรค lomakepyyntรถรค koskaan saavuttamasta UploadController@process-osoitteessa sijaitsevaa ohjainmetodia.
Kokeile sitรค ja lรคhetรค muutama tiedosto sovellukseen tรคllรค lomakkeella. Siirry sen jรคlkeen kohtaan /lista -sivulta nรคet latauskansion sisรคllรถn ja lataamasi tiedostot on lueteltu taulukossa:
Bigger Picture
Otetaanpa askel taaksepรคin ja katsotaanpa, mitรค olemme tehneet tรคssรค Laravel-tutoriaalissa.
Tรคmรค kaavio kuvaa sovellusta sellaisena kuin se on tรคllรค hetkellรค (yleisen tason yksityiskohdat pois lukien):
Muista, ettรค tรคmรคn Laravel-tutoriaalin alussa luomallamme request-objektilla tulisi olla samat rules-metodissa mรครคritellyt parametrit kuin blade-mallipohjan lomakkeella (jos ei, lue uudelleen kohta โValidointilogiikan luominenโ). Kรคyttรคjรค syรถttรครค lomakkeen verkkosivulle, joka renderรถidรครคn blade-mallipohjan kautta, ja lรคhettรครค lomakkeen. Mallipohjan jQuery-koodi lomakkeen alareunassa pysรคyttรครค oletusarvoisen lรคhetyksen (joka ohjaa automaattisesti erilliselle sivulle), luo ajax-pyynnรถn, lataa pyynnรถn lomaketiedoilla ja ladatulla tiedostolla ja lรคhettรครค koko prosessin sovelluksemme ensimmรคiseen kerrokseen: pyyntรถรถn.
Pyyntรถobjekti tรคytetรครคn liittรคmรคllรค rules()-metodin parametrit lรคhetettyihin lomakeparametreihin ja sitten se validoi tiedot kunkin mรครคritetyn sรครคnnรถn mukaisesti. Jos kaikki sรครคnnรถt tรคyttyvรคt, pyyntรถ vรคlitetรครคn sille ohjainmetodille, joka vastaa reittitiedostossa web.php mรครคriteltyjรค arvoja. Tรคssรค tapauksessa tyรถn suorittaa UploadControllerin process()-metodi. Kun ohjain on avattu, tiedรคmme jo, ettรค pyyntรถ lรคpรคisi validoinnin, joten meidรคn ei tarvitse testata uudelleen, onko annettu tiedostonimi todella merkkijono vai sisรคltรครคkรถ userFile-parametri jonkin tyyppistรค tiedostoa. Voimme jatkaa normaalisti.
Ohjausmetodi hakee sitten validoidut parametrit pyyntรถobjektista, luo tรคydellisen tiedostonimen yhdistรคmรคllรค annetun fileName-parametrin userFile-parametrin alkuperรคiseen tiedostopรครคtteeseen, tallentaa tiedoston sovelluksemme hakemistoon ja palauttaa sitten yksinkertaisen JSON-koodatun vastauksen, joka varmistaa pyynnรถn onnistumisen. jQuery-logiikka vastaanottaa vastauksen ja suorittaa muutamia kรคyttรถliittymรครคn liittyviรค tehtรคviรค, kuten nรคyttรครค onnistumis- (tai virhe-)viestin viiden sekunnin ajan, piilottaa sen ja tyhjentรครค aiemmat lomakemerkinnรคt. Nรคin kรคyttรคjรค tietรครค varmasti, ettรค pyyntรถ onnistui, ja voi halutessaan ladata uuden tiedoston.
Huomioi myรถs yllรค olevasta kaaviosta, missรค asiakkaan ja palvelimen vรคlinen raja kulkee. Tรคmรคn kรคsitteen ymmรคrtรคminen on ehdottoman tรคrkeรครค, ja se auttaa sinua ratkaisemaan ongelmia ja haasteita, joita saatat kohdata tulevaisuudessa, kun jonglรถรถraat esimerkiksi useiden samanaikaisesti tapahtuvien asynkronisten pyyntรถjen kanssa. Erottelu tapahtuu aivan pyyntรถobjektin rajalla. Itse pyyntรถobjektia voidaan pitรครค "porttina" muuhun sovellukseen. Se suorittaa verkkoselaimesta vรคlitettyjen lomakearvojen alustavan validoinnin ja rekisterรถinnin. Jos ne katsotaan kelvollisiksi, se jatkaa ohjaimeen. Kaikki sitรค edeltรคvรค on kรคyttรถliittymรคssรค ("asiakas" tarkoittaa kirjaimellisesti "kรคyttรคjรคn tietokoneella"). Sovellus palauttaa vastauksen takaisin asiakaspuolelle, jossa jQuery-koodimme kuuntelee kรคrsivรคllisesti sen saapumista ja suorittaa muutamia yksinkertaisia โโkรคyttรถliittymรคtehtรคviรค vastaanotettuaan sen.
Olemme myรถs kรคsitelleet monia tรคrkeitรค usein kysyttyjรค kysymyksiรค Laraveliin ja PHP:hen liittyvรคt haastattelukysymykset niin uusille kuin kokeneillekin hakijoille oikean tyรถn saamiseksi.







