Validation Laravel-唯一规则验证-getMessages不存在

Validation Laravel-唯一规则验证-getMessages不存在,validation,laravel,unique,Validation,Laravel,Unique,我正在编写一个简单的测验应用程序,其中有一系列挑战(简单、中等、困难),每个挑战都有自己的问题 要添加的问题应该是唯一的 我有以下代码来“存储”数据 在我的模型中,我有一个验证方法 // model class ChallengeQuests extends Model { // protected $table = 'challengequests'; protected $fillable=[ 'challenge_id', 'ques

我正在编写一个简单的测验应用程序,其中有一系列挑战(简单、中等、困难),每个挑战都有自己的问题

要添加的问题应该是唯一的

我有以下代码来“存储”数据

在我的模型中,我有一个验证方法

// model
class ChallengeQuests extends Model
{
    //
    protected $table = 'challengequests';
    protected $fillable=[
        'challenge_id',
        'question_id'
    ];

    public static function validate($input) {
        $rules = array(
            'challenge_id' => 'Required|Integer',
            'question_id' => 'Required|Integer|Unique:questions,id'
        );

        return Validator::make($input, $rules);
    }
}
但当我运行我的代码时,Laravel抱怨道

BadMethodCallException in Validator.php line 3016:
Method [getMessages] does not exist.
我想要它,这样问题就独一无二了

我做错了什么

编辑:

我正在使用:

use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Input;

堆栈跟踪:

BadMethodCallException in Validator.php line 3016:
Method [getMessages] does not exist.
in Validator.php line 3016
at Validator->__call('getMessages', array()) in ChallengeQuestionsController.php line 78
at ChallengeQuestionsController->store(object(Request))
at call_user_func_array(array(object(ChallengeQuestionsController), 'store'), array(object(Request))) in Controller.php line 80
at Controller->callAction('store', array(object(Request))) in ControllerDispatcher.php line 146
at ControllerDispatcher->call(object(ChallengeQuestionsController), object(Route), 'store') in ControllerDispatcher.php line 94
at ControllerDispatcher->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in ControllerDispatcher.php line 96
at ControllerDispatcher->callWithinStack(object(ChallengeQuestionsController), object(Route), object(Request), 'store') in ControllerDispatcher.php line 54
at ControllerDispatcher->dispatch(object(Route), object(Request), 'App\Http\Controllers\ChallengeQuestionsController', 'store') in Route.php line 174
at Route->runController(object(Request)) in Route.php line 140
at Route->run(object(Request)) in Router.php line 724
at Router->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Router.php line 726
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 699
at Router->dispatchToRoute(object(Request)) in Router.php line 675
at Router->dispatch(object(Request)) in Kernel.php line 246
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 44
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 132
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 99
at Kernel->handle(object(Request)) in index.php line 53
at require_once('/Applications/XAMPP/xamppfiles/htdocs/laravel/scquiz/public/index.php') in server.php line 21

用于获取验证消息的正确方法不是
getMessages()
,而是
messages()
,因此您的代码应该如下所示:

return Redirect::to('/')->withErrors($v->messages());
此外,如果您使用的是Laravel 5,您可能希望研究使用哪个功能可以更好地完成与您尝试实现的相同的任务,并在不同的层上处理验证,同时为您传递错误和页面重定向


通过在您的案例中使用表单请求,控制器方法将简化为:

public function store(ChallangeQuestsFormRequest $request)
{
    ChallengeQuests::create($request->only('challenge_id', 'question_id'));

    return redirect()->to($url['redirects_to']);
}

由于规则和验证以及发生错误时的重定向将由
ChallangeQuestsFormRequest
类处理。另外,使用
create
创建模型条目将自动保存条目,因此无需对
create
的结果使用
save

请发布错误的整个堆栈跟踪。根据请求添加堆栈跟踪您的解决方案有效,我可以通过
print\r
原始输出消息。我认为表单请求验证对我来说可能有点大,因为我还在学习Laravel。我还不能让页面呈现错误消息,但我想我可以通过一条Flash消息来解决这个问题。表单请求没有那么复杂,它们只是一个类,您可以将其作为参数注入控制器方法(如我的回答所示),它包含规则并为您处理验证。如果验证通过,则执行控制器方法代码,如果验证失败,则会重定向回表单,并将错误作为数组添加到{{$errors}变量中,以便在视图中显示。如果您有时间,我建议您至少阅读我链接到的文档,因为这只是几个段落,您可能会从一开始就了解其中的诀窍。另外,Laravel附带了一个名为
dump
的很好的帮助函数,这类似于
print\r
,但它的输出格式很好,具有正确的缩进和颜色。感谢您的帮助
public function store(ChallangeQuestsFormRequest $request)
{
    ChallengeQuests::create($request->only('challenge_id', 'question_id'));

    return redirect()->to($url['redirects_to']);
}