(0:00)
Итак, в последнем видео, у нас было введение о некоторых ключевых компонентах в Laravel — включая маршрутизацию, которая находится в каталоге app/http. Мы также создали некоторые маршруты и затем узнали о том, как они отправляются к нашим методам контроллеров, которые, в свою очередь, загружают виды (views).
Сейчас это всё ещё несколько ново, так что давайте ещё немного с этим поработаем. И в процессе узнаем о том как мы можем передавать переменные в наши виды.
(0:30)
Итак, вот что мы собираемся сделать, мы начнём с нуля. Я собираюсь удалить всё из нашего файла маршрутов. И то же самое будет верно для этих двух контроллеров. OK, так как же нам создать новый контроллер? Если вы помните, в последнем уроке, я говорил о том, что для статических страниц может быть полезно иметь какой-то общий контроллер страниц. Так, например, если пользователь запрашивает страницу About — example.com/about — мы хотим отправить его на PHPPagesController
, в метод под названием PHPabout()
.
(1:00)
Теперь прежде чем мы перейдем на следующий шаг, я хочу вам что-то показать. Представьте себе, если бы мы оставили тут в файле всё как есть и попытались просмотреть его в браузере?
laravel5.dev/about
Попробуем, и мы получаем эту страницу с ошибкой, но она не даёт нам никакой информации о том, что пошло не так. И это потому, что Laravel и большинство фреймворков, используют концепцию среды окружения. В этой среде я хочу использовать эту особую базу данных. Я не хочу на самом деле отправлять электронную почту.
(1:30)
И я хочу использовать такой способ обработки ошибок. Но для производства (in production), мы также не хотим показывать ошибки пользователю, поэтому нам нужна другая конфигурация для этой среды. Так что, прямо сейчас, поскольку по умолчанию предполагается работа в production, здесь нас просто предохраняют. Все ваши закрытые данные о сервере не будут показываться для пользователя. Но, как я уже сказал, для разработки, мы на самом деле хотим видеть всё подробно. Итак, вот всё, что вам нужно сделать. Мы поговорим о конфигурации среды подробнее в будущих уроках.
(2:00)
Пока же, вы видите этот файл env.example. Всё, что вам надо сделать, это переименовать его в .env, и он вступит в силу. И главным образом, не беспокойтесь обо всём что видите здесь, я научу вас всему что стоит знать в будущем. Но особенно обратите внимание, что сейчас, мы устанавливаем рабочую среду приложения не как производственную, а как локальную. Так что если мы вернёмся и обновим, теперь у нас есть немного больше информации для отладки приложения.
(2:30)
И, конечно, в этом случае, файл PHPPagesController
не существует. Так что это наш следующий шаг. Мы могли бы вручную создать этот контроллер, но это долго, так ведь? Вместо этого мы собираемся использовать утилиту командной строки Laravel, которую мы называем Artisan. Позвольте я вам покажу. Если мы запустим:
shphp artisan
Вы увидите несколько десятков различных команд, которые мы можем использовать. Конкретно сейчас нам нужен один из генераторов. Я хочу сделать контроллер.
(3:00)
Вот команда, которую мы используем:
shphp artisan make:controller PagesController
Теперь у вас тут есть два варианта. Если я запущу это, и если мы вернёмся и взглянем на наш сгенерированный файл, он включает в себя кучу различных методов. И это для приспособления к тому, что мы называем ресурсной маршрутизацией (resourceful routing), которую мы с вами пока ещё не рассмотрели. Так что вместо этого я удалю всё здесь и попробую снова. Но я добавлю тут флаг --plain.
(3:30)
Можете думать о нём как об опции для команды. Я просто хочу пустой контроллер. Так что теперь если мы ещё раз попробуем — у нас появился простой шаблон для начала. Теперь здесь напрашивается вопрос, если вы задумаетесь: «Откуда мне знать какие опции я могу передавать этим командам?». Вы можете всегда добавить перед командой слово help. Таким образом:
shphp artisan help make:controller
И теперь вам скажут тут: «Вот аргумент, который необходимо передать, и все флаги или опции перечислены ниже».
(4:00)
Хорошо, обратно в файл routes.php... мы хотим направить обработку к методу PHPabout()
в нашем контроллере, так что это наш следующий шаг. Создадим метод с именем PHPabout()
. И мы просто вернём страницу About:
public function about()
{
return 'About Page';
}
И посмотрим на неё в браузере. Итак, если мы вернёмся и обновим страницу.. вот так просто! Для этого не надо быть семи пядей во лбу.
(4:30)
Но как мы узнали в последнем видео, вы, вероятно, не хотите возвращать строку, а скорее вид вашего контроллера:
return view('pages.about');
Итак, если вы помните, мы идём в папку resources/views, у нас там уже есть папка /pages с прошлого раза, но я создам новую:
about.blade.php
И снова, я собираюсь напрямую вписать тут немного HTML, но сейчас, я хочу чтобы вы подумали, как плохо это будет масштабироваться.
(5:00)
Если бы я хотел добавить здесь стилей, то в текущем состоянии, мне нужно будет продублировать их в каждом созданном мной виде. Не очень хорошая идея. Но мы будем говорить об этом подробнее в будущем уроке. Если вы хотите забежать вперёд, поизучайте мастер-страницы или файлы макета, как некоторые люди называют их. Хорошо, мы напишем <h1>About Me</h1>, и затем добавим немного текста «Lorem Ipsum». И если мы возвратимся назад в браузер и обновим страницу, у нас есть основа для сайта.
(5:30)
Но теперь, как нам передать переменные в наш вид? Помните, что ваши виды должны быть крайне простыми. Они не должны говорить с сервисами приложения или делать выборку строк непосредственно из таблицы БД или нечто подобное. Вместо этого мы даем им всё что нужно. Думайте об этом так: мы говорим «привет» виду, даём ему коллекцию записей блога, а затем вид перебирает эти записи блога и отображает их на странице.
(6:00)
Обратите внимание, что нигде в процессе этого вид сам не идёт в БД для извлечения записей. Ему просто их передают. Так что не забывайте этот принцип. Это распространенная ошибка и она действительно делает код грязным и путанным. OK, вернёмся к PHPPagesController
и допустим, что мы хотим передать наше имя. Очень просто, правда? Хорошо:
$name = 'Jeffrey Way';
И теперь я хочу передать это виду.
(6:30)
И у нас есть несколько различных способов сделать это, в зависимости от ваших предпочтений. Я покажу вам два пути.
Мы могли бы сказать with...:
return view('pages.about')->with('name', $name);
(загрузить этот вид с этими данными...).
OK, прежде чем я покажу вам некоторые альтернативы, давайте убедимся, что это работает:
<h1>About Me: </h1>
И теперь, как мне выдать на экран имя человека? Вы знаете, как сделать это, ведь так?
<h1>About Me: <?= $name; ?></h1>
Давайте посмотрим, если это сработает. Вернёмся, обновим, и готово.
(7:00)
Вот переменная.
Однако мы здесь используем Laravel, и я уже упоминал в предыдущем видео о шаблонизаторе Blade в Laravel. В основном, это означает, что у нас есть приятный синтаксис, который мы можем использовать, и который будет компилироваться в обычный PHP. Но он делает нашу работу намного проще. Да, PHP и сам подходит для шаблонов, но его возможности не очень подходят для этого. И вместо этого, Laravel Blade делает написание кода гораздо более приятным заданием.
(7:30)
Вот как. Для экранирования данных мы просто заключаем имя переменной в две фигурные скобки:
<h1>About Me: {{ $name }}</h1>
Это эквивалентно тому, как мы вручную экранируем данные и выводим на экран. Однако теперь, если вы хотите неэкранированные данные, то используйте такой синтаксис:
<h1>About Me: {!! $name !!}</h1>
И может быть демонстрация сделает это немного более ясным. Позвольте я вам покажу. Если мы вернемся к PHPPagesController
и может быть мы хотим сделать имя красным цветом:
$name = 'Jeffrey <span style="color: red;">Way</span>';
(8:00)
Ну вы знаете, может быть, это значение приходит к нам из базы данных или нечто подобное. Теперь, если мы вернёмся и обновим... и мы видим, что теперь текст красный. И это потому, что мы не экранировали его. И вы должны быть осторожны с этим, особенно когда, например, кто-то заполняет форму. Что если они вставили код Javascript в эту форме? В области текста они сделали что-то вроде этого:
<script>alert('HI');</script>
Вот такого типа вещей вам нужно опасаться. Так что действительно думайте, хотите экранировать данные или нет.
(8:30)
Примите это как правило — старайтесь экранировать, если только нет серьёзных причин чтобы это не делать. Итак, вернемся к нашей странице About. И чтобы показать вам разницу, теперь, мы сделаем экранирование:
<h1>About Me {{ $name }}</h1>
И если я вернусь в браузер, вы на самом деле увидите HTML. Так что это более безопасно по умолчанию. OK, давайте продолжим. Обратно к PHPPagesController
. Это был один из способов как это сделать. Но что, если бы мы хотели передать более чем одну переменную?
(9:00)
Мы хотим передать массив. ОК, точно так же, никакой разницы. Как насчёт того, чтобы написать:
return view('pages.about')->with([
'first' => 'Jeffrey',
'last' => 'Way'
]);
Хорошо, теперь, давайте напишем PHP$first
, затем пробел, и за ним PHP$last
:
<h1>About Me {{ $first }} {{ $last }}</h1>
Вернёмся назад, обновим страницу, и теперь мы передаём несколько переменных. Итак, просто чтобы уточнить, как это работает:
(9:30)
когда вы передаёте массив, каждый ключ будет использоваться как имя переменной в виде, и конечно, каждое значение будет значением этой переменной. Хорошо, так что это был второй способ.
Третий способ заключается в передаче массива данных в качестве второго аргумента функции PHPview()
. Если вы пользовались другими фреймворками типа CodeIgniter, то это может показаться вам более знакомым. Так что, в этом случае, мы могли бы сказать:
$data = [];
$data ['first'] = 'Douglas';
$data ['last'] = 'Quaid';
return view('pages.about', $data);
(10:00)
Теперь если мы возвращаемся назад, мы по-прежнему получим то же самое. И многие люди предпочитают этот подход. Для меня, если только я не имею дело с большим количеством данных, то, что я действительно люблю делать, это явно перечислять мои переменные. Таким образом:
$first = 'Fox';
$last = 'Mulder';
Ну, да, я мог бы сделать массив и вручную заполнить его, или мы можем использовать PHP-функцию PHPcompact()
, например так:
return view ('pages.about', compact('first', 'last'));
Если вы не знакомы с PHPcompact()
:
(10:30)
он принимает каждый ключ и пытается найти переменную с таким же именем. Так что в этом случае, он найдет вот это (PHP$first
). И затем он создаст ассоциативный массив. Так что если мы попробуем этот подход то, конечно, это по-прежнему будет работать. И это то, что я люблю делать. Потому что обычно, вам действительно нужно передавать лишь одну переменную в вид. Поэтому я думаю, что это довольно удобный подход. Но если вы хотите вместо этого использовать вариант с PHPwith()
, то нет проблем. Это просто зависит от ваших предпочтений.
(11:00)
Хорошо, думаю достаточно для этого видео, как только вы почувствуете себя комфортно, как всегда, можете переходить к следующему видео.