Lavavel 5.2.36 RouteCollection.php中的MethodNotAllowedHttpException行218: [英] Lavavel 5.2.36 MethodNotAllowedHttpException in RouteCollection.php line 218:

查看:2204
本文介绍了Lavavel 5.2.36 RouteCollection.php中的MethodNotAllowedHttpException行218:的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我对Laravel相当陌生,并且正在尝试实施简单表单的发布请求。我一直在关注YouTube教程系列( laravel 5 |第3节|第4部分:路由POST请求)但是,在5分46秒的时间内,有一个通知,此方法仅适用于Laravel 5.2之前的版本。



I试图编辑VerifyCsrfToken.php方法protected $ except = ['api /'];但这没什么区别。



我的routes.php代码片段:

  Route :: post('/ form-handler',function(\Illuminate\Http\Request $ request){
if(isset($ request ['option'])&& $请求['firstName'])
{
if(strlen($ request ['firstName'])> 0){
return view('forms.formResults',['action' => $ request ['option'],'name'=> $ request ['firstName']]);
}
return redirect() - > back();

return redirect() - > back(); //将用户返回到它们来自的页面
}) - > name('form-handler');

我的welcome.blade.php代码片段:

 < div class =form-group> 
< form action ={{route('form-handler')}}method =postclass =form-control>
< label for =select-action>选择一个选项:< / label>
< select id =select-actionname =option>
< option value =option1> Option1< / option>
< option value =option2> Option2< / option>
< option value =option3> Option3< / option>
< / select>
< input type =textname =firstName>
< button type =submit>提交详情< / button>
< input type =hiddenvalue ={{Session :: token()}}name =_ token> <! - Laravel安全措施,注意名称必须始终为'_token' - >
< / form>
< / div>

我的完整错误讯息:

<$ p $ RouteCollection.php中的MethodNotAllowedHttpException行218:RouteCollection.php中的
行218 $ RouteCollection中的
-> methodNotAllowed(array('POST'))in RouteCollection.php line 205 RouteCollection中的
- > getRouteForMethods(object(Request),array('POST'))RouteCollection.php行中的
RouteCollection-> match(object(Request))in Route.php line 821
在Router-> findRoute(object(Request))in Router.php line 691
at Router-> dispatchToRoute(object(Request))in Router.php line 675
at在Kernel-> Illuminate \Foundation \Http\ {closure}(object(Request))处的Kernel.php行246
处的路由器→调度(对象(请求))
在call_user_func (对象(闭包),对象(请求))在Pipeline.php第52行
在Pipeline-> Illuminate\Routing\ {closure}(object(Request))in Debugbar.php line 49
在Debugbar-> handle(object(Request),obje (Pipeline.php)中的数组(对象(Debugbar),'handle'),数组(对象(请求),对象(Closure)))
在Pipeline.php中的
< Pipeline.php行中的call_user_func(object(Closure),object(Request))处的照明\管线\ {闭合}(对象(请求))
在管线 - >照亮CheckForMaintenanceMode.php第44行
处的CheckForMaintenanceMode-> handle(object(Request),object(Closure))
(array(对象(CheckForMaintenanceMode),'handle'),数组(对象(Request),对象(Closure)))在Pipeline.php行136
在Pipeline-> Illuminate\Pipeline\ {closure}(object(请求))
在pipeline.php中的call_user_func(object(Closure),object(Request))行32
在Pipeline-> Illuminate\Routing\ {closure}(object(Request))在Pipeline.php中为
(object(Closure),object(Request))102行
在Pipeline-> then(object(C )在Kernel.php行132
(在Kernel-> sendRequestThroughRouter(object(Request))in Kernel.php line 99
at Kernel-> handle(object(Request))in index。 php line 53

这种实现方法完全无效还是只需要一些tweeks? p>

最好我想知道什么是检索表单数据的最佳后处理方法,同时还能保护您的网站免受跨网站请求伪造。



任何修补程序或备用解决方案都将非常感谢。



请随时索取我可能遗漏的任何资源。



完整的routes.php(注意,我也尝试将post方法添加到中间件路由组中):

 <?php 

/ *
| ------------------------- -------------------------------------------------
|申请路线
| ------------------------------------------- -------------------------------
|
|您可以在这里注册应用程序的所有路线。
|这是一件轻而易举的事情。只需告诉Laravel它应该对
|做出回应的URI并给它一个控制器,以便在请求该URI时进行调用。
|
* /

/ * Route :: get('/',function(){
return view('home.welcome');
}); * /

Route :: get('/','WelcomeController @ index') - > name('home');

Route :: resource('lists','ListsController');

Route :: get('/ contact / {firstName?}',函数($ firstName = null)
{
返回视图('about.contact',['' firstName'=> $ firstName]);
}) - > name('contact');

Route :: get('/ blog',function()
{
return view('blog.blog');
}) - > name ('博客');

Route :: group(['middleware'=>'auth'],function(){
Route :: post('/ form-handler',function(\Illuminate \Http\Request $ request){
if(isset($ request ['option'])&& $ request ['firstName'])
{
if(strlen ($ request ['firstName'])> 0){
return view('forms.formResults',['action'=> $ request ['option'],'name'=> $ request ['firstName']]); //创建视图
}
return redirect() - > back();
}
return redirect() - > back(); //将用户返回到它们来自的页面
}) - > name('form-handler');
});


解决方案

编辑答案 -

b

我编辑了我的答案,使其更清晰,代码完全符合您的需求。而不是使用isset,它使用的验证不会停止运行代码,如果没有设置选项。这将在刀片视图中显示错误消息。



您的routes.php文件应包含以下内容:

  Route :: post('/ form-handler','formController @ formHandle'); 

刀片视图必须具有如下形式

  @if(count($ errors)> 0)
< div class =alert alert-danger>
< ul>
@foreach($ errors-> all()as $ error)
< li> {{$ error}}< / li>
@endforeach
< / ul>
< / div>
@endif
< div class =form-group>
< form action ={{route('form-handler')}}method =postclass =form-control>
< label for =select-action>选择一个选项:< / label>
< select id =select-actionname =option>
< option value =option1> Option1< / option>
< option value =option2> Option2< / option>
< option value =option3> Option3< / option>
< / select>
< input type =textname =firstName>
< input type =hiddenname =_ tokenvalue =<?php echo csrf_token();?>>
< button type =submit>提交详情< / button>
< input type =hiddenvalue ={{Session :: token()}}name =_ token>
< / form>

表单控制器必须像这样

 <?php 

namespace App \Http\Controllers;

使用Illuminate \Http\Request;
使用Illuminate\Routing\Controller;

类FormController扩展Controller
{
/ **
*逻辑转到此处。
*
* @param请求$请求
* @return回应
* /
公共函数formHandle(请求$请求)
{
$ this-> validate($ request,[
'firstName'=>'required | min:1 | max:255',
'option'=>'required'
]);

$ data = $ request;

return view('forms.formResults') - > compact($ data);
}
}


Hi I am fairly new to Laravel and am trying to implement a post request for a simple form. I have been following a YouTube Tutorial series (laravel 5 | Section 3 | Part 4 Routing POST Requests) however at 5:46mins in, there is a notification that this method is only applicable to versions prior to Laravel 5.2.

I have tried to edit the VerifyCsrfToken.php method protected $except = ['api/']; but this makes no difference.

My routes.php code snippet:

Route::post('/form-handler', function(\Illuminate\Http\Request $request){
    if(isset($request['option']) && $request['firstName'])
    {
        if(strlen($request['firstName']) > 0){
            return view('forms.formResults', ['action' => $request['option'], 'name' => $request['firstName']]);
        }
        return redirect()->back();
    }
    return redirect()->back(); // Return user back to the page they came from
})->name('form-handler');

My welcome.blade.php code snippet:

<div class="form-group">
    <form action="{{route('form-handler')}}" method="post" class="form-control">
        <label for="select-action">Select an option:</label>
        <select id="select-action" name="option">
            <option value="option1">Option1</option>
            <option value="option2">Option2</option>
            <option value="option3">Option3</option>
        </select>
        <input type="text" name="firstName">
        <button type="submit">Submit Details</button>
        <input type="hidden" value="{{Session::token()}}" name="_token"> <!-- Laravel Security Measure, Note name must always be '_token'-->
    </form>
</div>

My full error message:

MethodNotAllowedHttpException in RouteCollection.php line 218:
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 Debugbar.php line 49
at Debugbar->handle(object(Request), object(Closure))
at call_user_func_array(array(object(Debugbar), '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)) 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

Is this method of implementation completely invalid or does it just need a few tweeks?

Preferably I would like to know what the optimal post method is for retrieving form data, while still protecting your site from cross-site request forgeries.

Any fixes or alternate solutions will be much appreciated.

Please feel free to ask for any resources I may have left out.

Full routes.php (Note I have also tried adding the post method to the middleware route group):

    <?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/

/* Route::get('/', function () {
    return view('home.welcome');
}); */

Route::get('/', 'WelcomeController@index')->name('home');

Route::resource('lists', 'ListsController');

Route::get('/contact/{firstName?}', function($firstName = null)
{
    return view('about.contact', ['firstName' => $firstName]);
})->name('contact');

Route::get('/blog', function()
{
    return view('blog.blog');
})->name('blog');

Route::group(['middleware' => 'auth'], function () {
    Route::post('/form-handler', function(\Illuminate\Http\Request $request){
        if(isset($request['option']) && $request['firstName'])
        {
            if(strlen($request['firstName']) > 0){
            return view('forms.formResults', ['action' => $request['option'], 'name' => $request['firstName']]); // You create the view
        }
        return redirect()->back();
    }
    return redirect()->back(); // Return user back to the page they came from
    })->name('form-handler');
});

解决方案

Edited answer --

I have edited my answer to make cleaner code that has exactly what you need. instead of using isset, it uses validation that will not stop running the code if the options are not set. This will also display an error message on the blade view.

Your routes.php file should contain the following

Route::post('/form-handler', 'formController@formHandle');

The Blade view must have a form that looks like this

@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
<div class="form-group">
    <form action="{{route('form-handler')}}" method="post" class="form-control">
        <label for="select-action">Select an option:</label>
        <select id="select-action" name="option">
            <option value="option1">Option1</option>
            <option value="option2">Option2</option>
            <option value="option3">Option3</option>
        </select>
        <input type="text" name="firstName">
        <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
        <button type="submit">Submit Details</button>
        <input type="hidden" value="{{Session::token()}}" name="_token">
    </form>

The form controller must look like this

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class FormController extends Controller
{
    /**
     * Logic Goes here.
     *
     * @param  Request  $request
     * @return Response
     */
    public function formHandle(Request $request)
    {   
        $this->validate($request, [
            'firstName' => 'required|min:1|max:255',
            'option' => 'required'
            ]);

            $data = $request;

            return view('forms.formResults')->compact($data);  
    }
}

这篇关于Lavavel 5.2.36 RouteCollection.php中的MethodNotAllowedHttpException行218:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆