William Turrell
William Turrell

Reputation: 3326

Laravel - return a redirectResponse selectively generated in a function

Part of my application is a multi-stage checkout process; during the latter pages of this I first run a sanity check on each request to verify the user actually has some items in their basket: if not they're sent back to the beginning.

I have a controller function like this which is called from multiple routes for DRY purposes.

private function checkBasketFull($request)
{
    if (self::isBasketEmpty($request)) {
        return redirect('/')->with('status', config('app.empty_basket_message'));
    }
}

When I call it, I can't just do:

self::checkBasketFull($request);

because without a return the redirect doesn't fire, only the session data is sent.

And I can't do:

return self::checkBasketFull($request);

because that will give an error if there's no redirect or abort the method if checkBasketFull returns anything else.

My current (working) code is:

    $check = self::checkBasketFull($request);
    if ($check) {
        return $check;
    }

Is there an alternative way of writing this on a single line, or modifying the checkBasketFull function, so the redirect will occur if the basket is empty but execution will continue as normal if it isn't?

Upvotes: 0

Views: 899

Answers (1)

Joseph Silber
Joseph Silber

Reputation: 219930

Either use this:

if ($redirect = self::checkBasketFull($request)) return $redirect;

Or throw an error and catch it in the global error handler.


However, instead of returning and checking that for a redirect like that, I'd much rather keep it as two completely separate methods:

public function someRoute(Request $request)
{
    if ($this->isBasketEmpty($request)) return $this->redirectBasketEmpty();

    // Continue processing this request...
}

protected function isBasketEmpty(request)
{
    // run your login here...
}

protected function redirectBasketEmpty()
{
    return redirect('/')->with('status', config('app.empty_basket_message'));
}

Feels cleaner to me.

Upvotes: 1

Related Questions