Laravel Контроллер не проходит через данные - PullRequest
1 голос
/ 24 апреля 2020

Я создаю очень простое веб-приложение для опросов, и при ответе на созданный опрос контроллер не работает в контроллере, вместо того, чтобы выгружать данные массива и его информацию, он вместо этого перенаправляет их обратно в форму и не выполняет их. сбросьте что-нибудь, нет ошибок при выполнении кода, который он просто перенаправляет обратно в форму. Я попытался перенастроить и переписать форму в представлении, которое исправило некоторые вещи, но все еще не является основной проблемой

Survey Controller:

public function store(Questionnaire $questionnaire, $slug){

        $data = request()->validate([
            'responses.*.answerid' => 'required',
            'responses.*.question_id' => 'required',
            'survey.name' => 'required',
            'survey.email' =>'required | email',
        ]);

        dd($data);

    }

Blade. php View:

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">


            <h1>{{ $questionnaire->title }}</h1>
            <form action = "/surveys/{{ $questionnaire->id }}-{{Str::slug($questionnaire->title)}}" method = "post">
                @csrf 
                @foreach($questionnaire->questions as $key => $question)

                <div class="card mt-4">
                    <div class="card-header"><strong> {{ $key + 1 }} </strong>{{ $question->question }}</div>

                        <div class = "card-body">
                            @error('responses.' . $key . '.answerid')
                                <small class = "text-danger">{{ $message }}</small>
                            @enderror
                            <ul class = "list-group">
                                @foreach($question->answers as $answer)
                                    <label for="answer{{$answer->id}}">
                                        <li class="list-group-item">
                                            <input type = "hidden" name = 'responses[{{$key}}][questionid]' value = '{{$question->id}}'>
                                            <input type = "radio" name = 'responses[{{$key}}][answerid]' id = 'answer{{ $answer->id }}' class = "mr-2" value= "{{$answer->id}}" {{ old('responses.' . $key . '.answer_id') == $answer->id ? 'checked' : '' }}>
                                            {{ $answer->answer }}
                                        </li>
                                    </label>
                                @endforeach
                            </ul>
                        </div>
                    </div>

                @endforeach
                <div class="card mt-4">
                    <div class="card-header">Your Information</div>

                    <div class="card-body">
                            <div class="form-group">
                                <label for="name">Your Name</label>
                                <input name = "survey[name]" type="text" class="form-control" id="name" aria-describedby="nameHelp" placeholder="Enter Name">
                                <small id="nameHelp" class="form-text text-muted">Please Enter Your Name</small>

                                @error('name')
                                    <small class = "text-danger">{{ $message }}</small>
                                @enderror

                            </div>
                        </div>
                        <div class="card-body">
                            <div class="form-group">
                                <label for="email">Your Email</label>
                                <input name = "survey[email]" type="email" class="form-control" id="email" aria-describedby="emailHelp" placeholder="Enter Email">
                                <small id="emailHelp" class="form-text text-muted">Please enter your Email</small>

                                @error('email')
                                    <small class = "text-danger">{{ $message }}</small>
                                @enderror


                            </div>
                        </div>
                        <div>
                                <button class = "btn btn-dark" type="submit">Complete Survey</button>
                            </div>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>
@endsection

Файл маршрутов:

Route::get('/surveys/{questionnaire}-{slug}', 'SurveyController@show');
Route::post('/surveys/{questionnaire}-{slug}', 'SurveyController@store');

Модель вопросника:

protected $guarded = [];
public function surveys(){
        return $this->hasMany(Survey::class);
    }

Модель опроса:

protected $guarded = [];
public function questionnaire(){
        return $this->belongsTo(Questionnaire::class);
    }

    public function responses(){
        return $this->hasMany(SurveyResponse::class);
    }

Модель SurveyResponses:

protected $guarded = [];

    public function survey(){
        return $this->belongsTo(Survey::class);
    }

Миграция опроса:

Schema::create('surveys', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('questionnaire_id');
            $table->string('name');
            $table->string('email');
            $table->timestamps();
        });

Миграция ответов на опрос:

Schema::create('survey_responses', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('survey_id');
            $table->unsignedBigInteger('questionid');
            $table->unsignedBigInteger('answerid');
            $table->timestamps();
        });

Это форма в блейде. php Файл:

<form action = "/surveys/{{ $questionnaire->id }}-{{Str::slug($questionnaire->title)}}" method = "post">
                @csrf 
                @foreach($questionnaire->questions as $key => $question)

                <div class="card mt-4">
                    <div class="card-header"><strong> {{ $key + 1 }} </strong>{{ $question->question }}</div>

                        <div class = "card-body">
                            @error('responses.' . $key . '.answerid')
                                <small class = "text-danger">{{ $message }}</small>
                            @enderror
                            <ul class = "list-group">
                                @foreach($question->answers as $answer)
                                    <label for="answer{{$answer->id}}">
                                        <li class="list-group-item">
                                            <input type = "hidden" name = 'responses[{{$key}}][questionid]' value = '{{ $question->id }}'>
                                            <input type = "radio" name = 'responses[{{$key}}][answerid]' id = 'answer{{ $answer->id }}' class = "mr-2" value= "{{$answer->id}}" {{ old('responses.' . $key . '.answer_id') == $answer->id ? 'checked' : '' }}>
                                            {{ $answer->answer }}
                                        </li>
                                    </label>
                                @endforeach
                            </ul>
                        </div>
                    </div>

                @endforeach
                <div class="card mt-4">
                    <div class="card-header">Your Information</div>

                    <div class="card-body">
                            <div class="form-group">
                                <label for="name">Your Name</label>
                                <input name = "survey[name]" type="text" class="form-control" id="name" aria-describedby="nameHelp" placeholder="Enter Name">
                                <small id="nameHelp" class="form-text text-muted">Please Enter Your Name</small>

                                @error('name')
                                    <small class = "text-danger">{{ $message }}</small>
                                @enderror

                            </div>
                        </div>
                        <div class="card-body">
                            <div class="form-group">
                                <label for="email">Your Email</label>
                                <input name = "survey[email]" type="email" class="form-control" id="email" aria-describedby="emailHelp" placeholder="Enter Email">
                                <small id="emailHelp" class="form-text text-muted">Please enter your Email</small>

                                @error('email')
                                    <small class = "text-danger">{{ $message }}</small>
                                @enderror


                            </div>
                        </div>
                        <div>
                                <button class = "btn btn-dark" type="submit">Complete Survey</button>
                        </div>
                        @if ($errors->any())
                            <div class="alert alert-danger">
                                <ul>
                                    @foreach ($errors->all() as $error)
                                         <li>{{ $error }}</li>
                                    @endforeach
                                </ul>
                            </div>
                        @endif
                    </div>
                </div>
            </form>

Это входные данные, через которые должен быть пропущен идентификатор вопроса:

<input type = "hidden" name = 'responses[{{$key}}][questionid]' value = '{{ $question->id }}'>

1 Ответ

1 голос
/ 24 апреля 2020

Ваш dd($data); в вашем контроллере не будет запущен, если ваш запрос на проверку не пройден, потому что, если проверка не пройдена, он перенаправит вас на экран с ошибками Таким образом, у вас есть два способа увидеть ошибку:

1 - используйте приведенный ниже код в вашем контроллере:

use Illuminate\Support\Facades\Validator; // Important to use Validator Facade in this case

public function store(Questionnaire $questionnaire, $slug){

 $validator = Validator::make($request->all(), [
            'responses.*.answerid' => 'required',
            'responses.*.question_id' => 'required',
            'survey.name' => 'required',
            'survey.email' =>'required|email',
        ]);


        if ($validator->fails()) {
            //dd($validator);
            return redirect(route('route-name'))
                        ->withErrors($validator)
                        ->withInput();
        }
}

2 - используйте приведенный ниже код:

<!-- /resources/views/view-name.blade.php -->


@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...