pwweb /
localisation
| 1 | <?php |
||||||
| 2 | |||||||
| 3 | /** |
||||||
| 4 | * PWWEB\Localisation\Traits HasAddresses. |
||||||
| 5 | * |
||||||
| 6 | * HasAddresses trait for use with other models. |
||||||
| 7 | * |
||||||
| 8 | * @author Frank Pillukeit <[email protected]> |
||||||
| 9 | * @copyright 2020 pw-websolutions.com |
||||||
| 10 | * @license http://www.opensource.org/licenses/mit-license.html MIT License |
||||||
| 11 | */ |
||||||
| 12 | |||||||
| 13 | namespace PWWEB\Localisation\Traits; |
||||||
| 14 | |||||||
| 15 | use Illuminate\Database\Eloquent\Relations\MorphToMany; |
||||||
| 16 | use PWWEB\Localisation\LocalisationRegistrar; |
||||||
| 17 | use PWWEB\Localisation\Models\Address; |
||||||
| 18 | |||||||
| 19 | trait HasAddresses |
||||||
| 20 | { |
||||||
| 21 | /** |
||||||
| 22 | * Address class. |
||||||
| 23 | * |
||||||
| 24 | * @var string |
||||||
| 25 | */ |
||||||
| 26 | private $addressClass; |
||||||
| 27 | |||||||
| 28 | /** |
||||||
| 29 | * Retrieve and return the address class to be used. |
||||||
| 30 | * |
||||||
| 31 | * @return string |
||||||
| 32 | */ |
||||||
| 33 | public function getAddressClass(): string |
||||||
| 34 | { |
||||||
| 35 | if (false === isset($this->addressClass)) { |
||||||
| 36 | $this->addressClass = app(LocalisationRegistrar::class)->getAddressModel(); |
||||||
|
0 ignored issues
–
show
|
|||||||
| 37 | } |
||||||
| 38 | |||||||
| 39 | return $this->addressClass; |
||||||
| 40 | } |
||||||
| 41 | |||||||
| 42 | /** |
||||||
| 43 | * A model may have multiple addresses. |
||||||
| 44 | * |
||||||
| 45 | * @return \Illuminate\Database\Eloquent\Relations\MorphToMany |
||||||
| 46 | */ |
||||||
| 47 | public function addresses(): MorphToMany |
||||||
| 48 | { |
||||||
| 49 | return $this->morphToMany( |
||||||
|
0 ignored issues
–
show
It seems like
morphToMany() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 50 | config('pwweb.localisation.models.address'), |
||||||
| 51 | 'model', |
||||||
| 52 | config('pwweb.localisation.table_names.model_has_address'), |
||||||
| 53 | config('pwweb.localisation.column_names.model_morph_key'), |
||||||
| 54 | 'address_id' |
||||||
| 55 | ); |
||||||
| 56 | } |
||||||
| 57 | |||||||
| 58 | /** |
||||||
| 59 | * Assign the given address(es) to the model. |
||||||
| 60 | * |
||||||
| 61 | * @param array|string|\PWWEB\Localisation\Contracts\Address ...$addresses One or multiple addresses to be added to the user. |
||||||
| 62 | * |
||||||
| 63 | * @return mixed |
||||||
| 64 | */ |
||||||
| 65 | public function assignAddress(...$addresses) |
||||||
| 66 | { |
||||||
| 67 | $addresses = collect($addresses) |
||||||
| 68 | ->flatten() |
||||||
| 69 | ->map( |
||||||
| 70 | function ($address) { |
||||||
| 71 | if (true === empty($address)) { |
||||||
| 72 | return false; |
||||||
| 73 | } |
||||||
| 74 | |||||||
| 75 | return $this->getStoredAddress($address); |
||||||
| 76 | } |
||||||
| 77 | ) |
||||||
| 78 | ->filter( |
||||||
| 79 | function ($address) { |
||||||
| 80 | return $address instanceof Address; |
||||||
| 81 | } |
||||||
| 82 | ) |
||||||
| 83 | ->map->id |
||||||
| 84 | ->all(); |
||||||
| 85 | |||||||
| 86 | $model = $this->getModel(); |
||||||
|
0 ignored issues
–
show
It seems like
getModel() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 87 | |||||||
| 88 | if (true === $model->exists) { |
||||||
| 89 | $this->addresses()->sync($addresses, false); |
||||||
| 90 | $model->load('addresses'); |
||||||
| 91 | } else { |
||||||
| 92 | $class = \get_class($model); |
||||||
| 93 | |||||||
| 94 | $class::saved( |
||||||
| 95 | function ($object) use ($addresses, $model) { |
||||||
| 96 | static $modelLastFiredOn; |
||||||
| 97 | if (null !== $modelLastFiredOn && $modelLastFiredOn === $model) { |
||||||
| 98 | return; |
||||||
| 99 | } |
||||||
| 100 | $object->addresses()->sync($addresses, false); |
||||||
| 101 | $object->load('addresses'); |
||||||
| 102 | $modelLastFiredOn = $object; |
||||||
| 103 | } |
||||||
| 104 | ); |
||||||
| 105 | } |
||||||
| 106 | |||||||
| 107 | // TEMP: $this->forgetCachedAddresses(); |
||||||
| 108 | |||||||
| 109 | return $this; |
||||||
| 110 | } |
||||||
| 111 | |||||||
| 112 | /** |
||||||
| 113 | * Get a stored address from the cache. |
||||||
| 114 | * |
||||||
| 115 | * @param int|string $address Address to be retrieved from cache |
||||||
| 116 | * |
||||||
| 117 | * @return \PWWEB\Localisation\Contracts\Address |
||||||
| 118 | */ |
||||||
| 119 | protected function getStoredAddress($address): Address |
||||||
| 120 | { |
||||||
| 121 | $addressClass = $this->getAddressClass(); |
||||||
| 122 | |||||||
| 123 | if (true === is_numeric($address)) { |
||||||
| 124 | return $addressClass->findById($address); |
||||||
| 125 | } |
||||||
| 126 | |||||||
| 127 | if (true === is_string($address)) { |
||||||
|
0 ignored issues
–
show
|
|||||||
| 128 | return $addressClass->findByName($address); |
||||||
| 129 | } |
||||||
| 130 | |||||||
| 131 | return $address; |
||||||
| 132 | } |
||||||
| 133 | } |
||||||
| 134 |
Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.
Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..