Skip to content

Commit 9c4c2f7

Browse files
committed
ID support. Classic const doc support. Various fixes and enhancements.
1 parent 02edb19 commit 9c4c2f7

File tree

6 files changed

+85
-37
lines changed

6 files changed

+85
-37
lines changed

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ vocables.
99
## Features
1010

1111
* [PSR](http://www.php-fig.org/) compliant entity generator including properties, getters and setters
12-
* Full [PSR-5](https://github.com/php-fig/fig-standards/pull/169) compliant PHPDoc for classes, properties, constants (enum
12+
* Full PHPDoc ([PSR-5](https://github.com/php-fig/fig-standards/pull/169) compliant) for classes, properties, constants (enum
1313
values) and methods extracted from Schema.org
1414
* Doctrine annotation mapping (database columns and relations)
1515
* Data validation through [Symfony Validator](http://symfony.com/doc/current/book/validation.html) annotations
@@ -58,10 +58,13 @@ relations:
5858
# Debug mode
5959
debug: false
6060

61+
# Automatically add an id field to entities
62+
generateId: true
63+
6164
# Generate interfaces and use Doctrine's Resolve Target Entity feature
6265
useInterface: false
6366

64-
# Use PSR-5's @type annotation instead of @var in the PHPDoc.
67+
# Use PSR-5's @type annotation instead of @var in the PHPDoc
6568
useType: false
6669

6770
# Use Doctrine's ArrayCollection instead of standard arrays

src/SchemaOrgModel/AnnotationGenerator/ConstraintAnnotationGenerator.php

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
namespace SchemaOrgModel\AnnotationGenerator;
1111

12+
use SchemaOrgModel\CardinalitiesExtractor;
13+
1214
/**
1315
* Constraint annotation generator.
1416
*
@@ -23,34 +25,47 @@ public function generateFieldAnnotations($className, $fieldName)
2325
{
2426
$field = $this->classes[$className]['fields'][$fieldName];
2527

26-
if ($field['isEnum']) {
28+
if ($field['isId']) {
2729
return [];
2830
}
2931

30-
switch ($field['range']) {
31-
case 'URL':
32-
return ['@Assert\Url'];
32+
$asserts = [];
33+
if (!$field['isArray']) {
34+
switch ($field['range']) {
35+
case 'URL':
36+
$asserts[] = '@Assert\Url';
37+
break;
3338

34-
case 'Date':
35-
return ['@Assert\Date'];
39+
case 'Date':
40+
$asserts[] = '@Assert\Date';
41+
break;
3642

37-
case 'DateTime':
38-
return ['@Assert\DateTime'];
43+
case 'DateTime':
44+
$asserts[] = '@Assert\DateTime';
45+
break;
3946

40-
case 'Time':
41-
return ['@Assert\Time'];
42-
}
47+
case 'Time':
48+
$asserts[] = '@Assert\Time';
49+
break;
50+
}
51+
52+
if (isset($field['resource']) && 'email' === $field['resource']->localName()) {
53+
$asserts[] = '@Assert\Email';
54+
}
4355

44-
if ('email' === $field['resource']->localName()) {
45-
return ['@Assert\Email'];
56+
if (!$asserts) {
57+
$phpType = $this->toPhpType($field);
58+
if (in_array($phpType, ['boolean', 'float', 'integer', 'string'])) {
59+
$asserts[] = sprintf('@Assert\Type(type="%s")', $phpType);
60+
}
61+
}
4662
}
4763

48-
$phpType = $this->toPhpType($field);
49-
if (in_array($phpType, ['boolean', 'float', 'integer', 'string'])) {
50-
return [sprintf('@Assert\Type(type="%s")', $phpType)];
64+
if (CardinalitiesExtractor::CARDINALITY_1_1 === $field['cardinality'] || CardinalitiesExtractor::CARDINALITY_1_N === $field['cardinality']) {
65+
$asserts[] = '@Assert\NotNull';
5166
}
5267

53-
return [];
68+
return $asserts;
5469
}
5570

5671
/**

src/SchemaOrgModel/AnnotationGenerator/DoctrineOrmAnnotationGenerator.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ public function generateFieldAnnotations($className, $fieldName)
140140
}
141141
}
142142

143+
if ($field['isId']) {
144+
$annotations[] = '@ORM\Id';
145+
$annotations[] = '@ORM\GeneratedValue(strategy="AUTO")';
146+
}
147+
143148
return $annotations;
144149
}
145150

src/SchemaOrgModel/AnnotationGenerator/PhpDocAnnotationGenerator.php

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,14 @@ public function generateConstantAnnotations($className, $constantName)
4242
$resource = $this->classes[$className]['constants'][$constantName]['resource'];
4343

4444
$annotations = $this->formatDoc($resource->get('rdfs:comment'), true);
45-
$annotations[0] = sprintf(
46-
'@type %s %s',
47-
'string',
48-
$constantName,
49-
$annotations[0]
50-
);
45+
if ($this->config['useType']) {
46+
$annotations[0] = sprintf(
47+
'@type %s %s',
48+
'string',
49+
$constantName,
50+
$annotations[0]
51+
);
52+
}
5153

5254
return $annotations;
5355
}
@@ -58,8 +60,9 @@ public function generateConstantAnnotations($className, $constantName)
5860
public function generateFieldAnnotations($className, $fieldName)
5961
{
6062
$field = $this->classes[$className]['fields'][$fieldName];
63+
$comment = $field['resource'] ? $field['resource']->get('rdfs:comment') : '';
6164

62-
$annotations = $this->formatDoc($field['resource']->get('rdfs:comment'), true);
65+
$annotations = $this->formatDoc($comment, true);
6366
$annotations[0] = sprintf(
6467
'@%s %s $%s %s',
6568
$this->config['useType'] ? 'type' : 'var',

src/SchemaOrgModel/TypesGenerator.php

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ public function generate($config)
259259
'cardinality' => $cardinality,
260260
'isArray' => $isArray,
261261
'isNullable' => $isNullable,
262+
'isId' => false,
262263
];
263264
if ($isArray) {
264265
$class['hasConstructor'] = true;
@@ -274,13 +275,33 @@ public function generate($config)
274275
}
275276

276277
// Second pass
277-
foreach ($classes as $className => $class) {
278+
foreach ($classes as &$class) {
278279
if ($class['parent'] && isset($classes[$class['parent']])) {
279280
$classes[$class['parent']]['hasChild'] = true;
280281
}
281282

282-
foreach ($class['fields'] as $fieldName => $field) {
283-
$classes[$className]['fields'][$fieldName]['isEnum'] = isset($classes[$field['range']]) && $classes[$field['range']]['isEnum'];
283+
foreach ($class['fields'] as &$field) {
284+
$field['isEnum'] = isset($classes[$field['range']]) && $classes[$field['range']]['isEnum'];
285+
}
286+
}
287+
288+
// Generate ID
289+
if ($config['generateId']) {
290+
foreach ($classes as &$class) {
291+
if (!$class['hasChild'] && !$class['isEnum']) {
292+
$class['fields'] = [
293+
'id' => [
294+
'name' => 'id',
295+
'resource' => null,
296+
'range' => 'Integer',
297+
'cardinality' => CardinalitiesExtractor::CARDINALITY_1_1,
298+
'isArray' => false,
299+
'isNullable' => false,
300+
'isEnum' => false,
301+
'isId' => true,
302+
],
303+
] + $class['fields'];
304+
}
284305
}
285306
}
286307

@@ -302,7 +323,7 @@ public function generate($config)
302323
$class['constants'][$constantName]['annotations'] = $this->generateConstantAnnotations($annotationGenerators, $className, $constantName);
303324
}
304325

305-
foreach ($class['fields'] as $fieldName => $field) {
326+
foreach ($class['fields'] as $fieldName => &$field) {
306327
$typeHint = false;
307328
if ($this->isDateTime($field['range'])) {
308329
$typeHint = '\\DateTime';
@@ -314,15 +335,15 @@ public function generate($config)
314335
}
315336
}
316337

317-
$class['fields'][$fieldName]['typeHint'] = $typeHint;
318-
$class['fields'][$fieldName]['annotations'] = $this->generateFieldAnnotations($annotationGenerators, $className, $fieldName);
319-
$class['fields'][$fieldName]['getterAnnotations'] = $this->generateGetterAnnotations($annotationGenerators, $className, $fieldName);
338+
$field['typeHint'] = $typeHint;
339+
$field['annotations'] = $this->generateFieldAnnotations($annotationGenerators, $className, $fieldName);
340+
$field['getterAnnotations'] = $this->generateGetterAnnotations($annotationGenerators, $className, $fieldName);
320341

321342
if ($field['isArray']) {
322-
$class['fields'][$fieldName]['adderAnnotations'] = $this->generateAdderAnnotations($annotationGenerators, $className, $fieldName);
323-
$class['fields'][$fieldName]['removerAnnotations'] = $this->generateRemoverAnnotations($annotationGenerators, $className, $fieldName);
343+
$field['adderAnnotations'] = $this->generateAdderAnnotations($annotationGenerators, $className, $fieldName);
344+
$field['removerAnnotations'] = $this->generateRemoverAnnotations($annotationGenerators, $className, $fieldName);
324345
} else {
325-
$class['fields'][$fieldName]['setterAnnotations'] = $this->generateSetterAnnotations($annotationGenerators, $className, $fieldName);
346+
$field['setterAnnotations'] = $this->generateSetterAnnotations($annotationGenerators, $className, $fieldName);
326347
}
327348
}
328349

src/SchemaOrgModel/TypesGeneratorConfiguration.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ public function getConfigTreeBuilder()
4646
->prototype('scalar')->end()
4747
->end()
4848
->booleanNode('debug')->defaultFalse()->info('Debug mode')->end()
49+
->booleanNode('generateId')->defaultTrue()->info('Automatically add an id field to entities')->end()
4950
->booleanNode('useInterface')->defaultFalse()->info('Generate interfaces and use Doctrine\'s Resolve Target Entity feature')->end()
50-
->booleanNode('useType')->defaultFalse()->info('Use PSR-5\'s @type annotation instead of @var in the PHPDoc.')->end()
51+
->booleanNode('useType')->defaultFalse()->info('Use PSR-5\'s @type annotation instead of @var in the PHPDoc')->end()
5152
->booleanNode('useDoctrineCollection')->defaultTrue()->info('Use Doctrine\'s ArrayCollection instead of standard arrays')->end()
5253
->booleanNode('checkIsGoodRelations')->defaultFalse()->info('Emit a warning if a property is not derived from GoodRelations')->end()
5354
->scalarNode('header')->defaultFalse()->info('A license or any text to use as header of generated files')->example('// (c) Kévin Dunglas <[email protected]>')->end()

0 commit comments

Comments
 (0)