Compare commits

..
Author SHA1 Message Date
laravel-ide-helper 4c2f68f14a composer fix-style 2025-01-08 10:00:25 +00:00
Barry vd. Heuvel a11dd14ee5 Check if macro is valid 2025-01-08 10:59:45 +01:00
113 changed files with 674 additions and 3051 deletions
+3 -1
View File
@@ -6,7 +6,9 @@
/.gitattributes export-ignore /.gitattributes export-ignore
/.github export-ignore /.github export-ignore
/.gitignore export-ignore /.gitignore export-ignore
/.php-cs-fixer* export-ignore /.php-cs-fixer.cache export-ignore
/.php-cs-fixer.php export-ignore
/.php-cs-fixer.tests.cache export-ignore
/phpunit.xml.dist export-ignore /phpunit.xml.dist export-ignore
/psalm-baseline.xml export-ignore /psalm-baseline.xml export-ignore
/psalm.xml export-ignore /psalm.xml export-ignore
+2 -2
View File
@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- name: Git checkout - name: Git checkout
uses: actions/checkout@v6 uses: actions/checkout@v4
- name: Validate Composer configuration - name: Validate Composer configuration
run: composer validate --strict run: composer validate --strict
@@ -23,6 +23,6 @@ jobs:
composer global require ergebnis/composer-normalize composer global require ergebnis/composer-normalize
composer normalize composer normalize
- uses: stefanzweifel/git-auto-commit-action@v7 - uses: stefanzweifel/git-auto-commit-action@v5
with: with:
commit_message: normalize composer.json commit_message: normalize composer.json
+2 -2
View File
@@ -13,7 +13,7 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v6 uses: actions/checkout@v4
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
@@ -27,7 +27,7 @@ jobs:
- run: composer fix-style - run: composer fix-style
continue-on-error: true continue-on-error: true
- uses: stefanzweifel/git-auto-commit-action@v7 - uses: stefanzweifel/git-auto-commit-action@v5
with: with:
commit_message: composer fix-style commit_message: composer fix-style
commit_author: laravel-ide-helper <[email protected]> commit_author: laravel-ide-helper <[email protected]>
+61 -65
View File
@@ -1,79 +1,75 @@
name: Integration Tests name: Integration Tests
on: on:
push: push:
branches: branches:
- master - master
pull_request: pull_request:
branches: branches:
- "*" - "*"
schedule:
- cron: '0 0 * * *'
jobs: jobs:
php-laravel-integration-tests: php-laravel-integration-tests:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
timeout-minutes: 15
env:
COMPOSER_NO_INTERACTION: 1
strategy:
fail-fast: false
matrix:
php: [8.4, 8.3, 8.2]
laravel: [^11.15]
timeout-minutes: 15 name: P${{ matrix.php }} - Laravel${{ matrix.laravel }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
path: src
env: - name: Setup PHP
COMPOSER_NO_INTERACTION: 1 uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
strategy: - name: Install dependencies
fail-fast: false run: |
matrix: composer create-project --prefer-dist laravel/laravel:${{ matrix.laravel }} --stability=dev --no-progress sample
php: [8.5, 8.4, 8.3, 8.2] cd sample
laravel: [11.x, 12.x, 13.x] composer config minimum-stability dev
exclude: composer update --prefer-stable --prefer-dist --no-progress
- laravel: 13.x
php: 8.2
name: P${{ matrix.php }} - Laravel${{ matrix.laravel }} - name: Add package from source
run: |
cd sample
sed -e 's|"type": "project",|&\n"repositories": [ { "type": "path", "url": "../src" } ],|' -i composer.json
composer require --dev "barryvdh/laravel-ide-helper:*" --with-all-dependencies
steps: - name: Execute generate run
- name: Checkout code run: |
uses: actions/checkout@v6 cd sample
with: php artisan ide-helper:generate
path: src
- name: Setup PHP - name: Execute meta run
uses: shivammathur/setup-php@v2 run: |
with: cd sample
php-version: ${{ matrix.php }} php artisan ide-helper:meta -v
coverage: none
- name: Install dependencies - name: Check file existence
run: | run: |
composer create-project --prefer-dist laravel/laravel:${{ matrix.laravel }} --stability=dev --no-progress sample ls sample/_ide_helper.php
cd sample ls sample/.phpstorm.meta.php
composer config minimum-stability dev
composer update --prefer-stable --prefer-dist --no-progress
- name: Add package from source
run: |
cd sample
sed -e 's|"type": "project",|&\n"repositories": [ { "type": "path", "url": "../src" } ],|' -i composer.json
composer require --dev "barryvdh/laravel-ide-helper:*" --with-all-dependencies
- name: Execute generate run - name: Check logs
run: | run: |
cd sample if [ `ls -1q "sample/storage/logs/" | wc -l` -gt 0 ]; then
php artisan ide-helper:generate for logfile in sample/storage/logs/*; do
echo "-- $logfile --"
- name: Execute meta run cat $logfile
run: | done
cd sample exit 1
php artisan ide-helper:meta -v fi
- name: Check file existence
run: |
ls sample/_ide_helper.php
ls sample/.phpstorm.meta.php
- name: Check logs
run: |
if [ `ls -1q "sample/storage/logs/" | wc -l` -gt 0 ]; then
for logfile in sample/storage/logs/*; do
echo "-- $logfile --"
cat $logfile
done
exit 1
fi
+2 -2
View File
@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v4
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
@@ -25,4 +25,4 @@ jobs:
run: composer install --prefer-dist --no-progress --no-suggest run: composer install --prefer-dist --no-progress --no-suggest
- name: Analyze - name: Analyze
run: vendor/bin/phpstan --no-progress --error-format=github run: composer analyze
+26 -35
View File
@@ -7,55 +7,46 @@ on:
pull_request: pull_request:
branches: branches:
- "*" - "*"
schedule:
- cron: '0 0 * * *'
jobs: jobs:
php-tests: php-tests:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
timeout-minutes: 15 timeout-minutes: 15
env: env:
COMPOSER_NO_INTERACTION: 1 COMPOSER_NO_INTERACTION: 1
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-latest] os: [ubuntu-22.04, windows-2019]
php: [8.5, 8.4, 8.3, 8.2] php: [8.4, 8.3, 8.2]
laravel: [12.x, 13.x, ~11.15] laravel: [^11.15]
stability: [prefer-lowest, prefer-stable] stability: [prefer-lowest, prefer-stable]
include:
- os: windows-latest
php: 8.3
laravel: 12.x
stability: prefer-stable
exclude:
- laravel: 13.x
php: 8.2
steps: steps:
- name: Set git to use LF - name: Set git to use LF
if: "${{ matrix.os == 'windows-latest' }}" if: ${{ matrix.os == 'windows-2019' }}
run: | run: |
git config --global core.autocrlf false git config --global core.autocrlf false
git config --global core.eol lf git config --global core.eol lf
- name: Checkout code - name: Checkout code
uses: actions/checkout@v6 uses: actions/checkout@v4
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: ${{ matrix.php }} php-version: ${{ matrix.php }}
coverage: none coverage: none
extensions: pdo_sqlite, fileinfo extensions: pdo_sqlite, fileinfo
- name: Install dependencies - name: Install dependencies
run: | run: |
composer remove vimeo/psalm --no-update --dev composer remove vimeo/psalm --no-update --dev
composer remove friendsofphp/php-cs-fixer --no-update --dev composer remove friendsofphp/php-cs-fixer --no-update --dev
composer require "laravel/framework:${{ matrix.laravel }}" --no-update --no-progress composer require "laravel/framework:${{ matrix.laravel }}" --no-update --no-progress
composer update --prefer-dist --no-progress --${{ matrix.stability }} composer update --prefer-dist --no-progress --${{ matrix.stability }}
- name: Execute Unit Tests - name: Execute Unit Tests
run: composer test-ci run: composer test-ci
+2 -2
View File
@@ -16,7 +16,7 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v6 uses: actions/checkout@v4
with: with:
ref: ${{ github.event.release.target_commitish }} ref: ${{ github.event.release.target_commitish }}
@@ -27,7 +27,7 @@ jobs:
release-notes: ${{ github.event.release.body }} release-notes: ${{ github.event.release.body }}
- name: Commit updated CHANGELOG - name: Commit updated CHANGELOG
uses: stefanzweifel/git-auto-commit-action@v7 uses: stefanzweifel/git-auto-commit-action@v5
with: with:
branch: ${{ github.event.release.target_commitish }} branch: ${{ github.event.release.target_commitish }}
commit_message: Update CHANGELOG commit_message: Update CHANGELOG
+1 -2
View File
@@ -1,6 +1,5 @@
.phpunit.result.cache .phpunit.result.cache
/auth.json
/build
/.idea /.idea
/.php-cs-fixer.cache /.php-cs-fixer.cache
/.php-cs-fixer.php /.php-cs-fixer.php
+1 -1
View File
@@ -3,7 +3,7 @@ require __DIR__ . '/vendor/autoload.php';
$finder = PhpCsFixer\Finder::create() $finder = PhpCsFixer\Finder::create()
->in(__DIR__) ->in(__DIR__)
->exclude(['tests', 'build']); ->exclude('tests');
$config = require __DIR__ . '/.php-cs-fixer.common.php'; $config = require __DIR__ . '/.php-cs-fixer.common.php';
-95
View File
@@ -1,100 +1,5 @@
# Changelog # Changelog
## v3.6.1 - 2025-12-10
### What's Changed
* Fix `methodsto` typo in README by @peterchrjoergensen in https://github.com/barryvdh/laravel-ide-helper/pull/1723
* Bump actions/checkout from 4 to 5 in the deps group by @dependabot[bot] in https://github.com/barryvdh/laravel-ide-helper/pull/1731
* Fix typos in documentation and code comments by @kei1111 in https://github.com/barryvdh/laravel-ide-helper/pull/1733
* Add php 8.5 support by @sergiy-petrov in https://github.com/barryvdh/laravel-ide-helper/pull/1735
* Fix alias fake error by @WentTheFox in https://github.com/barryvdh/laravel-ide-helper/pull/1745
* Remove calls to PHP 8.5-deprecated `setAccessible` by @jnoordsij in https://github.com/barryvdh/laravel-ide-helper/pull/1744
* Bump the deps group across 1 directory with 2 updates by @dependabot[bot] in https://github.com/barryvdh/laravel-ide-helper/pull/1743
* Add support for `decimal` column type by @BrainStone in https://github.com/barryvdh/laravel-ide-helper/pull/1739
### New Contributors
* @peterchrjoergensen made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1723
* @kei1111 made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1733
* @WentTheFox made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1745
* @BrainStone made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1739
**Full Changelog**: https://github.com/barryvdh/laravel-ide-helper/compare/v3.6.0...v3.6.1
## v3.6.0 - 2025-07-18
### What's Changed
* fix: Change AsArrayObject cast to be Laravel's ArrayObject by @wsamoht in https://github.com/barryvdh/laravel-ide-helper/pull/1675
* Add extends declaration for Macroable classes to fix missing inherited methods by @KentarouTakeda in https://github.com/barryvdh/laravel-ide-helper/pull/1674
* fix(meta): ignore aliases in the autoloader (Fixes #1671) by @pataar in https://github.com/barryvdh/laravel-ide-helper/pull/1686
* feat(ModelsCommand): add support for the new Scope attribute by @pataar in https://github.com/barryvdh/laravel-ide-helper/pull/1694
* fix type change for scope default float parameter by @nivseb in https://github.com/barryvdh/laravel-ide-helper/pull/1697
* Revert #1629 - *Allow adding custom Macroable classes* by @erikn69 in https://github.com/barryvdh/laravel-ide-helper/pull/1707
* Configurable macro return type defaults by @erikn69 in https://github.com/barryvdh/laravel-ide-helper/pull/1711
* docs(readme): add Laravel 12 support information by @SantosVilanculos in https://github.com/barryvdh/laravel-ide-helper/pull/1717
* Add multi-level directory support for translation files by @RosiersRobin in https://github.com/barryvdh/laravel-ide-helper/pull/1718
* Support `AsCollection::of($map)`, `AsCollection::using($class, $map)` by @erikn69 in https://github.com/barryvdh/laravel-ide-helper/pull/1714
* fix: Fixed wrong doc for SoftDeletes `withTrashed` method by @eldair in https://github.com/barryvdh/laravel-ide-helper/pull/1688
* Support other OS on tests by @erikn69 in https://github.com/barryvdh/laravel-ide-helper/pull/1715
* Fix tests on windows by @barryvdh in https://github.com/barryvdh/laravel-ide-helper/pull/1720
* Bump stefanzweifel/git-auto-commit-action from 5 to 6 in the deps group by @dependabot[bot] in https://github.com/barryvdh/laravel-ide-helper/pull/1719
* Update .gitattributes - avoid all `.php-cs-fixer` files on vendor by @erikn69 in https://github.com/barryvdh/laravel-ide-helper/pull/1708
* fix(ModelsCommand): use 'string' as realType for 'encrypted' casts by @pataar in https://github.com/barryvdh/laravel-ide-helper/pull/1698
* Trim strings and bump reflection docblock by @barryvdh in https://github.com/barryvdh/laravel-ide-helper/pull/1721
* Add magic *_exists properties by @erikn69 in https://github.com/barryvdh/laravel-ide-helper/pull/1712
### New Contributors
* @wsamoht made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1675
* @nivseb made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1697
* @SantosVilanculos made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1717
* @RosiersRobin made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1718
**Full Changelog**: https://github.com/barryvdh/laravel-ide-helper/compare/v3.5.5...v3.6.0
## v3.5.5 - 2025-02-21
### What's Changed
* Fix for incorrect config item types in meta file by @eldair in https://github.com/barryvdh/laravel-ide-helper/pull/1662
* Prevent generation of incorrect property annotation by @skyler544 in https://github.com/barryvdh/laravel-ide-helper/pull/1665
* Fix MorphTo Model Doc Generation by @yparitcher in https://github.com/barryvdh/laravel-ide-helper/pull/1668
* Laravel 12 support by @jonnott in https://github.com/barryvdh/laravel-ide-helper/pull/1672
### New Contributors
* @eldair made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1662
* @skyler544 made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1665
* @yparitcher made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1668
* @jonnott made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1672
**Full Changelog**: https://github.com/barryvdh/laravel-ide-helper/compare/v3.5.4...v3.5.5
## v3.5.4 - 2025-01-14
### What's Changed
* Convert auth() helper to use Auth facade by @barryvdh in https://github.com/barryvdh/laravel-ide-helper/pull/1656
* Check if returnType from docblock is not null by @barryvdh in https://github.com/barryvdh/laravel-ide-helper/pull/1658
**Full Changelog**: https://github.com/barryvdh/laravel-ide-helper/compare/v3.5.3...v3.5.4
## v3.5.3 - 2025-01-08
### What's Changed
* Catch meta, tweak auth by @barryvdh in https://github.com/barryvdh/laravel-ide-helper/pull/1654
* Check if macro is valid by @barryvdh in https://github.com/barryvdh/laravel-ide-helper/pull/1655
* feat: use generics of return type to determine resulting models by @Bloemendaal in https://github.com/barryvdh/laravel-ide-helper/pull/1653
### New Contributors
* @Bloemendaal made their first contribution in https://github.com/barryvdh/laravel-ide-helper/pull/1653
**Full Changelog**: https://github.com/barryvdh/laravel-ide-helper/compare/v3.5.2...v3.5.3
## v3.5.2 - 2025-01-06 ## v3.5.2 - 2025-01-06
### Fixes ### Fixes
+7 -5
View File
@@ -11,7 +11,7 @@
This package generates helper files that enable your IDE to provide accurate autocompletion. This package generates helper files that enable your IDE to provide accurate autocompletion.
Generation is done based on the files in your project, so they are always up-to-date. Generation is done based on the files in your project, so they are always up-to-date.
The 3.x branch supports Laravel 10 and later. For older version, use the 2.x releases. The 3.x branch supports Laravel 10 and 11. For older version, use the 2.x releases.
- [Installation](#installation) - [Installation](#installation)
- [Usage](#usage) - [Usage](#usage)
@@ -51,7 +51,7 @@ php artisan ide-helper:models -RW
If you don't want the full _ide_helper.php file, you can run add `--write-eloquent-helper` to the model command to generate small version, which is required for the `@mixin \Eloquent` to be able to add the QueryBuilder methods. If you don't want the full _ide_helper.php file, you can run add `--write-eloquent-helper` to the model command to generate small version, which is required for the `@mixin \Eloquent` to be able to add the QueryBuilder methods.
If you don't want to add all the phpdocs to your Models directly, you can use `--nowrite` to create a separate file. The `--write-mixin` option can be used to only add a `@mixin` to your models, but add the generated phpdocs in a separate file. This avoids having the results marked as duplicate. If you don't want to add all the phpdocs to your Models directly, you can use `--nowrite` to create a seperate file. The `--write-mixin` option can be used to only add a `@mixin` to your models, but add the generated phpdocs in a seperate file. This avoids having the results marked as duplicate.
_Check out [this Laracasts video](https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/15) for a quick introduction/explanation!_ _Check out [this Laracasts video](https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/15) for a quick introduction/explanation!_
@@ -115,6 +115,8 @@ Str::macro('concat', function(string $str1, string $str2) : string {
}); });
``` ```
You can add any custom Macroable traits to detect in the `macroable_traits` config option.
### Automatic PHPDocs for models ### Automatic PHPDocs for models
If you don't want to write your properties yourself, you can use the command `php artisan ide-helper:models` to generate If you don't want to write your properties yourself, you can use the command `php artisan ide-helper:models` to generate
@@ -210,11 +212,11 @@ Eloquent allows calling `where<Attribute>` on your models, e.g. `Post::whereTitl
If for some reason it's undesired to have them generated (one for each column), you can disable this via config `write_model_magic_where` and setting it to `false`. If for some reason it's undesired to have them generated (one for each column), you can disable this via config `write_model_magic_where` and setting it to `false`.
#### Magic `*_count` and `*_exists` properties #### Magic `*_count` properties
You may use the [`::withCount`](https://laravel.com/docs/master/eloquent-relationships#counting-related-models) and [`::withExists`](https://laravel.com/docs/master/eloquent-relationships#other-aggregate-functions) methods to count the number results from a relationship without actually loading them. Those results are then placed in attributes following the `<columnname>_count` and `<columnname>_exists` convention. You may use the [`::withCount`](https://laravel.com/docs/master/eloquent-relationships#counting-related-models) method to count the number results from a relationship without actually loading them. Those results are then placed in attributes following the `<columname>_count` convention.
By default, these attributes are generated in the phpdoc. You can turn them off by setting the config `write_model_relation_count_properties` and `write_model_relation_exists_properties` to `false`. By default, these attributes are generated in the phpdoc. You can turn them off by setting the config `write_model_relation_count_properties` to `false`.
#### Generics annotations #### Generics annotations
+13 -14
View File
@@ -23,24 +23,23 @@
"require": { "require": {
"php": "^8.2", "php": "^8.2",
"ext-json": "*", "ext-json": "*",
"barryvdh/reflection-docblock": "^2.4", "barryvdh/reflection-docblock": "^2.3",
"composer/class-map-generator": "^1.0", "composer/class-map-generator": "^1.0",
"illuminate/console": "^11.15 || ^12 || ^13.0", "illuminate/console": "^11.15",
"illuminate/database": "^11.15 || ^12 || ^13.0", "illuminate/database": "^11.15",
"illuminate/filesystem": "^11.15 || ^12 || ^13.0", "illuminate/filesystem": "^11.15",
"illuminate/support": "^11.15 || ^12 || ^13.0" "illuminate/support": "^11.15"
}, },
"require-dev": { "require-dev": {
"ext-pdo_sqlite": "*", "ext-pdo_sqlite": "*",
"friendsofphp/php-cs-fixer": "^3", "friendsofphp/php-cs-fixer": "^3",
"illuminate/config": "^11.15 || ^12 || ^13.0", "illuminate/config": "^11.15",
"illuminate/view": "^11.15 || ^12 || ^13.0", "illuminate/view": "^11.15",
"larastan/larastan": "^3.1",
"mockery/mockery": "^1.4", "mockery/mockery": "^1.4",
"orchestra/testbench": "^9.2 || ^10 || ^11.0", "orchestra/testbench": "^9.2",
"phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^10.5",
"phpunit/phpunit": "^10.5 || ^11.5.3 || ^12.5.12",
"spatie/phpunit-snapshot-assertions": "^4 || ^5", "spatie/phpunit-snapshot-assertions": "^4 || ^5",
"vimeo/psalm": "^5.4",
"vlucas/phpdotenv": "^5" "vlucas/phpdotenv": "^5"
}, },
"suggest": { "suggest": {
@@ -75,8 +74,7 @@
} }
}, },
"scripts": { "scripts": {
"analyze": "phpstan", "analyze": "psalm",
"analyze-set-baseline": "phpstan --generate-baseline",
"check-style": [ "check-style": [
"php-cs-fixer fix --diff --diff-format=udiff --dry-run", "php-cs-fixer fix --diff --diff-format=udiff --dry-run",
"php-cs-fixer fix --diff --diff-format=udiff --dry-run --config=.php_cs.tests.php" "php-cs-fixer fix --diff --diff-format=udiff --dry-run --config=.php_cs.tests.php"
@@ -85,8 +83,9 @@
"php-cs-fixer fix", "php-cs-fixer fix",
"php-cs-fixer fix --config=.php-cs-fixer.tests.php" "php-cs-fixer fix --config=.php-cs-fixer.tests.php"
], ],
"psalm-set-baseline": "psalm --set-baseline=psalm-baseline.xml",
"test": "phpunit", "test": "phpunit",
"test-ci": "phpunit", "test-ci": "phpunit -d --without-creating-snapshots",
"test-regenerate": "phpunit -d --update-snapshots" "test-regenerate": "phpunit -d --update-snapshots"
} }
} }
+45 -68
View File
@@ -49,14 +49,17 @@ return [
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Write model query methods | Factory builders
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Set to false to disable generated docs for the 'query()', 'newQuery()' and 'newModelQuery()' methods. | Set to true to generate factory generators for better factory()
| method auto-completion.
|
| Deprecated for Laravel 8 or latest.
| |
*/ */
'write_query_methods' => true, 'include_factory_builders' => false,
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@@ -82,16 +85,14 @@ return [
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Write model relation count and exists properties | Write model relation count properties
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Set to false to disable writing of relation count and exists properties | Set to false to disable writing of relation count properties to model DocBlocks.
| to model DocBlocks.
| |
*/ */
'write_model_relation_count_properties' => true, 'write_model_relation_count_properties' => true,
'write_model_relation_exists_properties' => false,
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@@ -122,7 +123,6 @@ return [
'helper_files' => [ 'helper_files' => [
base_path() . '/vendor/laravel/framework/src/Illuminate/Support/helpers.php', base_path() . '/vendor/laravel/framework/src/Illuminate/Support/helpers.php',
base_path() . '/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php',
], ],
/* /*
@@ -201,29 +201,29 @@ return [
], ],
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Support for camel cased models | Support for camel cased models
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| There are some Laravel packages (such as Eloquence) that allow for accessing | There are some Laravel packages (such as Eloquence) that allow for accessing
| Eloquent model properties via camel case, instead of snake case. | Eloquent model properties via camel case, instead of snake case.
| |
| Enabling this option will support these packages by saving all model | Enabling this option will support these packages by saving all model
| properties as camel case, instead of snake case. | properties as camel case, instead of snake case.
| |
| For example, normally you would see this: | For example, normally you would see this:
| |
| * @property \Illuminate\Support\Carbon $created_at | * @property \Illuminate\Support\Carbon $created_at
| * @property \Illuminate\Support\Carbon $updated_at | * @property \Illuminate\Support\Carbon $updated_at
| |
| With this enabled, the properties will be this: | With this enabled, the properties will be this:
| |
| * @property \Illuminate\Support\Carbon $createdAt | * @property \Illuminate\Support\Carbon $createdAt
| * @property \Illuminate\Support\Carbon $updatedAt | * @property \Illuminate\Support\Carbon $updatedAt
| |
| Note, it is currently an all-or-nothing option. | Note, it is currently an all-or-nothing option.
| |
*/ */
'model_camel_case_properties' => false, 'model_camel_case_properties' => false,
/* /*
@@ -273,20 +273,6 @@ return [
*/ */
'use_generics_annotations' => true, 'use_generics_annotations' => true,
/*
|--------------------------------------------------------------------------
| Default return types for macros
|--------------------------------------------------------------------------
|
| Define default return types for macros without explicit return types.
| e.g. `\Illuminate\Database\Query\Builder::class => 'static'`,
| `\Illuminate\Support\Str::class => 'string'`
|
*/
'macro_default_return_types' => [
Illuminate\Http\Client\Factory::class => Illuminate\Http\Client\PendingRequest::class,
],
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Additional relation types | Additional relation types
@@ -336,29 +322,6 @@ return [
'enforce_nullable_relationships' => true, 'enforce_nullable_relationships' => true,
/*
|--------------------------------------------------------------------------
| Make soft deletable relations nullable
|--------------------------------------------------------------------------
|
| When set to true (default), relationships to models using SoftDeletes trait
| will be marked as nullable. This is because soft-deleted records are excluded
| from queries by default, meaning even non-nullable foreign keys can return
| null when the related model is soft-deleted.
|
| Default: true
| A relationship to a soft-deletable model will include |null in the type:
| * @property-read Team|null $team
|
| Option: false
| A relationship to a soft-deletable model will NOT include |null (unless
| nullable for other reasons such as nullable foreign key column):
| * @property-read Team $team
|
*/
'soft_deletes_force_nullable' => true,
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Run artisan commands after migrations to generate model helpers | Run artisan commands after migrations to generate model helpers
@@ -371,4 +334,18 @@ return [
// 'ide-helper:models --nowrite', // 'ide-helper:models --nowrite',
], ],
/*
|--------------------------------------------------------------------------
| Macroable Traits
|--------------------------------------------------------------------------
|
| Define which traits should be considered capable of adding Macro.
| You can add any custom trait that behaves like the original Laravel one.
|
*/
'macroable_traits' => [
Filament\Support\Concerns\Macroable::class,
Spatie\Macroable\Macroable::class,
],
]; ];
+1 -1
View File
@@ -72,7 +72,7 @@ function vsCodeGetConfigValue($value, $key, $configPaths)
$key = collect(explode('.', $key)); $key = collect(explode('.', $key));
$key->pop(); $key->pop();
$key = $key->implode('.'); $key = $key->implode('.');
$value = []; $value = 'array(...)';
} }
$nextKey = $keysToFind->shift(); $nextKey = $keysToFind->shift();
+36 -53
View File
@@ -1,71 +1,56 @@
<?php <?php
function vsCodeGetTranslationsFromFile(Symfony\Component\Finder\SplFileInfo $file, $path, $namespace) function vsCodeGetTranslationsFromFile($file, $path, $namespace)
{ {
if ($file->getExtension() !== 'php') { $key = pathinfo($file, PATHINFO_FILENAME);
return null;
}
$filePath = $file->getRealPath();
$relativePath = trim(str_replace($path, '', $file->getPath()), DIRECTORY_SEPARATOR);
$lang = explode(DIRECTORY_SEPARATOR, $relativePath)[0] ?? null;
if (!$lang) {
return null;
}
$keyPath = str_replace($path . DIRECTORY_SEPARATOR . $lang . DIRECTORY_SEPARATOR, '', $filePath);
$keyWithSlashes = str_replace('.php', '', $keyPath);
$baseKey = str_replace(DIRECTORY_SEPARATOR, '.', $keyWithSlashes);
if ($namespace) { if ($namespace) {
$baseKey = "{$namespace}::{$baseKey}"; $key = "{$namespace}::{$key}";
} }
try { $lang = collect(explode(DIRECTORY_SEPARATOR, str_replace($path, '', $file)))
$translations = require $filePath; ->filter()
} catch (Throwable $e) { ->first();
return null;
}
if (!is_array($translations)) { $fileLines = Illuminate\Support\Facades\File::lines($file);
return null;
}
$fileLines = Illuminate\Support\Facades\File::lines($filePath);
$lines = []; $lines = [];
$inComment = false; $inComment = false;
foreach ($fileLines as $index => $line) { foreach ($fileLines as $index => $line) {
$trimmed = trim($line); $trimmed = trim($line);
if (str_starts_with($trimmed, '/*')) {
if (substr($trimmed, 0, 2) === '/*') {
$inComment = true; $inComment = true;
continue;
} }
if ($inComment) { if ($inComment) {
if (str_ends_with($trimmed, '*/')) { if (substr($trimmed, -2) !== '*/') {
$inComment = false; continue;
} }
$inComment = false;
}
if (substr($trimmed, 0, 2) === '//') {
continue; continue;
} }
if (str_starts_with($trimmed, '//')) {
continue;
}
$lines[] = [$index + 1, $trimmed]; $lines[] = [$index + 1, $trimmed];
} }
return [ return [
'k' => $baseKey, 'k' => $key,
'la' => $lang, 'la' => $lang,
'vs' => collect(Illuminate\Support\Arr::dot($translations)) 'vs' => collect(Illuminate\Support\Arr::dot((Illuminate\Support\Arr::wrap(__($key, [], $lang)))))
->map( ->map(
fn ($value, $dotKey) => vsCodeTranslationValue( fn ($value, $key) => vsCodeTranslationValue(
$dotKey, $key,
$value, $value,
str_replace(base_path(DIRECTORY_SEPARATOR), '', $filePath), str_replace(base_path(DIRECTORY_SEPARATOR), '', $file),
$lines $lines
)
) )
)
->filter(), ->filter(),
]; ];
} }
@@ -78,12 +63,13 @@ function vsCodeTranslationValue($key, $value, $file, $lines): ?array
$lineNumber = 1; $lineNumber = 1;
$keys = explode('.', $key); $keys = explode('.', $key);
$index = 0;
$currentKey = array_shift($keys); $currentKey = array_shift($keys);
foreach ($lines as $line) { foreach ($lines as $index => $line) {
if ( if (
strpos($line[1], '"' . $currentKey . '"') !== false || strpos($line[1], '"' . $currentKey . '"', 0) !== false ||
strpos($line[1], "'" . $currentKey . "'") !== false strpos($line[1], "'" . $currentKey . "'", 0) !== false
) { ) {
$lineNumber = $line[0]; $lineNumber = $line[0];
$currentKey = array_shift($keys); $currentKey = array_shift($keys);
@@ -112,9 +98,9 @@ function vscodeCollectTranslations(string $path, ?string $namespace = null)
return collect(); return collect();
} }
return collect(Illuminate\Support\Facades\File::allFiles($realPath)) return collect(Illuminate\Support\Facades\File::allFiles($realPath))->map(
->map(fn ($file) => vsCodeGetTranslationsFromFile($file, $path, $namespace)) fn ($file) => vsCodeGetTranslationsFromFile($file, $path, $namespace)
->filter(); );
} }
$loader = app('translator')->getLoader(); $loader = app('translator')->getLoader();
@@ -124,6 +110,7 @@ $reflection = new ReflectionClass($loader);
$property = $reflection->hasProperty('paths') $property = $reflection->hasProperty('paths')
? $reflection->getProperty('paths') ? $reflection->getProperty('paths')
: $reflection->getProperty('path'); : $reflection->getProperty('path');
$property->setAccessible(true);
$paths = Illuminate\Support\Arr::wrap($property->getValue($loader)); $paths = Illuminate\Support\Arr::wrap($property->getValue($loader));
@@ -138,10 +125,6 @@ $namespaced = collect($namespaces)->flatMap(
$final = []; $final = [];
foreach ($default->merge($namespaced) as $value) { foreach ($default->merge($namespaced) as $value) {
if (!isset($value['vs']) || !is_iterable($value['vs'])) {
continue;
}
foreach ($value['vs'] as $key => $v) { foreach ($value['vs'] as $key => $v) {
$dotKey = "{$value['k']}.{$key}"; $dotKey = "{$value['k']}.{$key}";
-67
View File
@@ -1,67 +0,0 @@
parameters:
ignoreErrors:
-
message: '#^File ends with a trailing whitespace\. This may cause problems when running the code in the web browser\. Remove the closing \?\> mark or remove the whitespace\.$#'
identifier: whitespace.fileEnd
count: 1
path: resources/views/helper.php
-
message: '#^Call to an undefined method Illuminate\\Contracts\\Filesystem\\Filesystem\:\:requireOnce\(\)\.$#'
identifier: method.notFound
count: 1
path: src/Console/MetaCommand.php
-
message: '#^Call to an undefined method Illuminate\\Contracts\\Foundation\\Application\:\:getBindings\(\)\.$#'
identifier: method.notFound
count: 1
path: src/Console/MetaCommand.php
-
message: '#^Call to an undefined method Barryvdh\\Reflection\\DocBlock\\Tag\:\:getMethodName\(\)\.$#'
identifier: method.notFound
count: 1
path: src/Console/ModelsCommand.php
-
message: '#^Call to an undefined method Barryvdh\\Reflection\\DocBlock\\Tag\:\:getType\(\)\.$#'
identifier: method.notFound
count: 1
path: src/Console/ModelsCommand.php
-
message: '#^Call to an undefined method Barryvdh\\Reflection\\DocBlock\\Tag\:\:getVariableName\(\)\.$#'
identifier: method.notFound
count: 1
path: src/Console/ModelsCommand.php
-
message: '#^Call to an undefined method Illuminate\\Support\\Optional\:\:getNumberOfParameters\(\)\.$#'
identifier: method.notFound
count: 1
path: src/Console/ModelsCommand.php
-
message: '#^Call to an undefined method Illuminate\\Support\\Optional\:\:getParameters\(\)\.$#'
identifier: method.notFound
count: 1
path: src/Console/ModelsCommand.php
-
message: '#^Call to an undefined method Illuminate\\Support\\Optional\:\:getReturnType\(\)\.$#'
identifier: method.notFound
count: 1
path: src/Console/ModelsCommand.php
-
message: '#^Call to an undefined static method Illuminate\\Database\\Eloquent\\Model\:\:newFactory\(\)\.$#'
identifier: staticMethod.notFound
count: 2
path: src/Console/ModelsCommand.php
-
message: '#^Call to an undefined method ReflectionFunctionAbstract\:\:getDeclaringClass\(\)\.$#'
identifier: method.notFound
count: 1
path: src/Method.php
-11
View File
@@ -1,11 +0,0 @@
includes:
- phpstan-baseline.neon
- vendor/phpstan/phpstan-phpunit/extension.neon
parameters:
level: 2
paths:
- src
- resources/views
excludePaths:
+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<files psalm-version="5.4.0@62db5d4f6a7ae0a20f7cc5a4952d730272fc0863">
<file src="src/Factories.php">
<UndefinedClass occurrences="2">
<code>Factory</code>
<code>Factory</code>
</UndefinedClass>
</file>
<file src="src/Generator.php">
<UndefinedClass occurrences="6">
<code>\Auth</code>
<code>\Cache</code>
<code>\Cache</code>
<code>\DB</code>
<code>\Queue</code>
<code>\Storage</code>
</UndefinedClass>
</file>
<file src="src/Console/ModelsCommand.php">
<UndefinedClass occurrences="1">
<code>\UnitEnum</code>
</UndefinedClass>
</file>
</files>
+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0"?>
<psalm
errorLevel="7"
resolveFromConfigFile="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
errorBaseline="psalm-baseline.xml"
>
<projectFiles>
<directory name="src" />
<ignoreFiles>
<directory name="vendor" />
</ignoreFiles>
</projectFiles>
</psalm>
+11 -3
View File
@@ -3,7 +3,6 @@
/** /**
* @var Barryvdh\LaravelIdeHelper\Alias[][] $namespaces_by_alias_ns * @var Barryvdh\LaravelIdeHelper\Alias[][] $namespaces_by_alias_ns
* @var Barryvdh\LaravelIdeHelper\Alias[][] $namespaces_by_extends_ns * @var Barryvdh\LaravelIdeHelper\Alias[][] $namespaces_by_extends_ns
* @var string[] $real_time_facades
* @var bool $include_fluent * @var bool $include_fluent
* @var string $helpers * @var string $helpers
*/ */
@@ -30,7 +29,7 @@ $s3 = $s1 . $s2;
<?php foreach ($namespaces_by_extends_ns as $namespace => $aliases) : ?> <?php foreach ($namespaces_by_extends_ns as $namespace => $aliases) : ?>
namespace <?= $namespace === '__root' ? '' : trim($namespace, '\\') ?> { namespace <?= $namespace === '__root' ? '' : trim($namespace, '\\') ?> {
<?php foreach ($aliases as $alias) : ?> <?php foreach ($aliases as $alias) : ?>
<?php echo trim($alias->getDocComment($s1)) . "\n{$s1}" . $alias->getClassType() ?> <?= $alias->getExtendsClass() ?><?php if ($alias->shouldExtendParentClass()): ?> extends <?= $alias->getParentClass() ?><?php endif; ?> { <?php echo trim($alias->getDocComment($s1)) . "\n{$s1}" . $alias->getClassType() ?> <?= $alias->getExtendsClass() ?> {
<?php foreach ($alias->getMethods() as $method) : ?> <?php foreach ($alias->getMethods() as $method) : ?>
<?= trim($method->getDocComment($s2)) . "\n{$s2}" ?>public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>) <?= trim($method->getDocComment($s2)) . "\n{$s2}" ?>public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>)
{<?php if ($method->getDeclaringClass() !== $method->getRoot()) : ?> {<?php if ($method->getDeclaringClass() !== $method->getRoot()) : ?>
@@ -77,7 +76,7 @@ namespace <?= $namespace === '__root' ? '' : trim($namespace, '\\') ?> {
<?php endforeach; ?> <?php endforeach; ?>
<?php foreach ($real_time_facades as $name): ?> <?php foreach($real_time_facades as $name): ?>
<?php $nested = explode('\\', str_replace('\\' . class_basename($name), '', $name)); ?> <?php $nested = explode('\\', str_replace('\\' . class_basename($name), '', $name)); ?>
namespace <?php echo implode('\\', $nested); ?> { namespace <?php echo implode('\\', $nested); ?> {
/** /**
@@ -120,3 +119,12 @@ namespace Illuminate\Support {
} }
<?php endif ?> <?php endif ?>
<?php foreach ($factories as $factory) : ?>
namespace <?=$factory->getNamespaceName()?> {
/**
* @method \Illuminate\Database\Eloquent\Collection|<?=$factory->getShortName()?>[]|<?=$factory->getShortName()?> create($attributes = [])
* @method \Illuminate\Database\Eloquent\Collection|<?=$factory->getShortName()?>[]|<?=$factory->getShortName()?> make($attributes = [])
*/
class <?=$factory->getShortName()?>FactoryBuilder extends \Illuminate\Database\Eloquent\FactoryBuilder {}
}
<?php endforeach; ?>
+12 -15
View File
@@ -1,16 +1,4 @@
<?= '<?php' ?> <?= '<?php' ?>
<?php
/**
* @var array $bindings
* @var string[] $methods
* @var string[] $configMethods
* @var Illuminate\Support\Collection $configValues
* @var array<string, array> $expectedArgumentSets
* @var array $expectedArguments
* @var string[] $userMethods
* @var string $userModel/
* */
?>
/* @noinspection ALL */ /* @noinspection ALL */
// @formatter:off // @formatter:off
@@ -47,6 +35,15 @@ namespace PHPSTORM_META {
])); ]));
<?php endforeach; ?> <?php endforeach; ?>
<?php if (count($factories)) : ?>
override(\factory(0), map([
'' => '@FactoryBuilder',
<?php foreach ($factories as $factory) : ?>
'<?= $factory->getName() ?>' => \<?= $factory->getName() ?>FactoryBuilder::class,
<?php endforeach; ?>
]));
<?php endif; ?>
override(\Illuminate\Foundation\Testing\Concerns\InteractsWithContainer::mock(0), map(["" => "@&\Mockery\MockInterface"])); override(\Illuminate\Foundation\Testing\Concerns\InteractsWithContainer::mock(0), map(["" => "@&\Mockery\MockInterface"]));
override(\Illuminate\Foundation\Testing\Concerns\InteractsWithContainer::partialMock(0), map(["" => "@&\Mockery\MockInterface"])); override(\Illuminate\Foundation\Testing\Concerns\InteractsWithContainer::partialMock(0), map(["" => "@&\Mockery\MockInterface"]));
override(\Illuminate\Foundation\Testing\Concerns\InteractsWithContainer::instance(0), type(1)); override(\Illuminate\Foundation\Testing\Concerns\InteractsWithContainer::instance(0), type(1));
@@ -82,15 +79,15 @@ namespace PHPSTORM_META {
override(\tap(0), type(0)); override(\tap(0), type(0));
override(\optional(0), type(0)); override(\optional(0), type(0));
<?php if ($expectedArgumentSets): ?> <?php if (isset($expectedArgumentSets)): ?>
<?php foreach ($expectedArgumentSets as $name => $argumentsList) : ?> <?php foreach ($expectedArgumentSets as $name => $argumentsList) : ?>
registerArgumentsSet('<?= $name ?>', <?php foreach ($argumentsList as $i => $arg) : ?><?php if ($i % 5 == 0) { registerArgumentsSet('<?= $name ?>', <?php foreach ($argumentsList as $i => $arg) : ?><?php if($i % 5 == 0) {
echo "\n"; echo "\n";
} ?><?= var_export($arg, true); ?>,<?php endforeach; ?>); } ?><?= var_export($arg, true); ?>,<?php endforeach; ?>);
<?php endforeach; ?> <?php endforeach; ?>
<?php endif ?> <?php endif ?>
<?php if ($expectedArguments) : ?> <?php if (isset($expectedArguments)) : ?>
<?php foreach ($expectedArguments as $arguments) : ?> <?php foreach ($expectedArguments as $arguments) : ?>
<?php <?php
$classes = isset($arguments['class']) ? (array) $arguments['class'] : [null]; $classes = isset($arguments['class']) ? (array) $arguments['class'] : [null];
+22 -55
View File
@@ -22,7 +22,6 @@ use Illuminate\Config\Repository as ConfigRepository;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Database\Query\Builder as QueryBuilder; use Illuminate\Database\Query\Builder as QueryBuilder;
use Illuminate\Support\Facades\Facade; use Illuminate\Support\Facades\Facade;
use Illuminate\Support\Traits\Macroable;
use ReflectionClass; use ReflectionClass;
use Throwable; use Throwable;
@@ -37,7 +36,6 @@ class Alias
protected $classType = 'class'; protected $classType = 'class';
protected $short; protected $short;
protected $namespace = '__root'; protected $namespace = '__root';
protected $parentClass;
protected $root = null; protected $root = null;
protected $classes = []; protected $classes = [];
protected $methods = []; protected $methods = [];
@@ -48,6 +46,8 @@ class Alias
protected $phpdoc = null; protected $phpdoc = null;
protected $classAliases = []; protected $classAliases = [];
protected $isMacroable = false;
/** @var ConfigRepository */ /** @var ConfigRepository */
protected $config; protected $config;
@@ -62,12 +62,13 @@ class Alias
* @param array $magicMethods * @param array $magicMethods
* @param array $interfaces * @param array $interfaces
*/ */
public function __construct($config, $alias, $facade, $magicMethods = [], $interfaces = []) public function __construct($config, $alias, $facade, $magicMethods = [], $interfaces = [], $isMacroable = false)
{ {
$this->alias = $alias; $this->alias = $alias;
$this->magicMethods = $magicMethods; $this->magicMethods = $magicMethods;
$this->interfaces = $interfaces; $this->interfaces = $interfaces;
$this->config = $config; $this->config = $config;
$this->isMacroable = $isMacroable;
// Make the class absolute // Make the class absolute
$facade = '\\' . ltrim($facade, '\\'); $facade = '\\' . ltrim($facade, '\\');
@@ -86,7 +87,6 @@ class Alias
$this->detectNamespace(); $this->detectNamespace();
$this->detectClassType(); $this->detectClassType();
$this->detectExtendsNamespace(); $this->detectExtendsNamespace();
$this->detectParentClass();
if (!empty($this->namespace)) { if (!empty($this->namespace)) {
try { try {
@@ -101,7 +101,7 @@ class Alias
} }
if ($facade === '\Illuminate\Database\Eloquent\Model') { if ($facade === '\Illuminate\Database\Eloquent\Model') {
$this->usedMethods = ['decrement' => true, 'increment' => true]; $this->usedMethods = ['decrement', 'increment'];
} }
} }
@@ -171,25 +171,6 @@ class Alias
return $this->extendsNamespace; return $this->extendsNamespace;
} }
/**
* Get the parent class of the class which this alias extends
*
* @return null|string
*/
public function getParentClass()
{
return $this->parentClass;
}
/**
* Check if this class should extend the parent class
*/
public function shouldExtendParentClass()
{
return $this->parentClass
&& !is_subclass_of($this->extends, Facade::class);
}
/** /**
* Get the Alias by which this class is called * Get the Alias by which this class is called
* *
@@ -248,17 +229,11 @@ class Alias
return; return;
} }
$reflection = new \ReflectionMethod($facade, 'fake');
if ($reflection->getNumberOfRequiredParameters() > 0) {
return;
}
$real = $facade::getFacadeRoot(); $real = $facade::getFacadeRoot();
try { try {
$facade::fake(); $facade::fake();
$fake = $facade::getFacadeRoot(); $fake = $facade::getFacadeRoot();
if ($fake !== $real) { if ($fake !== $real) {
$this->addClass(get_class($fake)); $this->addClass(get_class($fake));
} }
@@ -293,18 +268,6 @@ class Alias
} }
} }
/**
* Detect the parent class
*/
protected function detectParentClass()
{
$reflection = new ReflectionClass($this->root);
$parentClass = $reflection->getParentClass();
$this->parentClass = $parentClass ? '\\' . $parentClass->getName() : null;
}
/** /**
* Detect the class type * Detect the class type
*/ */
@@ -325,8 +288,9 @@ class Alias
/** /**
* Get the real root of a facade * Get the real root of a facade
* *
* @return bool|string
*/ */
protected function detectRoot(): void protected function detectRoot()
{ {
$facade = $this->facade; $facade = $this->facade;
@@ -381,10 +345,11 @@ class Alias
$method = new \ReflectionMethod($className, $name); $method = new \ReflectionMethod($className, $name);
$class = new ReflectionClass($className); $class = new ReflectionClass($className);
if (!isset($this->usedMethods[$magic])) { if (!in_array($magic, $this->usedMethods)) {
if ($class !== $this->root) { if ($class !== $this->root) {
$this->methods[] = new Method( $this->methods[] = new Method(
$method, $method,
$this->alias,
$class, $class,
$magic, $magic,
$this->interfaces, $this->interfaces,
@@ -393,7 +358,7 @@ class Alias
$this->getTemplateNames() $this->getTemplateNames()
); );
} }
$this->usedMethods[$magic] = true; $this->usedMethods[] = $magic;
} }
} }
} }
@@ -401,6 +366,7 @@ class Alias
/** /**
* Get the methods for one or multiple classes. * Get the methods for one or multiple classes.
* *
* @return string
*/ */
protected function detectMethods() protected function detectMethods()
{ {
@@ -410,12 +376,13 @@ class Alias
$methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC); $methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC);
if ($methods) { if ($methods) {
foreach ($methods as $method) { foreach ($methods as $method) {
if (!isset($this->usedMethods[$method->name])) { if (!in_array($method->name, $this->usedMethods)) {
// Only add the methods to the output when the root is not the same as the class. // Only add the methods to the output when the root is not the same as the class.
// And don't add the __*() methods // And don't add the __*() methods
if ($this->extends !== $class && substr($method->name, 0, 2) !== '__') { if ($this->extends !== $class && substr($method->name, 0, 2) !== '__') {
$this->methods[] = new Method( $this->methods[] = new Method(
$method, $method,
$this->alias,
$reflection, $reflection,
$method->name, $method->name,
$this->interfaces, $this->interfaces,
@@ -424,18 +391,18 @@ class Alias
$this->getTemplateNames(), $this->getTemplateNames(),
); );
} }
$this->usedMethods[$method->name] = true; $this->usedMethods[] = $method->name;
} }
} }
} }
// Check if the class is macroable // Check if the class is macroable
// (Eloquent\Builder is also macroable but doesn't use Macroable trait) // (Eloquent\Builder is also macroable but doesn't use Macroable trait)
if ($class === EloquentBuilder::class || in_array(Macroable::class, $reflection->getTraitNames())) { if ($this->isMacroable || $class === EloquentBuilder::class) {
$properties = $reflection->getStaticProperties(); $properties = $reflection->getStaticProperties();
$macros = isset($properties['macros']) ? $properties['macros'] : []; $macros = isset($properties['macros']) ? $properties['macros'] : [];
foreach ($macros as $macro_name => $macro_func) { foreach ($macros as $macro_name => $macro_func) {
if (!isset($this->usedMethods[$macro_name])) { if (!in_array($macro_name, $this->usedMethods)) {
try { try {
$method = $this->getMacroFunction($macro_func); $method = $this->getMacroFunction($macro_func);
} catch (Throwable $e) { } catch (Throwable $e) {
@@ -445,13 +412,14 @@ class Alias
// Add macros // Add macros
$this->methods[] = new Macro( $this->methods[] = new Macro(
$method, $method,
$this->alias,
$reflection, $reflection,
$macro_name, $macro_name,
$this->interfaces, $this->interfaces,
$this->classAliases, $this->classAliases,
$this->getReturnTypeNormalizers($reflection) $this->getReturnTypeNormalizers($reflection)
); );
$this->usedMethods[$macro_name] = true; $this->usedMethods[] = $macro_name;
} }
} }
} }
@@ -589,13 +557,12 @@ class Alias
*/ */
protected function removeDuplicateMethodsFromPhpDoc() protected function removeDuplicateMethodsFromPhpDoc()
{ {
$methodNames = []; $methodNames = array_map(function (Method $method) {
foreach ($this->getMethods() as $method) { return $method->getName();
$methodNames[$method->getName()] = true; }, $this->getMethods());
}
foreach ($this->phpdoc->getTags() as $tag) { foreach ($this->phpdoc->getTags() as $tag) {
if ($tag instanceof MethodTag && isset($methodNames[$tag->getMethodName()])) { if ($tag instanceof MethodTag && in_array($tag->getMethodName(), $methodNames)) {
$this->phpdoc->deleteTag($tag); $this->phpdoc->deleteTag($tag);
} }
} }
+8 -35
View File
@@ -11,6 +11,7 @@
namespace Barryvdh\LaravelIdeHelper\Console; namespace Barryvdh\LaravelIdeHelper\Console;
use Barryvdh\LaravelIdeHelper\Factories;
use Dotenv\Parser\Entry; use Dotenv\Parser\Entry;
use Dotenv\Parser\Parser; use Dotenv\Parser\Parser;
use Illuminate\Console\Command; use Illuminate\Console\Command;
@@ -107,6 +108,9 @@ class MetaCommand extends Command
*/ */
public function handle() public function handle()
{ {
// Needs to run before exception handler is registered
$factories = $this->config->get('ide-helper.include_factory_builders') ? Factories::all() : [];
$ourAutoloader = $this->registerClassAutoloadExceptions(); $ourAutoloader = $this->registerClassAutoloadExceptions();
$bindings = []; $bindings = [];
@@ -145,6 +149,7 @@ class MetaCommand extends Command
$content = $this->view->make('ide-helper::meta', [ $content = $this->view->make('ide-helper::meta', [
'bindings' => $bindings, 'bindings' => $bindings,
'methods' => $this->methods, 'methods' => $this->methods,
'factories' => $factories,
'configMethods' => $this->configMethods, 'configMethods' => $this->configMethods,
'configValues' => $configValues, 'configValues' => $configValues,
'expectedArgumentSets' => $this->getExpectedArgumentSets(), 'expectedArgumentSets' => $this->getExpectedArgumentSets(),
@@ -187,31 +192,10 @@ class MetaCommand extends Command
*/ */
protected function registerClassAutoloadExceptions(): callable protected function registerClassAutoloadExceptions(): callable
{ {
$aliases = array_filter([...$this->getAbstracts(), 'config'], fn ($abstract) => !str_contains($abstract, '\\')); $autoloader = function ($class) {
$autoloader = function ($class) use ($aliases) {
// ignore aliases as they're meant to be resolved elsewhere
if (in_array($class, $aliases, true)) {
return;
}
// Don't throw when class existence is being checked via class_exists(),
// interface_exists(), trait_exists(), or enum_exists(). These functions
// expect the autoloader to return gracefully when the class doesn't exist.
// Throwing here would break libraries that use class_exists() to check for
// optional dependencies (e.g. Doctrine ORM checking for removed classes).
$existsFunctions = ['class_exists', 'interface_exists', 'trait_exists', 'enum_exists'];
foreach (debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3) as $frame) {
if (isset($frame['function']) && in_array($frame['function'], $existsFunctions, true)) {
return;
}
}
throw new \ReflectionException("Class '$class' not found."); throw new \ReflectionException("Class '$class' not found.");
}; };
spl_autoload_register($autoloader); spl_autoload_register($autoloader);
return $autoloader; return $autoloader;
} }
@@ -249,12 +233,7 @@ class MetaCommand extends Command
], ],
[ [
'class' => ['\Illuminate\Support\Facades\Route', '\Illuminate\Support\Facades\Auth', 'Illuminate\Foundation\Auth\Access\Authorizable'], 'class' => ['\Illuminate\Support\Facades\Route', '\Illuminate\Support\Facades\Auth', 'Illuminate\Foundation\Auth\Access\Authorizable'],
'method' => ['can', 'cannot', 'cant'], 'method' => ['can', 'cannot'],
'argumentSet' => 'auth',
],
[
'class' => ['Illuminate\Contracts\Auth\Access\Authorizable'],
'method' => ['can'],
'argumentSet' => 'auth', 'argumentSet' => 'auth',
], ],
[ [
@@ -329,13 +308,7 @@ class MetaCommand extends Command
{ {
if (!isset($this->templateCache[$name])) { if (!isset($this->templateCache[$name])) {
$file = __DIR__ . '/../../php-templates/' . basename($name) . '.php'; $file = __DIR__ . '/../../php-templates/' . basename($name) . '.php';
try { $value = $this->files->requireOnce($file) ?: [];
$value = $this->files->requireOnce($file) ?: [];
} catch (\Throwable $e) {
$value = [];
$this->warn('Cannot load template for ' . $name . ': ' . $e->getMessage());
}
if (!$value instanceof Collection) { if (!$value instanceof Collection) {
$value = collect($value); $value = collect($value);
} }
+51 -189
View File
@@ -114,7 +114,6 @@ class ModelsCommand extends Command
protected $write_model_magic_where; protected $write_model_magic_where;
protected $write_model_relation_count_properties; protected $write_model_relation_count_properties;
protected $write_model_relation_exists_properties;
protected $properties = []; protected $properties = [];
protected $methods = []; protected $methods = [];
protected $write = false; protected $write = false;
@@ -123,14 +122,6 @@ class ModelsCommand extends Command
protected $reset; protected $reset;
protected $phpstorm_noinspections; protected $phpstorm_noinspections;
protected $write_model_external_builder_methods; protected $write_model_external_builder_methods;
/**
* @var array<string, \SplFileObject>
*/
protected $fileCache = [];
/**
* @var array<string, Context>
*/
protected $contextCache = [];
/** /**
* @var array<string, true> * @var array<string, true>
*/ */
@@ -182,8 +173,6 @@ class ModelsCommand extends Command
$this->write_model_external_builder_methods = $this->laravel['config']->get('ide-helper.write_model_external_builder_methods', true); $this->write_model_external_builder_methods = $this->laravel['config']->get('ide-helper.write_model_external_builder_methods', true);
$this->write_model_relation_count_properties = $this->write_model_relation_count_properties =
$this->laravel['config']->get('ide-helper.write_model_relation_count_properties', true); $this->laravel['config']->get('ide-helper.write_model_relation_count_properties', true);
$this->write_model_relation_exists_properties =
$this->laravel['config']->get('ide-helper.write_model_relation_exists_properties', false);
$this->write = $this->write_mixin ? true : $this->write; $this->write = $this->write_mixin ? true : $this->write;
//If filename is default and Write is not specified, ask what to do //If filename is default and Write is not specified, ask what to do
@@ -421,6 +410,9 @@ class ModelsCommand extends Command
$params = []; $params = [];
switch ($type) { switch ($type) {
case 'encrypted':
$realType = 'mixed';
break;
case 'boolean': case 'boolean':
case 'bool': case 'bool':
$realType = 'bool'; $realType = 'bool';
@@ -428,7 +420,6 @@ class ModelsCommand extends Command
case 'decimal': case 'decimal':
$realType = 'numeric'; $realType = 'numeric';
break; break;
case 'encrypted':
case 'string': case 'string':
case 'hashed': case 'hashed':
$realType = 'string'; $realType = 'string';
@@ -462,7 +453,7 @@ class ModelsCommand extends Command
$realType = '\Illuminate\Support\Collection<array-key, mixed>'; $realType = '\Illuminate\Support\Collection<array-key, mixed>';
break; break;
case AsArrayObject::class: case AsArrayObject::class:
$realType = '\Illuminate\Database\Eloquent\Casts\ArrayObject<array-key, mixed>'; $realType = '\ArrayObject<array-key, mixed>';
break; break;
default: default:
// In case of an optional custom cast parameter , only evaluate // In case of an optional custom cast parameter , only evaluate
@@ -484,11 +475,7 @@ class ModelsCommand extends Command
} }
if (Str::startsWith($type, AsCollection::class)) { if (Str::startsWith($type, AsCollection::class)) {
$realType = $this->getTypeInModel($model, $params[0] ?? null) ?: '\Illuminate\Support\Collection'; $realType = $this->getTypeInModel($model, $params[0] ?? null) ?? '\Illuminate\Support\Collection';
$relatedModel = $this->getTypeInModel($model, $params[1] ?? null);
if ($relatedModel) {
$realType = $this->getCollectionTypeHint($realType, $relatedModel);
}
} }
if (Str::startsWith($type, AsEnumCollection::class)) { if (Str::startsWith($type, AsEnumCollection::class)) {
@@ -534,7 +521,7 @@ class ModelsCommand extends Command
} }
if ($isNullable) { if ($isNullable) {
$type = $this->wrapIntersectionType($type) . '|null'; $type .= '|null';
} else { } else {
$type = str_replace($nullString, '', $type); $type = str_replace($nullString, '', $type);
} }
@@ -542,22 +529,6 @@ class ModelsCommand extends Command
return $type; return $type;
} }
/**
* Wraps a bare intersection type in parentheses for correct DNF syntax.
*
* For example, `A&B` becomes `(A&B)` so that adding `|null` produces
* `(A&B)|null` instead of the ambiguous `A&B|null`.
* Types that are already parenthesized or contain union types are returned as-is.
*/
protected function wrapIntersectionType(string $type): string
{
if (str_contains($type, '&') && !str_contains($type, '|') && $type[0] !== '(') {
return '(' . $type . ')';
}
return $type;
}
/** /**
* Returns the override type for the give type. * Returns the override type for the give type.
* *
@@ -608,8 +579,6 @@ class ModelsCommand extends Command
'float', 'real', 'float4', 'float', 'real', 'float4',
'double', 'float8' => 'float', 'double', 'float8' => 'float',
'decimal', 'numeric' => 'numeric',
default => 'string', default => 'string',
}; };
} }
@@ -659,10 +628,6 @@ class ModelsCommand extends Command
) )
); );
}); });
// https://github.com/barryvdh/laravel-ide-helper/issues/1664
$reflections = array_filter($reflections, function (\ReflectionMethod $methodReflection) {
return !($methodReflection->getName() === 'getUseFactoryAttribute');
});
sort($reflections); sort($reflections);
foreach ($reflections as $reflection) { foreach ($reflections as $reflection) {
$type = $this->getReturnTypeFromReflection($reflection); $type = $this->getReturnTypeFromReflection($reflection);
@@ -700,11 +665,9 @@ class ModelsCommand extends Command
$comment = $this->getCommentFromDocBlock($reflection); $comment = $this->getCommentFromDocBlock($reflection);
$this->setProperty($name, null, null, true, $comment); $this->setProperty($name, null, null, true, $comment);
} }
} elseif (!empty($reflection->getAttributes('Illuminate\Database\Eloquent\Attributes\Scope')) || (Str::startsWith($method, 'scope') && $method !== 'scopeQuery' && $method !== 'scope' && $method !== 'scopes')) { } elseif (Str::startsWith($method, 'scope') && $method !== 'scopeQuery' && $method !== 'scope' && $method !== 'scopes') {
$scopeUsingAttribute = !empty($reflection->getAttributes('Illuminate\Database\Eloquent\Attributes\Scope'));
//Magic scope<name>Attribute //Magic scope<name>Attribute
$name = $scopeUsingAttribute ? $method : Str::camel(substr($method, 5)); $name = Str::camel(substr($method, 5));
if (!empty($name)) { if (!empty($name)) {
$comment = $this->getCommentFromDocBlock($reflection); $comment = $this->getCommentFromDocBlock($reflection);
$args = $this->getParameters($reflection); $args = $this->getParameters($reflection);
@@ -720,16 +683,13 @@ class ModelsCommand extends Command
); );
$this->setMethod($name, $builder . '<static>|' . $modelName, $args, $comment); $this->setMethod($name, $builder . '<static>|' . $modelName, $args, $comment);
} }
} elseif (in_array($method, ['query', 'newQuery', 'newModelQuery']) } elseif (in_array($method, ['query', 'newQuery', 'newModelQuery'])) {
) { $builder = $this->getClassNameInDestinationFile($model, get_class($model->newModelQuery()));
if ($this->laravel['config']->get('ide-helper.write_query_methods', true)) {
$builder = $this->getClassNameInDestinationFile($model, get_class($model->newModelQuery()));
$this->setMethod( $this->setMethod(
$method, $method,
$builder . '<static>|' . $this->getClassNameInDestinationFile($model, get_class($model)) $builder . '<static>|' . $this->getClassNameInDestinationFile($model, get_class($model))
); );
}
if ($this->write_model_external_builder_methods) { if ($this->write_model_external_builder_methods) {
$this->writeModelExternalBuilderMethods($model); $this->writeModelExternalBuilderMethods($model);
@@ -748,19 +708,14 @@ class ModelsCommand extends Command
$type = (string)$this->getReturnTypeFromDocBlock($reflection); $type = (string)$this->getReturnTypeFromDocBlock($reflection);
} }
$fileName = $reflection->getFileName(); $file = new \SplFileObject($reflection->getFileName());
if (!isset($this->fileCache[$fileName])) {
$this->fileCache[$fileName] = new \SplFileObject($fileName);
}
$file = $this->fileCache[$fileName];
$file->seek($reflection->getStartLine() - 1); $file->seek($reflection->getStartLine() - 1);
$lines = []; $code = '';
while ($file->key() < $reflection->getEndLine()) { while ($file->key() < $reflection->getEndLine()) {
$lines[] = $file->current(); $code .= $file->current();
$file->next(); $file->next();
} }
$code = implode('', $lines);
$code = trim(preg_replace('/\s\s+/', '', $code)); $code = trim(preg_replace('/\s\s+/', '', $code));
$begin = strpos($code, 'function('); $begin = strpos($code, 'function(');
$code = substr($code, $begin, strrpos($code, '}') - $begin + 1); $code = substr($code, $begin, strrpos($code, '}') - $begin + 1);
@@ -857,15 +812,6 @@ class ModelsCommand extends Command
// What kind of comments should be added to the relation count here? // What kind of comments should be added to the relation count here?
); );
} }
if ($this->write_model_relation_exists_properties) {
$this->setProperty(
Str::snake($method) . '_exists',
'bool|null',
true,
false
// What kind of comments should be added to the relation count here?
);
}
} elseif ( } elseif (
$relationReturnType === 'morphTo' || $relationReturnType === 'morphTo' ||
( (
@@ -873,16 +819,10 @@ class ModelsCommand extends Command
$relation === 'morphTo' $relation === 'morphTo'
) )
) { ) {
$matches = [];
$returnType = $this->getReturnTypeFromDocBlock($reflection);
if ($returnType !== null) {
preg_match('/MorphTo<(?:contravariant\s+)?(.+?)(?:,|>)/i', $returnType, $matches);
}
// Model isn't specified because relation is polymorphic // Model isn't specified because relation is polymorphic
$this->setProperty( $this->setProperty(
$method, $method,
$matches[1] ?? $this->getClassNameInDestinationFile($model, Model::class) . '|\Eloquent', $this->getClassNameInDestinationFile($model, Model::class) . '|\Eloquent',
true, true,
null, null,
$comment, $comment,
@@ -921,6 +861,7 @@ class ModelsCommand extends Command
if (in_array($relation, ['hasOne', 'hasOneThrough', 'morphOne'], true)) { if (in_array($relation, ['hasOne', 'hasOneThrough', 'morphOne'], true)) {
$defaultProp = $reflectionObj->getProperty('withDefault'); $defaultProp = $reflectionObj->getProperty('withDefault');
$defaultProp->setAccessible(true);
return !$defaultProp->getValue($relationObj); return !$defaultProp->getValue($relationObj);
} }
@@ -930,6 +871,7 @@ class ModelsCommand extends Command
} }
$fkProp = $reflectionObj->getProperty('foreignKey'); $fkProp = $reflectionObj->getProperty('foreignKey');
$fkProp->setAccessible(true);
$enforceNullableRelation = $this->laravel['config']->get('ide-helper.enforce_nullable_relationships', true); $enforceNullableRelation = $this->laravel['config']->get('ide-helper.enforce_nullable_relationships', true);
@@ -943,31 +885,9 @@ class ModelsCommand extends Command
} }
} }
if ($this->relatedModelUsesSoftDeletes($relationObj)) {
return true;
}
return false; return false;
} }
/**
* Check if the related model uses the SoftDeletes trait
*
* @param Relation $relationObj
*
* @return bool
*/
protected function relatedModelUsesSoftDeletes(Relation $relationObj): bool
{
if (!$this->laravel['config']->get('ide-helper.soft_deletes_force_nullable', true)) {
return false;
}
$relatedModel = $relationObj->getRelated();
return in_array('Illuminate\\Database\\Eloquent\\SoftDeletes', class_uses_recursive($relatedModel));
}
/** /**
* Check if the morphTo relation is nullable * Check if the morphTo relation is nullable
* *
@@ -984,6 +904,7 @@ class ModelsCommand extends Command
} }
$fkProp = $reflectionObj->getProperty('foreignKey'); $fkProp = $reflectionObj->getProperty('foreignKey');
$fkProp->setAccessible(true);
foreach (Arr::wrap($fkProp->getValue($relationObj)) as $foreignKey) { foreach (Arr::wrap($fkProp->getValue($relationObj)) as $foreignKey) {
if (isset($this->nullableColumns[$foreignKey])) { if (isset($this->nullableColumns[$foreignKey])) {
@@ -1014,7 +935,7 @@ class ModelsCommand extends Command
if ($type !== null) { if ($type !== null) {
$newType = $this->getTypeOverride($type); $newType = $this->getTypeOverride($type);
if ($nullable) { if ($nullable) {
$newType = $this->wrapIntersectionType($newType) . '|null'; $newType .= '|null';
} }
$this->properties[$name]['type'] = $newType; $this->properties[$name]['type'] = $newType;
} }
@@ -1165,7 +1086,6 @@ class ModelsCommand extends Command
$serializer = new DocBlockSerializer(); $serializer = new DocBlockSerializer();
$docComment = $serializer->getDocComment($phpdoc); $docComment = $serializer->getDocComment($phpdoc);
$mixinClassName = null;
if ($this->write_mixin) { if ($this->write_mixin) {
$phpdocMixin = new DocBlock($reflection, new Context($namespace)); $phpdocMixin = new DocBlock($reflection, new Context($namespace));
@@ -1202,14 +1122,6 @@ class ModelsCommand extends Command
$replace = "{$modelDocComment}\n"; $replace = "{$modelDocComment}\n";
$pos = strpos($contents, "final class {$classname}") ?: strpos($contents, "class {$classname}"); $pos = strpos($contents, "final class {$classname}") ?: strpos($contents, "class {$classname}");
if ($pos !== false) { if ($pos !== false) {
// If PHP 8 attributes (e.g. #[ObservedBy(...)]) precede the class
// declaration, insert the docblock before the first attribute so that
// the resulting order is: docblock → attributes → class.
$before = substr($contents, 0, $pos);
if (preg_match('/((?:#\[.+?\]\s*)+)$/s', $before, $matches)) {
$pos -= strlen($matches[1]);
$replace = "{$modelDocComment}\n";
}
$contents = substr_replace($contents, $replace, $pos, 0); $contents = substr_replace($contents, $replace, $pos, 0);
} }
} }
@@ -1262,7 +1174,7 @@ class ModelsCommand extends Command
$default = '[]'; $default = '[]';
} elseif (is_null($default)) { } elseif (is_null($default)) {
$default = 'null'; $default = 'null';
} elseif (is_int($default) || is_float($default)) { } elseif (is_int($default)) {
//$default = $default; //$default = $default;
} elseif ($default instanceof \UnitEnum) { } elseif ($default instanceof \UnitEnum) {
$default = '\\' . get_class($default) . '::' . $default->name; $default = '\\' . get_class($default) . '::' . $default->name;
@@ -1315,18 +1227,13 @@ class ModelsCommand extends Command
} }
} }
protected ?array $cachedRelationTypes = null;
protected ?array $cachedRelationReturnTypes = null;
/** /**
* Returns the available relation types * Returns the available relation types
*/ */
protected function getRelationTypes(): array protected function getRelationTypes(): array
{ {
return $this->cachedRelationTypes ??= array_merge( $configuredRelations = $this->laravel['config']->get('ide-helper.additional_relation_types', []);
self::RELATION_TYPES, return array_merge(self::RELATION_TYPES, $configuredRelations);
$this->laravel['config']->get('ide-helper.additional_relation_types', [])
);
} }
/** /**
@@ -1334,7 +1241,7 @@ class ModelsCommand extends Command
*/ */
protected function getRelationReturnTypes(): array protected function getRelationReturnTypes(): array
{ {
return $this->cachedRelationReturnTypes ??= $this->laravel['config']->get('ide-helper.additional_relation_return_types', []); return $this->laravel['config']->get('ide-helper.additional_relation_return_types', []);
} }
/** /**
@@ -1350,6 +1257,9 @@ class ModelsCommand extends Command
*/ */
protected function getAttributeTypes(Model $model, \ReflectionMethod $reflectionMethod): Collection protected function getAttributeTypes(Model $model, \ReflectionMethod $reflectionMethod): Collection
{ {
// Private/protected ReflectionMethods require setAccessible prior to PHP 8.1
$reflectionMethod->setAccessible(true);
/** @var Attribute $attribute */ /** @var Attribute $attribute */
$attribute = $reflectionMethod->invoke($model); $attribute = $reflectionMethod->invoke($model);
@@ -1409,7 +1319,11 @@ class ModelsCommand extends Command
*/ */
protected function getCommentFromDocBlock(\ReflectionMethod $reflection) protected function getCommentFromDocBlock(\ReflectionMethod $reflection)
{ {
$context = $this->getDocBlockContext($reflection); $phpDocContext = (new ContextFactory())->createFromReflector($reflection);
$context = new Context(
$phpDocContext->getNamespace(),
$phpDocContext->getNamespaceAliases()
);
$comment = ''; $comment = '';
$phpdoc = new DocBlock($reflection, $context); $phpdoc = new DocBlock($reflection, $context);
@@ -1430,7 +1344,11 @@ class ModelsCommand extends Command
*/ */
protected function getReturnTypeFromDocBlock(\ReflectionMethod $reflection, ?\Reflector $reflectorForContext = null) protected function getReturnTypeFromDocBlock(\ReflectionMethod $reflection, ?\Reflector $reflectorForContext = null)
{ {
$context = $this->getDocBlockContext($reflectorForContext ?? $reflection); $phpDocContext = (new ContextFactory())->createFromReflector($reflectorForContext ?? $reflection);
$context = new Context(
$phpDocContext->getNamespace(),
$phpDocContext->getNamespaceAliases()
);
$type = null; $type = null;
$phpdoc = new DocBlock($reflection, $context); $phpdoc = new DocBlock($reflection, $context);
@@ -1448,31 +1366,6 @@ class ModelsCommand extends Command
return $type; return $type;
} }
protected function getDocBlockContext(\Reflector $reflector): Context
{
if ($reflector instanceof \ReflectionMethod) {
$key = $reflector->getDeclaringClass()->getName();
} elseif ($reflector instanceof ReflectionClass) {
$key = $reflector->getName();
} else {
$phpDocContext = (new ContextFactory())->createFromReflector($reflector);
return new Context(
$phpDocContext->getNamespace(),
$phpDocContext->getNamespaceAliases()
);
}
if (!isset($this->contextCache[$key])) {
$phpDocContext = (new ContextFactory())->createFromReflector($reflector);
$this->contextCache[$key] = new Context(
$phpDocContext->getNamespace(),
$phpDocContext->getNamespaceAliases()
);
}
return $this->contextCache[$key];
}
protected function getReturnTypeFromReflection(\ReflectionMethod $reflection): ?string protected function getReturnTypeFromReflection(\ReflectionMethod $reflection): ?string
{ {
$returnType = $reflection->getReturnType(); $returnType = $reflection->getReturnType();
@@ -1502,7 +1395,7 @@ class ModelsCommand extends Command
if (in_array('Illuminate\\Database\\Eloquent\\SoftDeletes', $traits)) { if (in_array('Illuminate\\Database\\Eloquent\\SoftDeletes', $traits)) {
$modelName = $this->getClassNameInDestinationFile($model, get_class($model)); $modelName = $this->getClassNameInDestinationFile($model, get_class($model));
$builder = $this->getClassNameInDestinationFile($model, \Illuminate\Database\Eloquent\Builder::class); $builder = $this->getClassNameInDestinationFile($model, \Illuminate\Database\Eloquent\Builder::class);
$this->setMethod('withTrashed', $builder . '<static>|' . $modelName, ['bool $withTrashed = true']); $this->setMethod('withTrashed', $builder . '<static>|' . $modelName, []);
$this->setMethod('withoutTrashed', $builder . '<static>|' . $modelName, []); $this->setMethod('withoutTrashed', $builder . '<static>|' . $modelName, []);
$this->setMethod('onlyTrashed', $builder . '<static>|' . $modelName, []); $this->setMethod('onlyTrashed', $builder . '<static>|' . $modelName, []);
} }
@@ -1678,10 +1571,9 @@ class ModelsCommand extends Command
*/ */
protected function getUsedClassNames(ReflectionClass $reflection): array protected function getUsedClassNames(ReflectionClass $reflection): array
{ {
$context = $this->getDocBlockContext($reflection);
$namespaceAliases = array_flip(array_map(function ($alias) { $namespaceAliases = array_flip(array_map(function ($alias) {
return ltrim($alias, '\\'); return ltrim($alias, '\\');
}, $context->getNamespaceAliases())); }, (new ContextFactory())->createFromReflector($reflection)->getNamespaceAliases()));
$namespaceAliases[$reflection->getName()] = $reflection->getShortName(); $namespaceAliases[$reflection->getName()] = $reflection->getShortName();
return $namespaceAliases; return $namespaceAliases;
@@ -1725,8 +1617,7 @@ class ModelsCommand extends Command
$type = implode('|', $types); $type = implode('|', $types);
if ($paramType->allowsNull()) { if ($paramType->allowsNull()) {
// Use ?Type syntax only for single named types, not for intersection types if (count($types) == 1) {
if (count($types) == 1 && !str_starts_with($type, '(')) {
$type = '?' . $type; $type = '?' . $type;
} else { } else {
$type .= '|null'; $type .= '|null';
@@ -1744,7 +1635,7 @@ class ModelsCommand extends Command
preg_match( preg_match(
'/@param ((?:(?:[\w?|\\\\<>])+(?:\[])?)+)/', '/@param ((?:(?:[\w?|\\\\<>])+(?:\[])?)+)/',
$docComment, $docComment ?? '',
$matches $matches
); );
$type = $matches[1] ?? ''; $type = $matches[1] ?? '';
@@ -1799,53 +1690,24 @@ class ModelsCommand extends Command
return $type; return $type;
} }
protected function extractReflectionTypes(ReflectionType $reflection_type): array protected function extractReflectionTypes(ReflectionType $reflection_type)
{ {
if ($reflection_type instanceof ReflectionNamedType) { if ($reflection_type instanceof ReflectionNamedType) {
return [$this->getReflectionNamedType($reflection_type)]; $types[] = $this->getReflectionNamedType($reflection_type);
} } else {
$types = [];
if ($reflection_type instanceof \ReflectionIntersectionType) { foreach ($reflection_type->getTypes() as $named_type) {
return [$this->formatIntersectionType($reflection_type)]; if ($named_type->getName() === 'null') {
}
if ($reflection_type instanceof \ReflectionUnionType) {
return $this->extractUnionTypes($reflection_type);
}
// Unknown type - return empty array as fallback
return [];
}
protected function extractUnionTypes(\ReflectionUnionType $union_type): array
{
$types = [];
foreach ($union_type->getTypes() as $inner_type) {
if ($inner_type instanceof ReflectionNamedType) {
if ($inner_type->getName() === 'null') {
continue; continue;
} }
$types[] = $this->getReflectionNamedType($inner_type);
} elseif ($inner_type instanceof \ReflectionIntersectionType) { $types[] = $this->getReflectionNamedType($named_type);
$types[] = $this->formatIntersectionType($inner_type);
} }
// ReflectionUnionType cannot be nested per PHP's DNF rules
} }
return $types; return $types;
} }
protected function formatIntersectionType(\ReflectionIntersectionType $intersection_type): string
{
$parts = [];
foreach ($intersection_type->getTypes() as $type) {
$parts[] = $this->getReflectionNamedType($type);
}
return '(' . implode('&', $parts) . ')';
}
protected function getReflectionNamedType(ReflectionNamedType $paramType): string protected function getReflectionNamedType(ReflectionNamedType $paramType): string
{ {
$parameterName = $paramType->getName(); $parameterName = $paramType->getName();
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace Barryvdh\LaravelIdeHelper;
use Exception;
use Illuminate\Database\Eloquent\Factory;
use ReflectionClass;
class Factories
{
public static function all()
{
$factories = [];
if (static::isLaravelSevenOrLower()) {
$factory = app(Factory::class);
$definitions = (new ReflectionClass(Factory::class))->getProperty('definitions');
$definitions->setAccessible(true);
foreach ($definitions->getValue($factory) as $factory_target => $config) {
try {
$factories[] = new ReflectionClass($factory_target);
} catch (Exception $exception) {
}
}
}
return $factories;
}
protected static function isLaravelSevenOrLower()
{
return class_exists('Illuminate\Database\Eloquent\Factory');
}
}
+20 -30
View File
@@ -35,6 +35,7 @@ class Generator
protected $magic = []; protected $magic = [];
protected $interfaces = []; protected $interfaces = [];
protected $helpers; protected $helpers;
protected array $macroableTraits = [];
/** /**
* @param \Illuminate\Config\Repository $config * @param \Illuminate\Config\Repository $config
@@ -57,13 +58,9 @@ class Generator
// Find the drivers to add to the extra/interfaces // Find the drivers to add to the extra/interfaces
$this->detectDrivers(); $this->detectDrivers();
$this->extra = array_merge($this->extra, $this->config->get('ide-helper.extra', [])); $this->extra = array_merge($this->extra, $this->config->get('ide-helper.extra'), []);
$this->magic = array_merge($this->magic, $this->config->get('ide-helper.magic', [])); $this->magic = array_merge($this->magic, $this->config->get('ide-helper.magic'), []);
$this->interfaces = array_merge($this->interfaces, $this->config->get('ide-helper.interfaces', [])); $this->interfaces = array_merge($this->interfaces, $this->config->get('ide-helper.interfaces'), []);
Macro::setDefaultReturnTypes($this->config->get('ide-helper.macro_default_return_types', [
\Illuminate\Http\Client\Factory::class => \Illuminate\Http\Client\PendingRequest::class,
]));
// Make all interface classes absolute // Make all interface classes absolute
foreach ($this->interfaces as &$interface) { foreach ($this->interfaces as &$interface) {
$interface = '\\' . ltrim($interface, '\\'); $interface = '\\' . ltrim($interface, '\\');
@@ -74,7 +71,7 @@ class Generator
/** /**
* Generate the helper file contents; * Generate the helper file contents;
* *
* @return string * @return string;
*/ */
public function generate() public function generate()
{ {
@@ -83,8 +80,9 @@ class Generator
->with('namespaces_by_extends_ns', $this->getAliasesByExtendsNamespace()) ->with('namespaces_by_extends_ns', $this->getAliasesByExtendsNamespace())
->with('namespaces_by_alias_ns', $this->getAliasesByAliasNamespace()) ->with('namespaces_by_alias_ns', $this->getAliasesByAliasNamespace())
->with('real_time_facades', $this->getRealTimeFacades()) ->with('real_time_facades', $this->getRealTimeFacades())
->with('helpers', $this->detectHelpers()) ->with('helpers', $this->helpers)
->with('include_fluent', $this->config->get('ide-helper.include_fluent', true)) ->with('include_fluent', $this->config->get('ide-helper.include_fluent', true))
->with('factories', $this->config->get('ide-helper.include_factory_builders') ? Factories::all() : [])
->render(); ->render();
} }
@@ -114,24 +112,6 @@ class Generator
->render(); ->render();
} }
protected function detectHelpers()
{
$helpers = $this->helpers;
$replacements = [
'($guard is null ? \Illuminate\Contracts\Auth\Factory : \Illuminate\Contracts\Auth\StatefulGuard)' => '\\Auth',
];
foreach ($replacements as $search => $replace) {
$helpers = Str::replace(
"@return {$search}",
"@return $replace|$search",
$helpers
);
}
return $helpers;
}
protected function detectDrivers() protected function detectDrivers()
{ {
$defaultUserModel = config('auth.providers.users.model', config('auth.model', 'App\User')); $defaultUserModel = config('auth.providers.users.model', config('auth.model', 'App\User'));
@@ -362,7 +342,7 @@ class Generator
continue; continue;
} }
$aliases[] = new Alias($this->config, $class, $class, [], $this->interfaces); $aliases[] = new Alias($this->config, $class, $class, [], $this->interfaces, true);
} }
} }
@@ -384,8 +364,18 @@ class Generator
->filter(function ($class) { ->filter(function ($class) {
$traits = class_uses_recursive($class); $traits = class_uses_recursive($class);
// Filter only classes with the macroable trait if (isset($traits[Macroable::class])) {
return isset($traits[Macroable::class]); return true;
}
// Filter only classes with a macroable trait
foreach ($this->config->get('ide-helper.macroable_traits', []) as $trait) {
if (isset($traits[$trait])) {
return true;
}
}
return false;
}) })
->filter(function ($class) use ($aliases) { ->filter(function ($class) use ($aliases) {
$class = Str::start($class, '\\'); $class = Str::start($class, '\\');
+16 -46
View File
@@ -5,16 +5,20 @@ namespace Barryvdh\LaravelIdeHelper;
use Barryvdh\Reflection\DocBlock; use Barryvdh\Reflection\DocBlock;
use Barryvdh\Reflection\DocBlock\Tag; use Barryvdh\Reflection\DocBlock\Tag;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Http\Client\PendingRequest;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
class Macro extends Method class Macro extends Method
{ {
protected static $macroDefaults = []; protected $macroDefaults = [
\Illuminate\Http\Client\Factory::class => PendingRequest::class,
];
/** /**
* Macro constructor. * Macro constructor.
* *
* @param \ReflectionFunctionAbstract $method * @param \ReflectionFunctionAbstract $method
* @param string $alias
* @param \ReflectionClass $class * @param \ReflectionClass $class
* @param null $methodName * @param null $methodName
* @param array $interfaces * @param array $interfaces
@@ -23,19 +27,16 @@ class Macro extends Method
*/ */
public function __construct( public function __construct(
$method, $method,
$alias,
$class, $class,
$methodName = null, $methodName = null,
$interfaces = [], $interfaces = [],
$classAliases = [], $classAliases = [],
$returnTypeNormalizers = [] $returnTypeNormalizers = []
) { ) {
parent::__construct($method, $class, $methodName, $interfaces, $classAliases, $returnTypeNormalizers); parent::__construct($method, $alias, $class, $methodName, $interfaces, $classAliases, $returnTypeNormalizers);
} }
public static function setDefaultReturnTypes(array $map = [])
{
static::$macroDefaults = array_merge(static::$macroDefaults, $map);
}
/** /**
* @param \ReflectionFunctionAbstract $method * @param \ReflectionFunctionAbstract $method
*/ */
@@ -73,8 +74,8 @@ class Macro extends Method
$type = $this->concatReflectionTypes($return); $type = $this->concatReflectionTypes($return);
/** @psalm-suppress UndefinedClass */
if (!$return instanceof \ReflectionUnionType) { if (!$return instanceof \ReflectionUnionType) {
/** @phpstan-ignore method.notFound */
$type .= $this->root === "\\{$builder}" && $return->getName() === $builder ? '|static' : ''; $type .= $this->root === "\\{$builder}" && $return->getName() === $builder ? '|static' : '';
$type .= $return->allowsNull() ? '|null' : ''; $type .= $return->allowsNull() ? '|null' : '';
} }
@@ -83,56 +84,25 @@ class Macro extends Method
} }
$class = ltrim($this->declaringClassName, '\\'); $class = ltrim($this->declaringClassName, '\\');
if (!$this->phpdoc->hasTag('return') && isset(static::$macroDefaults[$class])) { if (!$this->phpdoc->hasTag('return') && isset($this->macroDefaults[$class])) {
$type = static::$macroDefaults[$class]; $type = $this->macroDefaults[$class];
$this->phpdoc->appendTag(Tag::createInstance("@return {$type}")); $this->phpdoc->appendTag(Tag::createInstance("@return {$type}"));
} }
} }
protected function concatReflectionTypes(?\ReflectionType $type): string protected function concatReflectionTypes(?\ReflectionType $type): string
{ {
if ($type instanceof \ReflectionNamedType) { /** @psalm-suppress UndefinedClass */
return $type->getName(); $returnTypes = $type instanceof \ReflectionUnionType
} ? $type->getTypes()
: [$type];
if ($type instanceof \ReflectionIntersectionType) { return Collection::make($returnTypes)
return $this->formatIntersectionType($type);
}
if ($type instanceof \ReflectionUnionType) {
return $this->formatUnionType($type);
}
// Unknown or null type
return '';
}
protected function formatUnionType(\ReflectionUnionType $type): string
{
return Collection::make($type->getTypes())
->map(function (\ReflectionType $inner) {
if ($inner instanceof \ReflectionNamedType) {
return $inner->getName();
}
if ($inner instanceof \ReflectionIntersectionType) {
return $this->formatIntersectionType($inner);
}
// ReflectionUnionType cannot be nested per PHP's DNF rules
return null;
})
->filter() ->filter()
->map->getName()
->implode('|'); ->implode('|');
} }
protected function formatIntersectionType(\ReflectionIntersectionType $type): string
{
$parts = Collection::make($type->getTypes())
->map(fn (\ReflectionNamedType $t) => $t->getName())
->toArray();
return '(' . implode('&', $parts) . ')';
}
protected function addLocationToPhpDoc() protected function addLocationToPhpDoc()
{ {
if ($this->method->name === '__invoke') { if ($this->method->name === '__invoke') {
+4 -3
View File
@@ -44,6 +44,7 @@ class Method
/** /**
* @param \ReflectionMethod|\ReflectionFunctionAbstract $method * @param \ReflectionMethod|\ReflectionFunctionAbstract $method
* @param string $alias
* @param \ReflectionClass $class * @param \ReflectionClass $class
* @param string|null $methodName * @param string|null $methodName
* @param array $interfaces * @param array $interfaces
@@ -51,7 +52,7 @@ class Method
* @param array $returnTypeNormalizers * @param array $returnTypeNormalizers
* @param string[] $templateNames * @param string[] $templateNames
*/ */
public function __construct($method, $class, $methodName = null, $interfaces = [], array $classAliases = [], array $returnTypeNormalizers = [], array $templateNames = []) public function __construct($method, $alias, $class, $methodName = null, $interfaces = [], array $classAliases = [], array $returnTypeNormalizers = [], array $templateNames = [])
{ {
$this->method = $method; $this->method = $method;
$this->interfaces = $interfaces; $this->interfaces = $interfaces;
@@ -177,7 +178,7 @@ class Method
/** /**
* Get the parameters for this method * Get the parameters for this method
* *
* @param bool $implode Whether to implode the array or not * @param bool $implode Wether to implode the array or not
* @return string * @return string
*/ */
public function getParams($implode = true) public function getParams($implode = true)
@@ -207,7 +208,7 @@ class Method
/** /**
* Get the parameters for this method including default values * Get the parameters for this method including default values
* *
* @param bool $implode Whether to implode the array or not * @param bool $implode Wether to implode the array or not
* @return string * @return string
*/ */
public function getParamsWithDefault($implode = true) public function getParamsWithDefault($implode = true)
+1 -66
View File
@@ -7,9 +7,7 @@ namespace Barryvdh\LaravelIdeHelper\Tests;
use Barryvdh\LaravelIdeHelper\Alias; use Barryvdh\LaravelIdeHelper\Alias;
use Barryvdh\LaravelIdeHelper\Macro; use Barryvdh\LaravelIdeHelper\Macro;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Facade;
/** /**
* @internal * @internal
@@ -17,31 +15,6 @@ use Illuminate\Support\Facades\Facade;
*/ */
class AliasTest extends TestCase class AliasTest extends TestCase
{ {
/**
* @covers ::detectMethods
*/
public function testDetectMethodsMacroableMacros(): void
{
// Mock
$macro = __FUNCTION__;
$alias = new AliasMock();
// Macros
Builder::macro(
$macro,
function () {
// empty
}
);
// Prepare
$alias->setClasses([Builder::class]);
$alias->detectMethods();
// Test
$this->assertNotNull($this->getAliasMacro($alias, Builder::class, $macro));
}
/** /**
* @covers ::detectMethods * @covers ::detectMethods
*/ */
@@ -51,7 +24,7 @@ class AliasTest extends TestCase
$macro = __FUNCTION__; $macro = __FUNCTION__;
$alias = new AliasMock(); $alias = new AliasMock();
// Macros // Macrosx
EloquentBuilder::macro( EloquentBuilder::macro(
$macro, $macro,
function () { function () {
@@ -67,22 +40,6 @@ class AliasTest extends TestCase
$this->assertNotNull($this->getAliasMacro($alias, EloquentBuilder::class, $macro)); $this->assertNotNull($this->getAliasMacro($alias, EloquentBuilder::class, $macro));
} }
/**
* @covers ::detectFake
*/
public function testNoExceptionOnRequiredFakeParameters(): void
{
// Mock
$alias = new AliasMock();
// Prepare
$alias->setFacade(MockFacade::class);
$this->expectNotToPerformAssertions();
// Test
$alias->detectFake();
}
/** /**
* @covers ::detectTemplateNames * @covers ::detectTemplateNames
*/ */
@@ -135,26 +92,4 @@ class AliasMock extends Alias
{ {
parent::detectMethods(); parent::detectMethods();
} }
public function detectFake()
{
parent::detectFake();
}
public function setFacade(string $facade)
{
$this->facade = $facade;
}
}
class MockFacade extends Facade
{
protected static function getFacadeAccessor()
{
return 'Illuminate\Foundation\Exceptions\Handler';
}
public static function fake(string $test1, $test2 = null)
{
}
} }
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\GeneratorCommand; namespace Barryvdh\LaravelIdeHelper\Tests\Console\GeneratorCommand;
use Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider; use Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider;
use Barryvdh\LaravelIdeHelper\Tests\SnapshotPhpDriver;
use Barryvdh\LaravelIdeHelper\Tests\TestCase; use Barryvdh\LaravelIdeHelper\Tests\TestCase;
abstract class AbstractGeneratorCommand extends TestCase abstract class AbstractGeneratorCommand extends TestCase
@@ -26,4 +27,9 @@ abstract class AbstractGeneratorCommand extends TestCase
{ {
return [IdeHelperServiceProvider::class]; return [IdeHelperServiceProvider::class];
} }
protected function assertMatchesMockedSnapshot()
{
$this->assertMatchesSnapshot($this->mockFilesystemOutput, new SnapshotPhpDriver());
}
} }
@@ -6,30 +6,18 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\GeneratorCommand\GenerateIdeHe
use Barryvdh\LaravelIdeHelper\Console\GeneratorCommand; use Barryvdh\LaravelIdeHelper\Console\GeneratorCommand;
use Barryvdh\LaravelIdeHelper\Tests\Console\GeneratorCommand\AbstractGeneratorCommand; use Barryvdh\LaravelIdeHelper\Tests\Console\GeneratorCommand\AbstractGeneratorCommand;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
class Test extends AbstractGeneratorCommand class Test extends AbstractGeneratorCommand
{ {
public function testGenerator(): void public function testGenerator(): void
{ {
Arr::macro('arr_custom_macro', function () {
});
DB::macro('db_custom_macro', function () {
});
$this->app['config']->set('ide-helper.macro_default_return_types', [Arr::class => 'Custom_Fake_Class']);
$command = $this->app->make(GeneratorCommand::class); $command = $this->app->make(GeneratorCommand::class);
$tester = $this->runCommand($command); $tester = $this->runCommand($command);
$this->assertSame(0, $tester->getStatusCode()); $this->assertSame(0, $tester->getStatusCode());
$this->assertStringContainsString('A new helper file was written to _ide_helper.php', $tester->getDisplay()); $this->assertStringContainsString('A new helper file was written to _ide_helper.php', $tester->getDisplay());
$this->assertStringContainsString('public static function configure($basePath = null)', $this->mockFilesystemOutput); $this->assertStringContainsString('public static function configure($basePath = null)', $this->mockFilesystemOutput);
$this->assertStringContainsString('* @return \Custom_Fake_Class', $this->mockFilesystemOutput);
$this->assertStringContainsString('public static function arr_custom_macro()', $this->mockFilesystemOutput);
$this->assertStringContainsString('public static function db_custom_macro()', $this->mockFilesystemOutput);
} }
public function testFilename(): void public function testFilename(): void
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand; namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand;
use Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider; use Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider;
use Barryvdh\LaravelIdeHelper\Tests\SnapshotPhpDriver;
use Barryvdh\LaravelIdeHelper\Tests\TestCase; use Barryvdh\LaravelIdeHelper\Tests\TestCase;
abstract class AbstractModelsCommand extends TestCase abstract class AbstractModelsCommand extends TestCase
@@ -50,7 +51,10 @@ abstract class AbstractModelsCommand extends TestCase
// Don't override integer -> int for tests // Don't override integer -> int for tests
$config->set('ide-helper.type_overrides', []); $config->set('ide-helper.type_overrides', []);
}
$config->set('ide-helper.write_model_relation_exists_properties', true); protected function assertMatchesMockedSnapshot()
{
$this->assertMatchesSnapshot($this->mockFilesystemOutput, new SnapshotPhpDriver());
} }
} }
@@ -1,21 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections;
use Illuminate\Contracts\Support\Arrayable;
use JsonSerializable;
class AdvancedCastMap implements Arrayable, JsonSerializable
{
public function toArray(): array
{
return [];
}
public function jsonSerialize(): array
{
return $this->toArray();
}
}
@@ -5,7 +5,6 @@ declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models; namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection; use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastMap;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum; use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum;
use Illuminate\Database\Eloquent\Casts\AsArrayObject; use Illuminate\Database\Eloquent\Casts\AsArrayObject;
use Illuminate\Database\Eloquent\Casts\AsCollection; use Illuminate\Database\Eloquent\Casts\AsCollection;
@@ -30,9 +29,7 @@ class AdvancedCast extends Model
'cast_to_encrypted_json' => 'encrypted:json', 'cast_to_encrypted_json' => 'encrypted:json',
'cast_to_encrypted_object' => 'encrypted:object', 'cast_to_encrypted_object' => 'encrypted:object',
'cast_to_as_collection' => AsCollection::class, 'cast_to_as_collection' => AsCollection::class,
'cast_to_as_collection_of' => AsCollection::class . ':,' . AdvancedCastMap::class, // since 12.10
'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class), 'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class),
'cast_to_as_collection_using_and_map' => AsCollection::class . ':' . AdvancedCastCollection::class . ',' . AdvancedCastMap::class, // since 12.10
'cast_to_as_enum_collection' => AsEnumCollection::class, 'cast_to_as_enum_collection' => AsEnumCollection::class,
'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class), 'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class),
'cast_to_as_array_object' => AsArrayObject::class, 'cast_to_as_array_object' => AsArrayObject::class,
@@ -5,7 +5,6 @@ declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models; namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection; use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastMap;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum; use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum;
use Illuminate\Database\Eloquent\Casts\AsArrayObject; use Illuminate\Database\Eloquent\Casts\AsArrayObject;
use Illuminate\Database\Eloquent\Casts\AsCollection; use Illuminate\Database\Eloquent\Casts\AsCollection;
@@ -13,6 +12,8 @@ use Illuminate\Database\Eloquent\Casts\AsEnumCollection;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property \Illuminate\Support\Carbon $cast_to_date_serialization * @property \Illuminate\Support\Carbon $cast_to_date_serialization
* @property \Illuminate\Support\Carbon $cast_to_datetime_serialization * @property \Illuminate\Support\Carbon $cast_to_datetime_serialization
* @property \Illuminate\Support\Carbon $cast_to_custom_datetime * @property \Illuminate\Support\Carbon $cast_to_custom_datetime
@@ -20,17 +21,15 @@ use Illuminate\Database\Eloquent\Model;
* @property \Carbon\CarbonImmutable $cast_to_immutable_custom_datetime * @property \Carbon\CarbonImmutable $cast_to_immutable_custom_datetime
* @property \Carbon\CarbonImmutable $cast_to_immutable_datetime * @property \Carbon\CarbonImmutable $cast_to_immutable_datetime
* @property int $cast_to_timestamp * @property int $cast_to_timestamp
* @property string $cast_to_encrypted * @property mixed $cast_to_encrypted
* @property array<array-key, mixed> $cast_to_encrypted_array * @property array<array-key, mixed> $cast_to_encrypted_array
* @property \Illuminate\Support\Collection<array-key, mixed> $cast_to_encrypted_collection * @property \Illuminate\Support\Collection<array-key, mixed> $cast_to_encrypted_collection
* @property array<array-key, mixed> $cast_to_encrypted_json * @property array<array-key, mixed> $cast_to_encrypted_json
* @property object $cast_to_encrypted_object * @property object $cast_to_encrypted_object
* @property \Illuminate\Support\Collection $cast_to_as_collection * @property \Illuminate\Support\Collection $cast_to_as_collection
* @property \Illuminate\Support\Collection $cast_to_as_enum_collection * @property \Illuminate\Support\Collection $cast_to_as_enum_collection
* @property \Illuminate\Database\Eloquent\Casts\ArrayObject<array-key, mixed> $cast_to_as_array_object * @property \ArrayObject<array-key, mixed> $cast_to_as_array_object
* @property \Illuminate\Support\Collection<int, AdvancedCastMap> $cast_to_as_collection_of
* @property AdvancedCastCollection $cast_to_as_collection_using * @property AdvancedCastCollection $cast_to_as_collection_using
* @property AdvancedCastCollection<int, AdvancedCastMap> $cast_to_as_collection_using_and_map
* @property \Illuminate\Support\Collection<int, AdvancedCastEnum> $cast_to_as_enum_collection_of * @property \Illuminate\Support\Collection<int, AdvancedCastEnum> $cast_to_as_enum_collection_of
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast newQuery()
@@ -70,9 +69,7 @@ class AdvancedCast extends Model
'cast_to_encrypted_json' => 'encrypted:json', 'cast_to_encrypted_json' => 'encrypted:json',
'cast_to_encrypted_object' => 'encrypted:object', 'cast_to_encrypted_object' => 'encrypted:object',
'cast_to_as_collection' => AsCollection::class, 'cast_to_as_collection' => AsCollection::class,
'cast_to_as_collection_of' => AsCollection::class . ':,' . AdvancedCastMap::class, // since 12.10
'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class), 'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class),
'cast_to_as_collection_using_and_map' => AsCollection::class . ':' . AdvancedCastCollection::class . ',' . AdvancedCastMap::class, // since 12.10
'cast_to_as_enum_collection' => AsEnumCollection::class, 'cast_to_as_enum_collection' => AsEnumCollection::class,
'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class), 'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class),
'cast_to_as_array_object' => AsArrayObject::class, 'cast_to_as_array_object' => AsArrayObject::class,
@@ -7,6 +7,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AllowGlobDirecto
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -42,8 +44,8 @@ use Illuminate\Database\Eloquent\Model;
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -7,6 +7,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ArrayCastsWithCo
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property array<int, string>|null $cast_to_array -- These three should not be duplicated * @property array<int, string>|null $cast_to_array -- These three should not be duplicated
* @property array<int, string> $cast_to_json some-description * @property array<int, string> $cast_to_json some-description
* @property \Illuminate\Support\Collection<int, string> $cast_to_collection some-description * @property \Illuminate\Support\Collection<int, string> $cast_to_collection some-description
@@ -8,6 +8,8 @@ use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $name * @property string|null $name
* @property string|null $name_read * @property string|null $name_read
@@ -83,6 +85,8 @@ use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @property int $diverging_type_hinted_get_and_set * @property int $diverging_type_hinted_get_and_set
* @property string|null $name * @property string|null $name
@@ -10,6 +10,8 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\Relations\MorphTo;
/** /**
*
*
* @property int $id * @property int $id
* @property string $both_same_name I'm a getter * @property string $both_same_name I'm a getter
* @property string $both_without_getter_comment * @property string $both_without_getter_comment
@@ -21,7 +23,6 @@ use Illuminate\Database\Eloquent\Relations\MorphTo;
* @property-read string $not_comment * @property-read string $not_comment
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationHasMany HasMany relations. * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationHasMany HasMany relations.
* @property-read int|null $relation_has_many_count * @property-read int|null $relation_has_many_count
* @property-read bool|null $relation_has_many_exists
* @property-read Simple|null $relationHasOne Others relations. * @property-read Simple|null $relationHasOne Others relations.
* @property-read Model|\Eloquent $relationMorphTo MorphTo relations. * @property-read Model|\Eloquent $relationMorphTo MorphTo relations.
* @property-write mixed $first_name Set the user's first name. * @property-write mixed $first_name Set the user's first name.
@@ -9,10 +9,11 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
/** /**
*
*
* @property int $id * @property int $id
* @property-read SimpleCollection<int, Simple> $relationHasMany * @property-read SimpleCollection<int, Simple> $relationHasMany
* @property-read int|null $relation_has_many_count * @property-read int|null $relation_has_many_count
* @property-read bool|null $relation_has_many_exists
* @method static SimpleCollection<int, static> all($columns = ['*']) * @method static SimpleCollection<int, static> all($columns = ['*'])
* @method static SimpleCollection<int, static> get($columns = ['*']) * @method static SimpleCollection<int, static> get($columns = ['*'])
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery()
@@ -7,6 +7,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate\Model
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property \Carbon\CarbonImmutable|null $created_at * @property \Carbon\CarbonImmutable|null $created_at
* @property \Carbon\CarbonImmutable|null $updated_at * @property \Carbon\CarbonImmutable|null $updated_at
* @method static \Illuminate\Database\Eloquent\Builder<static>|CustomDate newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|CustomDate newModelQuery()
@@ -1,218 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DnfTypes\Models;
use ArrayAccess;
use Countable;
use Illuminate\Database\Eloquent\Model;
use Iterator;
use Stringable;
use Traversable;
/**
* Test model covering all DNF type scenarios from PHP RFC.
*
* @see https://wiki.php.net/rfc/dnf_types
*/
class DnfTypeModel extends Model
{
// =========================================================================
// RFC Example 1: (A&B)|null - Intersection with null
// =========================================================================
/**
* Basic DNF: intersection OR null.
*/
public function getBasicDnfAttribute(): (Countable&Iterator)|null
{
return null;
}
// =========================================================================
// RFC Example 2: (A&B)|D - Intersection OR single type (no null)
// =========================================================================
/**
* Intersection OR single class type.
*/
public function getIntersectionOrClassAttribute(): (Countable&Iterator)|\stdClass
{
return new \stdClass();
}
// =========================================================================
// RFC Example 3: C|(X&D)|null - Single type OR intersection OR null
// =========================================================================
/**
* Single type OR intersection OR null.
*/
public function getSingleOrIntersectionOrNullAttribute(): \stdClass|(Countable&Iterator)|null
{
return null;
}
// =========================================================================
// RFC Example 4: (A&B&D)|int|null - Triple intersection OR primitive OR null
// =========================================================================
/**
* Triple intersection OR primitive OR null.
*/
public function getTripleIntersectionAttribute(): (Countable&Iterator&Traversable)|int|null
{
return null;
}
// =========================================================================
// RFC Example 5: (A&B)|(C&D)|null - Multiple intersection segments
// =========================================================================
/**
* Multiple intersection segments OR null.
*/
public function getMultipleIntersectionsAttribute(): (Countable&Iterator)|(ArrayAccess&Stringable)|null
{
return null;
}
// =========================================================================
// RFC Example 6: (A&B)|(C&D)|(E&F) - Multiple intersections without null
// =========================================================================
/**
* Multiple intersection segments without null.
*/
public function getMultipleIntersectionsNoNullAttribute(): (Countable&Iterator)|(ArrayAccess&Stringable)|(Traversable&Countable)
{
return new class () implements Countable, Iterator {
public function count(): int
{
return 0;
}
public function current(): mixed
{
return null;
}
public function key(): mixed
{
return null;
}
public function next(): void
{
}
public function rewind(): void
{
}
public function valid(): bool
{
return false;
}
};
}
// =========================================================================
// Pure intersection type (A&B) - No union, just intersection
// =========================================================================
/**
* Pure intersection type without union.
*/
public function getPureIntersectionAttribute(): Countable&Iterator
{
return new class () implements Countable, Iterator {
public function count(): int
{
return 0;
}
public function current(): mixed
{
return null;
}
public function key(): mixed
{
return null;
}
public function next(): void
{
}
public function rewind(): void
{
}
public function valid(): bool
{
return false;
}
};
}
// =========================================================================
// Parameter context: DNF types in method parameters
// =========================================================================
/**
* Scope with DNF parameter: (A&B)|null.
*/
public function scopeWithBasicDnfParam(
\Illuminate\Database\Query\Builder $query,
(Countable&Iterator)|null $param
): \Illuminate\Database\Query\Builder {
return $query;
}
/**
* Scope with complex DNF parameter: C|(A&B)|null.
*/
public function scopeWithComplexDnfParam(
\Illuminate\Database\Query\Builder $query,
\stdClass|(Countable&Iterator)|null $param
): \Illuminate\Database\Query\Builder {
return $query;
}
/**
* Scope with multiple intersection parameters.
*/
public function scopeWithMultipleIntersectionParam(
\Illuminate\Database\Query\Builder $query,
(Countable&Iterator)|(ArrayAccess&Stringable) $param
): \Illuminate\Database\Query\Builder {
return $query;
}
/**
* Scope with intersection OR primitive parameter.
*/
public function scopeWithIntersectionOrPrimitive(
\Illuminate\Database\Query\Builder $query,
(Countable&Iterator)|int $param
): \Illuminate\Database\Query\Builder {
return $query;
}
// =========================================================================
// Mixed: DNF in both parameter and return type
// =========================================================================
/**
* DNF in both parameter and return type.
*/
public function scopeWithDnfParamAndReturn(
\Illuminate\Database\Query\Builder $query,
(Countable&Iterator)|null $param
): (Countable&Iterator)|\Illuminate\Database\Query\Builder {
return $query;
}
}
@@ -1,24 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DnfTypes;
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
class Test extends AbstractModelsCommand
{
public function test(): void
{
$command = $this->app->make(ModelsCommand::class);
$tester = $this->runCommand($command, [
'--write' => true,
]);
$this->assertSame(0, $tester->getStatusCode());
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
$this->assertMatchesMockedSnapshot();
}
}
@@ -1,234 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DnfTypes\Models;
use ArrayAccess;
use Countable;
use Illuminate\Database\Eloquent\Model;
use Iterator;
use Stringable;
use Traversable;
/**
* Test model covering all DNF type scenarios from PHP RFC.
*
* @see https://wiki.php.net/rfc/dnf_types
* @property-read (\Countable&\Iterator)|null $basic_dnf
* @property-read (\Countable&\Iterator)|\stdClass $intersection_or_class
* @property-read (\Countable&\Iterator)|(\ArrayAccess&\Stringable)|null $multiple_intersections
* @property-read (\Countable&\Iterator)|(\ArrayAccess&\Stringable)|(\Traversable&\Countable) $multiple_intersections_no_null
* @property-read (\Countable&\Iterator) $pure_intersection
* @property-read \stdClass|(\Countable&\Iterator)|null $single_or_intersection_or_null
* @property-read (\Countable&\Iterator&\Traversable)|int|null $triple_intersection
* @method static \Illuminate\Database\Eloquent\Builder<static>|DnfTypeModel newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|DnfTypeModel newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|DnfTypeModel query()
* @method static \Illuminate\Database\Eloquent\Builder<static>|DnfTypeModel withBasicDnfParam((\Countable&\Iterator)|null $param)
* @method static \Illuminate\Database\Eloquent\Builder<static>|DnfTypeModel withComplexDnfParam(\stdClass|(\Countable&\Iterator)|null $param)
* @method static \Illuminate\Database\Eloquent\Builder<static>|DnfTypeModel withDnfParamAndReturn((\Countable&\Iterator)|null $param)
* @method static \Illuminate\Database\Eloquent\Builder<static>|DnfTypeModel withIntersectionOrPrimitive((\Countable&\Iterator)|int $param)
* @method static \Illuminate\Database\Eloquent\Builder<static>|DnfTypeModel withMultipleIntersectionParam((\Countable&\Iterator)|(\ArrayAccess&\Stringable) $param)
* @mixin \Eloquent
*/
class DnfTypeModel extends Model
{
// =========================================================================
// RFC Example 1: (A&B)|null - Intersection with null
// =========================================================================
/**
* Basic DNF: intersection OR null.
*/
public function getBasicDnfAttribute(): (Countable&Iterator)|null
{
return null;
}
// =========================================================================
// RFC Example 2: (A&B)|D - Intersection OR single type (no null)
// =========================================================================
/**
* Intersection OR single class type.
*/
public function getIntersectionOrClassAttribute(): (Countable&Iterator)|\stdClass
{
return new \stdClass();
}
// =========================================================================
// RFC Example 3: C|(X&D)|null - Single type OR intersection OR null
// =========================================================================
/**
* Single type OR intersection OR null.
*/
public function getSingleOrIntersectionOrNullAttribute(): \stdClass|(Countable&Iterator)|null
{
return null;
}
// =========================================================================
// RFC Example 4: (A&B&D)|int|null - Triple intersection OR primitive OR null
// =========================================================================
/**
* Triple intersection OR primitive OR null.
*/
public function getTripleIntersectionAttribute(): (Countable&Iterator&Traversable)|int|null
{
return null;
}
// =========================================================================
// RFC Example 5: (A&B)|(C&D)|null - Multiple intersection segments
// =========================================================================
/**
* Multiple intersection segments OR null.
*/
public function getMultipleIntersectionsAttribute(): (Countable&Iterator)|(ArrayAccess&Stringable)|null
{
return null;
}
// =========================================================================
// RFC Example 6: (A&B)|(C&D)|(E&F) - Multiple intersections without null
// =========================================================================
/**
* Multiple intersection segments without null.
*/
public function getMultipleIntersectionsNoNullAttribute(): (Countable&Iterator)|(ArrayAccess&Stringable)|(Traversable&Countable)
{
return new class () implements Countable, Iterator {
public function count(): int
{
return 0;
}
public function current(): mixed
{
return null;
}
public function key(): mixed
{
return null;
}
public function next(): void
{
}
public function rewind(): void
{
}
public function valid(): bool
{
return false;
}
};
}
// =========================================================================
// Pure intersection type (A&B) - No union, just intersection
// =========================================================================
/**
* Pure intersection type without union.
*/
public function getPureIntersectionAttribute(): Countable&Iterator
{
return new class () implements Countable, Iterator {
public function count(): int
{
return 0;
}
public function current(): mixed
{
return null;
}
public function key(): mixed
{
return null;
}
public function next(): void
{
}
public function rewind(): void
{
}
public function valid(): bool
{
return false;
}
};
}
// =========================================================================
// Parameter context: DNF types in method parameters
// =========================================================================
/**
* Scope with DNF parameter: (A&B)|null.
*/
public function scopeWithBasicDnfParam(
\Illuminate\Database\Query\Builder $query,
(Countable&Iterator)|null $param
): \Illuminate\Database\Query\Builder {
return $query;
}
/**
* Scope with complex DNF parameter: C|(A&B)|null.
*/
public function scopeWithComplexDnfParam(
\Illuminate\Database\Query\Builder $query,
\stdClass|(Countable&Iterator)|null $param
): \Illuminate\Database\Query\Builder {
return $query;
}
/**
* Scope with multiple intersection parameters.
*/
public function scopeWithMultipleIntersectionParam(
\Illuminate\Database\Query\Builder $query,
(Countable&Iterator)|(ArrayAccess&Stringable) $param
): \Illuminate\Database\Query\Builder {
return $query;
}
/**
* Scope with intersection OR primitive parameter.
*/
public function scopeWithIntersectionOrPrimitive(
\Illuminate\Database\Query\Builder $query,
(Countable&Iterator)|int $param
): \Illuminate\Database\Query\Builder {
return $query;
}
// =========================================================================
// Mixed: DNF in both parameter and return type
// =========================================================================
/**
* DNF in both parameter and return type.
*/
public function scopeWithDnfParamAndReturn(
\Illuminate\Database\Query\Builder $query,
(Countable&Iterator)|null $param
): (Countable&Iterator)|\Illuminate\Database\Query\Builder {
return $query;
}
}
@@ -13,6 +13,8 @@
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGeneratePhpdocWithExternalEloquentBuilder\Models{ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGeneratePhpdocWithExternalEloquentBuilder\Models{
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -48,8 +50,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGenerateP
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -10,9 +10,10 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasOne;
/** /**
*
*
* @property-read \Illuminate\Database\Eloquent\Collection<int, Dynamic> $regularHasMany * @property-read \Illuminate\Database\Eloquent\Collection<int, Dynamic> $regularHasMany
* @property-read int|null $regular_has_many_count * @property-read int|null $regular_has_many_count
* @property-read bool|null $regular_has_many_exists
* @method static \Illuminate\Database\Eloquent\Builder<static>|Dynamic newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Dynamic newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Dynamic newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Dynamic newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Dynamic query() * @method static \Illuminate\Database\Eloquent\Builder<static>|Dynamic query()
@@ -9,6 +9,8 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace\ModelWithCustomNamespaceFactory factory($count = null, $state = []) * @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace\ModelWithCustomNamespaceFactory factory($count = null, $state = [])
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithCustomNamespace newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithCustomNamespace newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithCustomNamespace newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithCustomNamespace newQuery()
@@ -39,6 +41,8 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\ModelWithFactoryFactory factory($count = null, $state = []) * @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\ModelWithFactoryFactory factory($count = null, $state = [])
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithFactory newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithFactory newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithFactory newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithFactory newQuery()
@@ -56,6 +60,8 @@ declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models; namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
/** /**
*
*
* @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\ModelWithNestedFactoryFactory factory($count = null, $state = []) * @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\ModelWithNestedFactoryFactory factory($count = null, $state = [])
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithNestedFactory newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithNestedFactory newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithNestedFactory newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithNestedFactory newQuery()
@@ -75,6 +81,8 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithoutFactory newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithoutFactory newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithoutFactory newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithoutFactory newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithoutFactory query() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithoutFactory query()
@@ -9,6 +9,8 @@ use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -44,8 +46,8 @@ use Illuminate\Database\Eloquent\Model;
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -7,6 +7,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhp
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -42,8 +44,8 @@ use Illuminate\Database\Eloquent\Model;
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -7,6 +7,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhp
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $charNullable * @property string|null $charNullable
* @property string $charNotNullable * @property string $charNotNullable
@@ -42,8 +44,8 @@ use Illuminate\Database\Eloquent\Model;
* @property float $floatNotNullable * @property float $floatNotNullable
* @property float|null $doubleNullable * @property float|null $doubleNullable
* @property float $doubleNotNullable * @property float $doubleNotNullable
* @property numeric|null $decimalNullable * @property string|null $decimalNullable
* @property numeric $decimalNotNullable * @property string $decimalNotNullable
* @property int|null $booleanNullable * @property int|null $booleanNullable
* @property int $booleanNotNullable * @property int $booleanNotNullable
* @property string|null $enumNullable * @property string|null $enumNullable
@@ -7,6 +7,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhp
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -42,8 +44,8 @@ use Illuminate\Database\Eloquent\Model;
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -67,6 +67,8 @@ class WithCollection extends Model
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateMixinCollection\Models{ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateMixinCollection\Models{
/** /**
*
*
* @property-read \Illuminate\Support\Collection<int, string> $collection * @property-read \Illuminate\Support\Collection<int, string> $collection
* @property-read \Illuminate\Support\Collection<\Illuminate\Support\Collection, \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateMixinCollection\NonModels\CollectionModel<\Illuminate\Support\Collection, \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateMixinCollection\NonModels\CollectionModel<int, \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateMixinCollection\NonModels\NonModel>>> $collection_with_nested_template * @property-read \Illuminate\Support\Collection<\Illuminate\Support\Collection, \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateMixinCollection\NonModels\CollectionModel<\Illuminate\Support\Collection, \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateMixinCollection\NonModels\CollectionModel<int, \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateMixinCollection\NonModels\NonModel>>> $collection_with_nested_template
* @property-read \Illuminate\Support\Collection<int, \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateMixinCollection\NonModels\NonModel> $collection_with_non_model_template * @property-read \Illuminate\Support\Collection<int, \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateMixinCollection\NonModels\NonModel> $collection_with_non_model_template
@@ -1,251 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpDocWithTypedScopeParameter\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
/**
* @comment Scope with required boolean parameter
*/
protected function scopeTyped01(Builder $query, bool $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional boolean parameter and default true
*/
protected function scopeTyped02(Builder $query, bool $value = true)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional boolean parameter and default false
*/
protected function scopeTyped03(Builder $query, bool $value = false)
{
$query->where('type', $value);
}
/**
* @comment Scope with required string parameter
*/
protected function scopeTyped04(Builder $query, string $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional string parameter and default value
*/
protected function scopeTyped05(Builder $query, string $value = 'dummy123')
{
$query->where('type', $value);
}
/**
* @comment Scope with required integer parameter
*/
protected function scopeTyped06(Builder $query, int $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional integer parameter and default positive value
*/
protected function scopeTyped07(Builder $query, int $value = 123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional integer parameter and default negative value
*/
protected function scopeTyped08(Builder $query, int $value = -123)
{
$query->where('type', $value);
}
/**
* @comment Scope with required float parameter
*/
protected function scopeTyped09(Builder $query, float $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default positive integer value
*/
protected function scopeTyped10(Builder $query, float $value = 123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default negative integer value
*/
protected function scopeTyped11(Builder $query, float $value = -123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default positive float value
*/
protected function scopeTyped12(Builder $query, float $value = 1.23)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default negative float value
*/
protected function scopeTyped13(Builder $query, float $value = -1.23)
{
$query->where('type', $value);
}
/**
* @comment Scope with required nullable boolean parameter
*/
protected function scopeTyped14(Builder $query, ?bool $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable boolean parameter and default true
*/
protected function scopeTyped15(Builder $query, ?bool $value = true)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable boolean parameter and default false
*/
protected function scopeTyped16(Builder $query, ?bool $value = false)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable boolean parameter and default null
*/
protected function scopeTyped17(Builder $query, ?bool $value = null)
{
$query->where('type', $value);
}
/**
* @comment Scope with required nullable string parameter
*/
protected function scopeTyped18(Builder $query, ?string $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable string parameter and default value
*/
protected function scopeTyped19(Builder $query, ?string $value = 'dummy123')
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable string parameter and default null
*/
protected function scopeTyped20(Builder $query, ?string $value = null)
{
$query->where('type', $value);
}
/**
* @comment Scope with required nullable integer parameter
*/
protected function scopeTyped21(Builder $query, ?int $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable integer parameter and default positive value
*/
protected function scopeTyped22(Builder $query, ?int $value = 123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable integer parameter and default negative value
*/
protected function scopeTyped23(Builder $query, ?int $value = -123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable integer parameter and default null
*/
protected function scopeTyped24(Builder $query, ?int $value = null)
{
$query->where('type', $value);
}
/**
* @comment Scope with required float nullable parameter
*/
protected function scopeTyped25(Builder $query, ?float $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable float parameter and default positive integer value
*/
protected function scopeTyped26(Builder $query, ?float $value = 123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable float parameter and default negative integer value
*/
protected function scopeTyped27(Builder $query, ?float $value = -123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default positive float value
*/
protected function scopeTyped28(Builder $query, ?float $value = 1.23)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default negative float value
*/
protected function scopeTyped29(Builder $query, ?float $value = -1.23)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default null
*/
protected function scopeTyped30(Builder $query, ?float $value = null)
{
$query->where('type', $value);
}
}
@@ -1,24 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpDocWithTypedScopeParameter;
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
class Test extends AbstractModelsCommand
{
public function test(): void
{
$command = $this->app->make(ModelsCommand::class);
$tester = $this->runCommand($command, [
'--write' => true,
]);
$this->assertSame(0, $tester->getStatusCode());
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
$this->assertMatchesMockedSnapshot();
}
}
@@ -1,287 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpDocWithTypedScopeParameter\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
/**
* @method static Builder<static>|Comment newModelQuery()
* @method static Builder<static>|Comment newQuery()
* @method static Builder<static>|Comment query()
* @method static Builder<static>|Comment typed01(bool $value) Scope with required boolean parameter
* @method static Builder<static>|Comment typed02(bool $value = true) Scope with optional boolean parameter and default true
* @method static Builder<static>|Comment typed03(bool $value = false) Scope with optional boolean parameter and default false
* @method static Builder<static>|Comment typed04(string $value) Scope with required string parameter
* @method static Builder<static>|Comment typed05(string $value = 'dummy123') Scope with optional string parameter and default value
* @method static Builder<static>|Comment typed06(int $value) Scope with required integer parameter
* @method static Builder<static>|Comment typed07(int $value = 123) Scope with optional integer parameter and default positive value
* @method static Builder<static>|Comment typed08(int $value = -123) Scope with optional integer parameter and default negative value
* @method static Builder<static>|Comment typed09(float $value) Scope with required float parameter
* @method static Builder<static>|Comment typed10(float $value = 123) Scope with optional float parameter and default positive integer value
* @method static Builder<static>|Comment typed11(float $value = -123) Scope with optional float parameter and default negative integer value
* @method static Builder<static>|Comment typed12(float $value = 1.23) Scope with optional float parameter and default positive float value
* @method static Builder<static>|Comment typed13(float $value = -1.23) Scope with optional float parameter and default negative float value
* @method static Builder<static>|Comment typed14(?bool $value) Scope with required nullable boolean parameter
* @method static Builder<static>|Comment typed15(?bool $value = true) Scope with optional nullable boolean parameter and default true
* @method static Builder<static>|Comment typed16(?bool $value = false) Scope with optional nullable boolean parameter and default false
* @method static Builder<static>|Comment typed17(?bool $value = null) Scope with optional nullable boolean parameter and default null
* @method static Builder<static>|Comment typed18(?string $value) Scope with required nullable string parameter
* @method static Builder<static>|Comment typed19(?string $value = 'dummy123') Scope with optional nullable string parameter and default value
* @method static Builder<static>|Comment typed20(?string $value = null) Scope with optional nullable string parameter and default null
* @method static Builder<static>|Comment typed21(?int $value) Scope with required nullable integer parameter
* @method static Builder<static>|Comment typed22(?int $value = 123) Scope with optional nullable integer parameter and default positive value
* @method static Builder<static>|Comment typed23(?int $value = -123) Scope with optional nullable integer parameter and default negative value
* @method static Builder<static>|Comment typed24(?int $value = null) Scope with optional nullable integer parameter and default null
* @method static Builder<static>|Comment typed25(?float $value) Scope with required float nullable parameter
* @method static Builder<static>|Comment typed26(?float $value = 123) Scope with optional nullable float parameter and default positive integer value
* @method static Builder<static>|Comment typed27(?float $value = -123) Scope with optional nullable float parameter and default negative integer value
* @method static Builder<static>|Comment typed28(?float $value = 1.23) Scope with optional float parameter and default positive float value
* @method static Builder<static>|Comment typed29(?float $value = -1.23) Scope with optional float parameter and default negative float value
* @method static Builder<static>|Comment typed30(?float $value = null) Scope with optional float parameter and default null
* @mixin \Eloquent
*/
class Comment extends Model
{
/**
* @comment Scope with required boolean parameter
*/
protected function scopeTyped01(Builder $query, bool $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional boolean parameter and default true
*/
protected function scopeTyped02(Builder $query, bool $value = true)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional boolean parameter and default false
*/
protected function scopeTyped03(Builder $query, bool $value = false)
{
$query->where('type', $value);
}
/**
* @comment Scope with required string parameter
*/
protected function scopeTyped04(Builder $query, string $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional string parameter and default value
*/
protected function scopeTyped05(Builder $query, string $value = 'dummy123')
{
$query->where('type', $value);
}
/**
* @comment Scope with required integer parameter
*/
protected function scopeTyped06(Builder $query, int $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional integer parameter and default positive value
*/
protected function scopeTyped07(Builder $query, int $value = 123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional integer parameter and default negative value
*/
protected function scopeTyped08(Builder $query, int $value = -123)
{
$query->where('type', $value);
}
/**
* @comment Scope with required float parameter
*/
protected function scopeTyped09(Builder $query, float $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default positive integer value
*/
protected function scopeTyped10(Builder $query, float $value = 123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default negative integer value
*/
protected function scopeTyped11(Builder $query, float $value = -123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default positive float value
*/
protected function scopeTyped12(Builder $query, float $value = 1.23)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default negative float value
*/
protected function scopeTyped13(Builder $query, float $value = -1.23)
{
$query->where('type', $value);
}
/**
* @comment Scope with required nullable boolean parameter
*/
protected function scopeTyped14(Builder $query, ?bool $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable boolean parameter and default true
*/
protected function scopeTyped15(Builder $query, ?bool $value = true)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable boolean parameter and default false
*/
protected function scopeTyped16(Builder $query, ?bool $value = false)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable boolean parameter and default null
*/
protected function scopeTyped17(Builder $query, ?bool $value = null)
{
$query->where('type', $value);
}
/**
* @comment Scope with required nullable string parameter
*/
protected function scopeTyped18(Builder $query, ?string $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable string parameter and default value
*/
protected function scopeTyped19(Builder $query, ?string $value = 'dummy123')
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable string parameter and default null
*/
protected function scopeTyped20(Builder $query, ?string $value = null)
{
$query->where('type', $value);
}
/**
* @comment Scope with required nullable integer parameter
*/
protected function scopeTyped21(Builder $query, ?int $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable integer parameter and default positive value
*/
protected function scopeTyped22(Builder $query, ?int $value = 123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable integer parameter and default negative value
*/
protected function scopeTyped23(Builder $query, ?int $value = -123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable integer parameter and default null
*/
protected function scopeTyped24(Builder $query, ?int $value = null)
{
$query->where('type', $value);
}
/**
* @comment Scope with required float nullable parameter
*/
protected function scopeTyped25(Builder $query, ?float $value)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable float parameter and default positive integer value
*/
protected function scopeTyped26(Builder $query, ?float $value = 123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional nullable float parameter and default negative integer value
*/
protected function scopeTyped27(Builder $query, ?float $value = -123)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default positive float value
*/
protected function scopeTyped28(Builder $query, ?float $value = 1.23)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default negative float value
*/
protected function scopeTyped29(Builder $query, ?float $value = -1.23)
{
$query->where('type', $value);
}
/**
* @comment Scope with optional float parameter and default null
*/
protected function scopeTyped30(Builder $query, ?float $value = null)
{
$query->where('type', $value);
}
}
@@ -13,6 +13,8 @@
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithExternalEloquentBuilder\Models{ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithExternalEloquentBuilder\Models{
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -48,8 +50,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWi
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -8,6 +8,8 @@ use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithExte
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -43,8 +45,8 @@ use Illuminate\Database\Eloquent\Model;
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -9,6 +9,8 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -44,8 +46,8 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -82,7 +84,6 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @property \Illuminate\Support\Carbon|null $updated_at * @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \Illuminate\Database\Eloquent\Collection<int, \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post> $posts * @property-read \Illuminate\Database\Eloquent\Collection<int, \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post> $posts
* @property-read int|null $posts_count * @property-read int|null $posts_count
* @property-read bool|null $posts_exists
* @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post null(string $unusedParam) * @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post null(string $unusedParam)
@@ -159,7 +160,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post whereUuidNullable($value) * @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post whereUuidNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post whereYearNotNullable($value) * @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post whereYearNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post whereYearNullable($value) * @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post whereYearNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post withTrashed(bool $withTrashed = true) * @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder<static>|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithForcedFqn\Models\Post withoutTrashed()
* @mixin \Eloquent * @mixin \Eloquent
*/ */
@@ -15,6 +15,8 @@ use Illuminate\Database\Query\Builder as QueryBuilder;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property CastType $char_not_nullable * @property CastType $char_not_nullable
@@ -50,8 +52,8 @@ use Illuminate\Support\Carbon;
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -88,7 +90,6 @@ use Illuminate\Support\Carbon;
* @property Carbon|null $updated_at * @property Carbon|null $updated_at
* @property-read Collection<int, Post> $posts * @property-read Collection<int, Post> $posts
* @property-read int|null $posts_count * @property-read int|null $posts_count
* @property-read bool|null $posts_exists
* @method static EloquentBuilder<static>|Post newModelQuery() * @method static EloquentBuilder<static>|Post newModelQuery()
* @method static EloquentBuilder<static>|Post newQuery() * @method static EloquentBuilder<static>|Post newQuery()
* @method static EloquentBuilder<static>|Post null(string $unusedParam) * @method static EloquentBuilder<static>|Post null(string $unusedParam)
@@ -165,7 +166,7 @@ use Illuminate\Support\Carbon;
* @method static EloquentBuilder<static>|Post whereUuidNullable($value) * @method static EloquentBuilder<static>|Post whereUuidNullable($value)
* @method static EloquentBuilder<static>|Post whereYearNotNullable($value) * @method static EloquentBuilder<static>|Post whereYearNotNullable($value)
* @method static EloquentBuilder<static>|Post whereYearNullable($value) * @method static EloquentBuilder<static>|Post whereYearNullable($value)
* @method static EloquentBuilder<static>|Post withTrashed(bool $withTrashed = true) * @method static EloquentBuilder<static>|Post withTrashed()
* @method static EloquentBuilder<static>|Post withoutTrashed() * @method static EloquentBuilder<static>|Post withoutTrashed()
* @mixin Eloquent * @mixin Eloquent
*/ */
@@ -13,6 +13,8 @@
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithFqnInExternalFile\Models{ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithFqnInExternalFile\Models{
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -48,8 +50,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWi
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -45,6 +45,8 @@ class Post extends Model
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithMixin\Models{ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithMixin\Models{
/** /**
*
*
* @property $someProp * @property $someProp
* @method someMethod(string $method) * @method someMethod(string $method)
* @method static \Illuminate\Database\Eloquent\Builder<static>|FinalPost newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|FinalPost newModelQuery()
@@ -58,6 +60,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWi
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithMixin\Models{ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithMixin\Models{
/** /**
*
*
* @property $someProp * @property $someProp
* @method someMethod(string $method) * @method someMethod(string $method)
* @property int $id * @property int $id
@@ -95,8 +99,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWi
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -9,13 +9,13 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
/** /**
*
*
* @property int $id * @property int $id
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $regularBelongsToMany * @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $regularBelongsToMany
* @property-read int|null $regular_belongs_to_many_count * @property-read int|null $regular_belongs_to_many_count
* @property-read bool|null $regular_belongs_to_many_exists
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $regularHasMany * @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $regularHasMany
* @property-read int|null $regular_has_many_count * @property-read int|null $regular_has_many_count
* @property-read bool|null $regular_has_many_exists
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple query() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple query()
@@ -8,6 +8,8 @@ use DateTime;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @property-read int|null $attribute_return_type_int_or_null * @property-read int|null $attribute_return_type_int_or_null
* @property-read array $attribute_returns_array * @property-read array $attribute_returns_array
@@ -7,6 +7,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Ignored\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @method static \Illuminate\Database\Eloquent\Builder<static>|NotIgnored newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|NotIgnored newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|NotIgnored newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|NotIgnored newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|NotIgnored query() * @method static \Illuminate\Database\Eloquent\Builder<static>|NotIgnored query()
@@ -13,6 +13,8 @@
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Interfaces\Models{ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Interfaces\Models{
/** /**
*
*
* @method static \Illuminate\Database\Eloquent\Builder<static>|User newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|User newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|User newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|User newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|User query() * @method static \Illuminate\Database\Eloquent\Builder<static>|User query()
@@ -24,6 +24,8 @@ use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\LaravelCustomCasts\Cas
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\LaravelCustomCasts\Casts\CastedProperty $casted_property_with_return_type * @property \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\LaravelCustomCasts\Casts\CastedProperty $casted_property_with_return_type
* @property \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\LaravelCustomCasts\Casts\CastedProperty $casted_property_with_return_docblock * @property \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\LaravelCustomCasts\Casts\CastedProperty $casted_property_with_return_docblock
* @property \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\LaravelCustomCasts\Casts\CastedProperty $casted_property_with_return_docblock_fqn * @property \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\LaravelCustomCasts\Casts\CastedProperty $casted_property_with_return_docblock_fqn
@@ -7,6 +7,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\MagicWhere\Model
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -42,8 +44,8 @@ use Illuminate\Database\Eloquent\Model;
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -9,6 +9,8 @@ use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks\CustomMethod; use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks\CustomMethod;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks\CustomProperty; use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks\CustomProperty;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks\UnsetMethod; use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks\UnsetMethod;
use Illuminate\Filesystem\Filesystem;
use Mockery;
class Test extends AbstractModelsCommand class Test extends AbstractModelsCommand
{ {
@@ -32,6 +34,24 @@ class Test extends AbstractModelsCommand
public function test(): void public function test(): void
{ {
$actualContent = null;
$mockFilesystem = Mockery::mock(Filesystem::class)->makePartial();
$mockFilesystem
->shouldReceive('get')
->andReturn(file_get_contents(__DIR__ . '/Models/Simple.php'))
->once();
$mockFilesystem
->shouldReceive('put')
->with(
Mockery::any(),
Mockery::capture($actualContent)
)
->andReturn(1) // Simulate we wrote _something_ to the file
->once();
$this->instance(Filesystem::class, $mockFilesystem);
$command = $this->app->make(ModelsCommand::class); $command = $this->app->make(ModelsCommand::class);
$tester = $this->runCommand($command, [ $tester = $this->runCommand($command, [
@@ -40,6 +60,33 @@ class Test extends AbstractModelsCommand
$this->assertSame(0, $tester->getStatusCode()); $this->assertSame(0, $tester->getStatusCode());
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay()); $this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
$this->assertMatchesMockedSnapshot();
$expectedContent = <<<'PHP'
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Models;
use Illuminate\Database\Eloquent\Model;
/**
*
*
* @property int $id
* @property-read string $custom
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple custom($custom)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple query()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple whereId($value)
* @mixin \Eloquent
*/
class Simple extends Model
{
}
PHP;
$this->assertSame($expectedContent, $actualContent);
} }
} }
@@ -1,20 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Models;
use Illuminate\Database\Eloquent\Model;
/**
* @property int $id
* @property-read string $custom
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple custom($custom)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple query()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple whereId($value)
* @mixin \Eloquent
*/
class Simple extends Model
{
}
@@ -1,11 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\MorphToIntersection\Models;
use Illuminate\Database\Eloquent\Model;
abstract class BaseModel extends Model
{
}
@@ -1,9 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\MorphToIntersection\Models;
interface CanBeAssigned
{
}
@@ -1,31 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\MorphToIntersection\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
class MorphToIntersection extends Model
{
protected $table = 'morphs';
/** @return MorphTo<(BaseModel&CanBeAssigned), $this> */
public function assigneeWithParens(): MorphTo
{
return $this->morphTo(type: 'nullable_relation_morph_to_type', id: 'nullable_relation_morph_to_id');
}
/** @return MorphTo<BaseModel&CanBeAssigned, $this> */
public function assigneeWithoutParens(): MorphTo
{
return $this->morphTo(type: 'nullable_relation_morph_to_type', id: 'nullable_relation_morph_to_id');
}
/** @return MorphTo<(BaseModel&CanBeAssigned), $this> */
public function nonNullableAssignee(): MorphTo
{
return $this->morphTo(type: 'relation_morph_to_type', id: 'relation_morph_to_id');
}
}
@@ -1,24 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\MorphToIntersection;
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
class Test extends AbstractModelsCommand
{
public function test(): void
{
$command = $this->app->make(ModelsCommand::class);
$tester = $this->runCommand($command, [
'--write' => true,
]);
$this->assertSame(0, $tester->getStatusCode());
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
$this->assertMatchesMockedSnapshot();
}
}
@@ -1,48 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\MorphToIntersection\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
/**
* @property string $relation_morph_to_type
* @property int $relation_morph_to_id
* @property string|null $nullable_relation_morph_to_type
* @property int|null $nullable_relation_morph_to_id
* @property-read (BaseModel&CanBeAssigned)|null $assigneeWithParens
* @property-read (BaseModel&CanBeAssigned)|null $assigneeWithoutParens
* @property-read (BaseModel&CanBeAssigned) $nonNullableAssignee
* @method static \Illuminate\Database\Eloquent\Builder<static>|MorphToIntersection newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|MorphToIntersection newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|MorphToIntersection query()
* @method static \Illuminate\Database\Eloquent\Builder<static>|MorphToIntersection whereNullableRelationMorphToId($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|MorphToIntersection whereNullableRelationMorphToType($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|MorphToIntersection whereRelationMorphToId($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|MorphToIntersection whereRelationMorphToType($value)
* @mixin \Eloquent
*/
class MorphToIntersection extends Model
{
protected $table = 'morphs';
/** @return MorphTo<(BaseModel&CanBeAssigned), $this> */
public function assigneeWithParens(): MorphTo
{
return $this->morphTo(type: 'nullable_relation_morph_to_type', id: 'nullable_relation_morph_to_id');
}
/** @return MorphTo<BaseModel&CanBeAssigned, $this> */
public function assigneeWithoutParens(): MorphTo
{
return $this->morphTo(type: 'nullable_relation_morph_to_type', id: 'nullable_relation_morph_to_id');
}
/** @return MorphTo<(BaseModel&CanBeAssigned), $this> */
public function nonNullableAssignee(): MorphTo
{
return $this->morphTo(type: 'relation_morph_to_type', id: 'relation_morph_to_id');
}
}
@@ -8,6 +8,8 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\Relations\MorphTo;
/** /**
*
*
* @property string $relation_morph_to_type * @property string $relation_morph_to_type
* @property int $relation_morph_to_id * @property int $relation_morph_to_id
* @property string|null $nullable_relation_morph_to_type * @property string|null $nullable_relation_morph_to_type
@@ -7,6 +7,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PHPStormNoInspec
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newQuery()
@@ -7,6 +7,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PHPStormNoInspec
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $id * @property int $id
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newQuery()
@@ -1,14 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PhpAttributesBeforeClass\Models;
use Illuminate\Database\Eloquent\Model;
// Tests: final class + attribute with nested array argument (e.g. ObservedBy([...]))
#[ObservedByStub([StubObserver::class])]
final class FinalWithNested extends Model
{
protected $table = 'simples';
}
@@ -1,15 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PhpAttributesBeforeClass\Models;
use Illuminate\Database\Eloquent\Model;
// Tests: multiple consecutive PHP 8 attributes before the class declaration
#[\AllowDynamicProperties]
#[SecondAttribute]
class MultipleAttributes extends Model
{
protected $table = 'simples';
}
@@ -1,12 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PhpAttributesBeforeClass\Models;
use Illuminate\Database\Eloquent\Model;
#[\AllowDynamicProperties]
class Simple extends Model
{
}
@@ -1,24 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PhpAttributesBeforeClass;
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
class Test extends AbstractModelsCommand
{
public function test(): void
{
$command = $this->app->make(ModelsCommand::class);
$tester = $this->runCommand($command, [
'--write' => true,
]);
$this->assertSame(0, $tester->getStatusCode());
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
$this->assertMatchesMockedSnapshot();
}
}
@@ -1,65 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PhpAttributesBeforeClass\Models;
use Illuminate\Database\Eloquent\Model;
// Tests: final class + attribute with nested array argument (e.g. ObservedBy([...]))
/**
* @property int $id
* @method static \Illuminate\Database\Eloquent\Builder<static>|FinalWithNested newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|FinalWithNested newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|FinalWithNested query()
* @method static \Illuminate\Database\Eloquent\Builder<static>|FinalWithNested whereId($value)
* @mixin \Eloquent
*/
#[ObservedByStub([StubObserver::class])]
final class FinalWithNested extends Model
{
protected $table = 'simples';
}
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PhpAttributesBeforeClass\Models;
use Illuminate\Database\Eloquent\Model;
// Tests: multiple consecutive PHP 8 attributes before the class declaration
/**
* @property int $id
* @method static \Illuminate\Database\Eloquent\Builder<static>|MultipleAttributes newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|MultipleAttributes newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|MultipleAttributes query()
* @method static \Illuminate\Database\Eloquent\Builder<static>|MultipleAttributes whereId($value)
* @mixin \Eloquent
*/
#[\AllowDynamicProperties]
#[SecondAttribute]
class MultipleAttributes extends Model
{
protected $table = 'simples';
}
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PhpAttributesBeforeClass\Models;
use Illuminate\Database\Eloquent\Model;
/**
* @property int $id
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple query()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple whereId($value)
* @mixin \Eloquent
*/
#[\AllowDynamicProperties]
class Simple extends Model
{
}
@@ -1,14 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PhpAttributesClosureInAttribute\Models;
use Illuminate\Database\Eloquent\Model;
// Tests: closure expression inside an attribute argument (PHP 8.5+)
#[SomeClosureAttr(fn () => true)]
class ClosureInAttribute extends Model
{
protected $table = 'simples';
}
@@ -1,27 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PhpAttributesClosureInAttribute;
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
class Test extends AbstractModelsCommand
{
/**
* @requires PHP 8.5
*/
public function test(): void
{
$command = $this->app->make(ModelsCommand::class);
$tester = $this->runCommand($command, [
'--write' => true,
]);
$this->assertSame(0, $tester->getStatusCode());
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
$this->assertMatchesMockedSnapshot();
}
}
@@ -1,22 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\PhpAttributesClosureInAttribute\Models;
use Illuminate\Database\Eloquent\Model;
// Tests: closure expression inside an attribute argument (PHP 8.5+)
/**
* @property int $id
* @method static \Illuminate\Database\Eloquent\Builder<static>|ClosureInAttribute newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|ClosureInAttribute newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|ClosureInAttribute query()
* @method static \Illuminate\Database\Eloquent\Builder<static>|ClosureInAttribute whereId($value)
* @mixin \Eloquent
*/
#[SomeClosureAttr(fn() => true)]
class ClosureInAttribute extends Model
{
protected $table = 'simples';
}
@@ -9,24 +9,21 @@ use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Pivot\Models\Pivots\Di
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property-read DifferentCustomPivot|CustomPivot|null $pivot * @property-read DifferentCustomPivot|CustomPivot|null $pivot
* @property-read \Illuminate\Database\Eloquent\Collection<int, ModelWithPivot> $relationCustomPivotUsingSameAccessor * @property-read \Illuminate\Database\Eloquent\Collection<int, ModelWithPivot> $relationCustomPivotUsingSameAccessor
* @property-read int|null $relation_custom_pivot_using_same_accessor_count * @property-read int|null $relation_custom_pivot_using_same_accessor_count
* @property-read bool|null $relation_custom_pivot_using_same_accessor_exists
* @property-read \Illuminate\Database\Eloquent\Collection<int, ModelWithPivot> $relationCustomPivotUsingSameAccessorAndClass * @property-read \Illuminate\Database\Eloquent\Collection<int, ModelWithPivot> $relationCustomPivotUsingSameAccessorAndClass
* @property-read int|null $relation_custom_pivot_using_same_accessor_and_class_count * @property-read int|null $relation_custom_pivot_using_same_accessor_and_class_count
* @property-read bool|null $relation_custom_pivot_using_same_accessor_and_class_exists
* @property-read CustomPivot|null $customAccessor * @property-read CustomPivot|null $customAccessor
* @property-read \Illuminate\Database\Eloquent\Collection<int, ModelWithPivot> $relationWithCustomPivot * @property-read \Illuminate\Database\Eloquent\Collection<int, ModelWithPivot> $relationWithCustomPivot
* @property-read int|null $relation_with_custom_pivot_count * @property-read int|null $relation_with_custom_pivot_count
* @property-read bool|null $relation_with_custom_pivot_exists
* @property-read DifferentCustomPivot|null $differentCustomAccessor * @property-read DifferentCustomPivot|null $differentCustomAccessor
* @property-read \Illuminate\Database\Eloquent\Collection<int, ModelWithPivot> $relationWithDifferentCustomPivot * @property-read \Illuminate\Database\Eloquent\Collection<int, ModelWithPivot> $relationWithDifferentCustomPivot
* @property-read int|null $relation_with_different_custom_pivot_count * @property-read int|null $relation_with_different_custom_pivot_count
* @property-read bool|null $relation_with_different_custom_pivot_exists
* @property-read \Illuminate\Database\Eloquent\Collection<int, ModelWithPivot> $relationWithDifferentCustomPivotUsingSameAccessor * @property-read \Illuminate\Database\Eloquent\Collection<int, ModelWithPivot> $relationWithDifferentCustomPivotUsingSameAccessor
* @property-read int|null $relation_with_different_custom_pivot_using_same_accessor_count * @property-read int|null $relation_with_different_custom_pivot_using_same_accessor_count
* @property-read bool|null $relation_with_different_custom_pivot_using_same_accessor_exists
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithPivot newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithPivot newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithPivot newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithPivot newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithPivot query() * @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithPivot query()
@@ -78,6 +75,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Pivot\Models\Piv
use Illuminate\Database\Eloquent\Relations\Pivot; use Illuminate\Database\Eloquent\Relations\Pivot;
/** /**
*
*
* @method static \Illuminate\Database\Eloquent\Builder<static>|CustomPivot newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|CustomPivot newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|CustomPivot newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|CustomPivot newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|CustomPivot query() * @method static \Illuminate\Database\Eloquent\Builder<static>|CustomPivot query()
@@ -95,6 +94,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Pivot\Models\Piv
use Illuminate\Database\Eloquent\Relations\Pivot; use Illuminate\Database\Eloquent\Relations\Pivot;
/** /**
*
*
* @method static \Illuminate\Database\Eloquent\Builder<static>|DifferentCustomPivot newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|DifferentCustomPivot newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|DifferentCustomPivot newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|DifferentCustomPivot newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|DifferentCustomPivot query() * @method static \Illuminate\Database\Eloquent\Builder<static>|DifferentCustomPivot query()
@@ -1,11 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\QueryMethods\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
}
@@ -1,32 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\QueryMethods;
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
class Test extends AbstractModelsCommand
{
protected function getEnvironmentSetUp($app)
{
parent::getEnvironmentSetUp($app);
$app['config']->set('ide-helper.write_query_methods', false);
}
public function test(): void
{
$command = $this->app->make(ModelsCommand::class);
$tester = $this->runCommand($command, [
'--write' => true,
]);
$this->assertSame(0, $tester->getStatusCode());
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
$this->assertMatchesMockedSnapshot();
$this->assertStringNotContainsString("@method static \Illuminate\Database\Eloquent\Builder<static>|Post query()", $this->mockFilesystemOutput);
}
}
@@ -1,156 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\QueryMethods\Models;
use Illuminate\Database\Eloquent\Model;
/**
* @property int $id
* @property string|null $char_nullable
* @property string $char_not_nullable
* @property string|null $string_nullable
* @property string $string_not_nullable
* @property string|null $text_nullable
* @property string $text_not_nullable
* @property string|null $medium_text_nullable
* @property string $medium_text_not_nullable
* @property string|null $long_text_nullable
* @property string $long_text_not_nullable
* @property int|null $integer_nullable
* @property int $integer_not_nullable
* @property int|null $tiny_integer_nullable
* @property int $tiny_integer_not_nullable
* @property int|null $small_integer_nullable
* @property int $small_integer_not_nullable
* @property int|null $medium_integer_nullable
* @property int $medium_integer_not_nullable
* @property int|null $big_integer_nullable
* @property int $big_integer_not_nullable
* @property int|null $unsigned_integer_nullable
* @property int $unsigned_integer_not_nullable
* @property int|null $unsigned_tiny_integer_nullable
* @property int $unsigned_tiny_integer_not_nullable
* @property int|null $unsigned_small_integer_nullable
* @property int $unsigned_small_integer_not_nullable
* @property int|null $unsigned_medium_integer_nullable
* @property int $unsigned_medium_integer_not_nullable
* @property int|null $unsigned_big_integer_nullable
* @property int $unsigned_big_integer_not_nullable
* @property float|null $float_nullable
* @property float $float_not_nullable
* @property float|null $double_nullable
* @property float $double_not_nullable
* @property numeric|null $decimal_nullable
* @property numeric $decimal_not_nullable
* @property int|null $boolean_nullable
* @property int $boolean_not_nullable
* @property string|null $enum_nullable
* @property string $enum_not_nullable
* @property string|null $json_nullable
* @property string $json_not_nullable
* @property string|null $jsonb_nullable
* @property string $jsonb_not_nullable
* @property string|null $date_nullable
* @property string $date_not_nullable
* @property string|null $datetime_nullable
* @property string $datetime_not_nullable
* @property string|null $datetimetz_nullable
* @property string $datetimetz_not_nullable
* @property string|null $time_nullable
* @property string $time_not_nullable
* @property string|null $timetz_nullable
* @property string $timetz_not_nullable
* @property string|null $timestamp_nullable
* @property string $timestamp_not_nullable
* @property string|null $timestamptz_nullable
* @property string $timestamptz_not_nullable
* @property int|null $year_nullable
* @property int $year_not_nullable
* @property string|null $binary_nullable
* @property string $binary_not_nullable
* @property string|null $uuid_nullable
* @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable
* @property string $ipaddress_not_nullable
* @property string|null $macaddress_nullable
* @property string $macaddress_not_nullable
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereBigIntegerNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereBigIntegerNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereBinaryNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereBinaryNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereBooleanNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereBooleanNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereCharNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereCharNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereDateNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereDateNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereDatetimeNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereDatetimeNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereDatetimetzNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereDatetimetzNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereDecimalNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereDecimalNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereDoubleNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereDoubleNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereEnumNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereEnumNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereFloatNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereFloatNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereIntegerNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereIntegerNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereIpaddressNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereIpaddressNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereJsonNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereJsonNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereJsonbNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereJsonbNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereLongTextNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereLongTextNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereMacaddressNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereMacaddressNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereMediumIntegerNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereMediumIntegerNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereMediumTextNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereMediumTextNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereSmallIntegerNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereSmallIntegerNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereStringNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereStringNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTextNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTextNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTimeNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTimeNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTimestampNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTimestampNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTimestamptzNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTimestamptzNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTimetzNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTimetzNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTinyIntegerNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereTinyIntegerNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUnsignedBigIntegerNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUnsignedBigIntegerNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUnsignedIntegerNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUnsignedIntegerNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUnsignedMediumIntegerNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUnsignedMediumIntegerNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUnsignedSmallIntegerNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUnsignedSmallIntegerNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUnsignedTinyIntegerNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUnsignedTinyIntegerNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUuidNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereUuidNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereYearNotNullable($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post whereYearNullable($value)
* @mixin \Eloquent
*/
class Post extends Model
{
}
@@ -1,33 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\QueryScopes\Models;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
/**
* @comment Scope using the 'Scope' attribute
* @param Builder $query
* @return void
*/
#[Scope]
protected function local(Builder $query): void
{
$query->where('ip_address', '127.0.0.1');
}
/**
* @comment Scope using the 'scope' prefix
* @param Builder $query
* @return void
*/
protected function scopeSystem(Builder $query): void
{
$query->where('system', true);
}
}
@@ -4,48 +4,9 @@ declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\QueryScopes\Models; namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\QueryScopes\Models;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
/**
* @method static Builder<static>|Comment local() Scope using the 'Scope' attribute
* @method static Builder<static>|Comment newModelQuery()
* @method static Builder<static>|Comment newQuery()
* @method static Builder<static>|Comment query()
* @method static Builder<static>|Comment system() Scope using the 'scope' prefix
* @mixin \Eloquent
*/
class Comment extends Model
{
/**
* @comment Scope using the 'Scope' attribute
* @param Builder $query
* @return void
*/
#[Scope]
protected function local(Builder $query): void
{
$query->where('ip_address', '127.0.0.1');
}
/**
* @comment Scope using the 'scope' prefix
* @param Builder $query
* @return void
*/
protected function scopeSystem(Builder $query): void
{
$query->where('system', true);
}
}
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\QueryScopes\Models;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -81,8 +42,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\QueryScopes\Mode
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -211,6 +172,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\QueryScopes\Mode
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @method static \Illuminate\Database\Eloquent\Builder<static>|PostParent active() * @method static \Illuminate\Database\Eloquent\Builder<static>|PostParent active()
* @method static \Illuminate\Database\Eloquent\Builder<static>|PostParent newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|PostParent newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|PostParent newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|PostParent newQuery()
@@ -14,7 +14,6 @@ class Test extends AbstractModelsCommand
parent::getEnvironmentSetUp($app); parent::getEnvironmentSetUp($app);
$app['config']->set('ide-helper.write_model_relation_count_properties', false); $app['config']->set('ide-helper.write_model_relation_count_properties', false);
$app['config']->set('ide-helper.write_model_relation_exists_properties', false);
} }
public function test(): void public function test(): void
@@ -8,6 +8,8 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
/** /**
*
*
* @property int $id * @property int $id
* @property string|null $char_nullable * @property string|null $char_nullable
* @property string $char_not_nullable * @property string $char_not_nullable
@@ -43,8 +45,8 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
* @property float $float_not_nullable * @property float $float_not_nullable
* @property float|null $double_nullable * @property float|null $double_nullable
* @property float $double_not_nullable * @property float $double_not_nullable
* @property numeric|null $decimal_nullable * @property string|null $decimal_nullable
* @property numeric $decimal_not_nullable * @property string $decimal_not_nullable
* @property int|null $boolean_nullable * @property int|null $boolean_nullable
* @property int $boolean_not_nullable * @property int $boolean_not_nullable
* @property string|null $enum_nullable * @property string|null $enum_nullable
@@ -8,6 +8,8 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
/** /**
*
*
* @property int $id * @property int $id
* @property int $not_null_column_with_foreign_key_constraint * @property int $not_null_column_with_foreign_key_constraint
* @property int $not_null_column_with_no_foreign_key_constraint * @property int $not_null_column_with_no_foreign_key_constraint
@@ -59,6 +61,8 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
/** /**
*
*
* @property int $id * @property int $id
* @property int $not_null_column_with_foreign_key_constraint * @property int $not_null_column_with_foreign_key_constraint
* @property int $not_null_column_with_no_foreign_key_constraint * @property int $not_null_column_with_no_foreign_key_constraint
@@ -128,39 +132,33 @@ use Illuminate\Database\Eloquent\Relations\MorphTo;
use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Database\Eloquent\Relations\MorphToMany;
/** /**
*
*
* @property int $id * @property int $id
* @property-read Simple $relationBelongsTo * @property-read Simple $relationBelongsTo
* @property-read AnotherModel $relationBelongsToInAnotherNamespace * @property-read AnotherModel $relationBelongsToInAnotherNamespace
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToMany * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToMany
* @property-read int|null $relation_belongs_to_many_count * @property-read int|null $relation_belongs_to_many_count
* @property-read bool|null $relation_belongs_to_many_exists
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToManyWithSub * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToManyWithSub
* @property-read int|null $relation_belongs_to_many_with_sub_count * @property-read int|null $relation_belongs_to_many_with_sub_count
* @property-read bool|null $relation_belongs_to_many_with_sub_exists
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToManyWithSubAnother * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToManyWithSubAnother
* @property-read int|null $relation_belongs_to_many_with_sub_another_count * @property-read int|null $relation_belongs_to_many_with_sub_another_count
* @property-read bool|null $relation_belongs_to_many_with_sub_another_exists
* @property-read AnotherModel $relationBelongsToSameNameAsColumn * @property-read AnotherModel $relationBelongsToSameNameAsColumn
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationHasMany * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationHasMany
* @property-read int|null $relation_has_many_count * @property-read int|null $relation_has_many_count
* @property-read bool|null $relation_has_many_exists
* @property-read Simple|null $relationHasOne * @property-read Simple|null $relationHasOne
* @property-read Simple $relationHasOneWithDefault * @property-read Simple $relationHasOneWithDefault
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationMorphMany * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationMorphMany
* @property-read int|null $relation_morph_many_count * @property-read int|null $relation_morph_many_count
* @property-read bool|null $relation_morph_many_exists
* @property-read Simple|null $relationMorphOne * @property-read Simple|null $relationMorphOne
* @property-read Model|\Eloquent $relationMorphTo * @property-read Model|\Eloquent $relationMorphTo
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationMorphedByMany * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationMorphedByMany
* @property-read int|null $relation_morphed_by_many_count * @property-read int|null $relation_morphed_by_many_count
* @property-read bool|null $relation_morphed_by_many_exists
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationSampleRelationType * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationSampleRelationType
* @property-read int|null $relation_sample_relation_type_count * @property-read int|null $relation_sample_relation_type_count
* @property-read bool|null $relation_sample_relation_type_exists
* @property-read Model|\Eloquent $relationSampleToAnyMorphedRelationType * @property-read Model|\Eloquent $relationSampleToAnyMorphedRelationType
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationSampleToAnyRelationType * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationSampleToAnyRelationType
* @property-read int|null $relation_sample_to_any_relation_type_count * @property-read int|null $relation_sample_to_any_relation_type_count
* @property-read bool|null $relation_sample_to_any_relation_type_exists
* @property-read Simple $relationSampleToBadlyNamedNotManyRelation * @property-read Simple $relationSampleToBadlyNamedNotManyRelation
* @property-read Simple $relationSampleToManyRelationType * @property-read Simple $relationSampleToManyRelationType
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery()
@@ -8,6 +8,8 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
/** /**
*
*
* @property int $id * @property int $id
* @property int $not_null_column_with_foreign_key_constraint * @property int $not_null_column_with_foreign_key_constraint
* @property int $not_null_column_with_no_foreign_key_constraint * @property int $not_null_column_with_no_foreign_key_constraint
@@ -59,6 +61,8 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
/** /**
*
*
* @property int $id * @property int $id
* @property int $not_null_column_with_foreign_key_constraint * @property int $not_null_column_with_foreign_key_constraint
* @property int $not_null_column_with_no_foreign_key_constraint * @property int $not_null_column_with_no_foreign_key_constraint
@@ -128,39 +132,33 @@ use Illuminate\Database\Eloquent\Relations\MorphTo;
use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Database\Eloquent\Relations\MorphToMany;
/** /**
*
*
* @property int $id * @property int $id
* @property-read Simple|null $relationBelongsTo * @property-read Simple|null $relationBelongsTo
* @property-read AnotherModel|null $relationBelongsToInAnotherNamespace * @property-read AnotherModel|null $relationBelongsToInAnotherNamespace
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToMany * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToMany
* @property-read int|null $relation_belongs_to_many_count * @property-read int|null $relation_belongs_to_many_count
* @property-read bool|null $relation_belongs_to_many_exists
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToManyWithSub * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToManyWithSub
* @property-read int|null $relation_belongs_to_many_with_sub_count * @property-read int|null $relation_belongs_to_many_with_sub_count
* @property-read bool|null $relation_belongs_to_many_with_sub_exists
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToManyWithSubAnother * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationBelongsToManyWithSubAnother
* @property-read int|null $relation_belongs_to_many_with_sub_another_count * @property-read int|null $relation_belongs_to_many_with_sub_another_count
* @property-read bool|null $relation_belongs_to_many_with_sub_another_exists
* @property-read AnotherModel|null $relationBelongsToSameNameAsColumn * @property-read AnotherModel|null $relationBelongsToSameNameAsColumn
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationHasMany * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationHasMany
* @property-read int|null $relation_has_many_count * @property-read int|null $relation_has_many_count
* @property-read bool|null $relation_has_many_exists
* @property-read Simple|null $relationHasOne * @property-read Simple|null $relationHasOne
* @property-read Simple $relationHasOneWithDefault * @property-read Simple $relationHasOneWithDefault
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationMorphMany * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationMorphMany
* @property-read int|null $relation_morph_many_count * @property-read int|null $relation_morph_many_count
* @property-read bool|null $relation_morph_many_exists
* @property-read Simple|null $relationMorphOne * @property-read Simple|null $relationMorphOne
* @property-read Model|\Eloquent $relationMorphTo * @property-read Model|\Eloquent $relationMorphTo
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationMorphedByMany * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationMorphedByMany
* @property-read int|null $relation_morphed_by_many_count * @property-read int|null $relation_morphed_by_many_count
* @property-read bool|null $relation_morphed_by_many_exists
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationSampleRelationType * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationSampleRelationType
* @property-read int|null $relation_sample_relation_type_count * @property-read int|null $relation_sample_relation_type_count
* @property-read bool|null $relation_sample_relation_type_exists
* @property-read Model|\Eloquent $relationSampleToAnyMorphedRelationType * @property-read Model|\Eloquent $relationSampleToAnyMorphedRelationType
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationSampleToAnyRelationType * @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationSampleToAnyRelationType
* @property-read int|null $relation_sample_to_any_relation_type_count * @property-read int|null $relation_sample_to_any_relation_type_count
* @property-read bool|null $relation_sample_to_any_relation_type_exists
* @property-read Simple $relationSampleToBadlyNamedNotManyRelation * @property-read Simple $relationSampleToBadlyNamedNotManyRelation
* @property-read Simple $relationSampleToManyRelationType * @property-read Simple $relationSampleToManyRelationType
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery()
@@ -7,6 +7,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\SimpleCasts\Mode
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/** /**
*
*
* @property int $cast_to_int * @property int $cast_to_int
* @property int $cast_to_integer * @property int $cast_to_integer
* @property float $cast_to_real * @property float $cast_to_real
@@ -31,7 +33,7 @@ use Illuminate\Database\Eloquent\Model;
* @property \Carbon\CarbonImmutable $cast_to_immutable_datetime * @property \Carbon\CarbonImmutable $cast_to_immutable_datetime
* @property \Carbon\CarbonImmutable $cast_to_immutable_datetime_serialization * @property \Carbon\CarbonImmutable $cast_to_immutable_datetime_serialization
* @property int $cast_to_timestamp * @property int $cast_to_timestamp
* @property string $cast_to_encrypted * @property mixed $cast_to_encrypted
* @property array<array-key, mixed> $cast_to_encrypted_array * @property array<array-key, mixed> $cast_to_encrypted_array
* @property \Illuminate\Support\Collection<array-key, mixed> $cast_to_encrypted_collection * @property \Illuminate\Support\Collection<array-key, mixed> $cast_to_encrypted_collection
* @property array<array-key, mixed> $cast_to_encrypted_json * @property array<array-key, mixed> $cast_to_encrypted_json
@@ -8,13 +8,15 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
/** /**
*
*
* @property int $id * @property int $id
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newQuery() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple newQuery()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple onlyTrashed()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple query() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple query()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple whereId($value) * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple withTrashed(bool $withTrashed = true) * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder<static>|Simple withoutTrashed()
* @mixin \Eloquent * @mixin \Eloquent
*/ */
@@ -1,34 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\SoftDeletesRelations\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOne;
class ModelWithRelations extends Model
{
protected $table = 'models_with_relations';
public function softDeletable(): BelongsTo
{
return $this->belongsTo(SoftDeletableModel::class, 'soft_deletable_model_id');
}
public function nonSoftDeletable(): BelongsTo
{
return $this->belongsTo(NonSoftDeletableModel::class, 'non_soft_deletable_model_id');
}
public function softDeletableHasOne(): HasOne
{
return $this->hasOne(SoftDeletableModel::class, 'model_with_relations_id');
}
public function nonSoftDeletableHasOne(): HasOne
{
return $this->hasOne(NonSoftDeletableModel::class, 'model_with_relations_id');
}
}
@@ -1,11 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\SoftDeletesRelations\Models;
use Illuminate\Database\Eloquent\Model;
class NonSoftDeletableModel extends Model
{
}
@@ -1,13 +0,0 @@
<?php
declare(strict_types=1);
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\SoftDeletesRelations\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class SoftDeletableModel extends Model
{
use SoftDeletes;
}

Some files were not shown because too many files have changed in this diff Show More