DEV Community

Cover image for PHP Enums tryFrom Method
Sean Kegel
Sean Kegel

Posted on • Edited on • Originally published at seankegel.com

PHP Enums tryFrom Method

I was recently working on a project where I was receiving data from an API that had a payment_type. I converted the payment_type into the enum below:

enum PaymentType: string 
{
    case CREDIT_CARD = 'credit_card';
    case APPLE_PAY = 'apple_pay';
    case GOOGLE_PAY = 'google_pay';
    case PAYPAL = 'paypal';
    case SHOP_PAY = 'shop_pay';
}
Enter fullscreen mode Exit fullscreen mode

Then, I use this enum in the data transfer object (DTO) to define the structure of the data I receive from the API.

However, the problem I was running into is the payment_type is not always in the response of the API data, so it could be null. In my DTO, I have a from method to build the object from the API response which looks like the following:

class OrderDto
{
    ...
    public static function from(array $data): self {
        return new self(
            ...
            payment_method: isset($data['payment_method']) ? PaymentType::from($data['payment_method']) : null,
        );
    }
}
Enter fullscreen mode Exit fullscreen mode

I had to check if the payment_method is set to, because otherwise, a ValueError exception will be thrown.

This is where the tryFrom method comes in handy. If payment_method is null or is not a valid case for the enum, it will just return null without throwing an exception. So now, the DTO can be updated to the following which is much cleaner:

class OrderDto
{
    ...
    public static function from(array $data): self {
        return new self(
            ...
            payment_method: PaymentType::tryFrom($data['payment_method']),
        );
    }
}
Enter fullscreen mode Exit fullscreen mode

Please note that this only works for backed enums in PHP 8.1+. In case you’re not familiar, a BackedEnum is one where each case has a value specified. So in the example above, the enum is a string backed enum since it is defined with enum PaymentType: string.

This would not work for a standard PHP enum like the one below:

// Not a backed enum so does not include from and tryFrom methods.
enum PaymentType 
{
    case CREDIT_CARD;
    case APPLE_PAY;
    case GOOGLE_PAY;
    case PAYPAL;
    case SHOP_PAY;
}
Enter fullscreen mode Exit fullscreen mode

If you found this tip helpful, I also have a similar one with the Carbon PHP make method. You can read that here.

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

The Most Contextual AI Development Assistant

Pieces.app image

Our centralized storage agent works on-device, unifying various developer tools to proactively capture and enrich useful materials, streamline collaboration, and solve complex problems through a contextual understanding of your unique workflow.

👥 Ideal for solo developers, teams, and cross-company projects

Learn more