Підручник Laravel для початківців
Що таке Laravel?
Laravel це веб-платформа MVC з відкритим кодом для PHP. Laravel — це надійна структура, яка забезпечує легку розробку веб-додатків на PHP із такими функціями, як модульна система упаковки з виділеним менеджером залежностей, доступом до реляційних баз даних та іншими утилітами для розгортання та обслуговування додатків.
Laravel створив Тейлор Отвелл. З моменту свого першого випуску в червні 2011 року (версія 1) він неухильно ставав все більш популярним у секторі PHP-фреймворків індустрії веб-розробки. Велику частину такої популярності можна пояснити багатьма функціями, орієнтованими на розробників, які входять до комплекту.
Чому Laravel?
Близько 2000 року, більшість PHP коди був процедурним і його можна було знайти у формі «сценаріїв», які містили б заплутаний безлад спагетті-коду. Навіть найпростіших сторінок не було розділення проблем, і тому програмі було досить легко швидко перетворитися на кошмар обслуговування. Світ потребував чогось кращого… Введіть PHP версії 5 і низку PHP-фреймворків, які намагаються привнести вкрай необхідне вирішення та покращити вирішення різноманітних проблем веб-додатків.
Відтоді ми побачили багато випущених фреймворків, які проклали шлях до популярних фреймворків, які існують і використовуються сьогодні. Сьогодні трійку лідерів (на нашу думку) складатимуть Zend Framework, Symfony і, звичайно, Laravel. Хоча кожна з цих структур була заснована на подібних принципах і спрямована на вирішення (в основному) однакових загальних проблем, їх ключові відмінності полягають у їхній реалізації. У кожного з них є свої примхи щодо вирішення проблем. Коли ви подивіться на код, створений кожним із них, ви побачите, що їх один від одного відокремлює суцільна лінія. На нашу скромну думку, фреймворк Laravel є найкращим.
Дізнатися більше про Різниця між Laravel і CodeIgniter
Як завантажити та встановити Laravel за допомогою Composer
ПРИМІТКА Передбачається, що у вашій локальній системі вже встановлено копію PHP. Якщо ні, ви можете прочитати, як його встановити тут
Composer є водночас і пакунком, і менеджером залежностей. Щоб установити його, відкрийте термінал і перейдіть у новий каталог. Виконайте цю команду:
curl -Ss getcomposer.org/installer | php
Результати цієї команди виглядатимуть так:
Примітка: Щоб отримати докладніші інструкції з налаштування Laravel, зверніться до документації Laravel тут.
Ви побачите, як він завантажує та компілює сценарій composer.phar, який ми використовуємо для встановлення Laravel. Хоча існує багато способів налаштувати нову програму Laravel, ми зробимо це за допомогою сценарію композитора Laravel. Щоб встановити цей сценарій, запустіть:
composer global require laravel/installer
Що виглядатиме приблизно так:
Це завантажить і встановить усі самі файли рамки, а також усі необхідні залежності. Пакети будуть збережені в каталозі постачальника. Після завантаження та встановлення це так само просто, як введення такої команди:
laravel new uploadApp
Ви побачите щось на зразок такого результату:
Composer встановлює всі пакети, необхідні Laravel для роботи. Це може зайняти кілька хвилин, тому запасіться терпінням. Після завершення виконайте команду ls -al, щоб переглянути, що встановлено.
Ось короткий розподіл каталогів у звичайній програмі Laravel:
- додаток/ : Це вихідна папка, де знаходиться код нашої програми. Усі контролери, політики та моделі містяться в цій папці
- bootstrap/ : Містить сценарій запуску програми та декілька файлів карти класу
- конфігурація/: Зберігає файли конфігурації програми. Зазвичай вони не змінюються безпосередньо, а натомість покладаються на значення, встановлені у файлі .env (середовище) у корені програми
- база даних/ : Містить файли бази даних, включаючи міграції, насіння та тестові фабрики
- публічний/ : Загальнодоступна папка, що містить скомпільовані ресурси та, звичайно, файл index.php
- ресурси/ : Містить інтерфейсні ресурси, такі як файли JavaScript, мовні файли, файли CSS/SASS і всі шаблони, які використовуються в програмі (так звані шаблони блейдів)
- маршрути/ : Тут знаходяться всі маршрути в додатку. Є кілька різних «областей» маршрутів, але ми зосередимося на файлі web.php
- зберігання/ : Усі тимчасові кеш-файли, які використовує програма, файли сеансів, скомпільовані сценарії перегляду та файли журналу
- тести/ : Містить тестові файли для програми, такі як модульні тести та функціональні тести.
- постачальник/ : Усі пакети залежностей інстальовано разом із композитором
А тепер давайте створимо решту програми та запустимо її за допомогою спеціальної команди artisan (щоб позбавити себе від клопоту щодо встановлення та налаштування веб-сервера, наприклад Apache або nginx). Файл .env містить усі значення конфігурації, які файли в каталозі /config використовують для налаштування програми. Усередині нього ви помітите, що значення конфігурації для різних параметрів використовуються внутрішніми засобами програми.
Дизайн програми: короткий виклад наших вимог
У цьому онлайн-посібнику Laravel ми створимо дуже просту програму, яка виконуватиме лише дві речі:
- обробляти завантаження файлів із веб-форми
- відображення раніше завантажених файлів на іншій сторінці.
Для цього проекту наша програма буде лише для запису, тобто користувач зможе лише записувати файли та переглядати список файлів, які він завантажив. Ця програма є надзвичайно простою, але вона має стати хорошою практикою для того, щоб ви почали розвивати свої навички та знання Laravel. Зауважте, що для стислості я виключив будь-яке моделювання бази даних, міграцію та автентифікацію, але в реальній програмі це додаткові речі, які ви захочете розглянути.
Ось список компонентів, які нам знадобляться, щоб програма працювала належним чином:
- A маршрут що дозволить зовнішньому світу (Інтернету) використовувати програму, а також вкаже кінцеву точку, яка вказуватиме на те, де розташована логіка для збереження завантаженого файлу
- A контролер який обробляє потік запиту до відповіді
- A шаблон який використовуватиметься для відображення списку раніше завантажених файлів і самої форми завантаження
- A запросити який контролер використовуватиме для перевірки даних, переданих із веб-форми
Що таке маршрут?
Маршрут у Laravel — це, по суті, кінцева точка, визначена URI, яка діє як «вказівник» на певну частину функціональності, яку пропонує програма. Найчастіше маршрут просто вказує на метод на контролері, а також диктує, які методи HTTP можуть досягати цього URI. Маршрут також не завжди означає метод контролера; він також може просто передати виконання програми визначеній Closure або анонімній функції.
Навіщо використовувати Route?
Маршрути зберігаються у файлах у папці /routes у кореневому каталозі проекту. За замовчуванням існує кілька різних файлів, які відповідають різним «сторонам» програми («сторони» походять із методології гексагональної архітектури). Вони включають:
- web.php Загальнодоступні маршрути на основі «браузера». Це найпоширеніші, і це те, що потрапляє у веб-браузер. Вони проходять через групу веб-проміжного програмного забезпечення, а також містять засоби для Захист csrf (що допомагає захиститися від зловмисних атак і хакерів на основі форм) і, як правило, містять певний «стан» (під цим я маю на увазі, що вони використовують сеанси)
- api.php Маршрути, які відповідають групі API і, таким чином, мають проміжне програмне забезпечення API, увімкнене за замовчуванням. Ці маршрути не мають стану та не мають сеансів або пам’яті для перехресних запитів (один запит не ділиться даними чи пам’яттю з будь-яким іншим запитом – кожен із них самоінкапсулюється).
- console.php Ці маршрути відповідають спеціальним командам, які ви створили для своєї програми
- channels.php Реєструє маршрути для трансляції подій
Ключовий файл, про який зараз варто звернути увагу, — це веб-браузер, web.php. Уже існує один маршрут, визначений за замовчуванням, це той, який ви натискаєте прямо під час переходу до кореневої веб-сторінки вашої програми (коренева веб-версія знаходиться в загальнодоступному каталозі). Нам знадобляться три різні маршрути для роботи нашої програми завантаження:
- /upload Це буде URI головної сторінки, на якій відображається наша веб-форма для завантаження файлів.
- /process Це буде місце, куди форма, розташована за URI /upload, розміщуватиме дані, надіслані у формі («дія» форми)
- /list Це список усіх файлів, завантажених на сайт
увагу Кінцева точка /list може не знадобитися, якщо ми хочемо помістити всю логіку для відображення форми завантаження та списку файлів на одній сторінці, однак ми поки що залишили їх окремо, щоб додати трохи більше змісту до теми, що розглядається. .
//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');
У цьому навчальному посібнику з фреймворку Laravel ми явно перерахуємо кожен потрібний маршрут у файлі маршрутів web.php за допомогою одного з доступних методів HTTP-запиту (get(), post(), put() , delete(), patch() або options() ). Перегляньте розбивку кожного з них це поза. Ці методи вказують, яким HTTP-дієсловам дозволено доступ до заданого маршруту. Якщо вам потрібен маршрут, щоб мати можливість прийняти більше одного HTTP-дієслова (це може бути у випадку, якщо ви використовуєте одну сторінку для відображення початкових даних і даних форми після відправки), ви можете використати Route::any( ) метод.
Другим аргументом методу Route::get() і Route::post() (і будь-якого іншого методу, пов’язаного з дієсловом HTTP на фасаді Route), є ім’я конкретного контролера та методу, що міститься в цьому контролер, який виконується після потрапляння на кінцеву точку маршруту дозволеним HTTP-запитом (GET, POST, PATCH тощо). Ми використовуємо UploadController для всіх трьох маршрутів і вказали їх таким чином:
Останнім методом, який ми викликаємо для кожного маршруту, є його функція name(), яка приймає один рядок як аргумент і використовується для більш-менш «тегування» певного маршруту назвою, яку легко запам’ятати (у наших випадках, завантаження, обробка та список). Я розумію, що дати кожному маршруту власне ім’я, коли URL-адреса має однакову назву, не здається такою чудовою функцією, але це дуже зручно, коли у вас є певний маршрут, наприклад /users/profile/dashboard/config, який легше запам’ятати як profile-admin або user-config.
Примітка про фасади:
- Фасади забезпечують «статичний» інтерфейс для класів, доступних у сервісному контейнері програми».
- Вони забезпечують стислий синтаксис, що запам’ятовується, що дозволяє використовувати функції Laravel, не запам’ятовуючи довгі назви класів, які потрібно вводити чи налаштовувати вручну.
У наведених вище визначеннях маршрутів у цьому підручнику з фреймворку Laravel ми використовуємо фасад Route замість того, щоб вручну створювати новий об’єкт Illuminate/Routing/Router і викликати відповідні методи для цього об’єкта. Це просто ярлик, який заощаджує введення. Фасади активно використовуються у фреймворку Laravel – ви можете і повинні ознайомитися з ними ближче. Документи для фасадів можна знайти тут.
Що таке контролер?
Контролер — це «C» в архітектурі «MVC» (Model-View-Controller), на якій базується Laravel. Роботу контролера можна звести до такого простого визначення: Він отримує запит від клієнта та повертає відповідь клієнту. Це базове визначення, а також мінімальні вимоги до будь-якого контролера. Те, що він робить між цими двома речами, зазвичай вважається «дією» контролера (або «реалізацією маршруту»). Він діє як друга точка входу до програми (першою є запит) для клієнта, який надсилає корисне навантаження запиту (до якого ми перейдемо далі) до програми, очікуючи певного типу відповіді (у формі сторінка успіху, переспрямування, сторінка помилки або будь-який інший тип відповіді HTTP).
Контролер робить (загалом) те ж саме, що й визначення маршруту з анонімною функцією, встановленою як «дія», коли цей маршрут потрапляє. Різниця полягає в тому, що контролер добре дотримується поділу проблем, тоді як маршрут визначається всередині фактичного визначення URL-адреси, що в основному означає, що ми поєднуємо призначений маршруту URI з реалізацією маршруту або кодом, який виконується, коли цей маршрут удар.
Наприклад, наступні дві частини коду досягнуть того самого:
Приклад №1: визначення та реалізація маршруту в одному виклику методу (у файлі маршрутів web.php)
//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); });
Приклад №2: визначення маршруту міститься в routes/web.php, але його реалізація знаходиться в класі /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); } }
Хоча приклад Laravel №2 здається набагато додатковим (а це не так – лише трохи більше коду й усе), подивіться на переваги, які ми отримуємо, розмістивши нашу логіку дій для даного маршруту «hello-world» усередині контролера. із визначенням маршруту як функції зворотного виклику:
- Наша логіка чітко розділена на власний клас (поділ проблем)
- Наш контролер налаштовано на розширення пізніше, якщо нам знадобиться додати до нього додаткові можливості… Скажімо, можливо, ми хотіли б додати функцію «до побачення, світ»… У цьому випадку ми перейменуємо контролер у більш загальний «HelloController», а потім визначимо два окремі методи, привіт() та до побачення(). Нам також потрібно буде визначити два окремих маршрути, які відображатимуть /привіт та / до побачення URI відповідного методу на контролері. Це бажано порівняно зі збільшенням файлу маршрутів із визначенням реалізації кожного маршруту як функції зворотного виклику.
- Laravel має вбудовану можливість кешувати всі визначення маршрутів у програмі, щоб пришвидшити час, потрібний для пошуку заданого маршруту (підвищити продуктивність програми); проте, ви зможете скористатися цим, лише якщо всі визначені вами маршрути всередині програми налаштовано за допомогою відображень для конкретного контролера (див. приклад №2 вище)
Давайте запустимо цю команду, яка створить для нас новий контролер.
// ...inside the project's root directory: php artisan make:controller UploadController
По суті, ця команда створює заглушку для контролера під назвою «UploadController» всередині основного каталогу контролера за адресою /app/Http/Controllers/UploadController.php. Не соромтеся відкрити цей файл і поглянути. Це дуже просто, оскільки це лише видалена версія контролера з правильним шляхом до простору імен і потрібними класами, з яких він розширюється.
Формування запиту
Перш ніж ми продовжимо цей навчальний посібник із PHP Laravel і внесемо кілька змін у згенерований заглушку UploadController, я думаю, буде доцільніше спочатку створити клас запиту. Це пов’язано з тим, що метод контролера, який обробляє запит, має ввести підказку об’єкта запиту у своєму підписі, дозволяючи йому автоматично перевіряти вхідні дані форми (як зазначено в методі rules(). Докладніше про це пізніше…) Наразі давайте використаємо знову команду artisan, щоб створити заглушку запиту:
php artisan make:request UploadFileRequest
Ця команда створить файл під назвою UploadFileRequest у app/Http/Requests/UploadFileRequest. Відкрийте заглушку та подивіться... Ви побачите, що це дуже просто, що містить лише два методи: authorize() і rules.
Створення логіки перевірки
Давайте змінимо заглушку запиту відповідно до потреб нашої програми. Змініть файл так, щоб він виглядав так:
<?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' ]; } }
Не так багато змін, але зауважте, що метод authorize() тепер повертає true замість false. Цей метод вирішує, чи дозволяти запиту надходити до програми. Якщо встановлено значення false, це зупиняє запит від входу в систему (що зазвичай є методом на контролері). Це було б дуже зручне місце для проведення будь-яких перевірок авторизації користувача або будь-якої іншої логіки, яка може вирішити, чи можна передавати запит до контролера. Наразі ми просто повертаємо true тут, щоб дозволити будь-чому використовувати запит.
Інший метод, rules() — це те, де вся магія вступає в дію щодо перевірки. Ідея проста: повернути масив, що містить набір правил у формі:
'formFieldName' => 'constraints this field has separated by pipe characters (|)'
Існує багато різних обмежень перевірки, які підтримуються Laravel прямо з коробки. Щоб отримати їх повний список, перегляньте онлайн-документацію тут. Для нашої програми завантаження буде два поля, які передаються через POST-запит із форми на інтерфейсі. Параметр fileName має бути включений у тіло форми (тобто обов’язковий) і використовується як ім’я файлу, під яким ми зберігатимемо файл у сховищі (це робиться в контролері – ми перейдемо до цього трохи пізніше). Ми також визначаємо, що ім’я файлу має бути рядком, додавши вертикальну лінію (|) і слово «рядок». Обмеження завжди розділені вертикальною рискою, що дозволяє вказувати будь-які додаткові критерії для даного поля в одному рядку! Яка сила!
Другий параметр, userFile, — це фактичний файл, який користувач завантажує з форми на веб-сторінці. UserFile також необхідний і повинен бути файлом. Примітка: Якщо ми очікуємо, що завантажений файл буде зображенням, тоді ми використаємо обмеження зображення, яке обмежить типи файлів, прийняті як один із популярних типів зображень (jpeg, png, bmp, gif або svg). Оскільки ми хочемо дозволити користувачеві завантажувати будь-який тип файлу, ми просто дотримуватимемося обмеження перевірки файлу.
Це майже все, що стосується об’єкта запиту. Його основна робота полягає в тому, щоб просто підтримувати прийнятний набір критеріїв (обмежень), яким мають задовольняти параметри тіла форми, щоб продовжити глибше вивчення програми. Інша річ, на яку слід звернути увагу, полягає в тому, що ці два поля (userFile і filename) також повинні бути вказані всередині HTML-коду у формі полів введення (причому ім’я поля відповідає імені всередині об’єкта запиту).
Ви можете запитати: звичайно, це визначає характеристики того, що має містити запит форми, але де виконується фактична перевірка цих обмежень? Ми розглянемо це далі.
Модифікація контролера
Відкрийте додаток/Http/Controllers/UploadController і внесіть у нього такі зміни:
<?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 } }
Отже, це досить простий підхід до збереження завантажених файлів на диск. Ось розбивка методу upload() вище:
- Введіть підказку класу запиту в методі контролера, який виконує функцію «м’ясо та картопля», щоб ми могли автоматично перевіряти вхідні дані
- Візьміть файл із (тепер перевіреного) об’єкта запиту всередині методу контролера (у цьому випадку ми назвали його upload(), але він також міг отримати більш стандартизовану назву, наприклад store()).
- Візьміть назву файлу із запиту
- Згенеруйте остаточне ім'я файлу, під яким буде збережено файл. Метод getClientOriginalExtension() просто отримує вихідне розширення завантаженого файлу.
- Збережіть файл у локальній файловій системі за допомогою її методу storeAs(), передавши названий шлях у каталозі /storage як 1-й аргумент і назву файлу, під яким його потрібно зберегти, як другий.
- Повернути відповідь JSON, яка вказує на успішне виконання запиту
Шаблон леза
Останньою важливою частиною цієї головоломки є шаблон леза, який містить усі HTML, CSS і javascript для нашої простої програми. Ось код – ми пояснимо його пізніше.
<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>
Ось що наше /завантажити сторінка виглядає так:
Це дуже типовий приклад файлу-леза, що містить HTML-форму та javascript/jQuery для додавання асинхронних функцій (тому сторінка не оновлюється). Є осн тег без атрибута методу (який я поясню за секунду) і з атрибутом цікавої дії зі значенням {{route('file.upload')}}. У blade це те, що відомо як a Директиви. Директива — це просто химерна назва функції — це функції, специфічні для шаблонів блейдів, які виконують різні операції, загальні для створення веб-сторінок і веб-додатків. Щоб краще зрозуміти все, що може зробити блейд, перегляньте документацію тут. У наведеному вище випадку ми використовуємо директиву route для створення URL-адреси для надсилання форми.
Пам’ятайте, що ми визначили наші маршрути раніше в додатку у файлі web.php, вказавши назву, яку легко запам’ятати для кожного з них. Директива {{route()}} приймає назву маршруту, шукає його у внутрішньо кешованому списку маршрутів і генерує повну URL-адресу на основі визначення цього маршруту у файлі web.php. Для цього першого випадку ми вказуємо, що ми хочемо, щоб форма надсилала надіслані дані на /process URL нашої програми, яка визначається як POST маршруту.
Наступна дивна річ, яку ви могли помітити, це тег @csrf прямо під початковим тегом форми. У blade цей тег генерує параметр _token у формі, який перевіряється всередині програми, перш ніж дати дозвіл на обробку даних форми. Це гарантує, що дані у формі мають дійсне походження, і запобігає атакам підробки міжсайтових запитів. Додаткову інформацію про це див Документи.
Після цього ми визначаємо нашу форму як звичайну, однак зверніть увагу, що назви параметрів нашої форми, userFile і fileName є точно такий же як визначено в нашому об’єкті запиту. Якщо ми забули включити вхідні дані для даного параметра, який був визначений в об’єкті запиту (або ввели його неправильно), запит завершився б невдачею та повернулася б помилка, унеможливлюючи потрапляння вихідного запиту форми в метод контролера, розташований за адресою UploadController@ процес .
Спробуйте й надішліть кілька файлів у програму за допомогою цієї форми. Після цього перейдіть до /список сторінку, щоб переглянути вміст папки завантажень із завантаженими файлами, переліченими в таблиці:
Bigger Picture
Давайте зробимо крок назад і подивимося, що ми зробили в цьому підручнику Laravel.
На цій діаграмі зображено програму в тому вигляді, в якому вона є зараз (за винятком деталей високого рівня):
Ви повинні пам’ятати, що об’єкт запиту, який ми створили на початку цього підручника Laravel, повинен мати ті самі параметри, визначені в методі правил, що й у формі в шаблоні блейда (якщо ні, перечитайте розділ «Створення логіки перевірки»). . Користувач вводить форму на веб-сторінці, яка відображається за допомогою механізму шаблонів blade (звичайно, цей процес відбувається на автопілоті, тому нам навіть не потрібно про це думати) і надсилає форму. Код jQuery шаблону в нижній частині зупиняє надсилання за замовчуванням (яке автоматично переспрямовує на окрему сторінку), створює запит ajax, завантажує запит із даними форми та завантаженим файлом і надсилає все на перший рівень нашого додаток: запит.
Об’єкт запиту заповнюється шляхом зв’язування параметрів всередині методу rules() із надісланими параметрами форми, а потім перевіряє дані відповідно до кожного вказаного правила. Якщо всі правила задовольняються, запит передається будь-якому методу контролера, який відповідає значенням, визначеним у файлі маршруту web.php. У цьому випадку роботу виконує метод process() UploadController. Як тільки ми натискаємо контролер, ми вже знаємо, що запит пройшов перевірку, тому нам не потрібно повторно перевіряти, чи надане ім’я файлу насправді є рядком, чи параметр userFile справді містить певний тип файлу… Ми можемо продовжити, як нормально.
Потім метод контролера забирає перевірені параметри з об’єкта запиту, генерує повне ім’я файлу шляхом об’єднання переданого параметра fileName з оригінальним розширенням userFile, зберігає файл у каталозі нашої програми, а потім повертає простий JSON-кодований файл відповідь, що підтверджує успішність запиту. Відповідь отримує логіка jQuery, яка виконує ще кілька завдань, пов’язаних з інтерфейсом користувача, наприклад, відображає повідомлення про успіх (або помилку) протягом 5 секунд, а потім приховує його, а також очищає попередні записи форми…це для того, щоб користувач знав впевнені, що запит був успішним і можуть завантажити інший файл, якщо вони бажають.
Крім того, зверніть увагу на схему вище, де проходить лінія між клієнтом і сервером. Ця концепція є надзвичайно важливою для вас, щоб ви її зрозуміли, і допоможе вам вирішити проблеми та проблеми, які можуть виникнути в майбутньому під час жонглювання, наприклад, кількома асинхронними запитами, які можуть виникнути в будь-який момент часу. Розділення відбувається прямо на межі об’єкта запиту. Сам об’єкт запиту можна розглядати як «шлюз» до решти програми… Він виконує початкову перевірку та реєстрацію значень форми, переданих із веб-браузера. Якщо вони вважаються дійсними, то вони переходять до контролера. Усе, що передує цьому, знаходиться на інтерфейсі («клієнт» буквально означає «на комп’ютері користувача»). Відповідь повертається з програми назад на сторону клієнта, де наш код jQuery терпляче очікує її надходження та виконує кілька простих завдань інтерфейсу користувача, отримавши її.
Ми охопили понад 90 важливих запитань Питання співбесіди, пов’язані з Laravel і PHP для новачків, а також досвідчених кандидатів, щоб отримати потрібну роботу.