laravel 路由需要缺失

-3 javascript laravel laravel-blade

缺少 [路由:conversations.show] [URI:conversations{user}] [缺少参数:user] 的必需参数。

我不知道如何解决这个问题,因为只有当我发送消息时,当我回来时我没有问题并且消息就在那里。

对话控制器.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use App\Repository\ConversationsRepository;
use Illuminate\Auth\AuthManager;
use vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder;

class ConversationsController extends Controller
{
    /**
     * @var ConversationRepository
     */
    private $r;

       /**
     * @var AuthManager
     */
    private $auth;

    public function __construct(ConversationsRepository $conversationRepository, AuthManager $auth){
        $this->r = $conversationRepository;
        $this->auth = $auth;
    }
    
    
    
    public function index (){
        return view('conversations/index', [
            'users' => $this->r->getConversations($this->auth->user()->id)
            ]);
    }

    public function show (User $user){
        return view('conversations/show', [
            'users' => $this->r->getConversations($this->auth->user()->id),
            'user' => $user,
            'messages' => $this->r->getMessagesFor($this->auth->user()->id, $user->id)->get()->reverse()
        ]);
    }
    public function store (User $user, Request $request){
       $this->r->createMessage(
        $request->get('content'),
        $this->auth->user()->id,
        $user->id
       );
       return redirect(route('conversations.show', ['id'=> $user->id]));
    }
    

}
Run Code Online (Sandbox Code Playgroud)

对话存储库.php

<?php
namespace App\Repository;

use App\Models\User;
use App\Models\Message;
use Illuminate\Database\Eloquent\Builder;
use Carbon\Carbon;
class ConversationsRepository{

    /**
     * @var User
     */

     private $user;
      /**
     * @var Message
     */

     private $message;




    public function __construct(User $user, Message $message){
        $this->user =$user;
        $this->message =$message;
    }

    public function getConversations(int $userId){
       return $this->user->newQuery()
        ->select('name', 'id')
        ->where('id', '!=', $userId)
        ->get();
    }

    public function createMessage(string $content, int $from, int $to){
        return $this->message->newQuery()->create([
            'content' => $content,
            'seller_id' => $from,
            'buyer_id' => $to,
            'created_at' => Carbon::now()
        ]);
    }
    public function getMessagesFor(int $from, int $to): Builder{
    return $this->message->newQuery()
    ->whereRaw("((buyer_id = $from AND seller_id = $to) OR (buyer_id = $to AND seller_id = $from))")
    ->orderBy('created_at', 'DESC');
    }

}
Run Code Online (Sandbox Code Playgroud)

缺少 [路由:conversations.show] [URI:conversations{user}] [缺少参数:user] 的必需参数。

我不知道如何解决这个问题,因为只有当我发送消息时,当我回来时我没有问题并且消息就在那里。

对话控制器.php


<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use App\Repository\ConversationsRepository;
use Illuminate\Auth\AuthManager;
use vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder;

class ConversationsController extends Controller
{
    /**
     * @var ConversationRepository
     */
    private $r;

       /**
     * @var AuthManager
     */
    private $auth;

    public function __construct(ConversationsRepository $conversationRepository, AuthManager $auth){
        $this->r = $conversationRepository;
        $this->auth = $auth;
    }
    
    
    
    public function index (){
        return view('conversations/index', [
            'users' => $this->r->getConversations($this->auth->user()->id)
            ]);
    }

    public function show (User $user){
        return view('conversations/show', [
            'users' => $this->r->getConversations($this->auth->user()->id),
            'user' => $user,
            'messages' => $this->r->getMessagesFor($this->auth->user()->id, $user->id)->get()->reverse()
        ]);
    }
    public function store (User $user, Request $request){
       $this->r->createMessage(
        $request->get('content'),
        $this->auth->user()->id,
        $user->id
       );
       return redirect(route('conversations.show', ['id'=> $user->id]));
    }
    

}

Run Code Online (Sandbox Code Playgroud)

对话存储库.php


<?php
namespace App\Repository;

use App\Models\User;
use App\Models\Message;
use Illuminate\Database\Eloquent\Builder;
use Carbon\Carbon;
class ConversationsRepository{

    /**
     * @var User
     */

     private $user;
      /**
     * @var Message
     */

     private $message;




    public function __construct(User $user, Message $message){
        $this->user =$user;
        $this->message =$message;
    }

    public function getConversations(int $userId){
       return $this->user->newQuery()
        ->select('name', 'id')
        ->where('id', '!=', $userId)
        ->get();
    }

    public function createMessage(string $content, int $from, int $to){
        return $this->message->newQuery()->create([
            'content' => $content,
            'seller_id' => $from,
            'buyer_id' => $to,
            'created_at' => Carbon::now()
        ]);
    }
    public function getMessagesFor(int $from, int $to): Builder{
    return $this->message->newQuery()
    ->whereRaw("((buyer_id = $from AND seller_id = $to) OR (buyer_id = $to AND seller_id = $from))")
    ->orderBy('created_at', 'DESC');
    }

}

Run Code Online (Sandbox Code Playgroud)

显示.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
    @foreach($users as $user)
            <div class="list-group">
    <a class="list-group-item" href="{{ route('conversations.show', $user->id )}}">{{$user->name}}</a>
    @endforeach
            <div class="col-md-9">
                    <div class="card">
                        <div class="card-header">{{ $user->name }}
                            <div class="card-body conversations">
                                @foreach($messages as $message)
                                <div class="row">
                                    <div class="col-md-10 {{ $message->from->id !== $user->id ?'offset-md-2 text-right' : ''}}">
                                        <p>
                                            <strong>{{($message->from->id !== $user->id ? 'Moi' : $message->from->name) }}</strong><br>
                                            {{ $message->content }}
                                        </p>
                                    </div>
                                </div>
                                @endforeach
                            <form action="" method="post">
                            @csrf
                            <div class="from-group">
                                <textarea name="content" placeholder="Ecrivez votre message" class="form-control"></textarea>
                            </div>
                            <button class="btn btn-primary" type="submit">Envoyer</button>
                            </form>
                         </div>
                    </div>
            </div>
        </div>
    </div>
</div>
</div>
@endsection 
Run Code Online (Sandbox Code Playgroud)

网页.php

<?php

use Illuminate\Support\Facades\Route;


Route::get('/', function () {
    return view('welcome');
})->name('welcome');


Auth::routes();

Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');

Auth::routes();

/* Ads Routes */

Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');

Route::get('/annonces', [App\Http\Controllers\AdController::class,'index'])->name('ad.index');

Route::get('/annonce', [App\Http\Controllers\AdController::class,'create'])->name('ad.create');

Route::post('/annonce/create', [App\Http\Controllers\AdController::class,'store'])->name('ad.store');

Route::post('/search', [App\Http\Controllers\AdController::class,'search'])->name('ad.search');

/* Messages Routes */

Route::get('/message/{seller_id}/{ad_id}' ,[App\Http\Controllers\MessageController::class,'create'])->name('message.create');
Route::post('/message' ,[App\Http\Controllers\MessageController::class,'store'])->name('message.store');

/* Messagerie Routes */

Route::get('/messageries', [App\Http\Controllers\ConversationsController::class, 'index'])->name('messageries');
Route::get('/conversations', [App\Http\Controllers\ConversationsController::class, 'index'])->name('conversations');
Route::get('conversations/{user}', [App\Http\Controllers\ConversationsController::class, 'show'])->name('conversations.show');
Route::post('/conversations/{user}', [App\Http\Controllers\ConversationsController::class, 'store']);


Run Code Online (Sandbox Code Playgroud)

I try to have a page where you have yours conversations but when i sent message an error happen

mrh*_*rhn 5

您已经这样定义了您的路线。

Route::get('conversations/{user}', [App\Http\Controllers\ConversationsController::class, 'show'])->name('conversations.show');
Run Code Online (Sandbox Code Playgroud)

然后,当您使用助手访问路线网址时route()。您应该将 url 参数键入提示为user。如图所示,有很多地方你做错了。

route('conversations.show', ['user' => $user->id])
Run Code Online (Sandbox Code Playgroud)

或者,您可以避免使用关联数组,将其设置为方法调用的参数。

route('conversations.show', $user->id)
Run Code Online (Sandbox Code Playgroud)