When strings are used as array keys there is no difference between the key used to define the
identifier of a route and that of a record. It may become quite troublesome when you need to search
for common keys such as
title; for instance when you need to rename records
'article_id'. Also, using strings as array keys may introduce errors such as
misspelling and use of deprecated/extraneous keys.
The following code is an example of strings used as array keys:
<?php $route = [ 'id' => 'articles:edit', … ]; $record = Record::from([ 'id' => 123 ]);
For all these reasons I recommend the use of constants such as
lovely IDE will help you avoid misspells, and will even warn you when a constant is marked as
deprecated. But instead of defining constants in some namespace, I prefer to define them in classes
or interfaces with a clear purpose. For instance, I'd use constants such as
Consider the following route definition, using strings to define keys and some special values.
<?php $definition = [ 'pattern' => '/articles/<id:\d+>/edit', 'controller' => ArticleController::class, 'action' => 'edit', 'via' => 'GET', 'id' => 'articles:edit' ];
And now consider the following route definition, using constants:
<?php use ICanBoogie\HTTP\Request; use ICanBoogie\RouteDefinition; $definition = [ RouteDefinition::PATTERN => '/articles/<id:\d+>/edit', RouteDefinition::CONTROLLER => ArticleController::class, RouteDefinition::ACTION => RouteDefinition::ACTION_EDIT, RouteDefinition::VIA => Request::METHOD_GET, RouteDefinition::ID => 'articles:edit' ];
That's a little more work, but I'm confident that these keys exists and now it would be child's play to search for route definition identifiers.
Define constants to use as array keys, and group them in classes/interfaces relevant to their purpose.