* Add support for protected Attribute accessors
* Fix formatting
* Prevent accessors methods marked as private from being added
* Exclude specific accessors based on trait instead of class
* Add changelog entry
* Add clarifying comment
* Fix accessor attributes not working on PHP < 8.1
* Reintroduce method variable to reduce PR clutter
* Change variable name to reduce PR clutter
* Update CHANGELOG.md
---------
Co-authored-by: Barry vd. Heuvel <[email protected]>
Co-authored-by: Barry vd. Heuvel <[email protected]>
* Laravel 10 support
* Add events v10 to suggestions
* Exclude invalid combinations from testing matrix, test on PHP 8.2
* Update CHANGELOG.md
* Use laravel/laravel dev-master as 10.x version
* Exclude one more laravel-php combination
* Use 10.* instead if dev-master
* Update run-integration-tests.yml
---------
Co-authored-by: Barry vd. Heuvel <[email protected]>
* option to use generics syntax, default to yes in laravel 9
* rename `use_generics_syntax` to `use_generics_annotations`
* update readme and changelog
* remove laravel 9 default override
* include key type in generics annotations
* readme rewording
* set `use_generics_annotations` to `true` by default
* update tests to reflect `use_generics_annotations` being set to `true` by default
* default `use_generics_annotations` setting to true when not set in config
Co-authored-by: Markus Podar <[email protected]>
---------
Co-authored-by: Markus Podar <[email protected]>
* gha: fix workflow by allowing the composer-normalize plugin
We don't need to enable it in the project itself, but at least in this
workflow which explicitly uses it.
See https://github.com/barryvdh/laravel-ide-helper/actions/runs/3980013548/jobs/6822812621#step:4:34
```
Error: ergebnis/composer-normalize (installed globally) contains a Composer plugin which is blocked by your allow-plugins config. You may add it to the list if you consider it safe.
You can run "composer global config --no-plugins allow-plugins.ergebnis/composer-normalize [true|false]" to enable it (true) or disable it explicitly and suppress this exception (false)
```
* gha: also run this workflow when it is changed itself
* Implement new config to specify return type of custom relations
* Apply suggestions from code review
Co-authored-by: Markus Podar <[email protected]>
* add test for morphed
* fix test output
* add info about how to add custom relationships
* fix wording
Co-authored-by: Markus Podar <[email protected]>
* gha: get more insights when/if logs exist
* Better handle cases when we can receive a concrete instance
The problem with `null` being passed to `ReflectionClass` was always
there but in PHP 8.1+ it triggers a deprecation warnings.
Since having `null` in `$concrete` doesn't make sense to reflect
anything anyway, we just throw a custom exception (which gets caught a
couple lines below) and just carry on.
When using `-v` this can be seen, example:
```
$ ./artisan ide-helper:meta -v
Cannot make 'Faker\Generator': Class 'Faker\Provider\en_US\Barcode' not found.
Cannot make 'Illuminate\Contracts\Auth\Authenticatable': Class does not exist
Cannot make 'cache.psr6': Class 'Symfony\Component\Cache\Adapter\Psr16Adapter' not found.
Cannot make 'csp-nonce': Class 'Wza3Mf4CXIvCkcp9K3boMUGJoK6S9maO' not found.
Cannot make 'env': Class 'local' not found.
Cannot make 'filesystem.cloud': Disk [s3] does not have a configured driver.
Cannot make 'redis.connection': Redis connection [default] not configured.
A new meta file was written to .phpstorm.meta.php
```
* gha: make sure to run meta with -v to see all output
Helps when debugging things
* Add CHANGELOG.md entry
#1289 calls `getReturnType` for every method on every model, which in
turn calls `getReturnTypeFromDocBlock` which has this code:
```php
$phpDocContext = (new ContextFactory())->createFromReflector($reflection);
```
Extracting the docblock is super slow, always has been. Now that we do
this for every method, this adds up a lot.
Performance on a private commercial project _before_ #1289 was introduced:
```
$ time ./artisan ide-helper:models --write --reset >/dev/null
real 0m2.857s
user 0m1.835s
sys 0m0.129s
```
After #1289 :
```
$ time ./artisan ide-helper:models --write --reset >/dev/null
real 0m54.147s
user 0m47.132s
sys 0m1.047s
```
However, in this case we **do not need** the phpdoc fallback (which is
legitimate and by design for many other cases), because also the Laravel
implementation only works by inspecting the _actual type_, see
https://github.com/laravel/framework/blob/e0c2620b57be6416820ea7ca8e46fd2f71d2fe35/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php#L570-L575
```php
$returnType = (new ReflectionMethod($this, $method))->getReturnType();
return static::$attributeMutatorCache[get_class($this)][$key] = $returnType &&
$returnType instanceof ReflectionNamedType &&
$returnType->getName() === Attribute::class &&
is_callable($this->{$method}()->get);
```
This side-stepping the phpdoc parsing a) still works correctly and b)
brings us back to the previous performance characteristics:
```
time ./artisan ide-helper:models --write --reset >/dev/null
real 0m2.987s
user 0m1.915s
sys 0m0.120s
```
* ✨ Set properties from model functions returning an Attribute
* ✅ Add test for model Attributes
* 🎨 Fix code style
* 🔖 Update changelog
* ✅ Update test to not require php 8
* 🐛 Fix PHP 7.3 incompatibility
* ✅ Update tests to only run when Illuminate Attribute exists