Laravel opetusohjelma aloittelijoille
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. Alkuperรคisen julkaisustaan โโkesรคkuussa 2011 (versio 1) lรคhtien se on kasvanut jatkuvasti suositummaksi web-kehitysteollisuuden PHP-kehyssektorilla. Suuri osa tรคstรค suosiosta johtuu sen mukana toimitetuista monista kehittรคjรคystรคvรคllisistรค ominaisuuksista.
Miksi Laravel?
Noin 2000, suurin osa PHP koodit oli menettelyllinen, ja se voi lรถytyรค "skriptien" muodossa, joissa olisi sotkuinen spagettikoodi. Jopa yksinkertaisimmilla sivuilla ei ollut huolenaiheiden erottaminen toisistaan, ja siksi sovelluksesta oli melko helppo kasvaa nopeasti yllรคpidon painajaiseksi. Maailma tarvitsi jotain parempaaโฆ Anna PHP-versio 5 ja useita PHP-kehyksiรค yrittรครคksesi tuoda kaivattua resoluutiota ja parempia ratkaisuja erilaisiin verkkosovellusongelmiin.
Sittemmin olemme nรคhneet monia kehyksiรค julkaistuja, jotka tasoittavat tietรค nykyisille ja nykyisille suosituille kehyksille. Tรคnรครคn kolme parasta olisi (mielestรคmme) Zend Framework, Symfony ja tietysti Laravel. Vaikka jokainen nรคistรค viitekehyksestรค perustui samanlaisiin periaatteisiin ja on suunnattu ratkaisemaan (periaatteessa) samoja yhteisiรค ongelmia, niiden tรคrkeimmรคt erot ovat niiden toteutukset. Heillรค jokaisella on omat omituisuutensa ongelmien ratkaisemisessa. Kun katsot kunkin niistรค tuottamaa koodia, huomaat, ettรค ne erottaa toisistaan โโmelko kiinteรค viiva. Nรถyrรค mielestรคmme Laravel-kehys on paras.
Lisรคtietoja Ero Laravelin ja CodeIgniterin vรคlillรค
Kuinka ladata ja asentaa Laravel Composerilla
HUOMAUTUS Oletuksena on, ettรค sinulla on jo kopio PHP:stรค asennettuna paikalliseen jรคrjestelmรครคsi. Jos ei, voit lukea kuinka se asennetaan 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รค:
Huomautuksia Katso Laravelin dokumentaatiosta laajemmat ohjeet Laravelin asettamisesta tรครคltรค.
Nรคet sen lataavan ja kรครคntรคvรคn composer.phar-skriptin, jota kรคytรคmme Laravelin asentamiseen. Vaikka on olemassa lukuisia tapoja luoda uusi Laravel-sovellus, teemme sen Laravelin sรคveltรคjรคkรคsikirjoituksen avulla. Asenna tรคmรค komentosarja suorittamalla:
composer global require laravel/installer
Joka nรคyttรครค suunnilleen tรคltรค:
Tรคmรค lataa ja asentaa kaikki kehystiedostot itse sekรค kaikki sen tarvitsemat riippuvuudet. Paketit tallennetaan toimittajahakemistoon. 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 paketit, joita Laravel tarvitsee toimiakseen. Se voi kestรครค muutaman minuutin, joten ole kรคrsivรคllinen. Kun se on valmis, suorita ls -al -komento nรคhdรคksesi, mitรค asennettiin.
Tรคssรค on lyhyt erittely yleisen Laravel-sovelluksen hakemistoista:
- sovellus/ : Tรคmรค on lรคhdekansio, jossa sovelluskoodimme sijaitsee. Kaikki ohjaimet, kรคytรคnnรถt ja mallit ovat tรคssรค kansiossa
- bootstrap/ : Sisรคltรครค sovelluksen kรคynnistysohjelman ja muutaman luokkakarttatiedoston
- config/ : Sisรคltรครค sovelluksen mรครคritystiedostoja. Nรคitรค ei yleensรค muokata suoraan, vaan ne perustuvat sovelluksen juuren .env (environment) -tiedostoon mรครคritettyihin arvoihin.
- tietokanta/ : Sisรคltรครค tietokantatiedostot, mukaan lukien siirrot, siemenet ja testitehtaat
- julkinen/ : Julkisesti saatavilla oleva kansio, joka sisรคltรครค kootut resurssit ja tietysti index.php-tiedoston
- resurssit/ : Sisรคltรครค kรคyttรถliittymรคn resursseja, kuten JavaScript-tiedostoja, kielitiedostoja, CSS/SASS-tiedostoja ja kaikki sovelluksessa kรคytetyt mallit (kutsutaan blade-malleiksi).
- reitit/ : Kaikki sovelluksen reitit ovat sisรคllรค tรครคllรค. Reittejรค on muutamia erilaisia, mutta yksi, johon keskitymme, on web.php-tiedosto
- varastointi/ : Kaikki sovelluksen kรคyttรคmรคt vรคliaikaiset vรคlimuistitiedostot, istuntotiedostot, kรครคnnetyt nรคkymรคskriptit ja lokitiedostot
- testit/: Sisรคltรครค sovelluksen testitiedostoja, kuten yksikkรถtestejรค ja toimintatestejรค.
- myyjรค/: Kaikki sรคveltรคjรคn mukana asennetut riippuvuuspaketit
Nyt sitten rakennetaan loput sovelluksesta ja ajetaan se erityisellรค artesaanikomennolla (sรครคstรคmme itseรคmme Web-palvelimen, kuten Apachen tai nginxin, asentamisesta ja mรครคrittรคmisestรค). .env-tiedosto sisรคltรครค kaikki mรครคritysarvot, joita /config-hakemiston tiedostot kรคyttรคvรคt sovelluksen mรครคrittรคmiseen. Sen sisรคllรค huomaat, ettรค sovelluksen sisรคosien kรคyttรคmien eri parametrien konfiguraatioarvot.
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 kirjoitus, mikรค tarkoittaa, ettรค kรคyttรคjรค voi kirjoittaa vain tiedostoja ja tarkastella lataamiensa tiedostojen luetteloa. Tรคmรค sovellus on erittรคin yksinkertainen, mutta sen pitรคisi toimia hyvรคnรค kรคytรคntรถnรค, jonka avulla voit alkaa rakentaa Laravel-taitojasi ja -tietojasi. Huomaa, ettรค lyhyyden vuoksi olen jรคttรคnyt pois tietokannan mallintamisen, siirrot ja todennuksen, mutta tosielรคmรคn sovelluksissa nรคmรค ovat muita asioita, joita sinun kannattaa harkita.
Tรคssรค on luettelo komponenteista, joita tarvitsemme saadaksemme sovelluksen toimimaan odotetulla tavalla:
- A reitti jonka avulla ulkomaailma (internet) voi kรคyttรครค sovellusta sekรค mรครคrittรครค pรครคtepisteen, joka osoittaa, missรค ladatun tiedoston tallentamisen logiikka sijaitsee
- A ohjain joka kรคsittelee pyynnรถn vastausvirtaan
- A sapluuna jota kรคytetรครคn nรคyttรคmรครคn luettelo aiemmin ladatuista tiedostoista ja itse latauslomake
- A pyyntรถ joita rekisterinpitรคjรค kรคyttรครค verkkolomakkeesta lรคhetettyjen tietojen vahvistamiseen
Mikรค on reitti?
Laravelin reitti on periaatteessa URI:n mรครคrittelemรค pรครคtepiste, joka toimii "osoittimena" johonkin sovelluksen tarjoamaan toimintoon. Yleisimmin reitti osoittaa yksinkertaisesti ohjaimessa olevaan menetelmรครคn ja myรถs sanelee, mitkรค HTTP-menetelmรคt voivat osua kyseiseen URI:hen. Reitti ei myรถskรครคn aina tarkoita ohjainmenetelmรครค; se voisi vain siirtรครค sovelluksen suorittamisen myรถs mรครคritellylle sulkemis- tai anonyymille toiminnolle.
Miksi kรคyttรครค Routea?
Reitit tallennetaan tiedostoihin /routes-kansioon projektin juurihakemistossa. Oletusarvoisesti sovelluksen eri "puolia" vastaavia tiedostoja on muutama ("puolet" tulee kuusikulmaisen arkkitehtuurin metodologiasta). Niihin kuuluvat:
- web.php Julkiset "selainpohjaiset" reitit. Nรคmรค ovat yleisimpiรค, ja verkkoselain iskee niihin. Ne kulkevat web-vรคliohjelmistoryhmรคn lรคpi ja sisรคltรคvรคt myรถs tilat csrf-suojaus (joka auttaa puolustautumaan lomakepohjaisilta haitallisilta hyรถkkรคyksiltรค ja hakkeroilta) ja sisรคltรคvรคt yleensรค jonkin verran "tilaa" (tarkoitan tรคllรค, ettรค ne kรคyttรคvรคt istuntoja)
- api.php Reitit, jotka vastaavat API-ryhmรครค ja joissa on siten API-vรคliohjelmisto oletuksena kรคytรถssรค. Nรคmรค reitit ovat tilattomia, eikรค niissรค ole istuntoja tai ristiinpyyntรถmuistia (yksi pyyntรถ ei jaa tietoja tai muistia minkรครคn muun pyynnรถn kanssa โ jokainen on itsekapseloitu).
- console.php Nรคmรค reitit vastaavat mukautettuja kรคsityรถlรคiskรคskyjรค, jotka olet luonut sovelluksellesi
- channels.php Rekisterรถi tapahtumien lรคhetysreitit
Avaintiedosto, jota on kรคsiteltรคvรค tรคllรค hetkellรค, on selainkohtainen, web.php . Oletusarvoisesti on jo mรครคritetty yksi reitti, johon osut oikealla navigoidessasi sovelluksesi verkkojuureen (verkkojuuri on julkisessa hakemistossa). Tarvitsemme kolmea eri reittiรค, jotta lataussovelluksemme toimisi:
- /upload Tรคmรค on pรครคsivun URI, joka nรคyttรครค verkkolomakkeemme tiedostojen lataamista varten.
- /process Tรคmรค on paikka, jossa /upload URI:ssa oleva lomake lรคhettรครค lomakkeella lรคhetetyt tiedot (lomakkeen "toiminto")
- /list Tรคmรค listaa kaikki sivustolle ladatut tiedostot
huomata /list-pรครคtepistettรค ei ehkรค tarvita, jos halusimme laittaa kaikki logiikka latauslomakkeen ja tiedostoluettelon nรคyttรคmiseksi yhdelle sivulle, mutta pidimme ne toistaiseksi erillรครคn lisรคtรคksemme hieman enemmรคn 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-kehyksen opetusohjelmassa luetellaan jokaiselle halutulle reitille se erikseen reittitiedostoon web.php kรคyttรคmรคllรค yhtรค kรคytettรคvissรค olevista HTTP-kohtaisista pyyntรถmenetelmistรค (get(), post(), put() , delete(), patch() tai option() ). Tarkista kunkin nรคistรค erittely tรคtรค ulos. Nรคmรค menetelmรคt mรครคrittelevรคt, mitkรค HTTP-verbit saavat kรคyttรครค tiettyรค reittiรค. Jos tarvitset reitin voidaksesi hyvรคksyรค useamman kuin yhden HTTP-verbin (mikรค voi olla tilanne, jos kรคytรคt yhtรค sivua sekรค alkutietojen nรคyttรคmiseen ettรค lรคhetettyjen lomaketietojen lรคhettรคmiseen), voit kรคyttรครค Route::any( ) menetelmรค.
Toinen argumentti sekรค Route::get()- ettรค Route::post()-metodeille (ja muille Reitin julkisivussa oleville HTTP-verbiin liittyville menetelmille) on tietyn ohjaimen ja sen sisรคllรค olevan menetelmรคn nimi. ohjain, joka suoritetaan osuessaan reitin pรครคtepisteeseen sallitulla HTTP-pyynnรถllรค (GET, POST, PATCH jne.) Kรคytรคmme UploadControlleria kaikille kolmelle reitille ja olemme mรครคrittรคneet ne seuraavasti:
Viimeinen menetelmรค, jota kutsumme kullakin reitillรค, on sen name()-funktio, joka hyvรคksyy yhden merkkijonon argumenttina ja jota kรคytetรครคn enemmรคn tai vรคhemmรคn "merkitsemรครคn" tietty reitti helposti muistettavalla nimellรค (meissรค tapauksissa lataa, kรคsittele ja luetteloi). Ymmรคrrรคn, ettรค ei vaikuta kovin hyvรคltรค ominaisuudesta antaa jokaiselle reitille oma nimi, kun URL-osoite on nimetty tรคsmรคlleen samalla tavalla, mutta se on todella hyรถdyllistรค, kun sinulla on tietty reitti, kuten /users/profile/dashboard/config, joka olisi helpompi muistaa nimellรค profile-admin tai user-config.
Huomautus julkisivuista:
- Julkisivut tarjoavat "staattisen" kรคyttรถliittymรคn luokille, jotka ovat saatavilla sovelluksen palvelusรคiliรถssรค."
- 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รค olevat reittimรครคritykset tรคssรค Laravel-kehysopetusohjelmassa, kรคytรคmme Reitin julkisivua sen sijaan, ettรค luomme manuaalisesti uuden Illuminate/Routing/Router-objektin ja kutsumme vastaavia menetelmiรค kyseiselle objektille. Se on vain pikakuvake, joka sรครคstรครค kirjoittamisen. Julkisivuja kรคytetรครคn paljon Laravel-kehyksessรค โ niihin voi ja kannattaa tutustua paremmin. Julkisivujen asiakirjat lรถytyvรคt 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 paljain kรคsin mรครคritelmรค ja se on myรถs minkรค tahansa ohjaimen vรคhimmรคisvaatimus. Se, mitรค se tekee nรคiden kahden asian vรคlillรค, katsotaan yleensรค ohjaimen "toimintoksi" (tai "reitin toteutukseksi"). Se toimii toisena sisรครคntulopisteenรค sovellukseen (ensimmรคinen on pyyntรถ) asiakkaalle, joka lรคhettรครค pyynnรถn hyรถtykuorman (johon pรครคsemme seuraavaksi) sovellukselle odottaen jonkinlaista vastausta (muodossa onnistumissivu, uudelleenohjaus, virhesivu tai mikรค tahansa muu HTTP-vastaus).
Ohjain tekee (periaatteessa) saman kuin reitinmรครคrittely, jonka anonyymi toiminto on asetettu "toiminnoksi", kun reitti osuu. Erona on se, ettรค ohjain kestรครค hyvin huolenaiheiden erottelun, kun taas reitti on mรครคritetty todellisen URL-mรครคritelmรคn mukaisesti, mikรค tarkoittaa periaatteessa, ettรค yhdistรคmme reitille osoitetun URI:n reitin toteutukseen tai koodiin, joka suoritetaan, kun kyseinen reitti on osuma.
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 routes/web.php:n sisรคllรค, mutta sen toteutus on /app/Http/Controllers/HelloWorldController-luokan sisรคllรค.
//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 nรคyttรครค paljon enemmรคn tyรถltรค (mitรค se ei ole โ vain vรคhรคn enemmรคn koodia riittรครค), katso hyรถdyt, joita saamme laittamalla toimintalogiikkamme annetulle "hello-world" -reitille ohjaimen sisรครคn. reitin mรครคrittelystรค takaisinsoittofunktiona:
- Logiikkamme on selkeรคsti erotettu omaan luokkaansa (huolenaiheiden erottelu)
- Ohjaimemme on asetettu laajennettavaksi myรถhemmin, jos tarvitsemme siihen lisรคominaisuuksiaโฆ Sano, ettรค ehkรค halusimme lisรคtรค "hyvรคsti maailma" -ominaisuuden... Tรคssรค tapauksessa nimeรคmme ohjaimen uudelleen yleisemmรคksi "HelloControlleriksi" ja mรครคritรคmme sitten kaksi erillistรค menetelmรครค, Hei() ja Hyvรคsti(). Meidรคn olisi myรถs mรครคritettรคvรค kaksi erillistรค reittiรค, jotka kartoittavat /Hei ja / Hyvรคsti URI-osoitteet sopivaan menetelmรครคn ohjaimessa. Tรคmรค on toivottavaa verrattuna reittitiedoston lihotukseen, jossa kunkin reitin toteutus on mรครคritelty takaisinsoittofunktioiksi.
- 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 mรครคrittรคmรคsi reitit sovelluksen sisรคllรค on mรครคritetty kรคyttรคmรคllรค ohjainkohtaisia โโkartoituksia (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 "UploadController"-nimiselle ohjaimelle ohjaimen pรครคhakemistoon osoitteessa /app/Http/Controllers/UploadController.php. Avaa tiedosto ja katso se. Se on hyvin yksinkertaista, koska se on vain ohjaimen tynkรคversio, jossa on oikea nimiavaruuden polku ja vaaditut luokat, joista se ulottuu.
Pyynnรถn luominen
Ennen kuin jatkamme tรคssรค PHP Laravel -opetusohjelmassa ja teemme muutamia muutoksia UploadControllerin luomaan tyngรครคn, mielestรคni on jรคrkevรคmpรครค luoda pyyntรถluokka ensin. Tรคmรค johtuu siitรค, ettรค pyyntรถรค kรคsittelevรคn controller-metodin on kirjoitettava vihje pyyntรถobjektille allekirjoituksessaan, jolloin se voi automaattisesti vahvistaa saapuvat lomaketiedot (mรครคritelty rule()-metodissa. Siitรค lisรครค myรถhemminโฆ) Kรคytetรครคn nyt artisan-komento uudelleen luomaan pyyntรถmme tynkรค:
php artisan make:request UploadFileRequest
Tรคmรค komento luo tiedoston nimeltรค UploadFileRequest sisรคllรค app/Http/Requests/UploadFileRequest. Avaa tynkรค ja kurkistaโฆ Se on hyvin yksinkertainen, sillรค se sisรคltรครค vain kaksi menetelmรครค, Authorize() ja sรครคnnรถt.
Validointilogiikan luominen
Muokkaamme pyynnรถn tynkรค vastaamaan sovelluksemme tarpeita. Muokkaa tiedostoa niin, ettรค se nรคyttรครค tรคltรค:
<?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 paljon muutoksia, mutta huomaa, ettรค authorize()-metodi palauttaa nyt true eikรค false. Tรคmรค menetelmรค pรครคttรครค, sallitaanko pyynnรถn siirtyminen sovellukseen vai ei. Jos arvoksi on asetettu epรคtosi, se estรครค pyyntรถรค saapumasta jรคrjestelmรครคn (joka normaalisti olisi ohjaimen menetelmรค). Tรคmรค olisi erittรคin kรคtevรค paikka tehdรค kรคyttรคjรคn valtuutustarkistuksia tai mikรค tahansa muu logiikka, joka voi pรครคttรครค, voidaanko pyyntรถ siirtรครค eteenpรคin ohjaimelle. Toistaiseksi palaamme tรคhรคn vain totta, jotta kaikki ja kaikki voivat kรคyttรครค pyyntรถรค.
Toinen menetelmรค, rules() on se, jossa kaikki taika tulee voimaan validoinnissa. 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รคssรค olevasta lomakkeesta. FileName-parametrin tulee olla 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รค tiedoston nimen on oltava merkkijono lisรครคmรคllรค putkimerkki (|) ja sana "merkkijono". Rajoitukset on aina rajattu putkilla, jolloin voit mรครคrittรครค lisรคkriteerit annetulle kentรคlle yhdellรค rivillรค! Mikรค voima!
Toinen parametri, userFile, on varsinainen tiedosto, jonka kรคyttรคjรค lataa verkkosivun lomakkeesta. UserFile vaaditaan myรถs ja tรคytyy olla tiedosto. Huomautus: Jos odotimme ladatun tiedoston olevan kuva, kรคyttรคisimme sen sijaan kuvarajoitusta, joka rajoittaisi yhdeksi suosituista kuvatyypeistรค hyvรคksyttyjรค tiedostotyyppejรค (jpeg, png, bmp, gif tai svg). Koska haluamme sallia kรคyttรคjรคn ladata minkรค tahansa tyyppisiรค tiedostoja, pysymme vain tiedoston vahvistusrajoituksessa.
Siinรค on kaikki, mitรค pyyntรถobjektissa on. Sen pรครคtehtรคvรคnรค on yksinkertaisesti pitรครค hallussaan hyvรคksyttรคvรคt kriteerit (rajoitukset), jotka lomakkeen runkoparametrien on tรคytettรคvรค voidakseen edetรค syvemmรคlle sovellukseen. Toinen huomioitava 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 nimi vastaa pyyntรถobjektin sisรคllรค olevaa nimeรค).
Saatat kysyรค: tรคmรค varmasti mรครคrittรครค ominaisuudet, mitรค lomakepyynnรถn tulee sisรคltรครค, mutta missรค nรคiden rajoitusten varsinainen tarkistus tehdรครคn? Palataan asiaan 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 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
}
}
Joten se on melko yksinkertainen tapa tallentaa ladatut tiedostot levylle. Tรคssรค on erittely yllรค olevasta upload()-menetelmรคstรค:
- Kirjoita pyyntรถluokka ohjainmenetelmรครคn, joka suorittaa liha ja perunat -toiminnon, jotta voimme tarkistaa saapuvat tiedot automaattisesti
- Ota tiedosto pois (nyt validoidusta) pyyntรถobjektista controller-metodin sisรคllรค (tรคssรค tapauksessa olemme antaneet sille nimen upload(), mutta se olisi voitu nimetรค myรถs standardoidulla nimellรค, kuten store()).
- Ota tiedostonimi pois 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.
- Palauta JSON-vastaus, joka osoittaa, ettรค pyyntรถ onnistui
Blade-malli
Tรคmรคn palapelin viimeinen tรคrkeรค osa on blade-malli, joka sisรคltรครค kaikki HTML-, CSS- ja JavaScript-koodit yksinkertaista sovellusta varten. Tรคssรค on koodi โ selitรคmme sen myรถhemmin.
<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>
Tรคssรค on mitรค meidรคn / lataa sivu nรคyttรครค tรคltรค:
Tรคmรค on hyvin tyypillinen esimerkki blade-tiedostosta, joka sisรคltรครค HTML-lomakkeen ja javascriptin/jQueryn asynkronisten toimintojen lisรครคmiseksi (jotta sivu ei pรคivity). On perus -tunniste, jossa ei ole method-attribuuttia (jonka selitรคn vain sekunnissa) ja uteliaalla action-attribuutilla, jonka arvo on {{route('file.upload')}}. Terรคssรค tรคmรค tunnetaan nimellรค a Direktiivi. Direktiivi on vain funktion kuvitteellinen nimi โ ne ovat korttimalleille ominaisia โโtoimintoja, jotka suorittavat erilaisia โโtoimintoja, jotka ovat yhteisiรค verkkosivujen ja verkkosovellusten rakentamisessa. Asiakirjoista saat paremman kรคsityksen kaikesta hienosta paskasta, jota blade voi tehdรค tรครคltรค. Yllรค olevassa tapauksessa kรคytรคmme reittiohjetta URL-osoitteen luomiseen lomakkeen lรคhettรคmistรค varten.
Muista, ettรค mรครคritimme reitit aiemmin sovelluksessa web.php-tiedoston sisรคllรค ja mรครคritimme jokaiselle helposti muistettavan nimen. {{route()}}-kรคsky hyvรคksyy reitin nimen, etsii sen sisรคisesti vรคlimuistissa olevasta reittiluettelosta ja luo tรคydellisen URL-osoitteen 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 sovelluksemme /process-URL-osoitteeseen, joka on mรครคritelty POST reittiรค.
Seuraava outo asia, jonka olet ehkรค huomannut, on @csrf-tunniste heti avauslomakkeen tagin alla. Bladessa tรคmรค tagi luo lomakkeeseen _token-parametrin, joka tarkistetaan sovelluksen sisรคllรค ennen kuin lomaketietojen kรคsittely sallitaan. Tรคmรค varmistaa, ettรค lomakkeen sisรคltรคmรคt tiedot ovat kelvollista alkuperรครค ja estรครค sivustojen vรคliset pyyntรถvรครคrennรถshyรถkkรคykset. Lisรคtietoja tรคstรค on osoitteessa docs.
Tรคmรคn jรคlkeen mรครคrittelemme lomakkeemme normaaliksi, mutta huomioi, ettรค lomakeparametreidemme userFile ja fileName nimet ovat tรคsmรคlleen sama kuten on mรครคritelty pyyntรถobjektissamme. Jos unohdamme sisรคllyttรครค syรถtteen tietylle parametrille, joka mรครคritettiin pyyntรถobjektissa (tai kirjoitimme sen vรครคrin), pyyntรถ epรคonnistuu ja palautettaisiin virhe, joka estรคisi alkuperรคistรค lomakepyyntรถรค osumasta ohjainmenetelmรครคn, joka sijaitsee osoitteessa UploadController@ kรคsitellรค asiaa .
Mene eteenpรคin ja 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
Otetaan askel taaksepรคin ja katsotaan, mitรค olemme tehneet tรคssรค Laravel-opetusohjelmassa.
Tรคmรค kaavio esittรครค sovelluksen sellaisena kuin se on tรคllรค hetkellรค (ei sisรคllรค korkean tason yksityiskohtia):
Muista, ettรค tรคmรคn Laravel-opetusohjelman alussa luomallamme pyyntรถobjektilla tulisi olla samat parametrit, jotka on mรครคritelty sen sรครคntรถmenetelmรคssรค kuin korttimallin lomakkeessa (jos et, lue uudelleen osio "Validointilogiikan luominen"). . Kรคyttรคjรค syรถttรครค lomakkeen web-sivulle, joka hahmonnetaan blade-mallimoottorin kautta (tรคmรค prosessi on tietysti automaattiohjattu, joten meidรคn ei tarvitse edes ajatella sitรค) ja lรคhettรครค lomakkeen. Mallin alareunassa oleva jQuery-koodi pysรคyttรครค oletuslรคhetyksen (joka ohjaa automaattisesti erilliselle sivulle), luo ajax-pyynnรถn, lataa pyynnรถn lomakkeen tiedoineen ja lataa tiedoston ja lรคhettรครค koko jutun ensimmรคiseen kerrokseen. sovellus: pyyntรถ.
Pyyntรถobjekti tรคytetรครคn yhdistรคmรคllรค sรครคnnรถt()-metodin sisรคllรค olevat parametrit lรคhetettyihin lomakeparametreihin, minkรค jรคlkeen se vahvistaa tiedot kunkin mรครคritetyn sรครคnnรถn mukaisesti. Jos kaikki sรครคnnรถt tรคyttyvรคt, pyyntรถ vรคlitetรครคn mille tahansa ohjainmenetelmรคlle, joka vastaa reittitiedostossa web.php mรครคritettyjรค arvoja. Tรคssรค tapauksessa UploadControllerin process()-menetelmรค tekee tyรถn. Kun osumme ohjaimeen, tiedรคmme jo, ettรค pyyntรถ lรคpรคisi vahvistuksen, joten meidรคn ei tarvitse testata uudelleen, onko annettu tiedostonimi itse asiassa merkkijono vai sisรคltรครคkรถ userFile-parametri todella jonkin tyyppisen tiedostonโฆ Voimme jatkaa nรคin normaali.
Ohjausmenetelmรค nappaa sitten validoidut parametrit pyyntรถobjektista, luo tรคyden tiedostonimen ketjuttamalla vรคlitetyn fileName-parametrin userFilen alkuperรคiseen tunnisteeseen, tallentaa tiedoston sovelluksemme hakemistoon ja palauttaa sitten yksinkertaisen JSON-koodatun vastauksen, joka vahvistaa pyynnรถn onnistumisen. Vastauksen vastaanottaa jQuery-logiikka, joka suorittaa muutamia kรคyttรถliittymรครคn liittyviรค tehtรคviรค, kuten nรคyttรครค onnistumis- (tai virhe-)viestin 5 sekunniksi, sitten piilottaa sen sekรค tyhjentรครค aiemmat lomakemerkinnรคtโฆ tรคmรค on, jotta kรคyttรคjรค tietรครค varmistaakseen, ettรค pyyntรถ onnistui, ja voivat halutessaan ladata toisen tiedoston.
Huomaa myรถs yllรค olevasta kaaviosta, missรค raja on vedetty asiakkaan ja palvelimen vรคlille. Tรคmรค kรคsite on ehdottoman tรคrkeรค ymmรคrtรครคksesi, ja se auttaa sinua ratkaisemaan ongelmia ja ongelmia, joita sinulla saattaa olla tulevaisuudessa, kun jongleeraat esimerkiksi useita asynkronisia pyyntรถjรค, joita voi esiintyรค milloin tahansa. Erottelu on aivan pyyntรถobjektin rajalla. Itse pyyntรถobjektia voidaan pitรครค "yhdyskรคytรคvรคnรค" muuhun sovellukseenโฆ Se suorittaa verkkoselaimesta vรคlitettรคvien lomakearvojen alkuperรคisen vahvistuksen ja rekisterรถinnin. Jos ne katsotaan kelvollisiksi, se jatkuu ohjaimelle. Kaikki ennen sitรค on kรคyttรถliittymรคssรค ("asiakas" tarkoittaa kirjaimellisesti "kรคyttรคjรคn tietokoneessa"). Vastaus palautetaan sovelluksesta takaisin asiakaspuolelle, jossa jQuery-koodimme kuuntelee kรคrsivรคllisesti sen saapumista ja suorittaa muutaman yksinkertaisen kรคyttรถliittymรคtehtรคvรคn vastaanotettuaan sen.
Olemme kรคsitelleet yli 90 tรคrkeรครค usein kysyttyรค Laraveliin ja PHP:hen liittyvรคt haastattelukysymykset niin uusille kuin kokeneillekin hakijoille oikean tyรถn saamiseksi.







