Laravel kurz pro začátečníky
⚡ Chytré shrnutí
Laravel je open-source PHP MVC framework vytvořený Taylorem Otwellem pro rychlé a čisté vytváření webových aplikací. Tento tutoriál vysvětluje, co je Laravel, jak ho nainstalovat pomocí Composeru a jak vytvořit funkční aplikaci pro nahrávání souborů pomocí tras, kontrolerů, validace formulářových požadavků a šablon Blade.
Co je Laravel?
laravel je open-source webový MVC framework pro PHP. Laravel je robustní framework, který poskytuje snadný vývoj webových aplikací PHP s funkcemi, jako je modulární balicí systém s vyhrazeným správcem závislostí, přístup k relačním databázím a další nástroje pro nasazení a údržbu aplikací.
Laravel vytvořil Taylor Otwell. Od svého prvního vydání v červnu 2011 (verze 1) se neustále těší stále větší popularitě v sektoru PHP frameworků v odvětví webového vývoje. Velká část této popularity lze připsat mnoha funkcím zaměřeným na vývojáře, které jsou standardně součástí.
Proč Laravel?
Asi 2000, většina PHP kód byl procedurální a mohl být nalezen ve formě „skriptů“, které by měly zamotanou změť kódu špaget. Ani ty nejjednodušší stránky neměly žádné oddělení obav, a proto bylo poměrně snadné, aby se aplikace rychle proměnila v noční můru údržby. Svět potřeboval něco lepšího. Vstoupila PHP verze 5 a řada PHP frameworků, které se snažily přinést tolik potřebnou strukturu a lepší řešení pro různé problémy s webovými aplikacemi.
Od té doby jsme byli svědky vydání mnoha frameworků, které vydláždily cestu pro populární frameworky používané dnes. Dnes by podle našeho názoru tři nejlepší frameworky byly Zend Framework, Symfony a samozřejmě Laravel. Ačkoli každý z těchto frameworků byl založen na podobných principech a je zaměřen na řešení (v podstatě) stejných běžných problémů, jejich klíčové rozdíly spočívají v jejich implementacích. Každý z nich má svá vlastní specifika, jak problémy řešit. Když se podíváte na kód, který každý z nich vytváří, uvidíte, že mezi nimi je poměrně pevná hranice. Podle našeho skromného názoru je framework Laravel nejlepší.
Více informací o rozdíl mezi Laravelem a CodeZapalovač.
Jak stáhnout a nainstalovat Laravel pomocí Composer
Poznámka: Tento tutoriál byl napsán pro Laravel 5.8, ale koncepty směrování, kontroleru, požadavku a blade zůstávají v aktuálních verzích stejné. V roce 2026 je nejnovější verzí Laravel 13 (vydána v březnu 2026), která vyžaduje PHP 8.3 nebo novější, zatímco Laravel 12 vyžaduje PHP 8.2.
Poznámka: Předpokládá se, že již máte na svém lokálním systému nainstalovanou kopii PHP. Pokud ne, můžete si přečíst, jak ji nainstalovat. zde.
Composer je správce balíčků i závislostí. Chcete-li jej nainstalovat, otevřete terminál a cd do nového adresáře. Spusťte tento příkaz:
curl -Ss getcomposer.org/installer | php
Výsledky tohoto příkazu budou vypadat takto:
Poznámka: Podrobnější pokyny k nastavení Laravelu naleznete v dokumentaci k Laravelu. zde.
Uvidíte, jak se stahuje a kompiluje skript composer.phar, který používáme k instalaci Laravelu. I když existuje mnoho způsobů, jak nastavit novou Laravel aplikaci, my to uděláme pomocí skriptu composer v Laravelu. Chcete-li tento skript nainstalovat, spusťte:
composer global require laravel/installer
Což bude vypadat nějak takto:
Tím se stáhnou a nainstalují všechny soubory frameworku a také všechny závislosti, které vyžaduje. Balíčky budou uloženy v adresáři vendor. Po stažení a instalaci stačí zadat následující příkaz:
laravel new uploadApp
Uvidíte něco jako následující výstup:
Composer instaluje všechny balíčky, které Laravel potřebuje ke svému běhu. Může to trvat několik minut, takže buďte trpěliví. Po dokončení spusťte příkaz ls -al a podívejte se, co bylo nainstalováno.
Zde je stručný rozpis adresářů v běžné aplikaci Laravel:
- aplikace/ : Toto je zdrojová složka, kde se nachází kód naší aplikace. V této složce se nacházejí všechny řadiče, zásady a modely.
- bootstrap/: Obsahuje spouštěcí skript aplikace a několik souborů mapy tříd.
- config/: Obsahuje konfigurační soubory aplikace. Ty se obvykle nemění přímo, ale spoléhají se na hodnoty nastavené v souboru .env (environment) v kořenovém adresáři aplikace.
- databáze/: Obsahuje databázové soubory včetně migrací, semen a testovacích továren.
- veřejný/: Veřejně přístupná složka obsahující zkompilované datové zdroje a samozřejmě soubor index.php.
- zdroje/: Obsahuje front-endové prvky, jako například JavaSoubory skriptů, jazykové soubory, soubory CSS/SASS a všechny šablony používané v aplikaci (nazývané šablony blade).
- trasy/: Všechny trasy v aplikaci jsou uvnitř tohoto souboru. Existuje několik různých „rozsahů“ tras, ale ten, na který se zaměříme, je soubor web.php.
- úložný prostor/ : Všechny dočasné soubory mezipaměti používané aplikací, soubory relací, kompilované skripty zobrazení a soubory protokolů.
- testy/: Obsahuje testovací soubory pro aplikaci, jako například jednotkové testy a funkční testy.
- prodejce/: Všechny balíčky závislostí nainstalované pomocí composeru.
A teď si sestavme zbytek aplikace a spusťme ji speciálním příkazem artisan (abychom si ušetřili starosti s instalací a konfigurací webového serveru, jako je Apache nebo nginx). Soubor .env obsahuje všechny konfigurační hodnoty, které soubory v adresáři /config používají ke konfiguraci aplikace.
Návrh aplikace: Rychlé shrnutí našich požadavků
V tomto online tutoriálu Laravel vytvoříme velmi jednoduchou aplikaci, která bude dělat pouze dvě věci:
- zpracovávat nahrávání souborů z webového formuláře
- zobrazit dříve nahrané soubory na jiné stránce.
V tomto projektu bude naše aplikace pouze pro zápis, což znamená, že uživatel může pouze zapisovat soubory a prohlížet si seznam souborů, které nahrál. Tato aplikace je velmi základní, ale měla by vám sloužit jako dobrý procvičovací materiál pro začátek budování vašich dovedností a znalostí Laravelu. V zájmu stručnosti jsme vyloučili jakékoli modelování databází, migrace a ověřování, ale v reálné aplikaci jsou to další věci, které budete chtít zvážit.
Zde je seznam komponent, které budeme potřebovat, aby aplikace fungovala podle očekávání:
- A trasa který umožní vnějšímu světu (internetu) používat aplikaci, a také určí koncový bod, který bude ukazovat na místo, kde se nachází logika pro ukládání nahraného souboru.
- A kontrolor který zpracovává tok požadavků k odpovědím.
- A šablona který bude použit k zobrazení seznamu dříve nahraných souborů a samotného formuláře pro nahrání.
- A požádat které kontrolér použije k ověření dat předaných z webového formuláře.
Co je to trasa?
Trasa v Laravelu je v podstatě koncový bod specifikovaný URI, který funguje jako „ukazatel“ na nějakou funkcionalitu nabízenou aplikací. Nejčastěji trasa jednoduše odkazuje na metodu na kontroleru a také určuje, které HTTP metody mohou na dané URI reagovat. Trasa nemusí vždy znamenat metodu kontroleru; může také pouze předat spuštění aplikace definované uzávěrové funkci nebo anonymní funkci.
Proč používat trasu?
Trasy jsou uloženy v souborech ve složce /routes v kořenovém adresáři projektu. Ve výchozím nastavení existuje několik různých souborů odpovídajících různým „stranám“ aplikace („strany“ pochází z metodiky hexagonální architektury). Patří mezi ně:
- web.php: veřejné trasy založené na „prohlížeči“. Tyto trasy jsou nejběžnější a webový prohlížeč je na ně zasahuje. Procházejí skupinou webového middlewaru a obsahují také funkce pro Ochrana CSRF (což pomáhá bránit se proti škodlivým útokům založeným na formulářích) a obecně obsahují určitý stupeň „stavu“ (tím myslíme, že využívají relace).
- api.php: trasy, které odpovídají skupině API, a proto mají ve výchozím nastavení povolený middleware API. Tyto trasy jsou bezstavové a nemají žádné relace ani paměť pro křížové požadavky (jeden požadavek nesdílí data ani paměť s žádným jiným požadavkem; každý z nich je samozapouzdřený).
- console.php: tyto trasy odpovídají vlastním příkazům artisan, které jste vytvořili pro svou aplikaci.
- channels.php: registruje trasy pro vysílání událostí.
Klíčovým souborem, kterým se v tuto chvíli zabýváme, je soubor web.php, specifický pro prohlížeč. Ve výchozím nastavení je již definována jedna trasa, a to ta, na kterou kliknete při navigaci do kořenového adresáře vaší aplikace (kořenový adresář se nachází ve veřejném adresáři). Pro fungování naší aplikace pro nahrávání budeme potřebovat tři různé trasy:
- /upload: toto bude URI hlavní stránky zobrazující náš webový formulář pro nahrávání souborů.
- /process: sem bude formulář umístěný na URI /upload odesílat data odeslaná z formuláře („akce“) formuláře.
- /list: zobrazí seznam všech souborů nahraných na web.
Poznámka: Koncový bod /list by možná nebyl potřeba, pokud bychom chtěli umístit veškerou logiku pro zobrazení formuláře pro nahrávání a seznamu souborů na jednu stránku; prozatím jsme je však ponechali odděleně, abychom k danému tématu přidali trochu více obsahu.
//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');
V tomto tutoriálu o Laravel frameworku pro každou požadovanou trasu ji explicitně uvedeme v souboru tras web.php pomocí jedné z dostupných metod specifických pro HTTP (get(), post(), put(), delete(), patch() nebo options()). Rozpis každé z nich naleznete pod tento ven. Tyto metody určují, které HTTP příkazy mají povolen přístup k dané trase. Pokud potřebujete, aby trasa mohla přijímat více než jeden HTTP příkaz (což by mohl být případ, pokud používáte jednu stránku pro zobrazení počátečních dat i dat po odeslání formuláře), můžete použít metodu Route::any().
Druhým argumentem metod Route::get() a Route::post() (a všech ostatních metod souvisejících s HTTP-slovesy na fasádě Route) je název konkrétního kontroleru a metoda umístěná uvnitř tohoto kontroleru, která se spustí po dosažení koncového bodu trasy s povoleným HTTP požadavkem (GET, POST, PATCH atd.). Pro všechny trasy používáme UploadController a specifikovali jsme je následujícím způsobem:
Poslední metodou, kterou voláme u každé trasy, je její funkce name(), která přijímá jeden řetězec jako argument a používá se k víceméně „označení“ konkrétní trasy snadno zapamatovatelným názvem (v našem případě upload, process a list). Dát každé trase vlastní název se nemusí zdát jako skvělá funkce, když... URL se jmenuje úplně stejně, ale opravdu se hodí, když máte specifickou trasu, jako například /users/profile/dashboard/config, kterou si snáze zapamatujete jako profile-admin nebo user-config.
Poznámka k fasádám:
- Fasády poskytují „statické“ rozhraní pro třídy, které jsou k dispozici v kontejneru služeb aplikace.
- Poskytují stručnou, zapamatovatelnou syntaxi, která vám umožňuje používat funkce Laravelu, aniž byste si pamatovali dlouhé názvy tříd, které je nutné vkládat nebo konfigurovat ručně.
Ve výše uvedených definicích tras používáme fasádu trasy namísto ručního vytváření instancí nového objektu Illuminate/Routing/Router a volání odpovídajících metod na tomto objektu. Je to jen zkratka, která šetří čas.pingFasády se v celém frameworku Laravel hojně používají; měli byste se s nimi lépe seznámit. Dokumentaci k Fasádám naleznete zde.
Co je to ovladač?
Řadič je „C“ v architektuře „MVC“ (Model-View-Controller), na které je založen Laravel. Úkol kontrolora lze zredukovat na tuto jednoduchou definici: přijme požadavek od klienta a vrátí klientovi odpověď. Toto je základní definice a zároveň minimální požadavek na jakýkoli daný kontroleru. To, co dělá mezi těmito dvěma věcmi, se obecně považuje za „akci“ kontroleru (neboli „implementaci trasy“). Funguje jako druhý vstupní bod do aplikace (prvním je požadavek) pro klienta, který odešle aplikaci datový obsah požadavku (ke kterému se dostaneme dále) a očekává nějaký typ odpovědi (ve formě stránky úspěchu, přesměrování, chybové stránky nebo jakéhokoli jiného druhu HTTP odpovědi).
Kontroler dělá (v podstatě) totéž co definice trasy s anonymní funkcí nastavenou jako „akce“ při dosažení této trasy. Rozdíl je v tom, že kontroler dobře snáší oddělení úkolů, zatímco trasa je definována přímo v dané trase. URL definice, což v podstatě znamená, že propojujeme URI přiřazené trase s implementací trasy nebo kódem, který se provede při dosažení této trasy.
Například následující dva kusy kódu dosáhnou stejné věci:
Příklad č. 1: Definice a implementace trasy v rámci jediného volání metody (v souboru web.php routes)
//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);
});
Příklad č. 2: Definice trasy je uvnitř souboru routes/web.php, ale její implementace se nachází uvnitř třídy /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);
}
}
I když se příklad č. 2 v Laravelu zdá být mnohem pracnější (což není, jen trochu více kódu), podívejte se na výhody, které získáme, když vložíme logiku akcí pro danou trasu „hello-world“ do kontroleru, místo abychom definovali trasu jako callback funkci:
- Naše logika je jasně oddělena do vlastní třídy (oddělení zájmů).
- Náš kontroler je nastaven pro pozdější rozšíření, pokud bychom potřebovali přidat další funkce. Řekněme, že bychom chtěli přidat funkci „sbohem světe“. V tomto případě bychom kontroler přejmenovali na obecnější „HelloController“ a poté definovali dvě samostatné metody, Ahoj() a Ahoj(). Také bychom potřebovali definovat dvě samostatné trasy, které mapovaly /Ahoj a / Ahoj URI k jejich příslušné metodě na kontroleru. To je žádoucí ve srovnání s navyšováním souboru tras s implementací každé trasy definovanou jako funkce zpětného volání.
- Laravel má vestavěnou schopnost ukládat do mezipaměti všechny definice tras v aplikaci, takže urychluje čas potřebný k nalezení dané trasy (zvyšuje výkon aplikace); nicméně, Toho budete moci využít pouze tehdy, pokud jsou všechny vaše definované trasy v aplikaci nakonfigurovány pomocí mapy specifické pro daný kontroler.pings (viz příklad č. 2 výše).
Spusťme tento příkaz, který nám vygeneruje nový kontroler.
// ...inside the project's root directory: php artisan make:controller UploadController
V podstatě tento příkaz vygeneruje stub pro kontrolery s názvem „UploadController“ v hlavním adresáři kontroleru na adrese /app/Http/Controllers/UploadController.php. Nebojte se tento soubor otevřít a podívat se na něj. Je to velmi jednoduché, protože se jedná pouze o stubbed verzi kontroleru se správnou cestou k jmennému prostoru a požadovanými třídami, ze kterých se rozšiřuje.
Generování požadavku
Než budeme pokračovat v tomto tutoriálu PHP Laravel a provedeme několik změn ve vygenerovaném stubu UploadControlleru, bude dávat větší smysl nejprve vytvořit třídu request. Je to proto, že metoda controlleru, která zpracovává požadavek, musí ve svém podpisu odkazovat na typ objektu request, což jí umožňuje automaticky ověřit příchozí data formuláře (jak je specifikováno v metodě rules(); o tom později). Prozatím znovu použijeme příkaz artisan k vygenerování našeho stubu request:
php artisan make:request UploadFileRequest
Tento příkaz vygeneruje soubor s názvem UploadFileRequest uvnitř adresáře app/Http/Requests/UploadFileRequest. Otevřete si stub a podívejte se na něj. Zjistíte, že je velmi jednoduchý, obsahuje pouze dvě metody, authorize() a rules().
Vytvoření ověřovací logiky
Upravme si request stub tak, aby vyhovoval potřebám naší aplikace. Upravme soubor tak, aby vypadal takto:
<?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'
];
}
}
Není to moc změn, ale všimněte si, že metoda authorize() nyní vrací true místo false. Tato metoda rozhoduje, zda povolí odeslání požadavku do aplikace. Pokud je nastavena na false, zabrání vstupu požadavku do systému. Toto by bylo velmi praktické místo pro umístění kontrol autorizace uživatele nebo jakékoli jiné logiky, která by mohla rozhodnout, zda se požadavek může přesunout do kontroleru. Prozatím zde pouze vracíme true, abychom umožnili všemu a všemu používat požadavek.
Druhá metoda, rules(), je místem, kde se projeví veškerá magie s ohledem na validaci. Myšlenka je jednoduchá: vrátit pole obsahující sadu pravidel ve tvaru:
'formFieldName' => 'constraints this field has separated by pipe characters (|)'
Existuje mnoho různých ověřovacích omezení, která jsou podporována Laravelem hned po vybalení. Jejich úplný seznam najdete v online dokumentaci zdePro naši nahrávací aplikaci budou existovat dvě pole, která se předávají prostřednictvím POST požadavku z formuláře na frontendu. Parametr fileName musí být zahrnut v těle formuláře (tj. povinný) a používá se jako název souboru, pod kterým budeme soubor ukládat v úložišti (to se provádí v kontroleru; k tomu se dostaneme o něco později). Také specifikujeme, že název souboru musí být řetězec, přidáním znaku svislé čáry (|) a slova 'string'. Omezení jsou vždy oddělena svislými čárkami, což vám umožňuje zadat libovolná další kritéria pro dané pole v jednom řádku.
Druhý parametr, userFile, je skutečný soubor, který uživatel nahrává z formuláře na webové stránce. userFile je také povinný a musí být souborem. Poznámka: Pokud bychom očekávali, že nahraný soubor bude obrázek, použili bychom omezení obrázku, které by omezilo typy souborů akceptované jako jeden z populárních typů obrázků (jpeg, png, bmp, gif nebo svg). Protože chceme uživateli umožnit nahrát jakýkoli typ souboru, zůstaneme u omezení validace souboru.
To je asi tak vše, co objekt request nabízí. Jeho hlavním úkolem je jednoduše uchovávat přijatelnou sadu kritérií (omezení), která musí parametry těla formuláře splňovat, aby bylo možné pokračovat hlouběji do aplikace. Dále je třeba poznamenat, že tato dvě pole (userFile a fileName) musí být také specifikována uvnitř HTML kódu ve formě vstupních polí (přičemž název pole odpovídá názvu uvnitř objektu request).
Možná se ptáte: toto definuje charakteristiky toho, co by měl formulářový požadavek obsahovat, ale kde se provádí samotná kontrola těchto omezení? K tomu se dostaneme příště.
Úprava ovladače
Otevřete aplikaci/Http/Controllers/UploadController a proveďte v ní následující změny:
<?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
}
}
Jedná se tedy o poměrně přímočarý přístup k ukládání nahraných souborů na disk. Zde je rozpis metody process() výše:
- V metodě controlleru, která provádí hlavní funkcionalitu, zadejte typový hint třídy požadavku, abychom mohli automaticky validovat příchozí data.
- Získejte soubor z (nyní ověřeného) objektu požadavku uvnitř metody controlleru.
- Z požadavku získejte název souboru.
- Vygenerujte konečný název souboru, který bude použit k uložení souboru. Metoda getClientOriginalExtension() jednoduše vezme původní příponu nahraného souboru.
- Uložte soubor do místního souborového systému pomocí jeho metody storeAs() a předejte pojmenovanou cestu v adresáři /storage jako 1. argument a název souboru, pod kterým se má uložit jako druhý.
- Vrátí odpověď JSON s uvedením, že požadavek byl úspěšný.
Šablona čepele
Posledním důležitým dílkem této skládačky je šablona blade, která bude obsahovat veškeré HTML, CSS a JavaSkript pro naši jednoduchou aplikaci. Zde je kód; vysvětlíme si ho později.
<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>
Tady je to, co je naše /nahrát stránka vypadá takto:
Toto je velmi typický příklad blade souboru obsahujícího HTML formulář a JavaSkript/jQuery pro přidání asynchronní funkcionality (aby se stránka neobnovovala). Existuje základní tag bez atributu method (který si vysvětlíme za chvíli) a se zvláštním atributem action s hodnotou {{route('process')}}. V blade je to známé jako Směrnice. Direktiva je jen ozdobný název pro funkci; jedná se o funkce specifické pro šablony blade, které provádějí různé operace společné pro tvorbu webových stránek a webových aplikací. Pro lepší pochopení všech užitečných věcí, které blade umí, se podívejte do dokumentace. zdeVe výše uvedeném případě používáme direktivu route k vygenerování URL pro odeslání našeho formuláře.
Nezapomeňte, že jsme trasy definovali dříve v aplikaci v souboru web.php a pro každou z nich jsme zadali snadno zapamatovatelný název. Direktiva {{route()}} přijímá název trasy, vyhledává jej v interně uloženém seznamu tras a generuje kompletní URL na základě definice dané trasy v souboru web.php. V tomto prvním případě specifikujeme, že chceme, aby formulář odeslal odeslaná data do /process URL naší aplikace, která je definována jako POST trasa.
Další věc, které jste si možná všimli, je tag @csrf přímo pod úvodním tagem formuláře. V Blade tento tag generuje parametr _token ve formuláři, který je v aplikaci ověřen předtím, než je povoleno zpracování dat z formuláře. Tím je zajištěno, že data uvnitř formuláře mají platný původ, a zabráněno útokům typu cross-site request forgery. Více informací o tomto tématu naleznete v dokumenty.
Poté definujeme náš formulář jako normální; všimněte si však, že názvy parametrů formuláře, userFile a fileName, jsou přesně stejný jak je definováno uvnitř našeho objektu požadavku. Pokud bychom zapomněli zahrnout vstup pro daný parametr, který byl definován v objektu požadavku (nebo bychom jej napsali špatně), požadavek by selhal a byla by vrácena chyba, což by zabránilo tomu, aby původní požadavek na formulář kdykoli dorazil k metodě kontroleru umístěné na UploadController@process.
Vyzkoušejte to a odešlete do aplikace několik souborů pomocí tohoto formuláře. Poté přejděte na /seznam na stránce zobrazíte obsah složky pro nahrání, přičemž soubory, které jste nahráli, jsou uvedeny v tabulce:
Větší obrázek
Udělejme krok zpět a podívejme se, co jsme v tomto tutoriálu o Laravelu udělali.
Tento diagram znázorňuje aplikaci v jejím současném stavu (bez detailů na vysoké úrovni):
Měli byste si vzpomenout, že objekt požadavku, který jsme vytvořili na začátku tohoto tutoriálu o Laravelu, by měl mít ve své metodě rules definované stejné parametry jako formulář v šabloně blade (pokud ne, přečtěte si znovu část „Vytvoření validační logiky“). Uživatel zadá formulář na webové stránce, která je vykreslena pomocí šablonovacího enginu blade, a odešle formulář. Kód jQuery šablony ve spodní části zastaví výchozí odeslání (které by automaticky přesměrovalo na samostatnou stránku), vytvoří požadavek ajax, načte požadavek s daty formuláře a nahraným souborem a celý proces odešle do první vrstvy naší aplikace: požadavku.
Objekt požadavku se naplní přiřazením parametrů uvnitř metody rules() k odeslaným parametrům formuláře a poté ověří data podle každého zadaného pravidla. Pokud jsou splněna všechna pravidla, požadavek se předá jakékoli metodě kontroleru odpovídající hodnotám definovaným v souboru trasy web.php. V tomto případě práci provede metoda process() objektu UploadController. Jakmile se dostaneme k kontroleru, již víme, že požadavek prošel validací, takže nemusíme znovu testovat, zda je zadaný název souboru skutečně řetězec, nebo zda parametr userFile skutečně obsahuje nějaký typ souboru. Můžeme pokračovat jako obvykle.
Metoda controlleru poté načte ověřené parametry z objektu požadavku, vygeneruje plný název souboru zřetězením předaného parametru fileName s původní příponou userFile, uloží soubor do adresáře v naší aplikaci a poté vrátí jednoduchou odpověď kódovanou ve formátu JSON, která ověřuje, že požadavek byl úspěšný. Odpověď je přijata logikou jQuery, která provede několik dalších úkolů souvisejících s uživatelským rozhraním, jako je zobrazení zprávy o úspěchu (nebo chybě) po dobu 5 sekund, její následné skrytí a také vymazání předchozích položek formuláře. To umožňuje uživateli s jistotou vědět, že požadavek byl úspěšný, a v případě potřeby může nahrát další soubor.
Také si všimněte, kde je na výše uvedeném diagramu hranice mezi klientem a serverem. Pochopení tohoto konceptu je naprosto zásadní a pomůže vám vyřešit problémy, které můžete v budoucnu narazit například při zvládání více asynchronních požadavků, které se mohou vyskytnout v daném okamžiku. Oddělení je přímo na hranici objektu požadavku. Samotný objekt požadavku lze považovat za „bránu“ do zbytku aplikace. Provádí počáteční validaci a registraci hodnot formuláře předávaných z webového prohlížeče. Pokud jsou považovány za platné, pokračuje do kontroleru. Vše před tím je na front-endu („klient“ doslova znamená „na počítači uživatele“). Odpověď se z aplikace vrací zpět na stranu klienta, kde náš kód jQuery trpělivě čeká na její příchod a po jejím přijetí provede několik jednoduchých úkolů uživatelského rozhraní.
Také jsme se zabývali mnoha důležitými často kladenými otázkami Otázky k pohovoru související s Laravelem a PHP pro nováčky i zkušené kandidáty, aby získali tu správnou práci.








