Skip to content

Laravel combine + combineAll example

This example shows how to combine multiple Results when you need to load several resources or run multiple validations.

Service

php
namespace App\Services;

use Maxiviper117\ResultFlow\Result;

final class ProfileService
{
    public function loadProfile(int $userId): Result
    {
        $user = $this->loadUser($userId);
        $account = $this->loadAccount($userId);
        $prefs = $this->loadPreferences($userId);

        return Result::combine([$user, $account, $prefs])
            ->map(fn (array $values) => [
                'user' => $values[0],
                'account' => $values[1],
                'prefs' => $values[2],
            ]);
    }

    public function validateProfile(array $data): Result
    {
        return Result::combineAll([
            $this->validateEmail($data['email'] ?? null),
            $this->validateName($data['name'] ?? null),
            $this->validateTimezone($data['timezone'] ?? null),
        ]);
    }

    private function loadUser(int $id): Result { return Result::ok(['id' => $id]); }
    private function loadAccount(int $id): Result { return Result::ok(['id' => $id]); }
    private function loadPreferences(int $id): Result { return Result::ok(['tz' => 'UTC']); }

    private function validateEmail(?string $email): Result
    {
        return $email ? Result::ok($email) : Result::fail('email required');
    }

    private function validateName(?string $name): Result
    {
        return $name ? Result::ok($name) : Result::fail('name required');
    }

    private function validateTimezone(?string $tz): Result
    {
        return $tz ? Result::ok($tz) : Result::fail('timezone required');
    }
}

Notes:

  • combine() fails fast and returns the first error.
  • combineAll() returns an array of all errors for full validation reporting.
  • Metadata from each result is merged in order.

Result functions used

  • combine(), combineAll(), ok(), fail(), map()