forked from geocoder-php/BazingaGeocoderBundle
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAttributeDriver.php
More file actions
83 lines (67 loc) · 2.77 KB
/
AttributeDriver.php
File metadata and controls
83 lines (67 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
declare(strict_types=1);
/*
* This file is part of the BazingaGeocoderBundle package.
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @license MIT License
*/
namespace Bazinga\GeocoderBundle\Mapping\Driver;
use Bazinga\GeocoderBundle\Mapping\Annotations;
use Bazinga\GeocoderBundle\Mapping\ClassMetadata;
use Bazinga\GeocoderBundle\Mapping\Exception\MappingException;
use Doctrine\Common\Util\ClassUtils;
/**
* @author Pierre du Plessis <pdples@gmail.com>
*/
final class AttributeDriver implements DriverInterface
{
public function isGeocodeable($object): bool
{
if (PHP_VERSION_ID < 80000) {
return false;
}
$reflection = ClassUtils::newReflectionObject($object);
return count($reflection->getAttributes(Annotations\Geocodeable::class)) > 0;
}
/**
* @throws MappingException
*/
public function loadMetadataFromObject($object): ClassMetadata
{
if (PHP_VERSION_ID < 80000) {
throw new MappingException(sprintf('The class %s is not geocodeable', get_class($object)));
}
$reflection = ClassUtils::newReflectionObject($object);
$attributes = $reflection->getAttributes(Annotations\Geocodeable::class);
if (0 === count($attributes)) {
throw new MappingException(sprintf('The class %s is not geocodeable', get_class($object)));
}
$metadata = new ClassMetadata();
$metadata->provider = $attributes[0]->newInstance()->provider;
foreach ($reflection->getProperties() as $property) {
foreach ($property->getAttributes() as $attribute) {
if (Annotations\Latitude::class === $attribute->getName()) {
$property->setAccessible(true);
$metadata->latitudeProperty = $property;
} elseif (Annotations\Longitude::class === $attribute->getName()) {
$property->setAccessible(true);
$metadata->longitudeProperty = $property;
} elseif (Annotations\Address::class === $attribute->getName()) {
$property->setAccessible(true);
$metadata->addressProperty = $property;
}
}
}
foreach ($reflection->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
if (count($method->getAttributes(Annotations\Address::class)) > 0) {
if (0 !== $method->getNumberOfRequiredParameters()) {
throw new MappingException('You can not use a method requiring parameters with #[Address] attribute!');
}
$metadata->addressGetter = $method;
}
}
return $metadata;
}
}