Прочитал в документации, что доп.поля при регистрации можно добавить в контроллере RegisterController, так и сделал: PHP: protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'IP-address' => $_SERVER['REMOTE_ADDR'], ]); } Конкретно - добавил дополнительное поле IP-address (разумеется, в базе оно тоже есть). Однако почему-то при нажатии кнопки регистрации выдает ошибку: SQLSTATE[HY000]: General error: 1364 Field 'IP-address' doesn't have a default value. Перевести я ее могу, но не понимаю почему не работает добавленная строчка $_SERVER['REOTE_ADDR'] Что-то не так делаю?
Ну и вдогонку вопрос: после выполнения команды php artisan make:auth я изменил строку @extends('layouts.app') на @extends('layouts.layout'), чтобы страницы входа и регистрации были внутри контейнера. А теперь смотрю этот файл app и возник вопрос не сломается ли что-нибудь в механизме регистрации и авторизации? Может что-то важное было в app, а я поменял на свой шаблон
Ну для начала название для поля диковатое.,.. Обычно ip_sddres, ipAddres имена.. У вас поле nullable ? Вы уверены что в Код (Text): $_SERVER['REMOTE_ADDR'], что то есть? Проверьте
Зачем делать его nullable? У пользователя не может быть айпи вообще? А почему там не должно чего-то быть? Это же элемент из суперглобального массива. Или в laravel не действуют общие правила php?
Laravel тут не при чём. Некоторые элементы суперглобальных массивов создаются из заголовков. А заголовки можно не передать или передать поддельные. Конкретно $_SERVER['REMOTE_ADDR'] может не быть или быть поддельным. А ещё это всё может быть изменено на этапе проксирования между веб-серверами правилами проксирования. Для более работающего определения IP используй что-то вроде PHP: function getIp() { $keys = [ 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR' ]; foreach ($keys as $key) { if (!empty($_SERVER[$key])) { $ip = trim(end(explode(',', $_SERVER[$key]))); if (filter_var($ip, FILTER_VALIDATE_IP)) { return $ip; } } } } $ip = getIp();
Такую ошибку выдает на 11 строке: Only variables should be passed by reference Итоговый код такой: PHP: protected function create(array $data) { function getIp() { $keys = [ 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR' ]; foreach ($keys as $key) { if (!empty($_SERVER[$key])) { $ip = trim(end(explode(',', $_SERVER[$key]))); if (filter_var($ip, FILTER_VALIDATE_IP)) { return $ip; } } } } $ip = getIp(); return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'IP-address' => $ip, ]); }
@lordconst, отладчиком пользуетесь? Посмотрите, в каком поле у вас IP. И не называйте так поля, для eloquent лучше, чтоб названия полей были сформированы по правилам идентификаторов PHP
Означает, что ожидается явным образом заданная переменная, а не промежуточный результат вызова функции. Из используемых в 11-й строке - это функция end(). То есть надо сначала результат выполнения функции explode() присвоить какой-нибудь переменной и уже её использовать в качестве аргумента функции end().