#php #laravel #laravel-8
#php #laravel #laravel-8
Вопрос:
В настоящее время я учусь выполнять вход и регистрацию в laravel8, ссылаясь на некоторые учебные пособия. Но после регистрации я получаю это сообщение Undefined offset: 1.
Строка ошибки, отображающая
$iteratee = trim($matches[1]);
Это мой файл маршрута (web.php )
use IlluminateSupportFacadesRoute;
use AppHttpControllersUserController;
Route::get('/signup',[
'uses' =>'AppHttpControllersUserController@getSignup',
'as'=>'user.signup'
]);
Route::post('/signup',[
'uses' =>'AppHttpControllersUserController@getSignup',
'as'=>'user.signup'
]);
И это часть регистрации страницы регистрации
<header class="masthead" >
<div class="container">
<div class="masthead-subheading"></div>
<div class="masthead-heading text-uppercase"></div>
<div class="container">
<div class="card bg-light">
<article class="card-body mx-auto" style="max-width: 400px;">
<h4 class="card-title mt-3 text-center">Create Account</h4>
<p class="text-center">Get started with your free account</p>
@if(count($errors) > 0)
<div class="alert alert-danger">
@foreach($errors->all()as $error)
<p>{{$error}}</p>
@endforeach
</div>
@endif
<form action="{{ route('user.signup')}}">
<div class="form-group input-group">
<div class="input-group-prepend">
<span class="input-group-text"> <i class="fa fa-envelope"></i> </span>
</div>
<input name="email" class="form-control" placeholder="Email address" type="email">
</div>
<div class="form-group input-group">
<div class="input-group-prepend">
<span class="input-group-text"> <i class="fa fa-lock"></i> </span>
</div>
<input name="password" placeholder="Create password" type="password">
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block"> Create Account </button>
{{csrf_field()}}
</div> <!-- form-group// -->
<p class="text-center">Have an account? <a href="login.html">Log In</a> </p>
</form>
</article>
</div> <!-- card.// -->
</div>
<!--container end.//-->
</header>
Пользовательский контроллер
class UserController extends Controller
{
public function getSignup()
{
return view('user.signup');
}
public function postSignup(Request $request)
{
$this->validate($request,[
'email'=> 'email|required|unique:users',
'password'=>'required|min:4'
]);
$user= new User([
'email'=>$request-> input('email'),
'password'=> bcrypt($request-> input('password'))
]);
$user-->save();
return redirect()->route('shop.index');
}
}
Пожалуйста, научите меня способу решения этой проблемы.Спасибо
Комментарии:
1.
$matches
, который является массивом (может быть? Вы не показываете, как вы его определяете), не имеет индекса1
, так что вы не можете этого сделать$matches[1]
. Есть ли что-то неясное в этом сообщении об ошибке?2. Где вы использовали этот код
trim($matches[1]);
?3. Я не понимаю.никогда раньше не использовал что-то под названием {$matches} . Но это строка кода, отображаемая в laravel с неопределенным смещением: ошибка 1. Что-то не так в моем кодировании поющей страницы?
4. Это выглядит неправильно:
Route::post('/signup', ['uses' => 'AppHttpControllersUserController@getSignup', ...
, зачемPOST
использовать маршрутgetSignup
? Должно ли это бытьpostSignup
так ? Кроме того,$user-->save();
это синтаксическая ошибка. У вас есть 2--
, должно быть$user->save();
5.
@foreach($errors->all()as $error)
является причиной этой ошибки; между()
и нет пробелаas
, поэтому@foreach()
директива завершается с ошибкой (как показано в ответе ниже). Это яркий пример того, почему отступы и интервалы так важны при написании кода. Пожалуйста, старайтесь быть последовательными и следовать соглашениям; пробелы до и после=>
для массивов, никаких пробелов->
для доступа к объектам и т. Д. И т. Д. Рассмотрите возможность использования IDE (VSCode, SublimeText и т. Д.), В которой есть подсветка linter / syntax, Чтобы избежать этих проблем.
Ответ №1:
Вы должны добавить пробел @foreach
между частями:
@foreach($errors->all()as $error)
Должно быть:
@foreach($errors->all() as $error)
Блейд-компилятор анализирует выражение, переданное в эту директиву, и выполняет preg_match
над ним a, чтобы получить фрагменты выражения, поскольку эта директива делает больше, чем просто создает foreach
цикл. Вот совпадение по выражению:
preg_match('/( *(.*) as *(.*))$/is', $expression, $matches);
$iteratee = trim($matches[1]);
Комментарии:
1. единственное место во всей базе кода, где
$iteratee = trim($matches[1]);
оно существует, находится в блейд-компиляторе@compileForelse
и@compileForeach
(которое исходит изCompilesLoops
признака)2. Исправлено @foreach, как вы сказали, но ошибка продолжает поступать. Что-то не так, как я использовал цикл в своем блейд-файле
3. @tuneKawaiiUwU Представление может быть кэшировано, попробуйте очистить его.