Evaldas Butkus
Evaldas Butkus

Reputation: 665

Laravel. Redirect intended to post method

I'm using laravel 5 and this is my problem. User fill in form X and if he isin't logged in, he gets redirected to fill in more fields form OR he gets possibility to log in. Everything works just fine, if user fill in additional fields, but if he login, laravel redirects user to form X with GET method instead of POST.

This is how my middleware redirect looks like:

return redirect()->guest('user/additional-fields');

This redirect appears on successfull log in:

return redirect()->intended();

So on redirect intended i get error MethodNotAllowedHttpException. URL is correct which is defined as POST method. What am I missing here? Why does laravel redirects intended as GET method? How could I solve this problem? Thanks!

EDIT:

Route::post('/user/log-in-post', ['as' => 'user-log-in-post', 'uses' => 'UserController@postUserLogIn']);

This is my route, I hope this is one you need.

Upvotes: 4

Views: 33222

Answers (4)

Rakeshkumar G G
Rakeshkumar G G

Reputation: 31

change the below code in app\exceptions\handler.php

use Exception;
use Request;
use Illuminate\Auth\AuthenticationException;
use Response;

protected function unauthenticated($request,AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }
    //return redirect()->guest(route('login'));
    return redirect()->guest('http://127.0.0.1:8000/api/signinnew'); // change this part to your login router
}

And in routes(i.e api.php):

Route::Any('signinnew',          [UserLogonController::class, 'signinNew']);

This will work in laravel 8x

Upvotes: 1

pankaj
pankaj

Reputation: 1906

Very Simple Approach for Post method Route form Controller.

The idea behind this is, every Route always calls the Action method of a Controller. so that in that case you can directly call that method in place of Redirect action performed.

check a code sample of XYZController

 $registration =  Registration::find($req->regId);
 $registration->update([ 'STEP_COMPLETED' => 5]);  // Step 5 completed.

 # Call Post Method Route 
   return $this->admissionFinish($req);

Note that $req should have all parameter that required in next action Method.

Upvotes: 1

Emeka Mbah
Emeka Mbah

Reputation: 17555

You can use a named route to solve this issue:

Lets make a named route like this:

For Get

Route::get('user/additional-fields',array(
    'uses' => 'UserController@getAdditionalFields',
    'as'   => 'user.getAdditionalFields'
));

For post

Route::post('user/additional-fields',array(
    'uses' => 'UserController@postAdditionalFields',
    'as'   => 'user.postAdditionalFields'
));

So we can now ensure Laravel uses the right route by doing this

return redirect()->guest(route('user.getAdditionalFields'));

Also note that its not possible to redirect a POST because Laravel expects form to be submitted. SO you can't do this:

return redirect()->guest(route('user.postAdditionalFields'));

except you use something like cURL or GuzzleHttp simulate a post request

Upvotes: 5

ChainList
ChainList

Reputation: 1208

You have to trick Laravel router by passing an "_method" the inputs.

The best way I found is by adding tricking and rewriting the Authenticate middleware

You have to rewrite the handle method to allow your redirection with your new input.

redirect()->guest('your/path')->with('_method', session('url.entended.method', 'GET'));

When you want to redirect to a route using another method than GET, simply do a Session::flash('url.entended.method', 'YOUR_METHOD').

Tell me if it do the trick

Upvotes: 1

Related Questions