Skip to content

Latest commit

 

History

History
95 lines (71 loc) · 2.22 KB

readme.md

File metadata and controls

95 lines (71 loc) · 2.22 KB

Migrating legacy code to \Grifart\Enum

This is step-by-step guide how to migrate you legacy code to \Grifart\Enum.

We will start with non-type safe enum represented by class with constants. [full source code]

class OrderState {
	public const NEW = 'new';
	public const PROCESSING = 'processing';
}

Our business logic is this:

$result = '';
switch ($state) {
	// your business logic
	case OrderState::NEW:
		$result = 'new';
		break;
	case OrderState::PROCESSING:
		$result = 'processing';
		break;
}

Step 1: add new type-safe API [source]

This is done by

  • extending \Grifart\Enum\Enum class
  • by automatically implementing enum values by including use \Grifart\Enum\AutoInstances; trait
  • and by adding magic methods annotations

There is not backward incompatible change introduced. And now you can use new APIs!

/**
 * @method static OrderState NEW()
 * @method static OrderState PROCESSING()
 */
class OrderState extends \Grifart\Enum\Enum {
	use \Grifart\Enum\AutoInstances;
	public const NEW = 'new';
	public const PROCESSING = 'processing';
}

Step 2: Migrating existing code to new API [source]

Migrating old code to new API is usually easy, just add parenthesis () when you access value.

$state = OrderState::NEW();

$result = '';
switch ($state) {
	// your business logic
	case OrderState::NEW():
		$result = 'new';
		break;
	case OrderState::PROCESSING():
		$result = 'processing';
		break;
}

Assert::same('new', $result);

Please note, that you will need to handle some cases manually as OrderState::NEW() returns object, enum instance, not a string.

Removing old API

So when you are finally ready to remove old API, just change constant visibility to private.

/**
 * @method static OrderState NEW()
 * @method static OrderState PROCESSING()
 */
class OrderState extends \Grifart\Enum\Enum {
	use \Grifart\Enum\AutoInstances;
	private const NEW = 'new';
	private const PROCESSING = 'processing';
}

Step 3: Enjoy new features [source]

Now, when you decided that you what to move your business logic inside enum declaration. You are now free to do so. And there are many more options, see other examples.