Метод публикации не работает, несмотря на добавление токена CSRF

Я новичок в Laravel, я пытался использовать форму и поэтому использовал в ней метод post после добавления токена CSRF. Также я загрузил form builder package и сделал все необходимые настройки. Но почему-то метод post в routes не работает. Хотя я пробовал использовать методы get и any в маршрутах, и они отлично работали.

Controller:

use App\Http\Controllers\Controller;

class AdminController extends Controller
{
    public function index()
    {
        echo "admin controller";
    }

    public function formSubmit()
    {
        echo "Form Submit Method";
        return view('layouts\formView');
    }
}

View:

@extends('layouts\masterLayout')
@section('head')

{!!Form::open(['route'=>'f.submit'])!!}
<input type = "hidden" name = "_token" value = "{{ csrf_token() }}">
{!!Form::text('field-one')!!}
{!!Form::submit('')!!}
@endsection

Route:

Route::post('form-submit',['uses'=>'Admin\AdminController@formSubmit', 'as'=>'f.submit']);

Ошибка: трассировка стека

in RouteCollection.php line 218
at RouteCollection->methodNotAllowed(array('POST')) in RouteCollection.php line 205
at RouteCollection->getRouteForMethods(object(Request), array('POST')) in RouteCollection.php line 158
at RouteCollection->match(object(Request)) in Router.php line 821
at Router->findRoute(object(Request)) in Router.php line 691
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 136
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

если вы используете {!! Form::open([, csrf будет автоматически генерироваться, поэтому нет необходимости в <input type = "hidden" name = "_token" value = "{{ csrf_token() }}">

arun 25.04.2018 11:26

@arun Я пробовал использовать без токена, но метод post не работает! Но get работает нормально.

Don'tDownvoteMe 25.04.2018 11:30

что ошибка говорит?

Just L 25.04.2018 11:37

@JustL Получение исключения MethodNotAllowedHttpException in RouteCollection.php line 218:

Don'tDownvoteMe 25.04.2018 11:45

с постом все в порядке, следите за своим маршрутом. загрузите код маршрута пожалуйста

Just L 25.04.2018 11:52
route был упомянут в вопросе выше, пожалуйста, обратитесь.
Don'tDownvoteMe 25.04.2018 11:54

попробуйте использовать более простой маршрут, например Route :: post ('action_form', 'YourController @ YourAction') ;. в форме, <form method = "post" action = "action_form">

Just L 25.04.2018 11:59

В таком случае якобы мне придется добавить токен CSRF?

Don'tDownvoteMe 25.04.2018 12:00

конечно, оставьте токен csrf, он должен быть там, если вы хотите POST

Just L 25.04.2018 12:01

Я попробую, но этот отлично работает с get, что означает, что форма маршрута, контроллер, все работает нормально.

Don'tDownvoteMe 25.04.2018 12:03

вы уже знаете, как писать код в контроллере, верно? если да, то все будет хорошо, просто попробуйте написать простой код

Just L 25.04.2018 12:03

если действие GET работает отлично, что у вас получилось с действием POST?

Just L 25.04.2018 12:04

Исключение, трассировка стека упоминается выше в вопросе

Don'tDownvoteMe 25.04.2018 12:06

вы изменили свой маршрут и форму, как я уже сказал?

Just L 25.04.2018 12:07

выполните поиск по руководству по laravel, перейдите в laracast или kodepedia. там много учебников с более простым кодом

Just L 25.04.2018 12:09
Стоит ли изучать 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-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
15
213
2

Ответы 2

Изменять

{!!Form::open(['route'=>'f.submit'])!!}

к

{!!Form::open(['route'=>'f.submit', 'method' => 'POST'])!!}

Причина, наверное, очевидна ;-)

РЕДАКТИРОВАТЬ

Можете ли вы изменить подпись функции formSubmit на это:

public function formSubmit(Request $request)
{
    echo "Form Submit Method";
    return view('layouts\formView');
}

По-прежнему возникает исключение MethodNotAllowedHttpException in RouteCollection.php line 218:

Don'tDownvoteMe 25.04.2018 11:45

Чего ждать? Вы указали свой маршрут в файле web.php? А вы удостоверились, что маршруты не кешируются?

Loek 25.04.2018 11:48

@DontDownvoteMe, попробуйте php artisan route:clear, также убедитесь, что ваш маршрут позволяет отправлять запросы на публикацию

Bagus Tesa 25.04.2018 11:50

@Loek, я использую v5.2, и я объявил маршруты в routes.php, а также очистил route cache

Don'tDownvoteMe 25.04.2018 11:53

@BagusTesa Очистил route cache, но проблема осталась прежней.

Don'tDownvoteMe 25.04.2018 11:53

Если поменять его на {!!Form::open(['url'=>'form-submit', 'method' => 'POST'])!!}, что произойдет?

Loek 25.04.2018 11:55

Это вызывает то же исключение. Даже пробовал {!!Form::open(['route'=>'f.submit', 'method'=>'POST'])!!}, но все равно исключение.

Don'tDownvoteMe 25.04.2018 11:58

хм, это сложно, что вам дал route:list?

Bagus Tesa 25.04.2018 12:01

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

Loek 25.04.2018 12:03

Я отправлю всю трассировку стека в вопросе выше, пожалуйста, проверьте!

Don'tDownvoteMe 25.04.2018 12:04

Обновил свой ответ. Если это не так, я полностью в темноте. Единственное, о чем я могу думать, - это пространство имен вашего контроллера. Но если get работает нормально, этого быть не должно.

Loek 25.04.2018 12:08

Я тоже пробовал ваш способ, но не работает, пространство имен не проблема, потому что, как вы сказали, он отлично работает с get. Но спасибо за помощь. Думаю, придется исследовать больше.

Don'tDownvoteMe 25.04.2018 12:10

а если поменять POST в шапках на post, с подписью нового метода?

Loek 25.04.2018 12:15

Вместо

Используйте следующее, чтобы создать поле ввода с уникальным токеном

{{csrf_token ()}}

Изменить маршрут на

Route :: post ('form-submit', ['as' => 'f.submit', 'uses' => 'Admin \ AdminController @ formSubmit']);

изменить метод просмотра

return view('layouts\formView');

Нравиться

return view('layouts.formView');

Например,

return view('YourFolderName.FileName');

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