hello world hello world - 4 months ago 388
PHP Question

Laravel 5.1 Trying to post data to controller but geting MethodNotAllowedHttpException error

Im trying to

POST
data to my controller but I'm getting a

MethodNotAllowedHttpException in RouteCollection.php line 219:


error message, here are my files.

my route file

<?php

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

// Authentication routes
Route::get('auth/login', 'Auth\AuthController@getLogin');
Route::post('auth/login', 'Auth\AuthController@postLogin');
Route::get('auth/logout', 'Auth\AuthController@getLogout');

// Registration routes
Route::get('register', 'Auth\AuthController@getRegister');
Route::post('auth/register', 'Auth\AuthController@postRegister');
Route::controllers(['password' => 'Auth\PasswordController',]);

Route::get('/home', 'HomeController@index');

// Using A Route Closure
Route::get('profile', ['middleware' => 'auth', function() {
// Only authenticated users may enter...
Route::auth();
}]);

// practicing using forms for sending data to the DB & populating form fields with DB data
Route::get('profile', 'ProfileController@index');
Route::post('profile/update', 'ProfileController@updateProfile');


profile.blade.php

<form method="POST" action="/profile/update/">
<div class="form-group hidden">
<input type="hidden" name="id" value="<?php echo $users[0]->id;?>">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input name="_method" type="hidden" value="PATCH">
</div>
<div class="form-group">
<label for="email"><b>Name:</b></label>
<input type="text" name="name" placeholder="Please enter your email here" class="form-control"/>
</div>
<div class="form-group">
<label for="email"><b>Email:</b></label>
<input type="text" name="email" placeholder="Please enter your email here" class="form-control"/>
</div>
<div class="form-group">
<button type="submit" class="btn btn-default"> Submit </button>
</div>
</form>


& my ProfileController.php

<?php

namespace App\Http\Controllers;

use Auth;
use App\User;
use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class ProfileController extends Controller
{
/**
* Update user profile & make backend push to DB
**/

public function index()
{
if(Auth::check()) {
// connecting to the DB and accessing
$users = User::all();
//var_dump($users);

return view('profile', compact('users'));
}

return view('auth/login');
}

public function updateProfile(Requests $request) {

return $request->all();

}
}


not sure what the issue is. Thanks for all the help everyone

Answer

A couple of issues that we managed to address here:

Over-use of HTTP Verbs

At your view, you have: <form method="POST" but also <input name="_method" type="hidden" value="PATCH"> which may conflict between a POST and a PATCH. Since your routes.php only declares POST, let's remove the patch definition.

Routing Mistake

Still at your view, your action points to action="/profile/update/" while your route is defined as Route::post('profile/update'), notice the extra / at the end in your form. That slash should not be there.

Controllers Request

You have a here: use App\Http\Requests; is probably incorrect because that's a folder within Laravel, not a class. Let's remove that and keep use Illuminate\Http\Request; for now. In the near future, you'll be learning how to create your own Form Requests and you'll probably want a UpdateProfileRequest.php.

Comments