Проверки на существование пользователя и тому подобное уже существуют в валидаторе: 'name' => ['required', 'string', 'max:64'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], (unique:users) - проверяет уникальность данного параметра в таблице users 'password' => ['required', 'string', 'min:6', 'max:16', 'confirmed'], (confirmed) - проверяет правильно ли мы подтвердили наш пароль
Спасибо! Все получилось с 1 го раза! Чувствуется сразу профессионализм автора) Все четко и по полочкам. Единственно еще интересно было бы узнать, как сделать, чтоб после аутентификации, в меню пункт ,допустим, "вход" менялось на email/имя пользователя, думаю, Вы понимаете о чем я)
Почему не показана реализация метода create в модели User. У меня из-за отстутствия такового из контроллера RegisterController прилетает ошибка что якобы поле email не имеет значения по умолчанию.
Очевидно, что если записать в поле email значение, то такая ошибка не возникнет. Проверьте, возможно вы опечатались в названии поля email, либо вовсе не передаете его значение в поля модели при ее создании.
@@lectoria Благодарю за ответ, да действительно мой косяк: передавал в параметр метода массив validateFields в квадратных скобках. Исправил и всё заработало как часы!
Проверьте, что у вас поле в форме называется password, проверьте в логике обработки данных от формы, не допустили ли опечатки в названии этого поля. Если опечаток нет, то через функцию dd в коде blade шаблона проверьте, какие данные поступают от формы, есть ли там вообще поле password.
А не противоречит ли стандартам подобное написание логики в контроллере? И помимо выноса ее в роуты или тот же контроллер, куда еще можно или даже, куда НУЖНО разместить эту логику? Можно ли создать для этой логики сервис и туда все вынести или это уже перебор и это чего-то недопонял про сервисы?
А о каких стандартах вы говорите? Сервис класс - это просто способ отделить логику, отвечающую за какой-то определенный пул задач в отдельный класс, доступный из любой точки приложения. Это не обязательно делать, если у вас данная логика встречается в одном месте.
@@lectoria Некорректно выразился, я имел ввиду то, что нужно, вроде как, стремиться к тому, чтобы в контроллере должно быть минимум кода и никакой логики
@@ddrdeveloper Согласен, есть такое понятие как "тонкий контроллер", в котором минимум кода. Но, я не всегда так делаю. Я изначально пишу логику в контроллере, чтобы как можно быстрее получить результат, но в голове прокручиваю варианты дальнейшего развития проекта и повторного использования написанного в контроллере кода, и либо сразу решаю вынести эту логику в сервис, либо оставляю ее в контроллере. Зависит от конкретного проекта и случая.
Здраствуйте , у меня есть вопрос - когда я пишу User::create вижу ошибку которая гласит Method 'create' not found in \App\Models\User , с User::where тоже самое , как это исправить ?
Для того, чтобы модель User позволяла использовать метод create, нужно, чтобы класс User наследовался от класса Illuminate\Database\Eloquent\Model. Сам же метод create вообще находится в классе Builder, но это уже другой вопрос )) В общем, чтобы иметь возможность вызова метода create, необходимо наследование от класса Model. Проверьте, является ли класс User наследником этого класса
@@lectoria Здравствуйте, я проверил, он является наследником, но все равно не работает. Я не очень понял, если метод находится в классе builder, то какое отношение он имеет к абстрактному классу Model? И что мне делать, если я проверил, наследование есть, но метода create он все равно не видит?
@@даниилкосвинцев В Laravel есть такие классы, которые реализуют что-то типа наследования. Вроде как это называется mixin (подмешивание). Одним из таких примеров является класс Illuminate\Database\Eloquent\Model - он явно не наследует класс Builder, но тем не менее имеет возможность использовать его методы. Если откроете исходный код этого класса (Model), то увидите там магический метод __call, который как раз и реализует логику обращения к классу Builder. То есть вы явно не увидите методов класса Builder в подсказках IDE, но тем не менее обращаться к ним можно. Чтобы IDE умела понимать такие подмешивания, рекомендую поставить себе расширение Laravel IDE Helper: github.com/barryvdh/laravel-ide-helper www.jetbrains.com/help/phpstorm/laravel.html С помощью него разработка станет куда проще. Осталось только разобраться, почему у вас не работает метод create. 1. Убедитесь, что там, где вы хотите вызывать метод create, вы используете именно класс \App\Models\User 2. Проверьте, какой класс наследует ваш класс \App\Models\User (там должен быть либо Illuminate\Foundation\Auth\User, либо Illuminate\Database\Eloquent\Model). 3. Если там Illuminate\Foundation\Auth\User - то проверьте, не вносили ли вы случайно какие-то исправления в файл vendor/laravel/framework/src/Illuminate/Foundation/Auth/User.php) 4. Если там Illuminate\Database\Eloquent\Model, то проверьте, не вносили ли вы какие-либо исправления в файл vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php 5. Если ответы на 3 и 4 - "Нет", то все должно работать. Если не работает, то я предлагаю просто состыковаться в телеграме, чтобы посмотреть скриншоты, а может и по тимвьюверу сконнектиться и разобраться, в чем дело. Телега: t.me/artprog
@@lectoria Спасибо большое за ответ! Никогда ещё мне так подробно не отвечали, очень приятно что вы так вовлечены в общение со зрителями! Я сегодня попробую пройтись по вашим пунктам, надеюсь у меня все получится)) ещё раз спасибо) с меня лайк, подписка и вечная любовь)
что делать, если у меня табличка не стандартная как в стоковом ларавеле, плюс еще нужно получить последний созданный id user чтобы соеденить его с другими полученными в тот момент данными?
Все зависит от того, что именно у вас в этой табличке нестандартно и в чем проблема со стандартной аутентификацией. Чтобы получить последний созданный id до текущего - просто сделайте User::sortby('id', 'desc')->first()->id; (логика, думаю, понятна). А чтобы получить id только что созданного пользователя, то делайте $user->id после того, как пользователь успешно создан.
Добрый день! Уроки отличные, спасибо! Вопрос! Создаю свою админку и там раздел работу с пользователями и при редактировании данных пользователя, пытаюсь ему сменить пароль, устанавливаю Hash::make($pass), но после обновлении данных, при попытке войти под новым паролем не проходит авторизация. Подскажите где копать?
@@lectoria Делаю так : $data['password'] = Hash::make($pass); $result = $user->update($data); Да, проверил, данные разные сохраняются. А где тогда второй раз хешируется? Мне получается не надо хешировать?
@@andrei_olekh Почему конкретно в вашем случае пользователь потом не может авторизоваться, я не знаю. Но я могу посоветовать еще перед сохранением в базу вывести в лог хеш пароля и сравнить его с тем значением, которое потом лежит в базе данных. Если они не совпадают, то значит нужно искать проблему в процессе сохранения (вполне может быть, что в вашему проекте хеширование происходит автоматически и стоит попробовать в $data['password'] положить чистый пароль). Если они совпадают, то значит проблема либо в самом процессе аутентификации, либо вы хешируете пароль не тем алгоритмом, который используется при аутентификации. Это уже нужно смотреть в настройки непосредственно вашего проекта.
@@lectoria я с помощью dd вывожу значение пароля перед сохранением, в БД ложится совершенно другое значение. Настройки Laravel по хешированию не менял. Мистика..
уже существующим пользователем не могу залогиниться. что бы не писал - вылазит ошибка прописанная в LoginController. вроде уже несколько раз сверил код. не понимаю,в чем может быть проблема. видимо,не вытягивает с бд 'email' 'password' ?
Причины могут быть разные, но одна из распространенных - это сохранение пароля в базу без хеширования. Проверьте, не лежит ли пароль в базе в чистом виде. Если так, то вам нужно при регистрации пользователя хешировать пароль (по-моему, если память не изменяет, это делается через фасад Hash)
@@SiegeMechanic Потому что вы при регистрации сохранили пароль в чистом виде, а нужно сохранять в хешированном. Ларавель по-умолчанию при проверке пароля сравнивает хеш введенного пароля с тем значением, что лежит в базе данных. Это логика по-умолчанию. Если вы хотите хранить в открытом виде (хотя так делать не стоит), то вы можете переопределить эту логику путем переопределения стандартной логики проверки хеша пароля, которая лежит в методе "validateCredentials" в классе: vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php Можете просто сделать свой провайдер пользователей, расширенный от Eloquent-провайдера, и в нем делать свою проверку пользовательских реквизитов на валидность.
Здравствуйте, регистрация и авторизация многи уже снимали видео но не кто не сделал роли(администратора,пользователь) ,если не трудно сделайте, заранее спасибо
Как раз в контент-плане стоит ближайшая тема про политики и гейты. Они же косвенно отвечают на вопрос ролей при авторизации. В ближайшее время должен разгрузиться от текущих рабочих задач и займусь новыми уроками.
@@Hrachik333 Да честно говоря, не вижу особого интереса рассказывать про remember_token. Настолько узкая тема. Мне кажется, это будет интересно слишком малому количеству подписчиков.
Артем здравствуйте, при отправке формы через XHR стандартная валидация выдает ошбку: 422 (Unprocessable Content). Данная ошибка просто выводится в консоли и никак не отлавливается. Как быть?
@@lectoria Спасибо, уже сам разобрался. Единственное - ошибка 422 (Unprocessable Content) так и выводится в консоль. Мне в сообществе Laravel сказали, что это нормально и ничего с этим не нужно делать. Вы как считаете?
@@ddrdeveloper Ошибки быть не должно. Я считаю, это не нормально ) Я как-то ловил такую ошибку и она была связана с тем, что одно из полей не проходило валидацию, насколько я помню.
@@lectoria Да, так и есть, я намеренно допускаю ошибку валидации и это как бы не считается системной ошибкой, но в консоли в любом случае при данной ошибке высвечивается 422 красной строкой. Где я только не искал, у кого только не спрашивал, решил вот у Вас, как у эксперта узнать.
Здравствуйте, подскажите пожалуйста что я делаю не так. При попытке регистрации нового пользователя выскакиевает ошибка SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value (HY000) Не могу понять причем тут поле 'name' ?
Откройте таблицу, в которой хранятся пользователи в базе данных и посмотрите на поле name. Скорее всего у него стоит NOT NULL и не указано значение по-умолчанию. Поэтому при регистрации, не заполняя это поле, вы получаете ошибку базы данных.
Видел разные практики. Кто-то делает название контроллера, исходя из той сущности, с которой он работает. Например UserController. А где-то встречаются практики, когда контроллер называют по тому действию, которое он выполняет. Например RegisteredUserController, AuthUserController и так далее. В итоге для себя не выработал пока четкого правила, как организовывать контроллеры. В одном и том же проекте могу сделать и так, и так. Например, у меня есть проект, где много разных страниц и я изначально назвал контроллеры по той странице, к которой он относится. Например ProfileController, GameController и так далее. Но позже, когда речь зашла о действии пользователя, пришлось сделать доп. контроллер UserActionsController, так как эти действия не относятся четко к какой-либо странице сайта и могут вызываться с разных мест. Но одно могу сказать точно - если я замечаю, что в контроллере образуется много разных (условно говоря, больше 2-3) методов для разных действий, то это верный признак того, что нужно их разносить по отдельным контроллерам. Потому что с ростом сложности, все равно будут добавляться какие-то вспомогательные функции и доп. код. И лучше, чтобы контроллеры были как можно более узко-направленными (отвечающими за как можно меньшее количество действий, в идеале 1 контроллер - 1 действие)
Не знаю почему, но у меня проблема с методом group() Argument 1 passed to Illuminate\Routing\Router::group() must be of the type array, string given, called in W:\domains\laravel2\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php on line 261 Эта ошибка появляется, когда я оставляю group() метод. Подскажите как решить, пожалуйста
По такой информации трудно сказать. Нужно бы посмотреть на ваши маршруты. Сначала локализуйте, в каком именно месте описания маршрутов (web.php или api.php, на какой строчке кода) у вас возникает эта проблема. Это можно найти, если поочередно закомментировать отдельные участки маршрутов, и когда ошибка исчезнет, найти то место, которое вы только что закомментировали. Затем покажите, что у вас там за код, возможно, где-то ошиблись в аргументах.
Спасибо! А можно ли отключить хеширование пароля ? Чтобы всё так же работало только без хеширования или залогиниться без пароля. Я понимаю, что всё можно сделать вручную. Но мне интересно стандарные средства ларавел (такие как Auth фасад) предусматривают такие варианты?
Теоретически можно, если изменить логику провайдера ядра Laravel - AuthServiceProvider и преопределить по итогу сервис 'auth', к которому по итогу обращается фасад Auth и вся внутренняя логика при работе с проверкой пароля. Но, мне этот вариант видится кривым, потому что мы пытаемся изменить логику ядра и это чревато ошибками совместимости с другими сервисами и пакетами, которые рассчитывают на стандартную логику ядра. По мне так лучше просто сделать альтернативное поле для пароля, назвать его, например pwd, и работать с ним так, как душе угодно - хоть с хешированием, хоть без.
Здравствуйте... данная конструкция Auth::attempt( $formFields) выдает false... в чем может быть проблема... пробовал также так: $formFields = [ 'email'=>$request->input('email'), 'password'=>Hash::make($request->input('password')) ];
Если Auth::attempt выдает false, то вероятнее всего, вы неверно вводите логин или пароль. Если же вы на 100% уверены, что логин и пароль верный, то смотрите в настройки config/auth.php, что там у вас за guard и providers. Еще рекомендую заглянуть в БД и посмотреть, хешируется ли пароль при сохранении.
@@lectoria спасибо за ответ! В том то и дело, что испробованы многие варианты, и с хешем и без (регистрация), в бд все корректно.... через dd проверка входных данных... логин/пасс через ручной ввод и copy paste в итоге все работает, кроме Auth::attempt... Видимо частный случай... будем разбираться... вам огромное спасибо интересные за уроки! С нетерпениеи ждем новых!
@@SiegeMechanic В guards прописываются ключи и настройки отдельных гвардов. Например: 'guards' => ['web' => [ 'driver' => 'session', 'provider' => 'users', ], ], А в providers, соответственно, указываются источники данных для сравнения с проверяемыми данными. Например, пользователи могут храниться как в базе, так и вообще на другом сайте. Пример, когда пользователи являются Eloquent моделями: 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], ],
Кстати я тут заинтересовался с 2FA (двухфакторной аутентификации) в документации промелькнуло про Fortify, но там мало об это написано и не совсем понятно, что делать. Так вот я поискал в интернете и в основном youtube выдает видео из иностраных туториалов и русско говорящих туториалах нет. Может запелить такой ролик? Я думаю многим интересно будет.
А как отображать на странице данные авторизованного пользователя? Допустим, он зашел на страницу своего аккаунта и там должна отображаться информация о нем. Как ее отобразить?
Через фасад Auth можно обратиться к методу user, который возвращает текущего аутентифицированного пользователя. Ну и далее можно обращаться к его полям, например name, email, и так далее. Если говорить про blade, то там это будет выглядеть например так: {{ Auth::user()->email }}
@@lectoria После регистрации отправить на почту ссылку для проверки существование почты или отправить с генерируемый пароль чтобы потом он мог поменять его. Одним словом каким образом отправить почту с определенными данными. Я видел что у ларавел 8 есть верификация почты.
@@Hrachik333 Если ваша модель User наследует класс Illuminate\Foundation\Auth\User (а по-умолчанию в Laravel именно так), то при регистрации пользователя происходит отправка письма для подтверждения почты при помощи метода sendEmailVerificationNotification в трейте Illuminate\Auth\Notifications\VerifyEmail\MustVerifyEmail. Можете просто заглянуть в исходный код, чтобы просто понять логику, как это работает. Также вы можете расширить класс User и описать свою логику отправки соответствующих писем с необходимыми данными. Процесс отправки писем хорошо описан в документации: laravel.com/docs/8.x/mail. У меня ролика на эту тему пока нет, так как это отдельный вопрос и в рамках одного ролика про аутентификацию это уже много информации
А в логах laravel какая-нибудь ошибка есть? Или может быть в логах ошибок php? Просто если все сделать четко по инструкции, то никаких ошибок быть не должно.
На 34:23 речь идет о проверке совпадений на существование пользователя в базе, если происходит попытка зарегистрировать пользователя с таким же email. Не совсем понял, о проверке на какие совпадения идет речь при аутентификации. Уточните?
@@Sapsonbz В смысле, вы его не видите в коде или при попытке его вызова возникает ошибка, что данного метода нет? Если вы их не видите в коде, то это нормально, потому что в классах Eloquent используется немного альтернативный способ, что-то вроде наследования, но фактически это просто проброс вызова в другой класс (в частности класс Builder) Если же возникает именно ошибка, что данного метода нет в классе User, значит ваш класс User не наследуется от класса Eloquent\Model. По какой причине он у вас не наследуется - другой вопрос. ))
@@Sapsonbz Ну то есть получается, что вызов метода where работает, просто не так, как вы ожидаете? В этом случае я рекомендую проверить вообще, вызывается ли ваш контроллер и связана ли ваша модель с конкретной таблицей в базе. Для этих целей можно поставить какие-нибудь тригеры в коде, по которым вы сможете понять, выполнен ли данный код или нет. Это может быть, например throw new Exception("Этот код выполнился");
Спасибо за ролик, супер! Вопрос: как можно преобразовать пароль в логин котролере в md5? в моделе User прописал public function setPasswordAttribute($password){ $this->attributes['password'] = md5($password); } и при регистрации он его шифрует, а вот при авторизации пароль который передаётся не шифруется.
Если уж и делаете md5, то добавляйте хотя бы соль к паролю, чтобы усложнить его несанкционированную расшифровку. А вообще, лучше вместо md5($password) делаете обращение к фасаду Hash и к его методу make: Hash::make($password); Чтобы корректно проверять пароль, добавьте в модель User метод checkPassword($password){ return Hash::make($password) === $this->password; } А в логин контроллере вы сначала вынимаете из базы данных пользователя User по email или логину (в зависимости от того, как у вас работает форма авторизации), а затем, если пользователь есть, вызываете у него метод $user->checkPassword($password); Таким образом сможете прочекать, коррректный ли пароль ввел пользователь. PS: Вместо Hash::make вызываете метод md5 (если хотите использовать именно его) PPS: Чтобы вытащить пароль в логин-контроллере, делаете это через $password = $request->post('имя поля с паролем, пришедшее от клиента');
При установке через laravel new projectname, в папке app также лежит папка Web, внутри которой есть набор базовых классов, которые унаследованы от еще более базовых. В том числе там должен лежать файл Controller/Controller.php, внутри которого должен быть подобный код (см. ниже). Если его там нет, то можно унаследоваться от класса: Illuminate\Routing\Controller
@@lectoria Ясно, буду пробовать, но я убирал эту строку с use и у меня вроде все работает все так, же как в видео. Так что не знаю, нужно ли создавать еще и этот файл. В самом коде унаследуется класс Controller. А сам класс Controller лежит в этой же папке и он почти такой же как вы прислали, за исключением того, что нет методов index и internalPage и так же унаследуется от BaseController.
@@szed8135 На самом деле, можно наследоваться и от базового класса Illuminate\Http\Controller, так как в папке Web лежит скорее пример кастомного контроллера, он по функционалу не сильно отличается от базового.
Auth::login вызвращает: ERROR: Illuminate\Auth\SessionGuard::login(): Argument #1 ($user) must be of type Illuminate\Contracts\Auth\Authenticatable, App\Models\User given
Для того, чтобы такого не возникало, модель User, которая лежит у вас в папке app/Models/ должна реализовывать интерфейс Illuminate\Contracts\Auth\Authenticatable Добавьте в начале: use Illuminate\Foundation\Auth\User as Authenticatable; А саму декларацию класса измените на: class User extends Authenticatable Класс Illuminate\Foundation\Auth\User реализует все необходимые для аутентификации методы и вообще по-умолчанию, при установке Laravel модель User уже должна содержать эти записи. Возможно, вы как-то иначе устанавливали Laravel.
Обязательно учту этот момент в новых видео-роликах. Пока таких просьб, как ваша мало, но все равно, в следующем ролике сделаю покрупнее шрифт, чтобы было комфортно смотреть на маленьких экранах.
"syntax error, unexpected 'user' (T_STRING), expecting ',' or ')' (View: D:\OpenServer\domains\myproject esources\views\login.blade.php)" не выдает страничку с формой что делать?
asset - это вспомогательная функция для формирования полного URL к ресурсам. Вот здесь можно посмотреть поподробнее, о чем это: laravel.com/docs/10.x/helpers#method-asset
Проверьте названия полей. В тег @error нужно передавать имя поля. Например @error('email') {{$message}} @enderror А также провеьте, валидируете ли вы вообще значения обрабатываемых полей.
Исчерпывающая понятная инструкция! Огромное спасибо!
Проверки на существование пользователя и тому подобное уже существуют в валидаторе:
'name' => ['required', 'string', 'max:64'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], (unique:users) - проверяет уникальность данного параметра в таблице users
'password' => ['required', 'string', 'min:6', 'max:16', 'confirmed'], (confirmed) - проверяет правильно ли мы подтвердили наш пароль
Видео про гейты и политики было бы интересно еще посмотреть)
Сразу видно опытный разработчик laravel, спасибо!
Спасибо, очень доступно раскрыта тема, хотелось бы дополнения именно к этой теме, так как это касается безопасности в целом.
Все будет )
На очереди тема гейтов и политик
Урок богатый пищей для развития, спасибо)
Благодарю за урок! толково, без воды и по делу!!! Спс за труд!!!
Спасибо, очень много полезной информации доступно рассказал и показал. Мне очень пригодилось! :)
Спасибо! Все получилось с 1 го раза! Чувствуется сразу профессионализм автора) Все четко и по полочкам. Единственно еще интересно было бы узнать, как сделать, чтоб после аутентификации, в меню пункт ,допустим, "вход" менялось на email/имя пользователя, думаю, Вы понимаете о чем я)
Ну это же не так сложно: ставите в шаблоне @auth {{ Auth::user()->email }} @endauth @guest Вход @endguest
@@lectoria маленькая но нужная деталь, отдельное спасибо что добиваете вопросы в комментах.
Огонь, благодарю за урок!
Просто спасибо большое за труд!
Артем большое спасибо! Сделайте пожалуйста видео аутентификацию с почта/телефон или через соцсети или только через гугл и с кнопкой запомнить.
Классный урок 👍👍👍
Все очень интересно и реально познавательно, но может можно это все файлом к примеру на гитхаб скинуть?
Почему не показана реализация метода create в модели User. У меня из-за отстутствия такового из контроллера RegisterController прилетает ошибка что якобы поле email не имеет значения по умолчанию.
Очевидно, что если записать в поле email значение, то такая ошибка не возникнет. Проверьте, возможно вы опечатались в названии поля email, либо вовсе не передаете его значение в поля модели при ее создании.
@@lectoria Благодарю за ответ, да действительно мой косяк: передавал в параметр метода массив validateFields в квадратных скобках. Исправил и всё заработало как часы!
Подскажите, делал по вашему видео до конца, при попытке залогиниться с существующими данными в БД вылазит ошибка: "Undefined array key "password""
Проверьте, что у вас поле в форме называется password, проверьте в логике обработки данных от формы, не допустили ли опечатки в названии этого поля. Если опечаток нет, то через функцию dd в коде blade шаблона проверьте, какие данные поступают от формы, есть ли там вообще поле password.
@@lectoria Да.. Действительно, в форме инпутов не было name="password".. Протупил :) Спасибо
А не противоречит ли стандартам подобное написание логики в контроллере?
И помимо выноса ее в роуты или тот же контроллер, куда еще можно или даже, куда НУЖНО разместить эту логику?
Можно ли создать для этой логики сервис и туда все вынести или это уже перебор и это чего-то недопонял про сервисы?
А о каких стандартах вы говорите? Сервис класс - это просто способ отделить логику, отвечающую за какой-то определенный пул задач в отдельный класс, доступный из любой точки приложения. Это не обязательно делать, если у вас данная логика встречается в одном месте.
@@lectoria Некорректно выразился, я имел ввиду то, что нужно, вроде как, стремиться к тому, чтобы в контроллере должно быть минимум кода и никакой логики
@@ddrdeveloper Согласен, есть такое понятие как "тонкий контроллер", в котором минимум кода. Но, я не всегда так делаю. Я изначально пишу логику в контроллере, чтобы как можно быстрее получить результат, но в голове прокручиваю варианты дальнейшего развития проекта и повторного использования написанного в контроллере кода, и либо сразу решаю вынести эту логику в сервис, либо оставляю ее в контроллере. Зависит от конкретного проекта и случая.
Здраствуйте , у меня есть вопрос - когда я пишу User::create вижу ошибку которая гласит Method 'create' not found in \App\Models\User , с User::where тоже самое , как это исправить ?
App\Models\User::create([ 'name' => 'zellx'])
Так пробовали?
Для того, чтобы модель User позволяла использовать метод create, нужно, чтобы класс User наследовался от класса Illuminate\Database\Eloquent\Model. Сам же метод create вообще находится в классе Builder, но это уже другой вопрос )) В общем, чтобы иметь возможность вызова метода create, необходимо наследование от класса Model. Проверьте, является ли класс User наследником этого класса
@@lectoria Здравствуйте, я проверил, он является наследником, но все равно не работает. Я не очень понял, если метод находится в классе builder, то какое отношение он имеет к абстрактному классу Model? И что мне делать, если я проверил, наследование есть, но метода create он все равно не видит?
@@даниилкосвинцев В Laravel есть такие классы, которые реализуют что-то типа наследования. Вроде как это называется mixin (подмешивание). Одним из таких примеров является класс Illuminate\Database\Eloquent\Model - он явно не наследует класс Builder, но тем не менее имеет возможность использовать его методы. Если откроете исходный код этого класса (Model), то увидите там магический метод __call, который как раз и реализует логику обращения к классу Builder. То есть вы явно не увидите методов класса Builder в подсказках IDE, но тем не менее обращаться к ним можно. Чтобы IDE умела понимать такие подмешивания, рекомендую поставить себе расширение Laravel IDE Helper:
github.com/barryvdh/laravel-ide-helper
www.jetbrains.com/help/phpstorm/laravel.html
С помощью него разработка станет куда проще.
Осталось только разобраться, почему у вас не работает метод create.
1. Убедитесь, что там, где вы хотите вызывать метод create, вы используете именно класс \App\Models\User
2. Проверьте, какой класс наследует ваш класс \App\Models\User (там должен быть либо Illuminate\Foundation\Auth\User, либо Illuminate\Database\Eloquent\Model).
3. Если там Illuminate\Foundation\Auth\User - то проверьте, не вносили ли вы случайно какие-то исправления в файл vendor/laravel/framework/src/Illuminate/Foundation/Auth/User.php)
4. Если там Illuminate\Database\Eloquent\Model, то проверьте, не вносили ли вы какие-либо исправления в файл vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
5. Если ответы на 3 и 4 - "Нет", то все должно работать. Если не работает, то я предлагаю просто состыковаться в телеграме, чтобы посмотреть скриншоты, а может и по тимвьюверу сконнектиться и разобраться, в чем дело. Телега: t.me/artprog
@@lectoria Спасибо большое за ответ! Никогда ещё мне так подробно не отвечали, очень приятно что вы так вовлечены в общение со зрителями! Я сегодня попробую пройтись по вашим пунктам, надеюсь у меня все получится)) ещё раз спасибо) с меня лайк, подписка и вечная любовь)
что делать, если у меня табличка не стандартная как в стоковом ларавеле, плюс еще нужно получить последний созданный id user чтобы соеденить его с другими полученными в тот момент данными?
Все зависит от того, что именно у вас в этой табличке нестандартно и в чем проблема со стандартной аутентификацией. Чтобы получить последний созданный id до текущего - просто сделайте User::sortby('id', 'desc')->first()->id; (логика, думаю, понятна). А чтобы получить id только что созданного пользователя, то делайте $user->id после того, как пользователь успешно создан.
Спасибо
И еще Артем сделайте пожалуйста видео о ролях юзеров.
Добрый день! Уроки отличные, спасибо! Вопрос! Создаю свою админку и там раздел работу с пользователями и при редактировании данных пользователя, пытаюсь ему сменить пароль, устанавливаю Hash::make($pass), но после обновлении данных, при попытке войти под новым паролем не проходит авторизация. Подскажите где копать?
Для начала проверьте, не хешируете ли вы пароль два раза. Сравните хеш на этапе установки с тем, что сохранилось в базу
@@lectoria Делаю так :
$data['password'] = Hash::make($pass);
$result = $user->update($data);
Да, проверил, данные разные сохраняются. А где тогда второй раз хешируется? Мне получается не надо хешировать?
@@andrei_olekh Почему конкретно в вашем случае пользователь потом не может авторизоваться, я не знаю. Но я могу посоветовать еще перед сохранением в базу вывести в лог хеш пароля и сравнить его с тем значением, которое потом лежит в базе данных. Если они не совпадают, то значит нужно искать проблему в процессе сохранения (вполне может быть, что в вашему проекте хеширование происходит автоматически и стоит попробовать в $data['password'] положить чистый пароль). Если они совпадают, то значит проблема либо в самом процессе аутентификации, либо вы хешируете пароль не тем алгоритмом, который используется при аутентификации. Это уже нужно смотреть в настройки непосредственно вашего проекта.
@@lectoria я с помощью dd вывожу значение пароля перед сохранением, в БД ложится совершенно другое значение. Настройки Laravel по хешированию не менял. Мистика..
Проблема решена! Спасибо за участие!
в 10 Laravel актуально ?
Не проверял. Но в целом не думаю, что в Laravel 10 существенно изменился принцип.
уже существующим пользователем не могу залогиниться. что бы не писал - вылазит ошибка прописанная в LoginController. вроде уже несколько раз сверил код. не понимаю,в чем может быть проблема. видимо,не вытягивает с бд 'email' 'password' ?
Причины могут быть разные, но одна из распространенных - это сохранение пароля в базу без хеширования. Проверьте, не лежит ли пароль в базе в чистом виде. Если так, то вам нужно при регистрации пользователя хешировать пароль (по-моему, если память не изменяет, это делается через фасад Hash)
@@lectoria так и оказалось. спасибо. не понял,только,почему так происходит? неужели ларавель принуждает к хешированию?
@@SiegeMechanic Потому что вы при регистрации сохранили пароль в чистом виде, а нужно сохранять в хешированном. Ларавель по-умолчанию при проверке пароля сравнивает хеш введенного пароля с тем значением, что лежит в базе данных. Это логика по-умолчанию. Если вы хотите хранить в открытом виде (хотя так делать не стоит), то вы можете переопределить эту логику путем переопределения стандартной логики проверки хеша пароля, которая лежит в методе "validateCredentials" в классе: vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php
Можете просто сделать свой провайдер пользователей, расширенный от Eloquent-провайдера, и в нем делать свою проверку пользовательских реквизитов на валидность.
@@lectoria Спасибо. Логика ясна теперь
Здравствуйте, регистрация и авторизация многи уже снимали видео но не кто не сделал роли(администратора,пользователь) ,если не трудно сделайте, заранее спасибо
Как раз в контент-плане стоит ближайшая тема про политики и гейты. Они же косвенно отвечают на вопрос ролей при авторизации. В ближайшее время должен разгрузиться от текущих рабочих задач и займусь новыми уроками.
Есть видео где используется remember_token ?
К сожалению, нет, на эту тему не снимал
@@lectoria А есть планах?
@@Hrachik333 Да честно говоря, не вижу особого интереса рассказывать про remember_token. Настолько узкая тема. Мне кажется, это будет интересно слишком малому количеству подписчиков.
Артем здравствуйте, при отправке формы через XHR стандартная валидация выдает ошбку: 422 (Unprocessable Content). Данная ошибка просто выводится в консоли и никак не отлавливается. Как быть?
Скорее всего где-то в процессе валидации данных от формы возникло исключение, которое не было соответствующим образом обработано.
@@lectoria Спасибо, уже сам разобрался. Единственное - ошибка 422 (Unprocessable Content) так и выводится в консоль. Мне в сообществе Laravel сказали, что это нормально и ничего с этим не нужно делать. Вы как считаете?
@@ddrdeveloper Ошибки быть не должно. Я считаю, это не нормально ) Я как-то ловил такую ошибку и она была связана с тем, что одно из полей не проходило валидацию, насколько я помню.
@@lectoria Да, так и есть, я намеренно допускаю ошибку валидации и это как бы не считается системной ошибкой, но в консоли в любом случае при данной ошибке высвечивается 422 красной строкой. Где я только не искал, у кого только не спрашивал, решил вот у Вас, как у эксперта узнать.
Здравствуйте, подскажите пожалуйста что я делаю не так. При попытке регистрации нового пользователя выскакиевает ошибка
SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value (HY000)
Не могу понять причем тут поле 'name' ?
Откройте таблицу, в которой хранятся пользователи в базе данных и посмотрите на поле name. Скорее всего у него стоит NOT NULL и не указано значение по-умолчанию. Поэтому при регистрации, не заполняя это поле, вы получаете ошибку базы данных.
спасибо!
Почему не сделали один контроллер UserController в котором бы описали все методы (register, login, logout) ?
Видел разные практики. Кто-то делает название контроллера, исходя из той сущности, с которой он работает. Например UserController. А где-то встречаются практики, когда контроллер называют по тому действию, которое он выполняет. Например RegisteredUserController, AuthUserController и так далее. В итоге для себя не выработал пока четкого правила, как организовывать контроллеры. В одном и том же проекте могу сделать и так, и так. Например, у меня есть проект, где много разных страниц и я изначально назвал контроллеры по той странице, к которой он относится. Например ProfileController, GameController и так далее. Но позже, когда речь зашла о действии пользователя, пришлось сделать доп. контроллер UserActionsController, так как эти действия не относятся четко к какой-либо странице сайта и могут вызываться с разных мест.
Но одно могу сказать точно - если я замечаю, что в контроллере образуется много разных (условно говоря, больше 2-3) методов для разных действий, то это верный признак того, что нужно их разносить по отдельным контроллерам. Потому что с ростом сложности, все равно будут добавляться какие-то вспомогательные функции и доп. код. И лучше, чтобы контроллеры были как можно более узко-направленными (отвечающими за как можно меньшее количество действий, в идеале 1 контроллер - 1 действие)
Не знаю почему, но у меня проблема с методом group()
Argument 1 passed to Illuminate\Routing\Router::group() must be of the type array, string given, called in W:\domains\laravel2\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php on line 261
Эта ошибка появляется, когда я оставляю group() метод. Подскажите как решить, пожалуйста
По такой информации трудно сказать. Нужно бы посмотреть на ваши маршруты.
Сначала локализуйте, в каком именно месте описания маршрутов (web.php или api.php, на какой строчке кода) у вас возникает эта проблема. Это можно найти, если поочередно закомментировать отдельные участки маршрутов, и когда ошибка исчезнет, найти то место, которое вы только что закомментировали. Затем покажите, что у вас там за код, возможно, где-то ошиблись в аргументах.
@@lectoria Это в web.php. Я делал всё как в видео и ошибка именно в group. Можно как-нибудь по-другому написать передачу маршрутов?
@@faketeam460 Да, можно без group каждый маршрут прописать отдельно, задав им имена с 'user.' спереди.
@@lectoria Спасибо
Спасибо! А можно ли отключить хеширование пароля ? Чтобы всё так же работало только без хеширования или залогиниться без пароля. Я понимаю, что всё можно сделать вручную. Но мне интересно стандарные средства ларавел (такие как Auth фасад) предусматривают такие варианты?
Теоретически можно, если изменить логику провайдера ядра Laravel - AuthServiceProvider и преопределить по итогу сервис 'auth', к которому по итогу обращается фасад Auth и вся внутренняя логика при работе с проверкой пароля. Но, мне этот вариант видится кривым, потому что мы пытаемся изменить логику ядра и это чревато ошибками совместимости с другими сервисами и пакетами, которые рассчитывают на стандартную логику ядра. По мне так лучше просто сделать альтернативное поле для пароля, назвать его, например pwd, и работать с ним так, как душе угодно - хоть с хешированием, хоть без.
Здравствуйте... данная конструкция Auth::attempt( $formFields) выдает false... в чем может быть проблема... пробовал также так: $formFields = [
'email'=>$request->input('email'),
'password'=>Hash::make($request->input('password'))
];
Если Auth::attempt выдает false, то вероятнее всего, вы неверно вводите логин или пароль. Если же вы на 100% уверены, что логин и пароль верный, то смотрите в настройки config/auth.php, что там у вас за guard и providers. Еще рекомендую заглянуть в БД и посмотреть, хешируется ли пароль при сохранении.
@@lectoria спасибо за ответ! В том то и дело, что испробованы многие варианты, и с хешем и без (регистрация), в бд все корректно.... через dd проверка входных данных... логин/пасс через ручной ввод и copy paste в итоге все работает, кроме Auth::attempt... Видимо частный случай... будем разбираться... вам огромное спасибо интересные за уроки! С нетерпениеи ждем новых!
@@lectoriaчто именно должно быть в guard и providers?
@@SiegeMechanic В guards прописываются ключи и настройки отдельных гвардов. Например: 'guards' => ['web' => [
'driver' => 'session',
'provider' => 'users',
],
],
А в providers, соответственно, указываются источники данных для сравнения с проверяемыми данными. Например, пользователи могут храниться как в базе, так и вообще на другом сайте.
Пример, когда пользователи являются Eloquent моделями:
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
],
Кстати я тут заинтересовался с 2FA (двухфакторной аутентификации) в документации промелькнуло про Fortify, но там мало об это написано и не совсем понятно, что делать. Так вот я поискал в интернете и в основном youtube выдает видео из иностраных туториалов и русско говорящих туториалах нет. Может запелить такой ролик? Я думаю многим интересно будет.
Идея хорошая! Определенно запишу себе в список тем
почему не показал css?
Это лишнее
у меня подключение css только так заработало
у тебя в видео вот так
в чем разница?
что такое asset?
А как отображать на странице данные авторизованного пользователя? Допустим, он зашел на страницу своего аккаунта и там должна отображаться информация о нем. Как ее отобразить?
Через фасад Auth можно обратиться к методу user, который возвращает текущего аутентифицированного пользователя. Ну и далее можно обращаться к его полям, например name, email, и так далее.
Если говорить про blade, то там это будет выглядеть например так:
{{ Auth::user()->email }}
@@lectoria Да, уже посмотрел в документации, спасибо
а как насчет проверки почти, валидация email
Перефразируйте вопрос, не понял вас.
@@lectoria После регистрации отправить на почту ссылку для проверки существование почты или отправить с генерируемый пароль чтобы потом он мог поменять его. Одним словом каким образом отправить почту с определенными данными. Я видел что у ларавел 8 есть верификация почты.
@@Hrachik333 Если ваша модель User наследует класс Illuminate\Foundation\Auth\User (а по-умолчанию в Laravel именно так), то при регистрации пользователя происходит отправка письма для подтверждения почты при помощи метода sendEmailVerificationNotification в трейте Illuminate\Auth\Notifications\VerifyEmail\MustVerifyEmail. Можете просто заглянуть в исходный код, чтобы просто понять логику, как это работает.
Также вы можете расширить класс User и описать свою логику отправки соответствующих писем с необходимыми данными.
Процесс отправки писем хорошо описан в документации: laravel.com/docs/8.x/mail. У меня ролика на эту тему пока нет, так как это отдельный вопрос и в рамках одного ролика про аутентификацию это уже много информации
@@lectoria спасибо посмотрю, может разберюсь
При нажатии регистрации, страница просто обновляется, не выдав ни одну ошибку.
А в логах laravel какая-нибудь ошибка есть? Или может быть в логах ошибок php? Просто если все сделать четко по инструкции, то никаких ошибок быть не должно.
С какой версией ларавел вы работаете?
Laravel 8
Подскажите при стандартной аутентификации как делать проверку на совпадения (34:23 минута)
На 34:23 речь идет о проверке совпадений на существование пользователя в базе, если происходит попытка зарегистрировать пользователя с таким же email. Не совсем понял, о проверке на какие совпадения идет речь при аутентификации. Уточните?
@@lectoria у меня у модели User нет метода where. Я просто не создавал сам таблицу, а пользуюсь встроенной аутентификацией
@@Sapsonbz В смысле, вы его не видите в коде или при попытке его вызова возникает ошибка, что данного метода нет?
Если вы их не видите в коде, то это нормально, потому что в классах Eloquent используется немного альтернативный способ, что-то вроде наследования, но фактически это просто проброс вызова в другой класс (в частности класс Builder)
Если же возникает именно ошибка, что данного метода нет в классе User, значит ваш класс User не наследуется от класса Eloquent\Model. По какой причине он у вас не наследуется - другой вопрос. ))
@@lectoria Ну у меня ошибок нет. код выполняется, только без уведомления что такой пользователь найден в системе
@@Sapsonbz Ну то есть получается, что вызов метода where работает, просто не так, как вы ожидаете? В этом случае я рекомендую проверить вообще, вызывается ли ваш контроллер и связана ли ваша модель с конкретной таблицей в базе. Для этих целей можно поставить какие-нибудь тригеры в коде, по которым вы сможете понять, выполнен ли данный код или нет. Это может быть, например
throw new Exception("Этот код выполнился");
Спасибо за ролик, супер! Вопрос: как можно преобразовать пароль в логин котролере в md5?
в моделе User прописал
public function setPasswordAttribute($password){
$this->attributes['password'] = md5($password);
}
и при регистрации он его шифрует, а вот при авторизации пароль который передаётся не шифруется.
Если уж и делаете md5, то добавляйте хотя бы соль к паролю, чтобы усложнить его несанкционированную расшифровку.
А вообще, лучше вместо md5($password) делаете обращение к фасаду Hash и к его методу make: Hash::make($password);
Чтобы корректно проверять пароль, добавьте в модель User метод checkPassword($password){ return Hash::make($password) === $this->password; }
А в логин контроллере вы сначала вынимаете из базы данных пользователя User по email или логину (в зависимости от того, как у вас работает форма авторизации), а затем, если пользователь есть, вызываете у него метод $user->checkPassword($password);
Таким образом сможете прочекать, коррректный ли пароль ввел пользователь.
PS: Вместо Hash::make вызываете метод md5 (если хотите использовать именно его)
PPS: Чтобы вытащить пароль в логин-контроллере, делаете это через $password = $request->post('имя поля с паролем, пришедшее от клиента');
@@lectoria Спасибо!
22:43
А что за описание класса Controller? У меня нет папки Web в app.
При установке через laravel new projectname, в папке app также лежит папка Web, внутри которой есть набор базовых классов, которые унаследованы от еще более базовых. В том числе там должен лежать файл Controller/Controller.php, внутри которого должен быть подобный код (см. ниже). Если его там нет, то можно унаследоваться от класса: Illuminate\Routing\Controller
@@lectoria Ясно, буду пробовать, но я убирал эту строку с use и у меня вроде все работает все так, же как в видео. Так что не знаю, нужно ли создавать еще и этот файл.
В самом коде унаследуется класс Controller. А сам класс Controller лежит в этой же папке и он почти такой же как вы прислали, за исключением того, что нет методов index и internalPage и так же унаследуется от BaseController.
@@szed8135 На самом деле, можно наследоваться и от базового класса Illuminate\Http\Controller, так как в папке Web лежит скорее пример кастомного контроллера, он по функционалу не сильно отличается от базового.
@@lectoria попробовал заменить на use Illuminate\Http\Controller; и получаю теперь
Error
Class 'Illuminate\Http\Controller\Controller' not found
@@SiegeMechanic Да, это я опечатался. Я имел ввиду Illuminate\Routing\Controller
Auth::login вызвращает: ERROR: Illuminate\Auth\SessionGuard::login(): Argument #1 ($user) must be of type Illuminate\Contracts\Auth\Authenticatable, App\Models\User given
Для того, чтобы такого не возникало, модель User, которая лежит у вас в папке app/Models/ должна реализовывать интерфейс Illuminate\Contracts\Auth\Authenticatable
Добавьте в начале:
use Illuminate\Foundation\Auth\User as Authenticatable;
А саму декларацию класса измените на:
class User extends Authenticatable
Класс Illuminate\Foundation\Auth\User реализует все необходимые для аутентификации методы и вообще по-умолчанию, при установке Laravel модель User уже должна содержать эти записи. Возможно, вы как-то иначе устанавливали Laravel.
непонятно, когды ты css творил...., с сережины фильма как будто начал
увеличь пжл немного шрифт. мне плохо видно
Обязательно учту этот момент в новых видео-роликах. Пока таких просьб, как ваша мало, но все равно, в следующем ролике сделаю покрупнее шрифт, чтобы было комфортно смотреть на маленьких экранах.
@@lectoria спасибо. уроки отличные
"syntax error, unexpected 'user' (T_STRING), expecting ',' or ')' (View: D:\OpenServer\domains\myproject
esources\views\login.blade.php)" не выдает страничку с формой что делать?
У вас синтаксическая ошибка в коде
у меня подключение css только так заработало
у тебя в видео вот так
в чем разница?
что такое asset?
asset - это вспомогательная функция для формирования полного URL к ресурсам. Вот здесь можно посмотреть поподробнее, о чем это: laravel.com/docs/10.x/helpers#method-asset
@@lectoria спасибо
Подскажите, а почему у меня не работают @error @enderror
Проверьте названия полей. В тег @error нужно передавать имя поля. Например @error('email') {{$message}} @enderror
А также провеьте, валидируете ли вы вообще значения обрабатываемых полей.