(0:00)
Итак, я полагаю, пришло время взглянуть на аутентификацию в Laravel 5. Но вот хорошая новость, по умолчанию фреймворк готов за вас сделать много всего. Давайте перейдем к нашему файлу routes.php. Теперь, если вы помните, в начале серии, мы изменили этот файл и удалили фрагмент кода, который выглядел так же, как и этот. Так что помните, когда мы делаем новую установку Laravel, то вы увидите это по умолчанию. Так что теперь вы можете подумать:
(0:30)
«Ну, я узнал о PHPRoute::get
и PHPRoute::post
, и мы узнали о ресурсах, но теперь что это за PHPRoute::controllers
?»
И это относится к другому способу регистрации наших маршрутов. И в самом деле, это то, что я вообще-то не рекомендую. Когда сможете всегда будьте более определёнными с вашими маршрутами. Однако, поскольку у нас есть несколько этих вещей уже по умолчанию, это делает всё немного чище для вас. Так что давайте взглянем на это. Мы регистрируем два контроллера. Один для PHPAuthController
и один для PHPPasswordController
.
(1:00)
Итак, позвольте мне показать вам, как это работает. Если мы откроем это, давайте взглянем на PHPAuthController
. И вы увидите главное в том, что он включает типаж, чтобы здесь всё выглядело получше. Теперь вы увидите здесь особое соглашение о присвоении имён. Имя запроса, get, post, delete, какой там он у вас. И затем фактическое имя метода, т.е. например PHPgetRegister()
. И это очень важно. Позвольте я вам покажу. Если мы запустим:
shphp artisan route:list
И я уменьшу текст здесь на несколько пунктов.
(1:30)
Обратите внимание, что хоть мы и не сделали явное определение в нашем файле маршрутов, что я рекомендую, у нас всё равно есть маршрут для auth/register. И он указывает на этот метод. Таким образом, здесь мы видим, что если мы будем следовать соглашению, то маршрут будет зарегистрирован автоматически, так сказать. Так что если бы мы сказали:
getFoo()
return 'foobar';
Если мы теперь запустим это ещё раз, то вы увидите, что у нас есть маршрут, который отвечает на auth/foo. Теперь, обратите внимание, что foo добавляется к базовому URL.
(2:00)
И это потому, что, если я переключусь обратно в routes.php, мы определили это вот здесь. Это наш базовый URI. И дальше, до тех пор, пока мы используем какой-то особый тип запроса, который Laravel распознает как GET и POST, то мы сможем довольно легко регистрировать наши маршруты. Хотя будьте осторожны, как я уже сказал, я вообще-то не советую этот способ. Если вы более наглядно определять маршруты, то в любое время когда вы захотите просто осмотреть ваше приложение, вы можете перейти на эту страницу и получить великолепный вид с высоты птичьего полета, чтобы понять на какие конечные точки мы можем отвечать.
(2:30)
Но с другой стороны, когда у вас есть только эта информация, она вам не очень полезна, не так ли? И да, это правда, у нас есть такие консольные команды как эта, но тем не менее, я по-прежнему рекомендую вам явно задавать маршруты. Итак, просто, чтобы закрепить этот материал, если мы переключимся назад, и я переименую это в PHPfoo()
, поскольку у нас нет типа запроса, то он не будет зарегистрирован. Это означает, что, если мы хотим отвечать на POST-запрос к /auth/bar, то вот как бы мы это представили: PHPpostBar()
.
(3:00)
Теперь, если мы запустим это, вы увидите его прямо здесь. Когда мы делаем запрос POST к auth/bar, то далее вызываем этот метод. Понятно? Итак, теперь вы понимаете, как это работает. Что ж, давайте посмотрим, как Laravel установил это для нас. И вот одна из самых классных штук. Мы получаем некоторые представления прямо по умолчанию. Так что даже если вам нужно их немного изменить, он по-прежнему выполняет за вас много нудной работы. Давайте посмотрим. Если мы перейдём на:
laravel5.dev/auth/login
(3:30)
Вот, смотрите! У нас есть страница входа в систему. Если же мы забыли наш пароль, это она тоже уже настроено. Или, если нам просто нужно зарегистрироваться, то у нас есть маршрут и для этого тоже. Так что это как раз то, что я имею в виду. Скорее всего, вы не хотите, чтобы ваша страница регистрации выглядела таким образом, но она уже настроена, так что вы можете просто подправить её как вам нужно. ОК, так что давайте посмотрим, как это выглядит. Мы уже знаем о PHPgetRegister()
, который загружает вид auth/register:
return view('auth.register');
(4:00)
Сейчас это должно быть уже немного более вам знакомо. Давайте взглянем на resources/views/auth/register.blade.php, и вот что вы получите прямо по умолчанию. У нас тут есть обработка ошибок, а далее идёт форма. Затем, если мы переключаемся назад, как насчёт самой страницы регистрации? Что ж, это означает, что нам понадобится метод PHPgetLogin()
, и он загружает вид (auth.login'. Но когда мы отправляем эту форму, она отправляется себе же или отправляет запрос POST на ту же самую страницу регистрации, поэтому мы попадём на PHPpostLogin()
.
(4:30)
Там Laravel быстро проверит ввод, с чем вы уже знакомы. И потом мы берём электронную почту и пароль, которые были введены в форму, мы пытаемся выполнить аутентификацию пользователя, и, если она прошла успешно, мы делаем PHPredirect()
туда, куда он и намеревался идти. В противном случае, была какая-то проблема, и значит введённые учётные данные были неправильны. Тогда мы PHPredirect()
обратно на страницу входа в систему, мы подставляем входные данные, так, что им не нужно заново вводить адрес электронной почты, и затем мы здесь добавляем сообщения об ошибке.
(5:00)
Но главным образом, ключевой момент, вам нужно знать об этой особенности только лишь если вам интересно как Laravel работает внутри. Но если вы предпочитаете не копаться в нём, то можете просто проигнорировать это. Это довольно круто. Итак, давайте посмотрим, у нас есть PHPgetRegister()
, и когда мы регистрируемся, мы идём на PHPpostRegister()
. И здесь мы делаем проверку данных, если она провалилась, то мы бросаем исключением, которое Laravel поймает. В противном случае, валидация данных из формы была успешной, и в этом случае, мы можем войти как пользователь.
(5:30)
И здесь, обратите внимание, мы ссылаемся на то, что мы называем зависимостью, поэтому и PHPRegistrar
. Что же, если мы вернемся к нашему PHPAuthController
, мы сможем увидеть это прямо здесь (в PHP__construct()
в файле register.blade.php). Так что, если мы щелкнем по нему, или если мы перейдём вручную, это будет в /app/Services/Registrar.php. Опять же, это всё идёт по умолчанию, но вы можете это удалить, если захотите. Вам не нужно использовать ничего из этого, если вы предпочитаете писать код с нуля. Вот где мы это создаём. И заметьте, это просто делает вызов Eloquent.
User::create()...
Мы передаём имя, электронную почту и пароль. Теперь, вот следующая классная вещь – мы уже коснулись этого много серий назад, но только чтобы освежить вашу память, если мы устанавливаем всё это с нуля, т.е. свежая установка Laravel, в ней ещё нет таблицы пользователей. И именно поэтому, опять же, уже в наборе по умолчанию у нас есть для вас пара миграций:
Schema::create ('users', function(Blueprint $table)...
Здесь есть некоторые общие поля, которые можно изменить, если нужно. И то же самое верно для таблицы password_resets.
(6:30)
Так что, это означает, что как только вы установите Laravel, если вы выполните команду:
shphp artisan migrate
Вы сразу получите эти две очень, очень нужные таблицы. ОК, так что с таким кратким введением, почему бы нам не попробовать это? Я зарегистрирую себя. JeffreyWay, jeffrey@laracasts.com, и пароль. Хорошо, давайте зарегистрируемся. И тут похоже, что нам это не удалось, но на самом деле это не так. Нас пытались отправить на страницу home.
(7:00)
Которая обычно содержит dashboard («приборную панель», основную информацию аккаунта). Но если вы помните, мы удалили этот маршрут. Поэтому, конечно, когда вы пытаетесь получить доступ к странице, маршрут для которой не зарегистрирован, то вы получите PHPNotFoundHttpException
. Этого следовало ожидать. Но главное, что у нас есть новый пользователь. Позвольте я вам покажу:
shphp artisan tinker
И мы запросим получить самого первого пользователя в нашей системе и приведём к массиву:
App\User::first()->toArray();
И вот оно. Так что мы просто должны справиться с ситуацией и указать куда нас должны направить после регистрации.
(7:30)
ОК, как я и сказал, вы можете сохранить эту страницу home или вы можете сделать свою собственную. Таким образом, вы могли бы сказать:
Route::get('home')
А потом реагировать на это. Или же мы можем просто изменить PHPredirectPath()
и, возможно, это как раз то, что мы сделаем. Если мы вернемся к типажу, давайте посмотрим, что он пытается сделать. После того, как мы зарегистрировали пользователя, мы перенаправляемся на PHPredirectPath()
и обратите внимание, он говорит: «Если у пользователя есть свойство redirectTo, то туда мы и направимся, в противном случае, мы пойдём по умолчанию в /home».
(8:00)
Это значит, давайте просто вернемся к нашему PHPAuthController
, и установим это прямо здесь.
И куда вы хотите пойти? Давайте пойдём к /articles:
protected $redirectTo = '/articles';
ОК, так что теперь, почему бы нам не выйти и не зарегистрировать кого-нибудь нового?
laravel5.dev/auth/logout
И у нас есть для этого маршрут. Это выведет пользователя из системы и перенаправит его на главную страницу.
(8:30)
И ещё раз, наша страница /home ещё не создана, но мы можем сделать её через несколько секунд. Так что теперь, мы зарегистрируем нового пользователя. JohnDoe, john@example.com и пароль, регистрируемся. И на этот раз, нас успешно отправят на /articles. Теперь, откуда нам на самом деле знать, что мы аутентифицированы? Есть несколько способов. Мы можем даже настроить небольших посредников (middleware), которые защитят определённые маршруты. Например, вы можете себе представить ситуации, когда вы хотите сказать: «Вы сможете просматривать эту страницу только если вошли в систему.»
(9:00)
В Laravel такие вещи делаются невероятно просто. И мы рассмотрим специфику этого в нашем следующем видео. Но сейчас, если мы идем к PHPArticlesController
, давайте просто посмотрим, если мы хотим получить аутентифицированного пользователя, то мы могли бы использовать фасад PHPAuth
, и мы могли бы сказать:
\Auth::user();
т.е. дайте мне аутентифицированного пользователя. И давайте вернём это значение и посмотрим, с чем мы тут работаем:
return \Auth::user();
(9:30)
Обновим, и готово. Вот человек, который в настоящее время вошёл в систему. Так что, если мы хотим получить имя аутентифицированного пользователя, то мы могли бы сделать что-то типа:
return \Auth::user()->name;
Вернёмся, обновим, и теперь вы видите, как это работает. Однако если мы выйдем из системы:
laravel5.dev/auth/logout
и вернёмся к laravel5.dev/articles, обратите внимание, что мы получаем ошибку. Trying to get property of non-object — «попытка получить свойство у не-объекта».
(10:00)
И это потому, что, когда мы идём по этому маршруту, то мы просто предполагаем, что у нас есть аутентифицированный пользователь, но это не так. В данном случае посетитель является гостем, так что PHP\Auth::user()
вернёт нам PHPnull
.
И это значит, что вы по сути пытаетесь сказать:
return null->name;
И, конечно же, мы получим исключение. Поэтому вы всегда должны убедиться, что если вам нужно чтобы аутентифицированный пользователь сделал что-то в замыкании или контроллере маршрута, то вам нужно настроить необходимый фильтр или посредник.
(10:30)
И не волнуйтесь, мы разберёмся со всем этим уже в следующем уроке. Таким образом, чтобы закончить это видео, давайте просто убедимся, что страница входа в систему работает. Мы знаем, что регистрация работает, так что давайте скажем: laravel5.dev/auth/login.
И я собираюсь войти в систему как john@example.com. Я использую его пароль и поставлю галочку на «Запомнить меня», и если мы пойдём дальше, всё работает. Джон вошёл в систему. И это означает, что теперь мы можем решить ту проблему из предыдущего видео, где мы жёстко вписали конкретного пользователя, чтобы связать его с этими статьями.
(11:00)
Давайте перейдём к articles/create и вы помните что мы ссылаемся на форму. Итак:
articles/form
И теперь прямо здесь, помните, у нас был этот временное скрытое поле ввода (input). Сейчас я могу полностью избавиться от всего этого. И значит, назад в нашем PHPArticlesController
, где мы сохраняем новую статью, теперь, как нам тут сказать, что,
(11:30)
когда мы создаем статью, мы хотим, чтобы его поле user_id было равным user_id аутентифицированного пользователя, который мы могли бы получить через PHPAuth::id()
или, просто получить объект от PHPuser()
и затем его PHPid
? Так как же нам это сделать? Что ж, и правда, вы могли бы сделать что-то вроде этого:
$request = $request->all();
$request ['user_id'] = Auth::id();
Или вы могли бы даже использовать некоторые вспомогательные функции Laravel, которые он включает в себя, например такие как PHParray_add
.
(12:00)
В качестве краткого отступления, если вы хотите узнать больше об этой теме, то перейдите в PHPIlluminate/Support/helpers.php
, и вы увидите кучу самых разных вещей, которые мы можем тут использовать. Думайте о них, как об отсутствующих функциях для работы с массивами, которые вы бы хотели, чтобы они были в PHP по умолчанию. Например такие как PHParray_pluck
, или PHParray_where
, или PHParray_first
. И их целая куча. Так что поиграйте с ними, когда будете чувствовать себя более комфортно с основами Laravel. Итак, ещё раз, да, мы могли установить это вручную, но я предпочёл бы этого не делать.
(12:30)
Давайте заставим Laravel выполнить эту работу для нас автоматически. Вот как. Мы просто станем ссылаться на отношения. Если я скажу:
Auth::user()->articles()->save(new Article($request->all()));
(возьмите статьи пользователя и сохраните новую, и передайте запрос)
За кадром, Laravel автоматически применит user_id к этой новой статье. Так что если вы хотите подчистить всё тут немного, мы могли бы извлечь переменную с именем PHP$article
, например, так:
$article = new Article($request->all());
(13:00)
И теперь, это на самом деле довольно чисто. Так что создаём новую статью с атрибутами из формы. И далее, давайте получим статьи аутентифицированного пользователя и сохраним новую статью. И мы просто передадим этот объект PHP$article
. Теперь запомните, на данный момент, для этой статьи user_id не установлен. За кадром Laravel сделает это для нас автоматически, так как мы ссылаемся на него таким образом. Но теперь, как же нам получить статьи из объекта PHP$user
?
(13:30)
Если мы перейдём в user.php и прокрутим файл вниз, не забывайте, что мы создали эти отношения в самом последнем видео. Итак, поскольку мы подготовились и уже проделали много работы, это всё будет просто работать прямо как есть. Учтите, что мы не делаем это так:
Auth::user()->articles;
Не забывайте, что когда вы ссылаетесь таким образом, то вы получите коллекцию всех статей. Но в нашем случае, мы хотим продолжить формирование цепочки.
(14:00)
Мы уже говорили обо всём этом. Вот поэтому мы ссылаемся на PHParticles()
как на метод и делаем PHPsave()
для этой новой статьи, которая есть у меня здесь:
Auth::user()->articles()->save($article);
Понятно? Итак, давайте посмотрим, если это сработает, и если так, то на этом и остановимся. Я переключусь назад и создам новую статью с названием Article by John, телом статьи and the body, и мы опубликуем её сегодня. Запустим, и кажется всё сработало. Давайте сделаем быстрый осмотр с помощью:
shphp artisan tinker
чтобы убедиться в том, что всё действительно работает:
App\Article::first()->toArray();
(14:30)
И вот оно. Наш user_id был автоматически установлен Laravel равным PHPid
аутентифицированного пользователя, и значит, мы могли бы сказать:
$john = App\User::where( 'name', 'JohnDoe')->first();
Хорошо, у нас есть Джон. Мы уже рассмотрели это в уроке об Eloquent. И если теперь мы хотим захватить все статьи, которые написал John, то мы можем это сделать. И мы приведём это к массиву:
$john->articles->toArray();
и мы должны получить его запись.
(15:00)
Итак, чтобы закончить и чтобы убедиться, в том, что всё это действительно ясно, так как для меня это было немного запутанным, когда я начинал учиться, давайте снова пройдём через этот процесс, используя tinker:
$article = new App\Article (['title' => 'New', 'body => 'new', 'published_at' => Carbon\Carbon::now()]);
ОК, всё это выглядит хорошо. У нас есть наша статья. Я могу привести её к массиву:
$article->toArray();
(15:30)
Однако не забывайте, что у нас там ещё нет user_id. Так что здесь мы можем использовать вот такой способ:
$john->articles()->save($article);
(в его статьях я хочу сохранить вот эту новую, которую мы создали)
И готово. Теперь user_id добавлен и статья была сохранена, значит, если мы теперь сделаем:
$article->toArray();
На этот раз, вы увидите, что сейчас она была обновлена с user_id, а также с временными штампами. Хорошо, я надеюсь, что вы начинаете привыкать к этому. В следующем видео мы разберёмся с посредниками (middleware).
Комментарии (1)
Для Версии 5.3
Одной строкой кода Создаём Контроллеры для регистрации и виды: php artisan make:auth
и всё работает!