Laravel custom Exception class returns empty getMessage()

Viewed 22

I have a CustomerHasVoucherException class but the $e->getMessage() in controller shows empty error message.

CustomerHasVoucherException :

<?php

namespace Modules\Customer\Exceptions;

use Exception;

class CustomerHasVoucherException extends Exception
{
    public function report()
    {
        return false;
    }

    public function render($request, $exception)
    {
        $request->headers->set('Accept', 'application/json');
        
        return response()->json((['message' => 'customer already has a voucher!']), 406);
    }
}

Controller Method:

public function reserveVoucher(CustomerRepository $customerRepository, CampaignRepository $campaignRepository, Request $request, $customer_id, $campaign_code)
    {
        // dd($campaign_code, $customer_id);
        try {

            $customer = $customerRepository->checkEligibility($customer_id);

            $campaignRepository->beginTransaction();
            $voucher = $campaignRepository->reserveVoucher($campaign_code, $customer);
            $campaignRepository->commitTransaction();

            return response()->json(
                ['message' => "Your voucher is reserved! Procced to next step within " . \Config::get('voucher.campaign.voucher.max_reservation_time') . " minutes."],
                200
            );
        } catch (CustomerHasVoucherException $e) {
            report($e);
            return response()->json(['error' => $e->getMessage()
        ]);
        } catch (\Throwable $th) {
            report($th);
            return response()->json(['error' => $th->getMessage()]);
        }
    }

Resonse:

{
    "error": ""
}
1 Answers

My Solution: In short Laravel doesn't have its own syntax for custom Exception classes. it uses the native PHP one.

https://www.php.net/manual/en/language.exceptions.extending.php

CustomerHasVoucherException : // updated to this

<?php

namespace Modules\Customer\Exceptions;

use Exception;

class CustomerHasVoucherException extends Exception
{
    protected $message = 'customer already has a voucher!';
    protected $code = 406;

    public function report()
    {
        return false;
    }

    public function render($request, $exception)
    {
        $request->headers->set('Accept', 'application/json');

        return response()->json((['error' => $this->message]), $this->code);
    }
}
Related