Я занимаюсь разработкой веб-сайта с несколькими материалами, включая блог, и у меня возникли некоторые сомнения относительно защиты массовых назначений.
Когда я публикую комментарий к статье в блоге, я предполагаю, что полями ‘fillable’ будут тело комментария, идентификатор статьи и parent_comment_id (необязательно и используется только для ответов на комментарий), но когда я подошел к
ArticleComment::create([
'author_id' => Auth::user()->id,
'body' => $request->input('body'),
'article_id' => $request->input('article_id'),
'parent_comment_id' => $request->input('parent_comment_id')
]);
Я обнаружил, что даже поле author_id должно быть массово назначаемым, чтобы оно сохранялось в базе данных (и не получало ошибку внешнего ключа).
Единственной альтернативой, которую я нашел, было бы собрать комментарий из нового экземпляра и сохранить его:
$comment = new App\ArticleComment();
$comment->author_id = Auth::user()->id;
$comment->body = $request->input('body');
$comment->article_id = $request->input('article_id');
$comment->parent_comment_id = $request->input('parent_comment_id');
$comment->save()
но в этом случае не было бы необходимости иметь какое-либо «заполненное» поле, потому что этот способ не генерирует никаких исключений массового присваивания.
Я знаю, что массовое назначение должно предотвратить изменение вредоносных данных с помощью пост-запроса, но я не совсем понимаю, например, как кто-то изменил бы author_id в строке 2, так как это происходит от Auth, а не от ввода.
Я думаю, что в этом случае вы бы использовали new ArticleComment($request->input())
или же $comment->fill($request->input())
назначить вводимые пользователем данные, затем назначить идентификаторы или данные, не редактируемые пользователем (в вашем случае author_id
) по отдельности.
$comment = new App\ArticleComment($request->input());
$comment->author_id = Auth::user()->id;
$comment->save()
Это помешает пользователям размещать форму с полем author_id в качестве поля, но все же позволяет быстро назначать пользовательские поля без необходимости перечислять их везде, где это необходимо.
В вашем примере никто не сможет его изменить. Однако что, если вы хотите назначить что-то подобное?
ArticleComment::create($request->all());
Теперь поля Можно быть изменены. Это то, от чего предназначено массовое назначение.