类型错误:传递给 Controller::show() 的参数 2 必须是模态的实例,给定的字符串

Dus*_*tin 2 php laravel vue.js

向分类页面添加上下投票功能。使用 Laravel 和 Vue。

我得到的错误是:

(1/1) FatalThrowableError 类型错误:传递给 Hustla\Http\Controllers\ListingVoteController::show() 的参数 2 必须是 Hustla\Listing 的一个实例,给出的字符串

我已经包含了 vue 文件、投票控制器、列表模型和路由。我希望有人可以帮助我。

上市模式

 public function votesAllowed()
 {
     return (bool) $this->allow_votes;
 }

 public function commentsAllowed()
 {
     return (bool) $this->allow_comments;
 }

 public function votes()
 {
  return $this->morphMany(Vote::class, 'voteable');
 }

 public function upVotes()
 {
     return $this->votes()->where('type', 'up');
 }

 public function downVotes()
 {
     return $this->votes()->where('type', 'down');
 }

 public function voteFromUser(User $user)
 {
     return $this->votes()->where('user_id', $user->id);
 }
Run Code Online (Sandbox Code Playgroud)

投票控制器

  public function show(Request $request, Listing $listing)
  {

    $response = [
        'up' => null,
        'down' => null,
        'can_vote' => $listing->votesAllowed(),
        'user_vote' => null,
    ];

    if ($listing->votesAllowed()) {
        $response['up'] = $listing->upVotes()->count();
        $response['down'] = $listing->downVotes()->count();
    }


    if ($request->user()) {
        $voteFromUser = $listing->voteFromUser($request->user())->first();
        $response['user_vote'] = $voteFromUser ? $voteFromUser->type : null;
    }

    return response()->json([
        'data' => $response
    ], 200);
}
Run Code Online (Sandbox Code Playgroud)

投票.vue

<template>
<div class="listing__voting">
    <a href="#" class="listing__voting-button">
        <span class="glyphicon glyphicon-thumbs-up"></span>
    </a> 1 &nbsp;

    <a href="#" class="listing__voting-button">
        <span class="glyphicon glyphicon-thumbs-down"></span>
    </a> 2 
</div>
</template>

<script>
    export default {
    data () {
        return {
            up: null,
            down: null,
            userVote: null,
            canVote: false
        }
    },
    props:{
        listingId: null
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

路线

Route::get('/{location}/{listing}/votes',[
'uses' => '\Hustla\Http\Controllers\ListingVoteController@show'
]);
Run Code Online (Sandbox Code Playgroud)

pat*_*cus 5

您的路由定义定义了两个参数:{location}{listing}。参数按照定义的顺序传递给控制器​​方法。

但是,您的控制器方法仅被定义为接受一个路由参数。第一个路由参数是将传递给方法的内容,在此路由定义中,这就是{location}参数。由于{location}不匹配$listing,字符串值将被传入,并且您将看到您看到的错误。

您需要将第二个路由参数添加到您的控制器操作中:

public function show(Request $request, $location, Listing $listing)
{
    // code
}
Run Code Online (Sandbox Code Playgroud)

如果$location也是模型,您可以继续添加类型提示以启用隐式路由模型绑定。