#php #laravel
#php #laravel
Вопрос:
я новичок в коде и задаюсь вопросом, почему мой идентификатор комментария не связан с правильным идентификатором сообщения.
Это мой контроллер комментариев
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use AppModelsTweet;
use AppModelsUser;
use AppModelsComment;
class CommentController extends Controller
{
public function show()
{
return view('comments',[
'tweets' => Tweet::all()
]);
}
public function store(Tweet $tweet)
{
$attributes = request()->validate(['comment_body' => 'required|max:255']);
Comment::create([
'user_id' => auth()->id(),
'tweet_id' => $tweet->id,
'comment_body' => $attributes['comment_body']
]);
return redirect('/comments/{$tweet->id}');
}
}
Это мой comment.blade.php файл
x-app>
<div class="border border-blue-400 rounded-lg px-8 py-6 mb-8">
{{dd($tweets)}}
@foreach ($tweets as $tweet)
<form method="POST" action="/comments/{{$tweet->id}}">
@csrf
@endforeach
<textarea
name="comment_body"
class="w-full"
placeholder="Reply to this tweet"
required
autofocus
>
</textarea>
<hr class="my-4">
<footer class="flex justify-between items-center">
<img
src="/images/twitter.jpg"
alt=""
class="mr-2 rounded-full"
width="50"
>
<button type="submit" class="bg-blue-500 hover:bg-blue-600 rounded-lg shadow px-10 text-white h-10">Comment</button>
</footer>
</form>
@error('body')
<p class="text-red-500 text-sm mt-2">{{ $message }} </p>
@enderror
</div>
<div class="border border-gray-300 rounded-lg">
<p class="p-4">No comments</p>
</div>
</x-app>
Основная проблема заключается в том, что я нажимаю комментарий и вместо того, чтобы вводить его в базу данных, как это должно быть, например, я комментирую твит с идентификатором 2 в базе данных, и комментарий будет иметь идентификатор твита 1, который предназначен для их связи, но вместо этого все комментарии будутидентификатор твита 1.
Комментарии:
1. ваш
@endforeach
должен быть перед</form>
закрытием тега, иначе он создаст так много<form>
тегов без какого-либо закрытия
Ответ №1:
Ваш метод контроллера ожидает модель «Tweet», а не $tweet->id
, которую вы публикуете.
Вы можете подтвердить это, выполнив print_r on $tweet
в методе store вашего контроллера.
print_r($tweet);
Измените действие формы на
<form method="POST" action="/comments/{{$tweet}}">
ЕСЛИ ВЫ НЕ ИСПОЛЬЗУЕТЕ МАРШРУТ РЕСУРСА
Ваш почтовый маршрут для этого действия должен быть настроен следующим образом:
Route::post('/comments/{tweet}, 'CommentController@store');
Согласно комментарию ДжошБонника, тег открытия формы находится в вашем @foreach
цикле в приведенном вами примере блейда, но закрытие — нет, вы, вероятно, захотите переместить свой @endforeach
тег ниже закрывающего </form>
тега
У вас также есть ошибка в вашем перенаправлении в контроллере, вам не нужны фигурные скобки {}
вокруг {$tweet->id}
Комментарии:
1. Теги открытия формы также находятся внутри
foreach
цикла, аone
один закрывающий тег находится вне этого цикла.2. хорошо заметил @JoshBonnick — я включу это в свой ответ
3. Привет, спасибо за ваше время, но я изменил следующие вещи, как вы сказали, и теперь вместо этого я получаю это мой URL {«id»: 1,»user_id»:1,»body»:»a»,»created_at»:»2020-10-20T09:58:58.000000Z»,»updated_at»:»2020-10-20T09:58:58.000000Z»}
4. вы уверены, что используете метод post?
5. Маршрут:: post(«/ comments/{tweet}», «App Http Controllers CommentController @store»); это мой маршрут, мне пришлось изменить его, чтобы учесть мою версию laravel, которая является laravel 8
Ответ №2:
POST
Метод не будет принимать идентификатор из действия. Вы можете использовать скрытое поле для идентификатора в форме.