Перенаправление на другой маршрут после отправки формы Laravel

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

Это контроллер

ProductReviewController

public function store(Request $request, Product $product)
{   
    auth()->user()->reviews()->create($request->all());

    return redirect()->route('welcome.show', compact('product'));
}

Это маршрут, который я пытаюсь перенаправить.

Web.php

Route::get('/products/{product}', [ 
'uses' => 'ProductController@showOne',
'as' => 'welcome.show'
]);

И это контролер этого маршрута

ProductController

public function showOne(Product $product, ProductReview $productReview)
{
    return view('welcome.show', ['product' => $product]);
}

Что я делаю неправильно? Потому что каждый раз, когда я пытаюсь перенаправить на этот маршрут, он выдает мне эту ошибку.

"Symfony\Component\HttpKernel\Exception\NotFoundHttpException"

Выдает эту новую ошибку, когда я меняю код контроллера для:

Новый код контроллера

public function store(Request $request, Product $product)
{   
auth()->user()->reviews()->create($request->all());

return redirect()->route('welcome.show', $product->id));
}

Ошибка

"Missing required parameters for [Route: welcome.show] [URI: products/{product}]."

Это взгляды:

Компонент Vue

    <template>
    <form @submit.prevent = "postReview">
            <div class = "form-group">
                <p class = "mt-4 text-center"><strong>How would you rate it?</strong></p>
                <h4 class = " offset-md-3"><star-rating v-model = "formData.rating"></star-rating></h4> 
            </div>
            <hr>
            <div class = "form-group">
                <label for = "headline"><strong>Review title</strong></label>
                <input type = "text" class = "form-control" v-model = "formData.headline" id = "headline" placeholder = "Add a title for your review">
            </div>
            <div class = "form-group">
                <label for = "description"><strong>Description</strong></label>
                <textarea v-model = "formData.description" class = "w-100 rounded pl-2 pt-2 border border-muted" style = "height:100px" id = "description" cols = "30" rows = "10" placeholder = "Tell us about your experiences with this product"></textarea>
            </div>

            <button class = "btn btn-primary rounded offset-md-4" type = "submit">Send review</button>
    </form>
</template>

<script>
 export default {
    props:['product','url', 'user'],
    data(){
        return {
            formData:{}
        }
    },
    methods:{
        postReview(){
            this.formData.product_id=this.product.id;
            this.formData.user_name=this.user.first_name;

            axios.post(this.url,this.formData)
                .then(data=>{
                    location.reload();
                })
                .catch(error=>{
                    console.info(error.response);
                })
        }
    },
}
</script>

Вид лезвия

    @extends('layouts.app')

@section('title')
Review
@endsection

@section('content')
<div class = "container">
    <div class = "row">
        <div class = "col-md-6">
            <div class = "col-md-12 product-img">
                <div class = "card">
                    <div class = "card-image">
                        <div class = "carousel-item active">
                        <img class = "d-block mx-auto" src = "{{ $product->imageUrl }}" alt = "First slide">
                        </div>
                    </div>
                </div>
            </div>
            <h5 class = "text-center">{{ $product->title }}</h5>
        </div>
        <div class = "col-md-6" id = "app">
            <review-form
            :user = "{{Auth::user()}}"
            :product = "{{$product}}"
            url = "{{route('review.store')}}">
            </review-form>
        </div>
    </div>
</div>
@endsection

Вы можете пройти по указанному маршруту вручную без ошибок?

Wreigh 30.05.2018 03:44

Да, у меня нет проблем с этим

user8946984 30.05.2018 03:48

$product в функции store, а не нуль?

Wreigh 30.05.2018 04:03

Нет, это не так. Это объект, я сделал dd (), и он показывает свои свойства

user8946984 30.05.2018 04:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
4
6 394
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Если ваш маршрут имеет параметры, вы можете передать их в качестве второго аргумента метода маршрута:

// For a route with the following URI: /products/{product}

    return redirect()->route('welcome.show', ['product' => $product]);

Я делаю это, но выдает ту же ошибку. Как вы думаете, в чем проблема?

user8946984 30.05.2018 04:39

Я не уверен, но полагаю, что $ product - это объект модели или объект другого типа. В том случае, если ваш маршрут ожидает $ product-> slug или $ product-> Id, тогда

return route(“welcome.show”, [“product” => $product->id]);

Просто верните URL-адрес маршрута, а затем измените сценарий компонента Vue, как показано ниже:

<script>
export default {
props:['product','url', 'user'],
data(){
    return {
        formData:{}
    }
},
methods:{
    postReview(){
        this.formData.product_id=this.product.id;
        this.formData.user_name=this.user.first_name;

        axios.post(this.url,this.formData)
            .then(function(response){
                   location.href = response;// Honestly i am not expert in vue but i would guess it should work something like this.

            })
            .catch(error=>{
                console.info(error.response);
            })
        }
    },
}
</script>

Да, я пытаюсь перенаправить его, но теперь, когда я изменил его на ваш код. Это выдает мне новую ошибку. Посмотрите вопрос, я его редактировал.

user8946984 30.05.2018 06:26

Замените код, например: return redirect () -> route («welcome.show», [«product» => $ product-> id]);

Purvesh 30.05.2018 06:31

Отправляю ту же ошибку. "Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpExceptio‌ n"

user8946984 30.05.2018 07:17

одна вещь, которую я не могу понять в вашем коде: зачем отправлять запрос ajax с использованием axios, тогда почему вы перенаправляете на другой маршрут? Если вы хотите отправить запрос ajax, тогда в контроллере вы просто возвращаете URL-адрес, который хотите перенаправить, и внутри обратного вызова ajax, который вы используете: location.url = url_from_controller.

Purvesh 30.05.2018 07:49

взгляните на этот вопрос: stackoverflow.com/questions/199099/…

Purvesh 30.05.2018 07:50

Я никогда не думал об этом. Я просто пытался использовать библиотеку Vuejs, и вот как они используют ее для отправки формы, но я не знал, как это повлияет на меня в момент перенаправления маршрута. Итак, для вас. Как лучше и проще решить эту проблему?

user8946984 30.05.2018 07:57

Вы показываете то же имя маршрута, а также перенаправляетесь на то же имя маршрута. Попробуйте вот так:

return redirect('route name');

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

user8946984 30.05.2018 06:48

попробуйте window.location.href = "url"; вместо location.reload ();

PHP Geek 30.05.2018 07:37

Я пробовал с именем маршрута и URL-адресом маршрута, но он не перенаправляет меня в другое представление

user8946984 30.05.2018 07:44
In your js section you have added the code :
 axios.post(this.url,this.formData)
                .then(data=>{
                    location.reload();
                })
                .catch(error=>{
                    console.info(error.response);
                })

here you are reloading the page..
write the redirection code at place of location.reload except in controller.
I hope it will work

И ты знаешь, как я могу это сделать?

user8946984 30.05.2018 07:31

Попробуй это

return redirect()->action('ProductController@showOne', ['product' => $product]);
Ответ принят как подходящий

Я просто решил свою проблему, добавив это:

window.location.href = "/products/" + this.formData.product_id

Это мой новый файл Vuejs:

    <template>
    <form @submit.prevent = "postReview">
            <div class = "form-group">
                <p class = "mt-4 text-center"><strong>How would you rate it?</strong></p>
                <h4 class = " offset-md-3"><star-rating v-model = "formData.rating"></star-rating></h4> 
            </div>
            <hr>
            <div class = "form-group">
                <label for = "headline"><strong>Review title</strong></label>
                <input type = "text" class = "form-control" v-model = "formData.headline" id = "headline" placeholder = "Add a title for your review">
            </div>
            <div class = "form-group">
                <label for = "description"><strong>Description</strong></label>
                <textarea v-model = "formData.description" class = "w-100 rounded pl-2 pt-2 border border-muted" style = "height:100px" id = "description" cols = "30" rows = "10" placeholder = "Tell us about your experiences with this product"></textarea>
            </div>

            <button class = "btn btn-primary rounded offset-md-4" type = "submit">Send review</button>
    </form>
</template>

<script>
 export default {
    props:['product','url', 'user'],
    data(){
        return {
            formData:{}
        }
    },
    methods:{
        postReview(){
            this.formData.product_id=this.product.id;
            this.formData.user_name=this.user.first_name;

            axios.post(this.url,this.formData)
                .then(data=>{
                    window.location.href = "/products/" + this.formData.product_id;
                })
                .catch(error=>{
                    console.info(error.response);
                })
        }
    },
}
</script>

Другие вопросы по теме