Skip to content

Commit 937dd16

Browse files
authored
Merge pull request #11 from TomHAnderson/feature/naming-strategy
Added naming strategy
2 parents 365dfdd + bc11460 commit 937dd16

File tree

7 files changed

+64
-13
lines changed

7 files changed

+64
-13
lines changed

README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,16 @@ to your `doctrine.php` configuration file:
111111
```
112112

113113

114+
### Naming Strategy
115+
116+
The default naming strategy uses the Inflector's `urlize()` method to change 'associationName' into 'association-name'.
117+
If this is not the way you want to name your relationsihps or routes then create your own naming strategy and assign
118+
it in the config file.
119+
120+
114121
## Route naming
115122

116-
When using the `routeNamePatterns` to create a route name, the entity name becomes `$inflector->urlize(shortName)`
123+
When using the `routeNamePatterns` to create a route name, the entity name becomes `$namingStrategy->route($entityName)`
117124
such as `api.short-name::fetch` according to the example configuration.
118125

119126

config/hal-doctrine.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
return [
44
'default' => [
55
'entityManager' => \Doctrine\ORM\EntityManager::class,
6+
'namingStrategy' => \ApiSkeletons\Laravel\HAL\Doctrine\NamingStrategy\DefaultNamingStrategy::class,
67
'routeNamePatterns' => [
78
'entity' => 'api.{entityName}::fetch',
89
'collection' => 'api.{entityName}::fetchAll',

phpcs.xml.dist

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,7 @@
1313
<file>src</file>
1414

1515
<!-- Include full Doctrine Coding Standard -->
16-
<rule ref="Doctrine"/>
16+
<rule ref="Doctrine">
17+
<exclude name="SlevomatCodingStandard.Classes.SuperfluousInterfaceNaming.SuperfluousSuffix"/>
18+
</rule>
1719
</ruleset>

src/DoctrineHydrator.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@
44

55
namespace ApiSkeletons\Laravel\HAL\Doctrine;
66

7+
use ApiSkeletons\Laravel\HAL\Doctrine\NamingStrategy\NamingStrategyInterface;
78
use ApiSkeletons\Laravel\HAL\Hydrator;
89
use ApiSkeletons\Laravel\HAL\Resource;
910
use DateTime;
10-
use Doctrine\Inflector\Inflector;
11-
use Doctrine\Inflector\InflectorFactory;
1211
use Doctrine\ORM\EntityManager;
1312
use Doctrine\ORM\Mapping\MappingException;
1413
use Exception;
1514
use Illuminate\Foundation\Application;
16-
use ReflectionClass;
1715

1816
use function array_diff_key;
1917
use function array_flip;
@@ -28,7 +26,7 @@ class DoctrineHydrator extends Hydrator
2826
protected array $config = [];
2927
protected string $configurationSection = 'default';
3028
protected EntityManager $entityManager;
31-
protected Inflector $inflector;
29+
protected NamingStrategyInterface $namingStrategy;
3230

3331
public function __construct(Application $application)
3432
{
@@ -50,8 +48,8 @@ public function __construct(Application $application)
5048

5149
// @codeCoverageIgnoreEnd
5250

53-
$this->entityManager = $application->get($this->config['entityManager']);
54-
$this->inflector = InflectorFactory::create()->build();
51+
$this->entityManager = $application->get($this->config['entityManager']);
52+
$this->namingStrategy = $application->get($this->config['namingStrategy']);
5553
}
5654

5755
public function extract(mixed $entity): Resource
@@ -108,14 +106,14 @@ public function extract(mixed $entity): Resource
108106

109107
if ($entityMetadata->isAssociationInverseSide($associationName)) {
110108
$resource->addLink(
111-
$associationName,
109+
$this->namingStrategy->association($associationName),
112110
route($associationRouteName, [
113111
'filter' => [$associationMapping['mappedBy'] => $identifier],
114112
])
115113
);
116114
} else {
117115
$resource->addLink(
118-
$associationName,
116+
$this->namingStrategy->association($associationName),
119117
route($associationRouteName, [
120118
'filter' => [$associationMapping['inversedBy'] => $identifier],
121119
])
@@ -128,13 +126,13 @@ public function extract(mixed $entity): Resource
128126

129127
$associationRouteName = $this->getRouteName($associationMapping['targetEntity'], 'entity');
130128
$resource->addLink(
131-
$associationName,
129+
$this->namingStrategy->association($associationName),
132130
route($associationRouteName, $identifier)
133131
);
134132
} else {
135133
// For 1:1 relationships, only embed the owning side
136134
$resource->addEmbeddedResource(
137-
$associationName,
135+
$this->namingStrategy->association($associationName),
138136
$data[$associationName]
139137
);
140138
}
@@ -149,7 +147,7 @@ protected function getRouteName(string $entityName, string $routeType): string
149147
return $this->config['entities'][$entityName]['routeNames'][$routeType] ??
150148
str_replace(
151149
'{entityName}',
152-
$this->inflector->urlize((new ReflectionClass($entityName))->getShortName()),
150+
$this->namingStrategy->route($entityName),
153151
$this->config['routeNamePatterns'][$routeType]
154152
);
155153
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace ApiSkeletons\Laravel\HAL\Doctrine\NamingStrategy;
6+
7+
use Doctrine\Inflector\Inflector;
8+
use Doctrine\Inflector\InflectorFactory;
9+
use ReflectionClass;
10+
11+
class DefaultNamingStrategy implements NamingStrategyInterface
12+
{
13+
protected Inflector $inflector;
14+
15+
public function __construct()
16+
{
17+
$this->inflector = InflectorFactory::create()->build();
18+
}
19+
20+
public function route(string $entityName): string
21+
{
22+
return $this->inflector
23+
->urlize((new ReflectionClass($entityName))->getShortName());
24+
}
25+
26+
public function association(string $associationName): string
27+
{
28+
return $this->inflector->urlize($associationName);
29+
}
30+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace ApiSkeletons\Laravel\HAL\Doctrine\NamingStrategy;
6+
7+
interface NamingStrategyInterface
8+
{
9+
public function route(string $entityName): string;
10+
11+
public function association(string $associationName): string;
12+
}

test/config/hal-doctrine.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
return [
44
'default' => [
55
'entityManager' => \Doctrine\ORM\EntityManager::class,
6+
'namingStrategy' => \ApiSkeletons\Laravel\HAL\Doctrine\NamingStrategy\DefaultNamingStrategy::class,
67
'routeNamePatterns' => [
78
'entity' => 'api.{entityName}::fetch',
89
'collection' => 'api.{entityName}::fetchAll',

0 commit comments

Comments
 (0)