#php #laravel
#php #laravel
Вопрос:
Я хочу сохранить новое сообщение из формы в своей базе данных, у меня есть заголовок и тело в $request и я хочу сохранить идентификатор зарегистрированного пользователя в сообщении. как я могу справиться с этим в модели или проверке?
Validator::make($request->all(), [
'title' => ['required'],
'body' => ['required'],
])->validate();
Post::create($request->all());
Я могу сохранить его, как показано ниже:
$post = new Flight;
$post->title = $request->title;
$post->body = $request->body;
$post->user_id = $request->user()->id;
$post->save();
но я хочу лучший способ.
- идентификатор пользователя не обнуляется в БД
Комментарии:
1. В чем проблема, что бы вы ни сделали, выглядит правильно.
2.
$request->user()->id
это дает вам аутентифицированного зарегистрированного пользователя, так в чем же проблема?3. Я хочу обработать это в модели или проверке, а в коде контроллера просто есть Post::create($request-> all());. Фактически то же самое, что и временные метки, которые Laravel обрабатывает сам или значение по умолчанию для полей, я тоже хочу справиться с этим
4. Одна вещь, которую нужно понять
$request->all()
, дает вам массив ваших входных данных формы с именами. Если у вас нет никаких входных данных в вашей формеuser_id
, вы просто не получите их$request
. Либо определите этот ввод, либо продолжайте делать то, что вы уже сделали. Подход, показанный @Muddassir, также является хорошим способом получения идентификатора пользователя, прошедшего проверку подлинности.5. Да, я знаю о формах и запросах, я хочу обрабатывать это автоматически. Например, если добавить защищенные $attributes = [‘user_id’ => 1, ]; , номер 1 всегда сохраняется для user_id , теперь я хочу идентификатор пользователя вместо номера 1
Ответ №1:
Вот пример кода, который я всегда использую.
use IlluminateHttpJsonResponse;
use IlluminateHttpResponse;
...
public function store(Request $request)
{
// take only fields that have been validated.
// instead of inserting all the request body
$validated = $request->validate([
'title' => 'required',
'body' => 'required'
]);
// use FormRequest if want seperate validation and its much cleaner
// something like this
// store(StorePostRequest $request)
// $validated = $request->validated();
// instead of declaring use Auth
// u can just use $request->user();
$post = $request->user()->post()->create($validated);
// or if you dont have the relation inside the user model
$post = Post::create(['user_id' => auth()->id()] $validated);
return new JsonResponse($post, Response::HTTP_CREATED);
}
Комментарии:
1. $post = Post::create([‘user_id’ => auth()-> id()] $validated); это не сработало для меня. но тот, который основан на отношении, был в порядке, спасибо
Ответ №2:
Включите фасад аутентификации в заголовок контроллера use Auth;
, чем вы можете использовать $post->user_id = Auth::id();
вы можете использовать оба Auth::user()->id
или Auth::id()
. Спасибо
Ответ №3:
Вы можете использовать проверку запроса формы для извлечения логина проверки из контроллера (см. Документацию).
Я бы предложил использовать $request->validated()
метод вместо $request->all()
того, чтобы убедиться, что в модель передаются только ожидаемые поля.
Кроме того, вы можете использовать auth()->id()
вспомогательный метод для получения идентификатора пользователя, вошедшего в систему.
Итак, функция контроллера может быть следующей:
Post::create(array_merge($request->validated(), ['user_id' => auth()->id()]));