#php #mysql #laravel #laravel-8
#php #mysql #laravel #laravel-8
Вопрос:
Я работаю с Laravel 8, и я создаю простую форму, которая выглядит следующим образом:
<form action="/create" method="POST">
@csrf
<label for="title">Title:</label>
<input type="text" name="title"></br>
<label for="body">Body:</label>
<textarea name="body" cols="30" rows="10"></textarea>
<button>Send</button>
</form>
Затем web.php
я добавляю это:
Route::post('/create',function(){
$validator = Validator::make(request()->all(),[
'title' => 'required',
'body' => 'required'
]);
Article::create([
'title' => request('title'),
'body' => request('body')
]);
return redirect('/create');
});
Но как только я отправляю форму, я вижу сообщение:
Исключение IlluminateDatabase QueryException SQLSTATE[23000]: нарушение ограничения целостности: заголовок столбца 1048 не может быть нулевым (SQL: вставить в articles
( title
, body
, updated_at
, created_at
) значения (?, ?, 2020-10-27 07:36:47, 2020-10-27 07:36:47))
И я знаю, что это означает, что в таблице есть столбец, который не может быть нулевым. Но, как вы можете видеть в коде, я определяю проверку, поэтому, если входные данные не заполнены, должно появиться требуемое сообщение, но этого не происходит, и снова появляется сообщение об ошибке.
И это также миграция таблицы:
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->timestamps();
});
}
Итак, если вы знаете, как я могу решить эту проблему, пожалуйста, дайте мне знать, я был бы очень признателен…
Заранее спасибо.
Комментарии:
1. Попробуйте
dd(request()->all())
просмотреть все параметры post2.
array:3 [▼ "_token" => "WupvBPXbBaL1lxOrOMRSq5weZH654tKNh2ewwJZS" "title" => null "body" => null ]
3. Итак, вот почему ваш код не работает. Мои рекомендации; 1) Попробуйте не использовать обработчики запросов на основе закрытия. Используйте контроллеры.
4. Итак, почему проверка не работает, поэтому пользователь ДОЛЖЕН заполнить форму
5. 2) Используйте
$request->validate()
вместо создания нового средства проверки.
Ответ №1:
Вы создаете экземпляр средства проверки, но не проверяете данные с его помощью.
$validator = Validator::make(request()->all(),[
'title' => 'required',
'body' => 'required'
]);
// Validates request data. If fails redirect to /create
if ($validator->fails()) {
return redirect('/create')
->withErrors($validator)
->withInput();
}
// Validation passed, create article.
Article::create([
'title' => request()->input('title'),
'body' => request()->input('body')
]);
return redirect('/create');
Также прочитайте о работе с сообщениями об ошибках проверки, чтобы понять, как отображать сообщения об ошибках на /create
странице.
Ответ №2:
Если вы создаете экземпляр средства проверки вручную, вам придется самостоятельно обрабатывать неудачную проверку. Вы можете проверить, не завершилась ли проверка с $validator->fails()
помощью . Я бы использовал $request->validate()
вместо этого, поэтому Laravel автоматически обрабатывает неудачную проверку.
Если вы не хотите использовать
validate
метод в запросе, вы можете создать экземпляр валидатора вручную, используяValidator
фасад.make
Метод на фасаде генерирует новый экземпляр валидатора:
<?php
namespace AppHttpControllers;
use AppHttpControllersController;
use IlluminateHttpRequest;
use IlluminateSupportFacadesValidator;
class PostController extends Controller
{
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
if ($validator->fails()) {
return redirect('post/create')
->withErrors($validator)
->withInput();
}
// Store the blog post...
}
}
После проверки, не удалась ли проверка запроса, вы можете использовать
withErrors
метод для отправки сообщений об ошибках в сеанс. При
использовании этого метода$errors
переменная будет автоматически использоваться совместно
с вашими представлениями после перенаправления, что позволяет вам легко отображать их
обратно пользователю.withErrors
Метод принимает средство проверки, a
MessageBag
или PHParray
.
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// The blog post is valid...
}
Теперь мы готовы заполнить наш
store
метод логикой
validate
нового сообщения в блоге. Для этого мы будем использовать метод validate
, предоставляемыйIlluminateHttpRequest
объектом. Если
правила проверки пройдут, ваш код продолжит выполняться нормально;
однако, если проверка завершится неудачно, будет выдано исключение, и
правильный ответ об ошибке будет автоматически отправлен обратно пользователю. В
случае традиционного HTTP-запроса будет
сгенерирован ответ перенаправления, в то время как для запросов AJAX будет отправлен ответ JSON.
Итак, в вашем случае это будет следующее:
use IlluminateHttpRequest;
use AppModelsArticle;
Route::post('/create', function (Request $request) {
$validatedData = $request->validate([
'title' => 'required',
'body' => 'required',
]);
Article::create($validatedData);
return redirect('/create');
});
Ответ №3:
Вам нужно будет указать fillable
либо guarded
атрибут or в модели, так как все модели Eloquent по умолчанию защищают от массового присвоения.
Вы можете видеть это в черте, используемой моделью:
trait GuardsAttributes
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [];
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = ['*'];
// ...
}
Поэтому вам нужно сделать поля заполняемыми.
class Article extends Model
{
protected $fillable = [
'title',
'body',
];
}
Ответ №4:
Route::post('/create',function(){
$validator = Validator::make(request()->all(),[
'title' => 'required',
'body' => 'required'
]);
Article::create([
'title' => request()->input('title'),
'body' => request()->input('body')
]);
return redirect('/create');
});
Комментарии:
1. Вы написали заполняемую функцию в файле статьи?
2. защищенный $ fillable = [ ‘title’, ‘body’ ];
3. Валидатор::make($request-> all(), [ ‘title’ => ‘required’, ‘body’ => ‘required’, ])->validate();
4. Пожалуйста, добавьте некоторые пояснения к вашему ответу, чтобы другие могли извлечь из него уроки
Ответ №5:
Попробуйте это:
Route::post('/create',function(){
$validateData = request()->validate([
'title' => 'required',
'body' => 'required',
]);
Article::create(request()->all());
return redirect('/create');
});
Комментарии:
1. Пожалуйста, добавьте некоторые пояснения к вашему ответу, чтобы другие могли извлечь из него уроки