mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 18:13:11 +00:00
Compare commits
325
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4434dfc550 | ||
|
|
8fed0af7b1 | ||
|
|
800e2347a6 | ||
|
|
7549f58a30 | ||
|
|
7740b80704 | ||
|
|
d6fb7907cc | ||
|
|
dc70337e48 | ||
|
|
4b051e45c7 | ||
|
|
7956ccb494 | ||
|
|
2acec73fdd | ||
|
|
085ca3e225 | ||
|
|
ec61b82178 | ||
|
|
d3965aaab5 | ||
|
|
4f588b9782 | ||
|
|
643329d23d | ||
|
|
07719015b3 | ||
|
|
7d2ea97f25 | ||
|
|
51fb97b8fb | ||
|
|
591e7d665f | ||
|
|
2dba19133c | ||
|
|
001091e605 | ||
|
|
ccac27c8cf | ||
|
|
f5759e2001 | ||
|
|
f7a3dc8ff2 | ||
|
|
672acce5ae | ||
|
|
67c00c0978 | ||
|
|
a1573919c1 | ||
|
|
0cf178aca9 | ||
|
|
c6509b658f | ||
|
|
6338abb2d7 | ||
|
|
ac7e186270 | ||
|
|
bc1d67f01c | ||
|
|
8eab699835 | ||
|
|
49ac75d805 | ||
|
|
02af2a278a | ||
|
|
d7ed749f3e | ||
|
|
9af62e243d | ||
|
|
05259b695d | ||
|
|
8bfe918f65 | ||
|
|
6579c0332b | ||
|
|
ed39977a30 | ||
|
|
bcc233280b | ||
|
|
77831852bb | ||
|
|
b47a118300 | ||
|
|
dca3ebe81e | ||
|
|
c119e89cf0 | ||
|
|
bc158a1b86 | ||
|
|
341c0ab89f | ||
|
|
cee441c87c | ||
|
|
9343d3a1cc | ||
|
|
f12d933ab1 | ||
|
|
4751420c9e | ||
|
|
6115100a0f | ||
|
|
5c886fb653 | ||
|
|
7d69dc6ea0 | ||
|
|
62fc436c4c | ||
|
|
409bbf665b | ||
|
|
2535f8e6ab | ||
|
|
16548fc878 | ||
|
|
872b470d9b | ||
|
|
04c1a8d444 | ||
|
|
c290af858d | ||
|
|
f64ff9c0b1 | ||
|
|
f3ad134242 | ||
|
|
9d14b019f6 | ||
|
|
f4656256fc | ||
|
|
cc9ed4423b | ||
|
|
512612f22f | ||
|
|
115068e57b | ||
|
|
a8b34ad228 | ||
|
|
485c756f6c | ||
|
|
cf4687f98c | ||
|
|
e65d30b27a | ||
|
|
416e0ab243 | ||
|
|
9374952402 | ||
|
|
850fc5fe7f | ||
|
|
726e595578 | ||
|
|
6336db0548 | ||
|
|
21352a1e48 | ||
|
|
390874207f | ||
|
|
3cdd3af631 | ||
|
|
c751d3e176 | ||
|
|
1a3affd4f8 | ||
|
|
0801d002e4 | ||
|
|
edc422cd2e | ||
|
|
4dc20b028a | ||
|
|
39885645b9 | ||
|
|
aa1aa66ee6 | ||
|
|
b70a9f5048 | ||
|
|
9f97f7cd5f | ||
|
|
97fd0e0a2d | ||
|
|
9f5670b7e9 | ||
|
|
1d302435ef | ||
|
|
81d5b223ff | ||
|
|
ce24d4b013 | ||
|
|
edfb05621c | ||
|
|
f0e4cf5e78 | ||
|
|
5d9925bab8 | ||
|
|
9e50460017 | ||
|
|
b55769213c | ||
|
|
f055d42b39 | ||
|
|
dda200fd34 | ||
|
|
e8ecb3da88 | ||
|
|
e49c4556dd | ||
|
|
2c96c45d5e | ||
|
|
532ae5bec3 | ||
|
|
c8f0f914e3 | ||
|
|
07f5eaea73 | ||
|
|
c76fbb5b61 | ||
|
|
c40fee2a3f | ||
|
|
5eadd2c7de | ||
|
|
6e26f22c76 | ||
|
|
ee9188acf1 | ||
|
|
a567f73140 | ||
|
|
6a461a7c47 | ||
|
|
3ba1e2573b | ||
|
|
6b58c23e6f | ||
|
|
6041681495 | ||
|
|
ddb74fb5c8 | ||
|
|
7917cce7c9 | ||
|
|
6627cb9587 | ||
|
|
3b03e4055d | ||
|
|
a227fca325 | ||
|
|
999167d4c2 | ||
|
|
2673bf4889 | ||
|
|
771770e56c | ||
|
|
88353535f2 | ||
|
|
acb2df9dfb | ||
|
|
7052b4f708 | ||
|
|
ac1e27167d | ||
|
|
de64d665e0 | ||
|
|
93d987336b | ||
|
|
744a9cf380 | ||
|
|
f2a7f9d84f | ||
|
|
29dd57e1e2 | ||
|
|
6244a931a0 | ||
|
|
ebea96213d | ||
|
|
01be015f86 | ||
|
|
a091b9c94a | ||
|
|
dd12b7cdcb | ||
|
|
ae48e1e467 | ||
|
|
c733bde1ea | ||
|
|
52a4b64656 | ||
|
|
b268871c16 | ||
|
|
2fc239623b | ||
|
|
37f08320ea | ||
|
|
b6871d09a4 | ||
|
|
3b75048d12 | ||
|
|
b162347aff | ||
|
|
f4e0fc3695 | ||
|
|
af84c78dec | ||
|
|
e71f3d5fc0 | ||
|
|
df670747c3 | ||
|
|
3a4eee9487 | ||
|
|
eb8c5729ae | ||
|
|
dc5282e9a4 | ||
|
|
c82529babd | ||
|
|
7cf8a51a8b | ||
|
|
73b1012b92 | ||
|
|
ca94ffd99a | ||
|
|
c1ddd30532 | ||
|
|
dcbe6c953f | ||
|
|
867a6fd9b4 | ||
|
|
39a96c3b95 | ||
|
|
057efb0ee7 | ||
|
|
1010cdbd26 | ||
|
|
2f61602e7a | ||
|
|
9fe65e7ed3 | ||
|
|
16a4297992 | ||
|
|
c8ebf563a0 | ||
|
|
843067b907 | ||
|
|
f0f7051012 | ||
|
|
e1af93f43b | ||
|
|
b19b1d69ba | ||
|
|
92d7f2e706 | ||
|
|
f0c138c4fd | ||
|
|
b8d5fc3663 | ||
|
|
df994eb767 | ||
|
|
0cae143470 | ||
|
|
c2dec69d64 | ||
|
|
dedd69e8b4 | ||
|
|
40c02c524d | ||
|
|
04c1139223 | ||
|
|
172e430c12 | ||
|
|
244e936b74 | ||
|
|
f7f7e9e65a | ||
|
|
1a813703fe | ||
|
|
d58731cd9b | ||
|
|
b246d9ab23 | ||
|
|
8d8302ff6a | ||
|
|
202395b50f | ||
|
|
c5c9b2b951 | ||
|
|
c5e18beff1 | ||
|
|
6c4dcd9049 | ||
|
|
aaade4eab9 | ||
|
|
b21324b20e | ||
|
|
db83fb8b6b | ||
|
|
4f42af1fa1 | ||
|
|
f0959c1184 | ||
|
|
73c502d5c5 | ||
|
|
3376522d68 | ||
|
|
a83df51ad4 | ||
|
|
fd30d1190d | ||
|
|
4f13ba85bd | ||
|
|
0fee1c47d3 | ||
|
|
64a6b90258 | ||
|
|
25cc68c75f | ||
|
|
36c4406b3a | ||
|
|
9ba2f5c557 | ||
|
|
5515cabea3 | ||
|
|
9859958cfa | ||
|
|
ae5d7708b7 | ||
|
|
113545bc1a | ||
|
|
ff54a20d21 | ||
|
|
db53e8e2b5 | ||
|
|
b3a79fe6c1 | ||
|
|
b4138e5122 | ||
|
|
c4d1f780b0 | ||
|
|
317889805b | ||
|
|
ca0cf7355a | ||
|
|
336ae44ef2 | ||
|
|
0168e7256b | ||
|
|
1044f466e9 | ||
|
|
fd4d280a80 | ||
|
|
2ff9672a49 | ||
|
|
00ee13e0cf | ||
|
|
4ef3876b94 | ||
|
|
5db6029f2c | ||
|
|
2a3c7fb087 | ||
|
|
b677af89c2 | ||
|
|
594534ec5a | ||
|
|
7305504c99 | ||
|
|
186340bedc | ||
|
|
4aa2e6a576 | ||
|
|
9baf93a502 | ||
|
|
affa55122f | ||
|
|
b7d84785b1 | ||
|
|
4df96b5e62 | ||
|
|
3a22b8daf6 | ||
|
|
24596b67f1 | ||
|
|
d978986523 | ||
|
|
3ea232dc3a | ||
|
|
007d3adb68 | ||
|
|
764bc02b84 | ||
|
|
a96add6981 | ||
|
|
4a6d127440 | ||
|
|
1ca875fbca | ||
|
|
462989abd5 | ||
|
|
bd5b6ecee7 | ||
|
|
3b66fea925 | ||
|
|
707ec990e7 | ||
|
|
a49cb46fdf | ||
|
|
a12f902b33 | ||
|
|
8287f02afa | ||
|
|
1d9e82f2b7 | ||
|
|
9599cfbbc9 | ||
|
|
c852650d7e | ||
|
|
ac6fbffac3 | ||
|
|
1ad23fd14c | ||
|
|
444325205e | ||
|
|
c760c9aa0c | ||
|
|
ce4186c1c7 | ||
|
|
ba95d18ef5 | ||
|
|
4b459d3e82 | ||
|
|
9e5c7e0887 | ||
|
|
ead6d4f89b | ||
|
|
1b5881c1e2 | ||
|
|
e8044dc920 | ||
|
|
4ffda148ce | ||
|
|
6cb0201476 | ||
|
|
f3d841c0a3 | ||
|
|
9562bf59d9 | ||
|
|
e2547b8596 | ||
|
|
eaf4a00eae | ||
|
|
e1940c25bc | ||
|
|
0531a58d24 | ||
|
|
07d45d2d7a | ||
|
|
cca99b6d25 | ||
|
|
6ec4f7baf9 | ||
|
|
7298d6e965 | ||
|
|
dbd98fdca3 | ||
|
|
3e02746778 | ||
|
|
3197aab841 | ||
|
|
bbf329b995 | ||
|
|
4aa919c09f | ||
|
|
4cd3362dfd | ||
|
|
ea17a4076b | ||
|
|
5402b5ebfa | ||
|
|
545298c44d | ||
|
|
3381123e71 | ||
|
|
94948e4f2c | ||
|
|
b9293420c3 | ||
|
|
6f20800eef | ||
|
|
7203ebee24 | ||
|
|
d35ea6e1d4 | ||
|
|
f3e48cbcce | ||
|
|
7515cd206d | ||
|
|
8e34870e2a | ||
|
|
b7197aec89 | ||
|
|
378adeb1f5 | ||
|
|
5f677edc14 | ||
|
|
1b611d7f80 | ||
|
|
a233d5bd5a | ||
|
|
cfa9a81d65 | ||
|
|
dcf76c1a81 | ||
|
|
bef8158d02 | ||
|
|
8381a2ebdd | ||
|
|
6bab45b8c2 | ||
|
|
2617352869 | ||
|
|
ce275a9bf2 | ||
|
|
b7b835bf09 | ||
|
|
b0481aef33 | ||
|
|
f80887914b | ||
|
|
f4ae4c4b45 | ||
|
|
6a27c5df68 | ||
|
|
7be6afbe5f | ||
|
|
b72689755b | ||
|
|
3cc7d7ccf6 | ||
|
|
18588eacf3 | ||
|
|
da59650fb2 | ||
|
|
fe2890925e | ||
|
|
1d1484025c | ||
|
|
0692626c41 | ||
|
|
90437012b8 | ||
|
|
e743f44011 |
+11
-5
@@ -2,8 +2,14 @@
|
|||||||
# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
|
# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
|
||||||
|
|
||||||
# Ignore all test and documentation with "export-ignore".
|
# Ignore all test and documentation with "export-ignore".
|
||||||
/.gitattributes export-ignore
|
/.editorconfig export-ignore
|
||||||
/.gitignore export-ignore
|
/.gitattributes export-ignore
|
||||||
/.travis.yml export-ignore
|
/.github export-ignore
|
||||||
/phpunit.xml.dist export-ignore
|
/.gitignore export-ignore
|
||||||
/tests 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
|
||||||
|
/psalm-baseline.xml export-ignore
|
||||||
|
/psalm.xml export-ignore
|
||||||
|
/tests export-ignore
|
||||||
|
|||||||
+2
-9
@@ -1,12 +1,5 @@
|
|||||||
# These are supported funding model platforms
|
# These are supported funding model platforms
|
||||||
|
|
||||||
github: barryvdh
|
github: barryvdh
|
||||||
patreon: # Replace with a single Patreon username
|
custom: ['https://fruitcake.nl']
|
||||||
open_collective: # Replace with a single Open Collective username
|
|
||||||
ko_fi: # Replace with a single Ko-fi username
|
|
||||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
|
||||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
|
||||||
liberapay: # Replace with a single Liberapay username
|
|
||||||
issuehunt: # Replace with a single IssueHunt username
|
|
||||||
otechie: # Replace with a single Otechie username
|
|
||||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
name: "🐛 Bug Report"
|
||||||
|
about: 'Report a general bug.'
|
||||||
|
labels: bug
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Versions:
|
||||||
|
- ide-helper Version: #.#.#
|
||||||
|
- Laravel Version: #.#.# <!-- remove if not applicable -->
|
||||||
|
- PHP Version: #.#.#
|
||||||
|
|
||||||
|
### Description:
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Please describe in detail the nature of the bug, code samples, etc.
|
||||||
|
|
||||||
|
The more, the better.
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Steps To Reproduce:
|
||||||
|
|
||||||
|
- …
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
name: "✨ Feature request"
|
||||||
|
about: 'Suggest a new feature or other improvements.'
|
||||||
|
labels: enhancement
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Summary
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Describe in detail what you propose, show (preferable) code examples and also signal if you're willing to work on it!
|
||||||
|
-->
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
name: "🙋🏼♂️ Support question"
|
||||||
|
about: 'I need assistance or clarification on usage of this library.'
|
||||||
|
labels: question
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Versions:
|
||||||
|
- ide-helper Version: #.#.#
|
||||||
|
- Laravel Version: #.#.# <!-- remove if not applicable -->
|
||||||
|
- PHP Version: #.#.#
|
||||||
|
|
||||||
|
### Question:
|
||||||
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
## Summary
|
||||||
|
<!-- Please provide an exhaustive description. -->
|
||||||
|
|
||||||
|
## Type of change
|
||||||
|
|
||||||
|
<!-- Please delete options that are not relevant. -->
|
||||||
|
|
||||||
|
- [ ] Bug fix (non-breaking change which fixes an issue)
|
||||||
|
- [ ] New feature (non-breaking change which adds functionality)
|
||||||
|
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
||||||
|
- [ ] This change requires a documentation update
|
||||||
|
- [ ] Misc. change (internal, infrastructure, maintenance, etc.)
|
||||||
|
|
||||||
|
### Checklist
|
||||||
|
- [ ] Existing tests have been adapted and/or new tests have been added
|
||||||
|
- [ ] Add a CHANGELOG.md entry
|
||||||
|
- [ ] Update the README.md
|
||||||
|
- [ ] Code style has been fixed via `composer fix-style`
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: monthly
|
||||||
|
groups:
|
||||||
|
deps:
|
||||||
|
patterns:
|
||||||
|
- '*'
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Number of days of inactivity before an issue becomes stale
|
||||||
|
daysUntilStale: 90
|
||||||
|
# Number of days of inactivity before a stale issue is closed
|
||||||
|
daysUntilClose: 60
|
||||||
|
# Issues with these labels will never be considered stale
|
||||||
|
exemptLabels:
|
||||||
|
- bug
|
||||||
|
- enhancement
|
||||||
|
- discussion
|
||||||
|
# Label to use when marking an issue as stale
|
||||||
|
staleLabel: stale
|
||||||
|
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||||
|
markComment: >
|
||||||
|
This issue has been automatically marked as stale because it has not had
|
||||||
|
recent activity. It will be closed if no further activity occurs.
|
||||||
|
|
||||||
|
If this issue is still present on the latest version of this library on supported Laravel versions,
|
||||||
|
please let us know by replying to this issue so we can investigate further.
|
||||||
|
|
||||||
|
Thank you for your contribution! Apologies for any delayed response on our side.
|
||||||
|
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||||
|
closeComment: false
|
||||||
|
# Limit to only `issues` or `pulls`
|
||||||
|
only: issues
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
name: normalize composer.json
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- .github/workflows/composer-normalize.yml
|
||||||
|
- composer.json
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
normalize:
|
||||||
|
timeout-minutes: 15
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: Git checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Validate Composer configuration
|
||||||
|
run: composer validate --strict
|
||||||
|
|
||||||
|
- name: Normalize composer.json
|
||||||
|
run: |
|
||||||
|
composer global config --no-plugins allow-plugins.ergebnis/composer-normalize true
|
||||||
|
composer global require ergebnis/composer-normalize
|
||||||
|
composer normalize
|
||||||
|
|
||||||
|
- uses: stefanzweifel/git-auto-commit-action@v5
|
||||||
|
with:
|
||||||
|
commit_message: normalize composer.json
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
name: Fix Code Style
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
fix-style:
|
||||||
|
name: Fix Code Style
|
||||||
|
timeout-minutes: 15
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
env:
|
||||||
|
COMPOSER_NO_INTERACTION: 1
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup PHP
|
||||||
|
uses: shivammathur/setup-php@v2
|
||||||
|
with:
|
||||||
|
php-version: 8.3
|
||||||
|
coverage: none
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: composer update --prefer-dist --no-progress
|
||||||
|
|
||||||
|
- run: composer fix-style
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- uses: stefanzweifel/git-auto-commit-action@v5
|
||||||
|
with:
|
||||||
|
commit_message: composer fix-style
|
||||||
|
commit_author: laravel-ide-helper <[email protected]>
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
name: Release Drafter
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
# branches to consider in the event; optional, defaults to all
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
# pull_request event is required only for autolabeler
|
||||||
|
pull_request:
|
||||||
|
# Only following types are handled by the action, but one can default to all as well
|
||||||
|
types: [opened, reopened, synchronize]
|
||||||
|
# pull_request_target event is required for autolabeler to support PRs from forks
|
||||||
|
# pull_request_target:
|
||||||
|
# types: [opened, reopened, synchronize]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update_release_draft:
|
||||||
|
permissions:
|
||||||
|
# write permission is required to create a github release
|
||||||
|
contents: write
|
||||||
|
# write permission is required for autolabeler
|
||||||
|
# otherwise, read permission is required at least
|
||||||
|
pull-requests: write
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
# (Optional) GitHub Enterprise requires GHE_HOST variable set
|
||||||
|
#- name: Set GHE_HOST
|
||||||
|
# run: |
|
||||||
|
# echo "GHE_HOST=${GITHUB_SERVER_URL##https:\/\/}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
# Drafts your next Release notes as Pull Requests are merged into "master"
|
||||||
|
- uses: release-drafter/release-drafter@v6
|
||||||
|
# (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml
|
||||||
|
# with:
|
||||||
|
# config-name: my-config.yml
|
||||||
|
# disable-autolabeler: true
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
name: Integration Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- "*"
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
php-laravel-integration-tests:
|
||||||
|
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]
|
||||||
|
|
||||||
|
name: P${{ matrix.php }} - Laravel${{ matrix.laravel }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
path: src
|
||||||
|
|
||||||
|
- name: Setup PHP
|
||||||
|
uses: shivammathur/setup-php@v2
|
||||||
|
with:
|
||||||
|
php-version: ${{ matrix.php }}
|
||||||
|
coverage: none
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
composer create-project --prefer-dist laravel/laravel:${{ matrix.laravel }} --stability=dev --no-progress sample
|
||||||
|
cd sample
|
||||||
|
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
|
||||||
|
run: |
|
||||||
|
cd sample
|
||||||
|
php artisan ide-helper:generate
|
||||||
|
|
||||||
|
- name: Execute meta run
|
||||||
|
run: |
|
||||||
|
cd sample
|
||||||
|
php artisan ide-helper:meta -v
|
||||||
|
|
||||||
|
- 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
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
name: Run Static Analysis
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
timeout-minutes: 15
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup PHP
|
||||||
|
uses: shivammathur/setup-php@v2
|
||||||
|
with:
|
||||||
|
php-version: 8.3
|
||||||
|
coverage: none
|
||||||
|
extensions: pdo_sqlite
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: composer install --prefer-dist --no-progress --no-suggest
|
||||||
|
|
||||||
|
- name: Analyze
|
||||||
|
run: composer analyze
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
name: Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- "*"
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
php-tests:
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
timeout-minutes: 15
|
||||||
|
env:
|
||||||
|
COMPOSER_NO_INTERACTION: 1
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-22.04, windows-2019]
|
||||||
|
php: [8.4, 8.3, 8.2]
|
||||||
|
laravel: [^11.15]
|
||||||
|
stability: [prefer-lowest, prefer-stable]
|
||||||
|
steps:
|
||||||
|
- name: Set git to use LF
|
||||||
|
if: ${{ matrix.os == 'windows-2019' }}
|
||||||
|
run: |
|
||||||
|
git config --global core.autocrlf false
|
||||||
|
git config --global core.eol lf
|
||||||
|
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup PHP
|
||||||
|
uses: shivammathur/setup-php@v2
|
||||||
|
with:
|
||||||
|
php-version: ${{ matrix.php }}
|
||||||
|
coverage: none
|
||||||
|
extensions: pdo_sqlite, fileinfo
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
composer remove vimeo/psalm --no-update --dev
|
||||||
|
composer remove friendsofphp/php-cs-fixer --no-update --dev
|
||||||
|
composer require "laravel/framework:${{ matrix.laravel }}" --no-update --no-progress
|
||||||
|
composer update --prefer-dist --no-progress --${{ matrix.stability }}
|
||||||
|
|
||||||
|
- name: Execute Unit Tests
|
||||||
|
run: composer test-ci
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
name: "Update Changelog"
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [released]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
# Give the default GITHUB_TOKEN write permission to commit and push the
|
||||||
|
# updated CHANGELOG back to the repository.
|
||||||
|
# https://github.blog/changelog/2023-02-02-github-actions-updating-the-default-github_token-permissions-to-read-only/
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.release.target_commitish }}
|
||||||
|
|
||||||
|
- name: Update Changelog
|
||||||
|
uses: stefanzweifel/changelog-updater-action@v1
|
||||||
|
with:
|
||||||
|
latest-version: ${{ github.event.release.tag_name }}
|
||||||
|
release-notes: ${{ github.event.release.body }}
|
||||||
|
|
||||||
|
- name: Commit updated CHANGELOG
|
||||||
|
uses: stefanzweifel/git-auto-commit-action@v5
|
||||||
|
with:
|
||||||
|
branch: ${{ github.event.release.target_commitish }}
|
||||||
|
commit_message: Update CHANGELOG
|
||||||
|
file_pattern: CHANGELOG.md
|
||||||
+7
-4
@@ -1,5 +1,8 @@
|
|||||||
build
|
|
||||||
vendor
|
|
||||||
composer.lock
|
|
||||||
.idea
|
|
||||||
.phpunit.result.cache
|
.phpunit.result.cache
|
||||||
|
|
||||||
|
/.idea
|
||||||
|
/.php-cs-fixer.cache
|
||||||
|
/.php-cs-fixer.php
|
||||||
|
/.php-cs-fixer.tests.cache
|
||||||
|
/composer.lock
|
||||||
|
/vendor
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// Share common rules between non-test and test files
|
||||||
|
return [
|
||||||
|
'@PSR12' => true,
|
||||||
|
'blank_line_after_opening_tag' => true,
|
||||||
|
'braces' => [
|
||||||
|
'allow_single_line_anonymous_class_with_empty_body' => true,
|
||||||
|
],
|
||||||
|
'compact_nullable_typehint' => true,
|
||||||
|
'declare_equal_normalize' => true,
|
||||||
|
'lowercase_cast' => true,
|
||||||
|
'lowercase_static_reference' => true,
|
||||||
|
'new_with_braces' => true,
|
||||||
|
'no_blank_lines_after_class_opening' => true,
|
||||||
|
'no_leading_import_slash' => true,
|
||||||
|
'no_whitespace_in_blank_line' => true,
|
||||||
|
'ordered_class_elements' => [
|
||||||
|
'order' => [
|
||||||
|
'use_trait',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'ordered_imports' => [
|
||||||
|
'imports_order' => [
|
||||||
|
'class',
|
||||||
|
'function',
|
||||||
|
'const',
|
||||||
|
],
|
||||||
|
'sort_algorithm' => 'alpha',
|
||||||
|
],
|
||||||
|
'return_type_declaration' => true,
|
||||||
|
'short_scalar_cast' => true,
|
||||||
|
'single_trait_insert_per_statement' => true,
|
||||||
|
'ternary_operator_spaces' => true,
|
||||||
|
'visibility_required' => [
|
||||||
|
'elements' => [
|
||||||
|
'const',
|
||||||
|
'method',
|
||||||
|
'property',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
// Further quality-of-life improvements
|
||||||
|
'array_syntax' => [
|
||||||
|
'syntax' => 'short',
|
||||||
|
],
|
||||||
|
'concat_space' => [
|
||||||
|
'spacing' => 'one',
|
||||||
|
],
|
||||||
|
'fully_qualified_strict_types' => true,
|
||||||
|
'native_function_invocation' => [
|
||||||
|
'include' => [],
|
||||||
|
'strict' => true,
|
||||||
|
],
|
||||||
|
'no_unused_imports' => true,
|
||||||
|
'single_quote' => true,
|
||||||
|
'space_after_semicolon' => true,
|
||||||
|
'trailing_comma_in_multiline' => true,
|
||||||
|
'trim_array_spaces' => true,
|
||||||
|
'unary_operator_spaces' => true,
|
||||||
|
'whitespace_after_comma_in_array' => true,
|
||||||
|
];
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?php
|
||||||
|
require __DIR__ . '/vendor/autoload.php';
|
||||||
|
|
||||||
|
$finder = PhpCsFixer\Finder::create()
|
||||||
|
->in(__DIR__)
|
||||||
|
->exclude('tests');
|
||||||
|
|
||||||
|
$config = require __DIR__ . '/.php-cs-fixer.common.php';
|
||||||
|
|
||||||
|
return (new PhpCsFixer\Config())
|
||||||
|
->setFinder($finder)
|
||||||
|
->setRules($config)
|
||||||
|
->setRiskyAllowed(true)
|
||||||
|
->setCacheFile(__DIR__ . '/.php-cs-fixer.cache');
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
require __DIR__ . '/vendor/autoload.php';
|
||||||
|
|
||||||
|
$finder = PhpCsFixer\Finder::create()
|
||||||
|
->in(__DIR__ . '/tests')
|
||||||
|
->exclude('__snapshots__');
|
||||||
|
|
||||||
|
$config = require __DIR__ . '/.php-cs-fixer.common.php';
|
||||||
|
|
||||||
|
// Additional rules for tests
|
||||||
|
$config = array_merge(
|
||||||
|
$config,
|
||||||
|
[
|
||||||
|
'declare_strict_types' => true,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
return (new PhpCsFixer\Config())
|
||||||
|
->setFinder($finder)
|
||||||
|
->setRules($config)
|
||||||
|
->setRiskyAllowed(true)
|
||||||
|
->setCacheFile(__DIR__ . '/.php-cs-fixer.tests.cache');
|
||||||
-65
@@ -1,65 +0,0 @@
|
|||||||
language: php
|
|
||||||
|
|
||||||
## Cache composer
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- $HOME/.composer/cache
|
|
||||||
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
- RUN_PHPCS=0
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- php: '7.2'
|
|
||||||
env: LARAVEL='5.5.*' COMPOSER_FLAGS='--prefer-lowest'
|
|
||||||
- php: '7.2'
|
|
||||||
env: LARAVEL='5.5.*' COMPOSER_FLAGS='--prefer-stable'
|
|
||||||
- php: '7.2'
|
|
||||||
env: LARAVEL='5.8.*' COMPOSER_FLAGS='--prefer-lowest'
|
|
||||||
- php: '7.2'
|
|
||||||
env: LARAVEL='5.8.*' COMPOSER_FLAGS='--prefer-stable'
|
|
||||||
- php: '7.2'
|
|
||||||
env: LARAVEL='^6.0' COMPOSER_FLAGS='--prefer-lowest'
|
|
||||||
- php: '7.2'
|
|
||||||
env: LARAVEL='^6.0' COMPOSER_FLAGS='--prefer-stable'
|
|
||||||
- php: '7.3'
|
|
||||||
env: LARAVEL='5.5.*' COMPOSER_FLAGS='--prefer-lowest'
|
|
||||||
- php: '7.3'
|
|
||||||
env: LARAVEL='5.5.*' COMPOSER_FLAGS='--prefer-stable'
|
|
||||||
- php: '7.3'
|
|
||||||
env: LARAVEL='5.8.*' COMPOSER_FLAGS='--prefer-lowest'
|
|
||||||
- php: '7.3'
|
|
||||||
env: LARAVEL='5.8.*' COMPOSER_FLAGS='--prefer-stable'
|
|
||||||
- php: '7.3'
|
|
||||||
env: LARAVEL='^6.0' COMPOSER_FLAGS='--prefer-lowest'
|
|
||||||
- php: '7.3'
|
|
||||||
env: LARAVEL='^6.0' COMPOSER_FLAGS='--prefer-stable'
|
|
||||||
- php: '7.4'
|
|
||||||
env: LARAVEL='5.5.*' COMPOSER_FLAGS='--prefer-lowest'
|
|
||||||
- php: '7.4'
|
|
||||||
env: LARAVEL='5.5.*' COMPOSER_FLAGS='--prefer-stable'
|
|
||||||
- php: '7.4'
|
|
||||||
env: LARAVEL='5.8.*' COMPOSER_FLAGS='--prefer-lowest'
|
|
||||||
- php: '7.4'
|
|
||||||
env: LARAVEL='5.8.*' COMPOSER_FLAGS='--prefer-stable'
|
|
||||||
- php: '7.4'
|
|
||||||
env: LARAVEL='^6.0' COMPOSER_FLAGS='--prefer-lowest'
|
|
||||||
- php: '7.4'
|
|
||||||
env: LARAVEL='^6.0' COMPOSER_FLAGS='--prefer-stable' RUN_PHPCS=1
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- phpenv config-rm xdebug.ini || true
|
|
||||||
|
|
||||||
install:
|
|
||||||
- travis_retry composer remove phpro/grumphp --no-interaction --no-update --dev
|
|
||||||
- composer require "illuminate/support:${LARAVEL}" --no-interaction --no-update
|
|
||||||
- composer require "illuminate/console:${LARAVEL}" --no-interaction --no-update
|
|
||||||
- composer require "illuminate/filesystem:${LARAVEL}" --no-interaction --no-update
|
|
||||||
- composer require --dev "illuminate/config:${LARAVEL}" --no-interaction --no-update
|
|
||||||
- composer require --dev "illuminate/view:${LARAVEL}" --no-interaction --no-update
|
|
||||||
- travis_retry composer update ${COMPOSER_FLAGS} --no-interaction --prefer-dist --no-suggest
|
|
||||||
|
|
||||||
script:
|
|
||||||
- vendor/bin/phpunit
|
|
||||||
- if [[ $RUN_PHPCS = 1 ]]; then vendor/bin/phpcs --standard=psr2 src/; fi
|
|
||||||
+293
@@ -0,0 +1,293 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
[Next release](https://github.com/barryvdh/laravel-ide-helper/compare/v3.2.0...master)
|
||||||
|
--------------
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Add support for multiple pivot types when using the same accessor.
|
||||||
|
- Smarter reset, keep tags that IDE helper doesn't use
|
||||||
|
- Use `numeric` type on fields with `decimal` casts
|
||||||
|
|
||||||
|
|
||||||
|
2024-10-18, 3.2.0
|
||||||
|
--------------
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fix type of hashed model property to `string`
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Add support for EloquentBuilder generics introduced in Laravel 11.15.
|
||||||
|
- Drop support for Laravel versions earlier than 11.15.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add support for AsCollection::using and AsEnumCollection::of casts [#1577 / uno-sw](https://github.com/barryvdh/laravel-ide-helper/pull/1577)
|
||||||
|
|
||||||
|
2024-07-12, 3.1.0
|
||||||
|
------------------
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fix return value of query scopes from parent class [#1366 / sforward](https://github.com/barryvdh/laravel-ide-helper/pull/1366)
|
||||||
|
- Add static to isBuiltin() check in ide-helper:models [#1541 / bram-pkg](https://github.com/barryvdh/laravel-ide-helper/pull/1541)
|
||||||
|
- Fix for getSomethingAttribute functions which return a collection with type templating in the phpDoc. [#1567 / stefanScrumble](https://github.com/barryvdh/laravel-ide-helper/pull/1567)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add type to pivot when using a custom pivot class [#1518 / d3v2a](https://github.com/barryvdh/laravel-ide-helper/pull/1518)
|
||||||
|
- Add support in morphTo relationship for null values [#1547 / matysekmichal](https://github.com/barryvdh/laravel-ide-helper/pull/1547)
|
||||||
|
- Add support for AsEnumCollection casts [#1557 / Braunson](https://github.com/barryvdh/laravel-ide-helper/pull/1557)
|
||||||
|
- Support for Attribute class in attributes [#1567 / stefanScrumble](https://github.com/barryvdh/laravel-ide-helper/pull/1567)
|
||||||
|
|
||||||
|
2024-03-01, 3.0.0
|
||||||
|
------------------
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Support for Laravel 11 [#1520 / KentarouTakeda](https://github.com/barryvdh/laravel-ide-helper/pull/1520)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Make `--reset` always keep the text and remove `--smart-reset`. Always skip the classname [#1523 / barryvdh](https://github.com/barryvdh/laravel-ide-helper/pull/1523) & [#1525 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/1525)
|
||||||
|
- Use short types (`int` and `bool` instead of `integer` and `boolean`) [#1524 / barryvdh](https://github.com/barryvdh/laravel-ide-helper/pull/1524)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
- Support for Laravel 9 and use of doctrine/dbal [#1512 / barryvdh](https://github.com/barryvdh/laravel-ide-helper/pull/1512)
|
||||||
|
With this functionality gone, a few changes have been made:
|
||||||
|
- support for custom datatypes has been dropped (config `custom_db_types`) unknown data types default to `string` now and to fix the type, add a proper cast in Eloquent
|
||||||
|
- You _might_ have top-level dependency on doctrine/dbal. This may have been in the past due to ide-helper, we suggest to check if you still need it and remove it otherwise
|
||||||
|
- Minimum PHP version, due to Laravel 10, is now PHP 8.1
|
||||||
|
|
||||||
|
2024-02-15, 2.15.1
|
||||||
|
------------------
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fix final class keyword in wrong position [#1517 / barryvdh](https://github.com/barryvdh/laravel-ide-helper/pull/1517)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
2024-02-14, 2.15.0
|
||||||
|
------------------
|
||||||
|
### Fixed
|
||||||
|
- Fix case issue in `ModelsCommand::unsetMethod()` [#1453 / leo108](https://github.com/barryvdh/laravel-ide-helper/pull/1453)
|
||||||
|
- Fix non-facade classes will result in no autocomplete [#841 / netpok](https://github.com/barryvdh/laravel-ide-helper/pull/841)
|
||||||
|
- Skip swoole, otherwise fatal error [#1477 / TimoFrenzel](https://github.com/barryvdh/laravel-ide-helper/pull/1477)
|
||||||
|
- Fix vulnerability CVE-2021-43608 [#1392 / allanlaal](https://github.com/barryvdh/laravel-ide-helper/pull/1392)
|
||||||
|
- Reset foreignKeyConstraintsColumns on model loop start [#1461 / snmatsui](https://github.com/barryvdh/laravel-ide-helper/pull/1461)
|
||||||
|
- Accept scope & scopes as relation [#1452 / Muetze42](https://github.com/barryvdh/laravel-ide-helper/pull/1452)
|
||||||
|
- Fix #1300 relation_return_type must take precedence if it is defined [#1394 / menthol](https://github.com/barryvdh/laravel-ide-helper/pull/1394)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Disable inspections of helper files [#1486 / eidng8](https://github.com/barryvdh/laravel-ide-helper/pull/1486)
|
||||||
|
- Removed support for Laravel 8 and therefore for PHP < 8.0 [#1504 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/1504)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add support for enum default arguments using enum cases. [#1464 / d8vjork](https://github.com/barryvdh/laravel-ide-helper/pull/1464)
|
||||||
|
- Add support for real-time facades in the helper file. [#1455 / filipac](https://github.com/barryvdh/laravel-ide-helper/pull/1455)
|
||||||
|
- Add support for relations with composite keys. [#1479 / calebdw](https://github.com/barryvdh/laravel-ide-helper/pull/1479)
|
||||||
|
- Add support for attribute accessors with no backing field or type hinting [#1411 / pindab0ter](https://github.com/barryvdh/laravel-ide-helper/pull/1411).
|
||||||
|
- Add support for AsCollection and AsArrayObject casts [#1393 / pataar](https://github.com/barryvdh/laravel-ide-helper/pull/1393)
|
||||||
|
- Reintroduce support for multi-db setups [#1426 / benpoulson](https://github.com/barryvdh/laravel-ide-helper/pull/1426)
|
||||||
|
- Support the BINARY(...) database field type [#1434 / Sfonxs](https://github.com/barryvdh/laravel-ide-helper/pull/1434)
|
||||||
|
- Add AllowDynamicProperties Attribute to cooperate with php8.2 deprecation [#1428 / GeoSot](https://github.com/barryvdh/laravel-ide-helper/pull/1428)
|
||||||
|
|
||||||
|
2024-02-05, 2.14.0
|
||||||
|
------------------
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Official support for Lumen has been dropped [#1425 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/1425)
|
||||||
|
- Refactor resolving of null information for custom casted attribute types [#1330 / wimski](https://github.com/barryvdh/laravel-ide-helper/pull/1330)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Catch exceptions when loading aliases [#1465 / dongm2ez](https://github.com/barryvdh/laravel-ide-helper/pull/1465)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add support for nikic/php-parser 5 (next to 4) [#1502 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/1502)
|
||||||
|
- Add support for `immutable_date:*` and `immutable_datetime:*` casts. [#1380 / thekonz](https://github.com/barryvdh/laravel-ide-helper/pull/1380)
|
||||||
|
- Add support for attribute accessors marked as protected. [#1339 / pindab0ter](https://github.com/barryvdh/laravel-ide-helper/pull/1339)
|
||||||
|
|
||||||
|
2023-02-04, 2.13.0
|
||||||
|
------------------
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fix return type of methods provided by `SoftDeletes` [#1345 / KentarouTakeda](https://github.com/barryvdh/laravel-ide-helper/pull/1345)
|
||||||
|
- Handle PHP 8.1 deprecation warnings when passing `null` to `new \ReflectionClass` [#1351 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/1351)
|
||||||
|
- Fix issue where \Eloquent is not included when using write_mixin [#1352 / Jefemy](https://github.com/barryvdh/laravel-ide-helper/pull/1352)
|
||||||
|
- Fix model factory method arguments for Laravel >= 9 [#1361 / wimski](https://github.com/barryvdh/laravel-ide-helper/pull/1361)
|
||||||
|
- Improve return type of mock helper methods in tests [#1405 / bentleyo](https://github.com/barryvdh/laravel-ide-helper/pull/1405)
|
||||||
|
- Fix Castable class if failed to detect it from return types [#1388 / kwarcu](https://github.com/barryvdh/laravel-ide-helper/pull/1388)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Added Laravel 10 support [#1407 / lptn](https://github.com/barryvdh/laravel-ide-helper/pull/1407)
|
||||||
|
- Add support for custom casts that implement `CastsInboundAttributes` [#1329 / sforward](https://github.com/barryvdh/laravel-ide-helper/pull/1329)
|
||||||
|
- Add option `use_generics_annotations` for collection type hints [#1298 / tanerkay](https://github.com/barryvdh/laravel-ide-helper/pull/1298)
|
||||||
|
|
||||||
|
2022-03-06, 2.12.3
|
||||||
|
------------------
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fix date and datetime handling for attributes that set a serialization format option for the Carbon instance [#1324 / FLeudts](https://github.com/barryvdh/laravel-ide-helper/pull/1324)
|
||||||
|
- Fix composer conflict with composer/pcre version 2/3. [#1327 / barryvdh](https://github.com/barryvdh/laravel-ide-helper/pull/1327)
|
||||||
|
|
||||||
|
2022-02-08, 2.12.2
|
||||||
|
------------------
|
||||||
|
### Fixed
|
||||||
|
- Remove composer dependecy, use copy of ClassMapGenerator [#1313 / barryvdh](https://github.com/barryvdh/laravel-ide-helper/pull/1313)
|
||||||
|
|
||||||
|
2022-01-24, 2.12.1
|
||||||
|
------------------
|
||||||
|
### Fixed
|
||||||
|
- Properly handle `Castable`s without return type. [#1306 / binotaliu](https://github.com/barryvdh/laravel-ide-helper/pull/1306)
|
||||||
|
|
||||||
|
2022-01-23, 2.12.0
|
||||||
|
------------------
|
||||||
|
### Added
|
||||||
|
- Add support for custom casts that using `Castable` [#1287 / binotaliu](https://github.com/barryvdh/laravel-ide-helper/pull/1287)
|
||||||
|
- Added Laravel 9 support [#1297 / rcerljenko](https://github.com/barryvdh/laravel-ide-helper/pull/1297)
|
||||||
|
- Added option `additional_relation_return_types` for custom relations that don't fit the typical naming scheme
|
||||||
|
|
||||||
|
2022-01-03, 2.11.0
|
||||||
|
------------------
|
||||||
|
### Added
|
||||||
|
- Add support for Laravel 8.77 Attributes [\#1289 / SimonJnsson](https://github.com/barryvdh/laravel-ide-helper/pull/1289)
|
||||||
|
- Add support for cast types `decimal:*`, `encrypted:*`, `immutable_date`, `immutable_datetime`, `custom_datetime`, and `immutable_custom_datetime` [#1262 / miken32](https://github.com/barryvdh/laravel-ide-helper/pull/1262)
|
||||||
|
- Add support of variadic parameters in `ide-helper:models` [\#1234 / shaffe-fr](https://github.com/barryvdh/laravel-ide-helper/pull/1234)
|
||||||
|
- Add support of custom casts without properties [\#1267 / sparclex](https://github.com/barryvdh/laravel-ide-helper/pull/1267)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fix recursively searching for `HasFactory` and `Macroable` traits [\#1216 / daniel-de-wit](https://github.com/barryvdh/laravel-ide-helper/pull/1216)
|
||||||
|
- Use platformName to determine db type when casting boolean types [\#1212 / stockalexander](https://github.com/barryvdh/laravel-ide-helper/pull/1212)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Move default models helper filename to config [\#1241 / wimski](https://github.com/barryvdh/laravel-ide-helper/pull/1241)
|
||||||
|
|
||||||
|
2021-06-18, 2.10.1
|
||||||
|
------------------
|
||||||
|
### Added
|
||||||
|
- Added Type registration according to [Custom Mapping Types documentation](https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html#custom-mapping-types) [\#1228 / wimski](https://github.com/barryvdh/laravel-ide-helper/pull/1241)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fixing issue where configured custom_db_types could cause a DBAL exception to be thrown while running `ide-helper:models` [\#1228 / wimski](https://github.com/barryvdh/laravel-ide-helper/pull/1241)
|
||||||
|
|
||||||
|
2021-04-09, 2.10.0
|
||||||
|
------------------
|
||||||
|
### Added
|
||||||
|
- Allowing Methods to be set or unset in ModelHooks [\#1198 / jenga201](https://github.com/barryvdh/laravel-ide-helper/pull/1198)\
|
||||||
|
Note: the visibility of `\Barryvdh\LaravelIdeHelper\Console\ModelsCommand::setMethod` has been changed to **public**!
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fixing issue where incorrect autoloader unregistered [\#1210 / tezhm](https://github.com/barryvdh/laravel-ide-helper/pull/1210)
|
||||||
|
|
||||||
|
2021-04-02, 2.9.3
|
||||||
|
-----------------
|
||||||
|
### Fixed
|
||||||
|
- Support both customized namespace factories as well as default resolvable ones [\#1201 / wimski](https://github.com/barryvdh/laravel-ide-helper/pull/1201)
|
||||||
|
|
||||||
|
2021-04-01, 2.9.2
|
||||||
|
-----------------
|
||||||
|
### Added
|
||||||
|
- Model hooks for adding custom information from external sources to model classes through the ModelsCommand [\#945 / wimski](https://github.com/barryvdh/laravel-ide-helper/pull/945)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fix ide-helper:models exception if model doesn't have factory [\#1196 / ahmed-aliraqi](https://github.com/barryvdh/laravel-ide-helper/pull/1196)
|
||||||
|
- Running tests triggering post_migrate hooks [\#1193 / netpok](https://github.com/barryvdh/laravel-ide-helper/pull/1193)
|
||||||
|
- Array_merge error when config is cached prior to package install [\#1184 / netpok](https://github.com/barryvdh/laravel-ide-helper/pull/1184)
|
||||||
|
|
||||||
|
2021-03-15, 2.9.1
|
||||||
|
-----------------
|
||||||
|
### Added
|
||||||
|
- Generate PHPDoc for Laravel 8.x factories [\#1074 / ahmed-aliraqi](https://github.com/barryvdh/laravel-ide-helper/pull/1074)
|
||||||
|
- Add a comment to a property like table columns [\#1168 / biiiiiigmonster](https://github.com/barryvdh/laravel-ide-helper/pull/1168)
|
||||||
|
- Added `post_migrate` hook to run commands after a migration [\#1163 / netpok](https://github.com/barryvdh/laravel-ide-helper/pull/1163)
|
||||||
|
- Allow for PhpDoc for macros with union types [\#1148 / riesjart](https://github.com/barryvdh/laravel-ide-helper/pull/1148)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Error when generating helper for invokable classes [\#1124 / standaniels](https://github.com/barryvdh/laravel-ide-helper/pull/1124)
|
||||||
|
- Fix broken ReflectionUnionTypes [\#1132 / def-studio](https://github.com/barryvdh/laravel-ide-helper/pull/1132)
|
||||||
|
- Relative class names are not converted to fully-qualified class names [\#1005 / SavKS](https://github.com/barryvdh/laravel-ide-helper/pull/1005)
|
||||||
|
|
||||||
|
2020-12-30, 2.9.0
|
||||||
|
-----------------
|
||||||
|
### Changed
|
||||||
|
- Dropped support for Laravel 6 and Laravel 7, as well as support for PHP 7.2 and added support for doctrine/dbal:^3 [\#1114 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/1114)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- `Macro::initPhpDoc()` will save original docblock if present [\#1116 / LastDragon-ru](https://github.com/barryvdh/laravel-ide-helper/pull/1116)
|
||||||
|
- `Alias` will grab macros from `\Illuminate\Database\Eloquent\Builder` too [\#1118 / LastDragon-ru](https://github.com/barryvdh/laravel-ide-helper/pull/1118)
|
||||||
|
|
||||||
|
2020-12-08, 2.8.2
|
||||||
|
-----------------
|
||||||
|
### Added
|
||||||
|
- Fix phpdoc generate for custom cast with parameter [\#986 / artelkr](https://github.com/barryvdh/laravel-ide-helper/pull/986)
|
||||||
|
- Created a possibility to add custom relation type [\#987 / efinder2](https://github.com/barryvdh/laravel-ide-helper/pull/987)
|
||||||
|
- Added `@see` with macro/mixin definition location to PhpDoc [\#1054 / riesjart](https://github.com/barryvdh/laravel-ide-helper/pull/1054)
|
||||||
|
- Initial compatibility for PHP8 [\#1106 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/1106)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Implement DeferrableProvider [\#914 / kon-shou](https://github.com/barryvdh/laravel-ide-helper/pull/914)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Compatibility with Lumen [\#1043 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/1043)
|
||||||
|
- Allow model_locations to have glob patterns [\#1059 / saackearl](https://github.com/barryvdh/laravel-ide-helper/pull/1059)
|
||||||
|
- Error when generating helper for macroable classes which are not facades and contain a "fake" method [\#1066 / domkrm] (https://github.com/barryvdh/laravel-ide-helper/pull/1066)
|
||||||
|
- Casts with a return type of `static` or `$this` now resolve to an instance of the cast [\#1103 / riesjart](https://github.com/barryvdh/laravel-ide-helper/pull/1103)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
- Removed format and broken generateJsonHelper [\#1053 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/1053)
|
||||||
|
|
||||||
|
2020-09-07, 2.8.1
|
||||||
|
-----------------
|
||||||
|
### Added
|
||||||
|
- Support Laravel 8 [\#1022 / barryvdh](https://github.com/barryvdh/laravel-ide-helper/pull/1022)
|
||||||
|
- Add option to force usage of FQN [\#1031 / edvordo](https://github.com/barryvdh/laravel-ide-helper/pull/1031)
|
||||||
|
- Add support for macros of all macroable classes [\#1006 / domkrm](https://github.com/barryvdh/laravel-ide-helper/pull/1006)
|
||||||
|
|
||||||
|
2020-08-11, 2.8.0
|
||||||
|
-----------------
|
||||||
|
### Added
|
||||||
|
- Add static return type to builder methods [\#924 / dmason30](https://github.com/barryvdh/laravel-ide-helper/pull/924)
|
||||||
|
- Add `optonal` to meta generator for PhpStorm [\#932 / halaei](https://github.com/barryvdh/laravel-ide-helper/pull/932)
|
||||||
|
- Decimal columns as string in Models [\#948 / fgibaux](https://github.com/barryvdh/laravel-ide-helper/pull/948)
|
||||||
|
- Simplify full namespaces for already included resources [\#954 / LANGERGabriel](https://github.com/barryvdh/laravel-ide-helper/pull/954)
|
||||||
|
- Make writing relation count properties optional [\#969 / AegirLeet](https://github.com/barryvdh/laravel-ide-helper/pull/969)
|
||||||
|
- Add more methods able to resolve container instances [\#996 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/996)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Test `auth` is bound before detect Auth driver [\#946 / zhwei](https://github.com/barryvdh/laravel-ide-helper/pull/946)
|
||||||
|
- Fix inline doc-block for final models [\#944 / Gummibeer](https://github.com/barryvdh/laravel-ide-helper/pull/955)
|
||||||
|
|
||||||
|
2020-04-22, 2.7.0
|
||||||
|
-----------------
|
||||||
|
### Added
|
||||||
|
- Add `ignored_models` as config option [\#890 / pataar](https://github.com/barryvdh/laravel-ide-helper/pull/890)
|
||||||
|
- Infer return type from reflection if no phpdoc given [\#906 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/906)
|
||||||
|
- Add custom collection support for get and all methods [\#903 / dmason30](https://github.com/barryvdh/laravel-ide-helper/pull/903)
|
||||||
|
- if a model implements interfaces, include them in the stub [\#920 / mr-feek](https://github.com/barryvdh/laravel-ide-helper/pull/920)
|
||||||
|
- Generate noinspections PHPStorm tags [\#905 / mzglinski](https://github.com/barryvdh/laravel-ide-helper/pull/905)
|
||||||
|
- Added support for Laravel 7 custom casts [\#913 / belamov](https://github.com/barryvdh/laravel-ide-helper/pull/913)
|
||||||
|
- Ability to use patterns for model_locations [\#921 / 4n70w4](https://github.com/barryvdh/laravel-ide-helper/pull/921)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- MorphToMany relations with query not working [\#894 / UksusoFF](https://github.com/barryvdh/laravel-ide-helper/pull/894)
|
||||||
|
- Fix camelCase duplicated properties generator [\#881 / bop10](https://github.com/barryvdh/laravel-ide-helper/pull/881)
|
||||||
|
- Prevent generation of invalid code for certain parameter default values [\#901 / loilo](https://github.com/barryvdh/laravel-ide-helper/pull/901)
|
||||||
|
- Make hasOne and morphOne nullable [\#864 / leo108](https://github.com/barryvdh/laravel-ide-helper/pull/864)
|
||||||
|
- Remove unnecessary and wrong definition of SoftDelete methods [\#918 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/918)
|
||||||
|
- Unregister meta command custom autoloader when it is no longer needed [\#919 / mr-feek](https://github.com/barryvdh/laravel-ide-helper/pull/919)
|
||||||
|
|
||||||
|
2020-02-25, 2.6.7
|
||||||
|
-----------------
|
||||||
|
### Added
|
||||||
|
- Support for Laravel 7 [commit by barryvdh](https://github.com/barryvdh/laravel-ide-helper/commit/edd69c5e0508972c81f1f7173236de2459c45814)
|
||||||
|
|
||||||
|
2019-12-02, 2.6.6
|
||||||
|
-----------------
|
||||||
|
### Added
|
||||||
|
- Add splat operator (...) support [\#860 / ngmy](https://github.com/barryvdh/laravel-ide-helper/pull/860)
|
||||||
|
- Add support for custom date class via Date::use() [\#859 / mfn](https://github.com/barryvdh/laravel-ide-helper/pull/859)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Prevent undefined property errors [\#877 / matt-allan](https://github.com/barryvdh/laravel-ide-helper/pull/877)
|
||||||
|
|
||||||
|
----
|
||||||
|
Missing an older changelog? Feel free to submit a PR!
|
||||||
@@ -0,0 +1,394 @@
|
|||||||
|
# IDE Helper Generator for Laravel
|
||||||
|
|
||||||
|
[](https://github.com/barryvdh/laravel-ide-helper/actions)
|
||||||
|
[](http://choosealicense.com/licenses/mit/)
|
||||||
|
[](https://packagist.org/packages/barryvdh/laravel-ide-helper)
|
||||||
|
[](https://packagist.org/packages/barryvdh/laravel-ide-helper)
|
||||||
|
[](https://fruitcake.nl/)
|
||||||
|
|
||||||
|
**Complete PHPDocs, directly from the source**
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
The 3.x branch supports Laravel 10 and 11. For older version, use the 2.x releases.
|
||||||
|
|
||||||
|
- [Installation](#installation)
|
||||||
|
- [Usage](#usage)
|
||||||
|
- [Automatic PHPDoc generation for Laravel Facades](#automatic-phpdoc-generation-for-laravel-facades)
|
||||||
|
- [Automatic PHPDocs for models](#automatic-phpdocs-for-models)
|
||||||
|
- [Model Directories](#model-directories)
|
||||||
|
- [Ignore Models](#ignore-models)
|
||||||
|
- [Model Hooks](#model-hooks)
|
||||||
|
- [Automatic PHPDocs generation for Laravel Fluent methods](#automatic-phpdocs-generation-for-laravel-fluent-methods)
|
||||||
|
- [Auto-completion for factory builders](#auto-completion-for-factory-builders)
|
||||||
|
- [PhpStorm Meta for Container instances](#phpstorm-meta-for-container-instances)
|
||||||
|
- [License](#license)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Require this package with composer using the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer require --dev barryvdh/laravel-ide-helper
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> If you encounter version conflicts with doctrine/dbal, please try:
|
||||||
|
> `composer require --dev barryvdh/laravel-ide-helper --with-all-dependencies`
|
||||||
|
|
||||||
|
This package makes use of [Laravels package auto-discovery mechanism](https://medium.com/@taylorotwell/package-auto-discovery-in-laravel-5-5-ea9e3ab20518), which means if you don't install dev dependencies in production, it also won't be loaded.
|
||||||
|
|
||||||
|
If for some reason you want manually control this:
|
||||||
|
- add the package to the `extra.laravel.dont-discover` key in `composer.json`, e.g.
|
||||||
|
```json
|
||||||
|
"extra": {
|
||||||
|
"laravel": {
|
||||||
|
"dont-discover": [
|
||||||
|
"barryvdh/laravel-ide-helper"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- Add the following class to the `providers` array in `config/app.php`:
|
||||||
|
```php
|
||||||
|
Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
|
||||||
|
```
|
||||||
|
If you want to manually load it only in non-production environments, instead you can add this to your `AppServiceProvider` with the `register()` method:
|
||||||
|
```php
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
if ($this->app->isLocal()) {
|
||||||
|
$this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
|
||||||
|
}
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> Note: Avoid caching the configuration in your development environment, it may cause issues after installing this package; respectively clear the cache beforehand via `php artisan cache:clear` if you encounter problems when running the commands
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
_Check out [this Laracasts video](https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/15) for a quick introduction/explanation!_
|
||||||
|
|
||||||
|
- `php artisan ide-helper:generate` - [PHPDoc generation for Laravel Facades ](#automatic-phpdoc-generation-for-laravel-facades)
|
||||||
|
- `php artisan ide-helper:models` - [PHPDocs for models](#automatic-phpdocs-for-models)
|
||||||
|
- `php artisan ide-helper:meta` - [PhpStorm Meta file](#phpstorm-meta-for-container-instances)
|
||||||
|
|
||||||
|
|
||||||
|
Note: You do need CodeComplice for Sublime Text: https://github.com/spectacles/CodeComplice
|
||||||
|
|
||||||
|
### Automatic PHPDoc generation for Laravel Facades
|
||||||
|
|
||||||
|
You can now re-generate the docs yourself (for future updates)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan ide-helper:generate
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: `bootstrap/compiled.php` has to be cleared first, so run `php artisan clear-compiled` before generating.
|
||||||
|
|
||||||
|
This will generate the file `_ide_helper.php` which is expected to be additionally parsed by your IDE for autocomplete. You can use the config `filename` to change its name.
|
||||||
|
|
||||||
|
You can configure your `composer.json` to do this each time you update your dependencies:
|
||||||
|
|
||||||
|
```js
|
||||||
|
"scripts": {
|
||||||
|
"post-update-cmd": [
|
||||||
|
"Illuminate\\Foundation\\ComposerScripts::postUpdate",
|
||||||
|
"@php artisan ide-helper:generate",
|
||||||
|
"@php artisan ide-helper:meta"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also publish the config file to change implementations (ie. interface to specific class) or set defaults for `--helpers`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan vendor:publish --provider="Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider" --tag=config
|
||||||
|
```
|
||||||
|
|
||||||
|
The generator tries to identify the real class, but if it cannot be found, you can define it in the config file.
|
||||||
|
|
||||||
|
Some classes need a working database connection. If you do not have a default working connection, some facades will not be included.
|
||||||
|
You can use an in-memory SQLite driver by adding the `-M` option.
|
||||||
|
|
||||||
|
If you use [real-time facades](https://laravel.com/docs/master/facades#real-time-facades) in your app, those will also be included in the generated file using a `@mixin` annotation and extending the original class underneath the facade.
|
||||||
|
|
||||||
|
**Note**: this feature uses the generated real-time facades files in the `storage/framework/cache` folder. Those files are generated on-demand as you use the real-time facade, so if the framework has not generated that first, it will not be included in the helper file. Run the route/command/code first and then regenerate the helper file and this time the real-time facade will be included in it.
|
||||||
|
|
||||||
|
You can choose to include helper files. This is not enabled by default, but you can override it with the `--helpers (-H)` option.
|
||||||
|
The `Illuminate/Support/helpers.php` is already set up, but you can add/remove your own files in the config file.
|
||||||
|
|
||||||
|
### Automatic PHPDoc generation for macros and mixins
|
||||||
|
|
||||||
|
This package can generate PHPDocs for macros and mixins which will be added to the `_ide_helper.php` file.
|
||||||
|
|
||||||
|
But this only works if you use type hinting when declaring a macro.
|
||||||
|
|
||||||
|
```php
|
||||||
|
Str::macro('concat', function(string $str1, string $str2) : string {
|
||||||
|
return $str1 . $str2;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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
|
||||||
|
PHPDocs, based on table columns, relations and getters/setters.
|
||||||
|
|
||||||
|
> Note: this command requires a working database connection to introspect the table of each model
|
||||||
|
|
||||||
|
By default, you are asked to overwrite or write to a separate file (`_ide_helper_models.php`).
|
||||||
|
You can write the comments directly to your Model file, using the `--write (-W)` option, or
|
||||||
|
force to not write with `--nowrite (-N)`.
|
||||||
|
|
||||||
|
Alternatively using the `--write-mixin (-M)` option will only add a mixin tag to your Model file,
|
||||||
|
writing the rest in (`_ide_helper_models.php`).
|
||||||
|
The class name will be different from the model, avoiding the IDE duplicate annoyance.
|
||||||
|
|
||||||
|
> Please make sure to back up your models, before writing the info.
|
||||||
|
|
||||||
|
Writing to the models should keep the existing comments and only append new properties/methods. It will not update changed properties/methods.
|
||||||
|
|
||||||
|
With the `--reset (-R)` option, the whole existing PHPDoc is replaced, including any comments that have been made.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan ide-helper:models "App\Models\Post"
|
||||||
|
```
|
||||||
|
|
||||||
|
```php
|
||||||
|
/**
|
||||||
|
* App\Models\Post
|
||||||
|
*
|
||||||
|
* @property integer $id
|
||||||
|
* @property integer $author_id
|
||||||
|
* @property string $title
|
||||||
|
* @property string $text
|
||||||
|
* @property \Illuminate\Support\Carbon $created_at
|
||||||
|
* @property \Illuminate\Support\Carbon $updated_at
|
||||||
|
* @property-read \User $author
|
||||||
|
* @property-read \Illuminate\Database\Eloquent\Collection|\Comment[] $comments
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|\App\Models\Post newModelQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|\App\Models\Post newQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|\App\Models\Post query()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|\App\Models\Post whereTitle($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|\App\Models\Post forAuthors(\User ...$authors)
|
||||||
|
* …
|
||||||
|
*/
|
||||||
|
```
|
||||||
|
|
||||||
|
With the `--write-mixin (-M)` option
|
||||||
|
```php
|
||||||
|
/**
|
||||||
|
* …
|
||||||
|
* @mixin IdeHelperPost
|
||||||
|
*/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Model Directories
|
||||||
|
|
||||||
|
By default, models in `app/models` are scanned. The optional argument tells what models to use (also outside app/models).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan ide-helper:models "App\Models\Post" "App\Models\User"
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also scan a different directory, using the `--dir` option (relative from the base path):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan ide-helper:models --dir="path/to/models" --dir="app/src/Model"
|
||||||
|
```
|
||||||
|
|
||||||
|
You can publish the config file (`php artisan vendor:publish`) and set the default directories.
|
||||||
|
|
||||||
|
#### Ignore Models
|
||||||
|
|
||||||
|
Models can be ignored using the `--ignore (-I)` option
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan ide-helper:models --ignore="App\Models\Post,App\Models\User"
|
||||||
|
```
|
||||||
|
|
||||||
|
Or can be ignored by setting the `ignored_models` config
|
||||||
|
|
||||||
|
```php
|
||||||
|
'ignored_models' => [
|
||||||
|
App\Post::class,
|
||||||
|
Api\User::class
|
||||||
|
],
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Magic `where*` methods
|
||||||
|
|
||||||
|
Eloquent allows calling `where<Attribute>` on your models, e.g. `Post::whereTitle(…)` and automatically translates this to e.g. `Post::where('title', '=', '…')`.
|
||||||
|
|
||||||
|
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` properties
|
||||||
|
|
||||||
|
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` to `false`.
|
||||||
|
|
||||||
|
#### Generics annotations
|
||||||
|
|
||||||
|
Laravel 9 introduced generics annotations in DocBlocks for collections. PhpStorm 2022.3 and above support the use of generics annotations within `@property` and `@property-read` declarations in DocBlocks, e.g. `Collection<User>` instead of `Collection|User[]`.
|
||||||
|
|
||||||
|
These can be disabled by setting the config `use_generics_annotations` to `false`.
|
||||||
|
|
||||||
|
#### Support `@comment` based on DocBlock
|
||||||
|
|
||||||
|
In order to better support IDEs, relations and getters/setters can also add a comment to a property like table columns. Therefore a custom docblock `@comment` is used:
|
||||||
|
```php
|
||||||
|
class Users extends Model
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @comment Get User's full name
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFullNameAttribute(): string
|
||||||
|
{
|
||||||
|
return $this->first_name . ' ' .$this->last_name ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// => after generate models
|
||||||
|
|
||||||
|
/**
|
||||||
|
* App\Models\Users
|
||||||
|
*
|
||||||
|
* @property-read string $full_name Get User's full name
|
||||||
|
* …
|
||||||
|
*/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Dedicated Eloquent Builder methods
|
||||||
|
|
||||||
|
A new method to the eloquent models was added called `newEloquentBuilder` [Reference](https://timacdonald.me/dedicated-eloquent-model-query-builders/) where we can
|
||||||
|
add support for creating a new dedicated class instead of using local scopes in the model itself.
|
||||||
|
|
||||||
|
If for some reason it's undesired to have them generated (one for each column), you can disable this via config `write_model_external_builder_methods` and setting it to `false`.
|
||||||
|
|
||||||
|
#### Custom Relationship Types
|
||||||
|
|
||||||
|
If you are using relationships not built into Laravel you will need to specify the name and returning class in the config to get proper generation.
|
||||||
|
|
||||||
|
```php
|
||||||
|
'additional_relation_types' => [
|
||||||
|
'externalHasMany' => \My\Package\externalHasMany::class
|
||||||
|
],
|
||||||
|
```
|
||||||
|
|
||||||
|
Found relationships will typically generate a return value based on the name of the relationship.
|
||||||
|
|
||||||
|
If your custom relationships don't follow this traditional naming scheme you can define its return type manually. The available options are `many` and `morphTo`.
|
||||||
|
|
||||||
|
```php
|
||||||
|
'additional_relation_return_types' => [
|
||||||
|
'externalHasMultiple' => 'many'
|
||||||
|
],
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Model Hooks
|
||||||
|
|
||||||
|
If you need additional information on your model from sources that are not handled by default, you can hook in to the
|
||||||
|
generation process with model hooks to add extra information on the fly.
|
||||||
|
Simply create a class that implements `ModelHookInterface` and add it to the `model_hooks` array in the config:
|
||||||
|
|
||||||
|
```php
|
||||||
|
'model_hooks' => [
|
||||||
|
MyCustomHook::class,
|
||||||
|
],
|
||||||
|
```
|
||||||
|
|
||||||
|
The `run` method will be called during generation for every model and receives the current running `ModelsCommand` and the current `Model`, e.g.:
|
||||||
|
|
||||||
|
```php
|
||||||
|
class MyCustomHook implements ModelHookInterface
|
||||||
|
{
|
||||||
|
public function run(ModelsCommand $command, Model $model): void
|
||||||
|
{
|
||||||
|
if (! $model instanceof MyModel) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$command->setProperty('custom', 'string', true, false, 'My custom property');
|
||||||
|
$command->unsetMethod('method');
|
||||||
|
$command->setMethod('method', $command->getMethodType($model, '\Some\Class'), ['$param']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```php
|
||||||
|
/**
|
||||||
|
* MyModel
|
||||||
|
*
|
||||||
|
* @property integer $id
|
||||||
|
* @property-read string $custom
|
||||||
|
```
|
||||||
|
|
||||||
|
### Automatic PHPDocs generation for Laravel Fluent methods
|
||||||
|
|
||||||
|
If you need PHPDocs support for Fluent methods in migration, for example
|
||||||
|
|
||||||
|
```php
|
||||||
|
$table->string("somestring")->nullable()->index();
|
||||||
|
```
|
||||||
|
|
||||||
|
After publishing vendor, simply change the `include_fluent` line in your `config/ide-helper.php` file into:
|
||||||
|
|
||||||
|
```php
|
||||||
|
'include_fluent' => true,
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run `php artisan ide-helper:generate`, you will now see all Fluent methods recognized by your IDE.
|
||||||
|
|
||||||
|
### Auto-completion for factory builders
|
||||||
|
|
||||||
|
If you would like the `factory()->create()` and `factory()->make()` methods to return the correct model class,
|
||||||
|
you can enable custom factory builders with the `include_factory_builders` line in your `config/ide-helper.php` file.
|
||||||
|
Deprecated for Laravel 8 or latest.
|
||||||
|
|
||||||
|
```php
|
||||||
|
'include_factory_builders' => true,
|
||||||
|
```
|
||||||
|
|
||||||
|
For this to work, you must also publish the PhpStorm Meta file (see below).
|
||||||
|
|
||||||
|
## PhpStorm Meta for Container instances
|
||||||
|
|
||||||
|
It's possible to generate a PhpStorm meta file to [add support for factory design pattern](https://www.jetbrains.com/help/phpstorm/ide-advanced-metadata.html).
|
||||||
|
For Laravel, this means we can make PhpStorm understand what kind of object we are resolving from the IoC Container.
|
||||||
|
For example, `events` will return an `Illuminate\Events\Dispatcher` object,
|
||||||
|
so with the meta file you can call `app('events')` and it will autocomplete the Dispatcher methods.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan ide-helper:meta
|
||||||
|
```
|
||||||
|
|
||||||
|
```php
|
||||||
|
app('events')->fire();
|
||||||
|
\App::make('events')->fire();
|
||||||
|
|
||||||
|
/** @var \Illuminate\Foundation\Application $app */
|
||||||
|
$app->make('events')->fire();
|
||||||
|
|
||||||
|
// When the key is not found, it uses the argument as class name
|
||||||
|
app('App\SomeClass');
|
||||||
|
// Also works with
|
||||||
|
app(App\SomeClass::class);
|
||||||
|
```
|
||||||
|
|
||||||
|
> Note: You might need to restart PhpStorm and make sure `.phpstorm.meta.php` is indexed.
|
||||||
|
>
|
||||||
|
> Note: When you receive a FatalException: class not found, check your config
|
||||||
|
> (for example, remove S3 as cloud driver when you don't have S3 configured. Remove Redis ServiceProvider when you don't use it).
|
||||||
|
|
||||||
|
You can change the generated filename via the config `meta_filename`. This can be useful for cases where you want to take advantage of PhpStorm's support of the _directory_ `.phpstorm.meta.php/`: all files placed there are parsed, should you want to provide additional files to PhpStorm.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The Laravel IDE Helper Generator is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
+56
-19
@@ -1,8 +1,18 @@
|
|||||||
{
|
{
|
||||||
"name": "barryvdh/laravel-ide-helper",
|
"name": "barryvdh/laravel-ide-helper",
|
||||||
"description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.",
|
"description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.",
|
||||||
"keywords": ["laravel", "autocomplete", "ide", "helper", "phpstorm", "netbeans", "sublime", "codeintel", "phpdoc"],
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"keywords": [
|
||||||
|
"laravel",
|
||||||
|
"autocomplete",
|
||||||
|
"ide",
|
||||||
|
"helper",
|
||||||
|
"phpstorm",
|
||||||
|
"netbeans",
|
||||||
|
"sublime",
|
||||||
|
"codeintel",
|
||||||
|
"phpdoc"
|
||||||
|
],
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "Barry vd. Heuvel",
|
"name": "Barry vd. Heuvel",
|
||||||
@@ -10,22 +20,33 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.2",
|
"php": "^8.2",
|
||||||
"illuminate/support": "^5.5|^6|^7",
|
"ext-json": "*",
|
||||||
"illuminate/console": "^5.5|^6|^7",
|
"barryvdh/reflection-docblock": "^2.1.2",
|
||||||
"illuminate/filesystem": "^5.5|^6|^7",
|
"composer/class-map-generator": "^1.0",
|
||||||
"barryvdh/reflection-docblock": "^2.0.6",
|
"illuminate/console": "^11.15",
|
||||||
"composer/composer": "^1.6",
|
"illuminate/database": "^11.15",
|
||||||
"doctrine/dbal": "~2.3"
|
"illuminate/filesystem": "^11.15",
|
||||||
|
"illuminate/support": "^11.15",
|
||||||
|
"nikic/php-parser": "^4.18 || ^5",
|
||||||
|
"phpdocumentor/type-resolver": "^1.1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"illuminate/config": "^5.5|^6|^7",
|
"ext-pdo_sqlite": "*",
|
||||||
"illuminate/view": "^5.5|^6|^7",
|
"friendsofphp/php-cs-fixer": "^3",
|
||||||
"phpro/grumphp": "^0.17.1",
|
"illuminate/config": "^11.15",
|
||||||
"squizlabs/php_codesniffer": "^3",
|
"illuminate/view": "^11.15",
|
||||||
"orchestra/testbench": "^3|^4",
|
"mockery/mockery": "^1.4",
|
||||||
"mockery/mockery": "^1.3"
|
"orchestra/testbench": "^9.2",
|
||||||
|
"phpunit/phpunit": "^10.5",
|
||||||
|
"spatie/phpunit-snapshot-assertions": "^4 || ^5",
|
||||||
|
"vimeo/psalm": "^5.4"
|
||||||
},
|
},
|
||||||
|
"suggest": {
|
||||||
|
"illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10|^11)."
|
||||||
|
},
|
||||||
|
"minimum-stability": "dev",
|
||||||
|
"prefer-stable": true,
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"Barryvdh\\LaravelIdeHelper\\": "src"
|
"Barryvdh\\LaravelIdeHelper\\": "src"
|
||||||
@@ -36,19 +57,35 @@
|
|||||||
"Barryvdh\\LaravelIdeHelper\\Tests\\": "tests"
|
"Barryvdh\\LaravelIdeHelper\\Tests\\": "tests"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scripts": {
|
"config": {
|
||||||
"test": "phpunit",
|
"allow-plugins": {
|
||||||
"check-style": "phpcs -p --standard=PSR2 src/",
|
"composer/package-versions-deprecated": true
|
||||||
"fix-style": "phpcbf -p --standard=PSR2 src/"
|
},
|
||||||
|
"sort-packages": true
|
||||||
},
|
},
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "2.6-dev"
|
"dev-master": "3.2-dev"
|
||||||
},
|
},
|
||||||
"laravel": {
|
"laravel": {
|
||||||
"providers": [
|
"providers": [
|
||||||
"Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider"
|
"Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"analyze": "psalm",
|
||||||
|
"check-style": [
|
||||||
|
"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"
|
||||||
|
],
|
||||||
|
"fix-style": [
|
||||||
|
"php-cs-fixer fix",
|
||||||
|
"php-cs-fixer fix --config=.php-cs-fixer.tests.php"
|
||||||
|
],
|
||||||
|
"psalm-set-baseline": "psalm --set-baseline=psalm-baseline.xml",
|
||||||
|
"test": "phpunit",
|
||||||
|
"test-ci": "phpunit -d --without-creating-snapshots",
|
||||||
|
"test-regenerate": "phpunit -d --update-snapshots"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+165
-60
@@ -1,19 +1,39 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
return array(
|
return [
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Filename & Format
|
| Filename
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
| The default filename (without extension) and the format (php or json)
|
| The default filename.
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'filename' => '_ide_helper',
|
'filename' => '_ide_helper.php',
|
||||||
'format' => 'php',
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Models filename
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| The default filename for the models helper file.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
'models_filename' => '_ide_helper_models.php',
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| PhpStorm meta filename
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| PhpStorm also supports the directory `.phpstorm.meta.php/` with arbitrary
|
||||||
|
| files in it, should you need additional files for your project; e.g.
|
||||||
|
| `.phpstorm.meta.php/laravel_ide_Helper.php'.
|
||||||
|
|
|
||||||
|
*/
|
||||||
'meta_filename' => '.phpstorm.meta.php',
|
'meta_filename' => '.phpstorm.meta.php',
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -21,7 +41,7 @@ return array(
|
|||||||
| Fluent helpers
|
| Fluent helpers
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
| Set to true to generate commonly used Fluent methods
|
| Set to true to generate commonly used Fluent methods.
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -29,22 +49,24 @@ return array(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Factory Builders
|
| Factory builders
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
| Set to true to generate factory generators for better factory()
|
| Set to true to generate factory generators for better factory()
|
||||||
| method auto-completion.
|
| method auto-completion.
|
||||||
|
|
|
|
||||||
|
| Deprecated for Laravel 8 or latest.
|
||||||
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'include_factory_builders' => false,
|
'include_factory_builders' => false,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Write Model Magic methods
|
| Write model magic methods
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
| Set to false to disable write magic methods of model
|
| Set to false to disable write magic methods of model.
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -52,11 +74,33 @@ return array(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Write Eloquent Model Mixins
|
| Write model external Eloquent builder methods
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Set to false to disable write external Eloquent builder methods.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
'write_model_external_builder_methods' => true,
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Write model relation count properties
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Set to false to disable writing of relation count properties to model DocBlocks.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
'write_model_relation_count_properties' => true,
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Write Eloquent model mixins
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
| This will add the necessary DocBlock mixins to the model class
|
| This will add the necessary DocBlock mixins to the model class
|
||||||
| contained in the Laravel Framework. This helps the IDE with
|
| contained in the Laravel framework. This helps the IDE with
|
||||||
| auto-completion.
|
| auto-completion.
|
||||||
|
|
|
|
||||||
| Please be aware that this setting changes a file within the /vendor directory.
|
| Please be aware that this setting changes a file within the /vendor directory.
|
||||||
@@ -77,9 +121,9 @@ return array(
|
|||||||
|
|
||||||
'include_helpers' => false,
|
'include_helpers' => false,
|
||||||
|
|
||||||
'helper_files' => array(
|
'helper_files' => [
|
||||||
base_path().'/vendor/laravel/framework/src/Illuminate/Support/helpers.php',
|
base_path() . '/vendor/laravel/framework/src/Illuminate/Support/helpers.php',
|
||||||
),
|
],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
@@ -89,28 +133,58 @@ return array(
|
|||||||
| Define in which directories the ide-helper:models command should look
|
| Define in which directories the ide-helper:models command should look
|
||||||
| for models.
|
| for models.
|
||||||
|
|
|
|
||||||
|
| glob patterns are supported to easier reach models in sub-directories,
|
||||||
|
| e.g. `app/Services/* /Models` (without the space).
|
||||||
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'model_locations' => array(
|
'model_locations' => [
|
||||||
'app',
|
'app',
|
||||||
),
|
],
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Models to ignore
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Define which models should be ignored.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
'ignored_models' => [
|
||||||
|
// App\MyModel::class,
|
||||||
|
],
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Models hooks
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Define which hook classes you want to run for models to add custom information.
|
||||||
|
|
|
||||||
|
| Hooks should implement Barryvdh\LaravelIdeHelper\Contracts\ModelHookInterface.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
'model_hooks' => [
|
||||||
|
// App\Support\IdeHelper\MyModelHook::class
|
||||||
|
],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Extra classes
|
| Extra classes
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
| These implementations are not really extended, but called with magic functions
|
| These implementations are not really extended, but called with magic functions.
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'extra' => array(
|
'extra' => [
|
||||||
'Eloquent' => array('Illuminate\Database\Eloquent\Builder', 'Illuminate\Database\Query\Builder'),
|
'Eloquent' => ['Illuminate\Database\Eloquent\Builder', 'Illuminate\Database\Query\Builder'],
|
||||||
'Session' => array('Illuminate\Session\Store'),
|
'Session' => ['Illuminate\Session\Store'],
|
||||||
),
|
],
|
||||||
|
|
||||||
'magic' => array(),
|
'magic' => [],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
@@ -122,39 +196,9 @@ return array(
|
|||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'interfaces' => array(
|
'interfaces' => [
|
||||||
|
// App\MyInterface::class => App\MyImplementation::class,
|
||||||
),
|
],
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Support for custom DB types
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| This setting allow you to map any custom database type (that you may have
|
|
||||||
| created using CREATE TYPE statement or imported using database plugin
|
|
||||||
| / extension to a Doctrine type.
|
|
||||||
|
|
|
||||||
| Each key in this array is a name of the Doctrine2 DBAL Platform. Currently valid names are:
|
|
||||||
| 'postgresql', 'db2', 'drizzle', 'mysql', 'oracle', 'sqlanywhere', 'sqlite', 'mssql'
|
|
||||||
|
|
|
||||||
| This name is returned by getName() method of the specific Doctrine/DBAL/Platforms/AbstractPlatform descendant
|
|
||||||
|
|
|
||||||
| The value of the array is an array of type mappings. Key is the name of the custom type,
|
|
||||||
| (for example, "jsonb" from Postgres 9.4) and the value is the name of the corresponding Doctrine2 type (in
|
|
||||||
| our case it is 'json_array'. Doctrine types are listed here:
|
|
||||||
| http://doctrine-dbal.readthedocs.org/en/latest/reference/types.html
|
|
||||||
|
|
|
||||||
| So to support jsonb in your models when working with Postgres, just add the following entry to the array below:
|
|
||||||
|
|
|
||||||
| "postgresql" => array(
|
|
||||||
| "jsonb" => "json_array",
|
|
||||||
| ),
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
'custom_db_types' => array(
|
|
||||||
|
|
||||||
),
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
@@ -184,16 +228,16 @@ return array(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Property Casts
|
| Property casts
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
| Cast the given "real type" to the given "type".
|
| Cast the given "real type" to the given "type".
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
'type_overrides' => array(
|
'type_overrides' => [
|
||||||
'integer' => 'int',
|
'integer' => 'int',
|
||||||
'boolean' => 'bool',
|
'boolean' => 'bool',
|
||||||
),
|
],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
@@ -206,4 +250,65 @@ return array(
|
|||||||
*/
|
*/
|
||||||
'include_class_docblocks' => false,
|
'include_class_docblocks' => false,
|
||||||
|
|
||||||
);
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Force FQN usage
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Use the fully qualified (class) name in DocBlocks,
|
||||||
|
| even if the class exists in the same namespace
|
||||||
|
| or there is an import (use className) of the class.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
'force_fqn' => false,
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Use generics syntax
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Use generics syntax within DocBlocks,
|
||||||
|
| e.g. `Collection<User>` instead of `Collection|User[]`.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
'use_generics_annotations' => true,
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Additional relation types
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Sometimes it's needed to create custom relation types. The key of the array
|
||||||
|
| is the relationship method name. The value of the array is the fully-qualified
|
||||||
|
| class name of the relationship, e.g. `'relationName' => RelationShipClass::class`.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
'additional_relation_types' => [],
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Additional relation return types
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| When using custom relation types its possible for the class name to not contain
|
||||||
|
| the proper return type of the relation. The key of the array is the relationship
|
||||||
|
| method name. The value of the array is the return type of the relation ('many'
|
||||||
|
| or 'morphTo').
|
||||||
|
| e.g. `'relationName' => 'many'`.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
'additional_relation_return_types' => [],
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Run artisan commands after migrations to generate model helpers
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| The specified commands should run after migrations are finished running.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
'post_migrate' => [
|
||||||
|
// 'ide-helper:models --nowrite',
|
||||||
|
],
|
||||||
|
|
||||||
|
];
|
||||||
|
|||||||
-18
@@ -1,18 +0,0 @@
|
|||||||
parameters:
|
|
||||||
git_dir: .
|
|
||||||
bin_dir: vendor/bin
|
|
||||||
tasks:
|
|
||||||
phpunit:
|
|
||||||
config_file: ~
|
|
||||||
testsuite: ~
|
|
||||||
group: []
|
|
||||||
always_execute: false
|
|
||||||
phpcs:
|
|
||||||
standard: PSR2
|
|
||||||
warning_severity: ~
|
|
||||||
ignore_patterns:
|
|
||||||
- tests/
|
|
||||||
triggered_by: [php]
|
|
||||||
whitelist_patterns:
|
|
||||||
- /^src\/.*/
|
|
||||||
- /^config\/.*/
|
|
||||||
+9
-14
@@ -1,22 +1,17 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<phpunit bootstrap="vendor/autoload.php"
|
<phpunit
|
||||||
backupGlobals="false"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
backupStaticAttributes="false"
|
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd"
|
||||||
colors="true"
|
cacheDirectory=".phpunit.result.cache"
|
||||||
verbose="true"
|
>
|
||||||
convertErrorsToExceptions="true"
|
|
||||||
convertNoticesToExceptions="true"
|
|
||||||
convertWarningsToExceptions="true"
|
|
||||||
processIsolation="false"
|
|
||||||
stopOnFailure="false">
|
|
||||||
<testsuites>
|
<testsuites>
|
||||||
<testsuite name="Unit Tests">
|
<testsuite name="Unit Tests">
|
||||||
<directory>tests</directory>
|
<directory>tests</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
<filter>
|
<source>
|
||||||
<whitelist>
|
<include>
|
||||||
<directory suffix=".php">src/</directory>
|
<directory suffix=".php">src/</directory>
|
||||||
</whitelist>
|
</include>
|
||||||
</filter>
|
</source>
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -1,270 +0,0 @@
|
|||||||
## Laravel IDE Helper Generator
|
|
||||||
|
|
||||||
[![Latest Version on Packagist][ico-version]][link-packagist]
|
|
||||||
[![Software License][ico-license]](LICENSE.md)
|
|
||||||
[![Build Status][ico-travis]][link-travis]
|
|
||||||
[![Total Downloads][ico-downloads]][link-downloads]
|
|
||||||
|
|
||||||
__For Laravel 4.x, check [version 1.11](https://github.com/barryvdh/laravel-ide-helper/tree/1.11)__
|
|
||||||
|
|
||||||
* [Complete phpDocs, directly from the source](#complete-phpdocs--directly-from-the-source)
|
|
||||||
* [Install](#install)
|
|
||||||
* [Automatic phpDoc generation for Laravel Facades](#automatic-phpdoc-generation-for-laravel-facades)
|
|
||||||
* [Automatic phpDocs for models](#automatic-phpdocs-for-models)
|
|
||||||
* [Automatic phpDocs generation for Laravel Fluent methods](#automatic-phpdocs-generation-for-laravel-fluent-methods)
|
|
||||||
* [Auto-completion for factory builders](#auto-completion-for-factory-builders)
|
|
||||||
- [PhpStorm Meta for Container instances](#phpstorm-meta-for-container-instances)
|
|
||||||
- [Lumen Install](#lumen-install)
|
|
||||||
+ [Enabling Facades](#enabling-facades)
|
|
||||||
+ [Adding the Service Provider](#adding-the-service-provider)
|
|
||||||
+ [Adding Additional Facades](#adding-additional-facades)
|
|
||||||
* [License](#license)
|
|
||||||
|
|
||||||
### Complete phpDocs, directly from the source
|
|
||||||
|
|
||||||
_Check out [this Laracasts video](https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/15) for a quick introduction/explanation!_
|
|
||||||
|
|
||||||
* [`php artisan ide-helper:generate` - phpDoc generation for Laravel Facades ](#automatic-phpdoc-generation-for-laravel-facades)
|
|
||||||
* [`php artisan ide-helper:models` - phpDocs for models](#automatic-phpdocs-for-models)
|
|
||||||
* [`php artisan ide-helper:meta` - PhpStorm Meta file](#phpstorm-meta-for-container-instances)
|
|
||||||
|
|
||||||
This package generates a file that your IDE understands, so it can provide accurate autocompletion. Generation is done based on the files in your project, so they are always up-to-date.
|
|
||||||
If you don't want to generate it, you can add a pre-generated file to the root folder of your Laravel project (but this isn't as up-to-date as self generated files).
|
|
||||||
|
|
||||||
* Generated version for L5: https://gist.github.com/barryvdh/5227822
|
|
||||||
* Generated version for Lumen: https://gist.github.com/barryvdh/be17164b0ad51f832f20
|
|
||||||
* Generated Phpstorm Meta file: https://gist.github.com/barryvdh/bb6ffc5d11e0a75dba67
|
|
||||||
|
|
||||||
Note: You do need CodeComplice for Sublime Text: https://github.com/spectacles/CodeComplice
|
|
||||||
|
|
||||||
### Install
|
|
||||||
|
|
||||||
Require this package with composer using the following command:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
composer require --dev barryvdh/laravel-ide-helper
|
|
||||||
```
|
|
||||||
|
|
||||||
After updating composer, add the service provider to the `providers` array in `config/app.php`
|
|
||||||
|
|
||||||
```php
|
|
||||||
Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
|
|
||||||
```
|
|
||||||
**Laravel 5.5** uses Package Auto-Discovery, so doesn't require you to manually add the ServiceProvider.
|
|
||||||
|
|
||||||
In Laravel, instead of adding the service provider in the `config/app.php` file, you can add the following code to your `app/Providers/AppServiceProvider.php` file, within the `register()` method:
|
|
||||||
|
|
||||||
```php
|
|
||||||
public function register()
|
|
||||||
{
|
|
||||||
if ($this->app->environment() !== 'production') {
|
|
||||||
$this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
|
|
||||||
}
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
This will allow your application to load the Laravel IDE Helper on non-production enviroments.
|
|
||||||
|
|
||||||
### Automatic phpDoc generation for Laravel Facades
|
|
||||||
|
|
||||||
You can now re-generate the docs yourself (for future updates)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
php artisan ide-helper:generate
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: `bootstrap/compiled.php` has to be cleared first, so run `php artisan clear-compiled` before generating.
|
|
||||||
|
|
||||||
You can configure your composer.json to do this after each commit:
|
|
||||||
|
|
||||||
```js
|
|
||||||
"scripts":{
|
|
||||||
"post-update-cmd": [
|
|
||||||
"Illuminate\\Foundation\\ComposerScripts::postUpdate",
|
|
||||||
"@php artisan ide-helper:generate",
|
|
||||||
"@php artisan ide-helper:meta"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also publish the config file to change implementations (ie. interface to specific class) or set defaults for `--helpers` or `--sublime`.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
php artisan vendor:publish --provider="Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider" --tag=config
|
|
||||||
```
|
|
||||||
|
|
||||||
The generator tries to identify the real class, but if it cannot be found, you can define it in the config file.
|
|
||||||
|
|
||||||
Some classes need a working database connection. If you do not have a default working connection, some facades will not be included.
|
|
||||||
You can use an in-memory SQLite driver by adding the `-M` option.
|
|
||||||
|
|
||||||
You can choose to include helper files. This is not enabled by default, but you can override it with the `--helpers (-H)` option.
|
|
||||||
The `Illuminate/Support/helpers.php` is already set up, but you can add/remove your own files in the config file.
|
|
||||||
|
|
||||||
### 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
|
|
||||||
phpDocs, based on table columns, relations and getters/setters. You can write the comments directly to your Model file, using the `--write (-W)` option. By default, you are asked to overwrite or write to a separate file (`_ide_helper_models.php`). You can force No with `--nowrite (-N)`.
|
|
||||||
Please make sure to backup your models, before writing the info.
|
|
||||||
It should keep the existing comments and only append new properties/methods. The existing phpdoc is replaced, or added if not found.
|
|
||||||
With the `--reset (-R)` option, the existing phpdocs are ignored, and only the newly found columns/relations are saved as phpdocs.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
php artisan ide-helper:models Post
|
|
||||||
```
|
|
||||||
|
|
||||||
```php
|
|
||||||
/**
|
|
||||||
* An Eloquent Model: 'Post'
|
|
||||||
*
|
|
||||||
* @property integer $id
|
|
||||||
* @property integer $author_id
|
|
||||||
* @property string $title
|
|
||||||
* @property string $text
|
|
||||||
* @property \Illuminate\Support\Carbon $created_at
|
|
||||||
* @property \Illuminate\Support\Carbon $updated_at
|
|
||||||
* @property-read \User $author
|
|
||||||
* @property-read \Illuminate\Database\Eloquent\Collection|\Comment[] $comments
|
|
||||||
*/
|
|
||||||
```
|
|
||||||
|
|
||||||
By default, models in `app/models` are scanned. The optional argument tells what models to use (also outside app/models).
|
|
||||||
|
|
||||||
```bash
|
|
||||||
php artisan ide-helper:models Post User
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also scan a different directory, using the `--dir` option (relative from the base path):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
php artisan ide-helper:models --dir="path/to/models" --dir="app/src/Model"
|
|
||||||
```
|
|
||||||
|
|
||||||
You can publish the config file (`php artisan vendor:publish`) and set the default directories.
|
|
||||||
|
|
||||||
Models can be ignored using the `--ignore (-I)` option
|
|
||||||
|
|
||||||
```bash
|
|
||||||
php artisan ide-helper:models --ignore="Post,User"
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: With namespaces, wrap your model name in double-quotes (`"`): `php artisan ide-helper:models "API\User"`, or escape the slashes (`Api\\User`)
|
|
||||||
|
|
||||||
For properly recognition of `Model` methods (i.e. `paginate`, `findOrFail`) you should extend `\Eloquent` or add
|
|
||||||
```php
|
|
||||||
/** @mixin \Eloquent */
|
|
||||||
```
|
|
||||||
for your model class.
|
|
||||||
|
|
||||||
### Automatic phpDocs generation for Laravel Fluent methods
|
|
||||||
If you need phpDocs support for Fluent methods in migration, for example
|
|
||||||
```php
|
|
||||||
$table->string("somestring")->nullable()->index();
|
|
||||||
```
|
|
||||||
After publishing vendor, simply change the `include_fluent` line your `config/ide-helper.php` file into:
|
|
||||||
```php
|
|
||||||
'include_fluent' => true,
|
|
||||||
```
|
|
||||||
And then run `php artisan ide-helper:generate` , you will now see all of the Fluent methods are recognized by your IDE.
|
|
||||||
|
|
||||||
|
|
||||||
### Auto-completion for factory builders
|
|
||||||
|
|
||||||
If you would like the `factory()->create()` and `factory()->make()` methods to return the correct model class,
|
|
||||||
you can enable custom factory builders with the `include_factory_builders` line your `config/ide-helper.php` file.
|
|
||||||
|
|
||||||
```php
|
|
||||||
'include_factory_builders' => true,
|
|
||||||
```
|
|
||||||
|
|
||||||
For this to work, you must also publish the PhpStorm Meta file (see below).
|
|
||||||
|
|
||||||
|
|
||||||
## PhpStorm Meta for Container instances
|
|
||||||
|
|
||||||
It's possible to generate a PhpStorm meta file to [add support for factory design pattern](https://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata). For Laravel, this means we can make PhpStorm understand what kind of object we are resolving from the IoC Container. For example, `events` will return an `Illuminate\Events\Dispatcher` object, so with the meta file you can call `app('events')` and it will autocomplete the Dispatcher methods.
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
php artisan ide-helper:meta
|
|
||||||
```
|
|
||||||
|
|
||||||
```php
|
|
||||||
app('events')->fire();
|
|
||||||
\App::make('events')->fire();
|
|
||||||
|
|
||||||
/** @var \Illuminate\Foundation\Application $app */
|
|
||||||
$app->make('events')->fire();
|
|
||||||
|
|
||||||
// When the key is not found, it uses the argument as class name
|
|
||||||
app('App\SomeClass');
|
|
||||||
```
|
|
||||||
|
|
||||||
Pre-generated example: https://gist.github.com/barryvdh/bb6ffc5d11e0a75dba67
|
|
||||||
|
|
||||||
> Note: You might need to restart PhpStorm and make sure `.phpstorm.meta.php` is indexed.
|
|
||||||
> Note: When you receive a FatalException about a class that is not found, check your config (for example, remove S3 as cloud driver when you don't have S3 configured. Remove Redis ServiceProvider when you don't use it).
|
|
||||||
|
|
||||||
## Lumen Install
|
|
||||||
|
|
||||||
This package is focused on Laravel development, but it can also be used in Lumen with some workarounds. Because Lumen works a little different, as it is like a barebone version of Laravel and the main configuration parameters are instead located in `bootstrap/app.php`, some alterations must be made.
|
|
||||||
|
|
||||||
#### Enabling Facades
|
|
||||||
|
|
||||||
While Laravel IDE Helper can generate automatically default Facades for code hinting, Lumen doesn't come with Facades activated. If you plan in using them, you must enable them under the `Create The Application` section, uncommenting this line:
|
|
||||||
|
|
||||||
```php
|
|
||||||
// $app->withFacades();
|
|
||||||
```
|
|
||||||
|
|
||||||
From there, you should be able to use the `create_alias()` function to add additional Facades into your application.
|
|
||||||
|
|
||||||
#### Adding the Service Provider
|
|
||||||
|
|
||||||
You can install Laravel IDE Helper in `app/Providers/AppServiceProvider.php`, and uncommenting this line that registers the App Service Providers so it can properly load.
|
|
||||||
|
|
||||||
```php
|
|
||||||
// $app->register(App\Providers\AppServiceProvider::class);
|
|
||||||
```
|
|
||||||
|
|
||||||
If you are not using that line, that is usually handy to manage gracefully multiple Laravel/Lumen installations, you will have to add this line of code under the `Register Service Providers` section of your `bootstrap/app.php`.
|
|
||||||
|
|
||||||
```php
|
|
||||||
if ($app->environment() !== 'production') {
|
|
||||||
$app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
After that, Laravel IDE Helper should work correctly. During the generation process, the script may throw exceptions saying that some Class(s) doesn't exist or there are some undefined indexes. This is normal, as Lumen has some default packages stripped away, like Cookies, Storage and Session. If you plan to add these packages, you will have to add them manually and create additional Facades if needed.
|
|
||||||
|
|
||||||
#### Adding Additional Facades
|
|
||||||
|
|
||||||
Currently Lumen IDE Helper doesn't take into account additional Facades created under `bootstrap/app.php` using `create_alias()`, so you need to create a `config/app.php` file and add your custom aliases under an `aliases` array again, like so:
|
|
||||||
|
|
||||||
```php
|
|
||||||
return [
|
|
||||||
'aliases' => [
|
|
||||||
'CustomAliasOne' => Example\Support\Facades\CustomAliasOne::class,
|
|
||||||
'CustomAliasTwo' => Example\Support\Facades\CustomAliasTwo::class,
|
|
||||||
//...
|
|
||||||
]
|
|
||||||
];
|
|
||||||
```
|
|
||||||
|
|
||||||
After you run ```php artisan ide-helper:generate```, it's recommended (but not mandatory) to rename `config/app.php` to something else until you have to re-generate the docs or after passing to production enviroment. Lumen 5.1+ will read this file for configuration parameters if it is present, and may overlap some configurations if it is completely populated.
|
|
||||||
|
|
||||||
### License
|
|
||||||
|
|
||||||
The Laravel IDE Helper Generator is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT)
|
|
||||||
|
|
||||||
|
|
||||||
[ico-version]: https://img.shields.io/packagist/v/barryvdh/laravel-ide-helper.svg?style=flat-square
|
|
||||||
[ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square
|
|
||||||
[ico-travis]: https://img.shields.io/travis/barryvdh/laravel-ide-helper/master.svg?style=flat-square
|
|
||||||
[ico-downloads]: https://img.shields.io/packagist/dt/barryvdh/laravel-ide-helper.svg?style=flat-square
|
|
||||||
|
|
||||||
[link-packagist]: https://packagist.org/packages/barryvdh/laravel-ide-helper
|
|
||||||
[link-travis]: https://travis-ci.org/barryvdh/laravel-ide-helper
|
|
||||||
[link-downloads]: https://packagist.org/packages/barryvdh/laravel-ide-helper
|
|
||||||
[link-author]: https://github.com/barryvdh
|
|
||||||
[link-contributors]: ../../contributors
|
|
||||||
+44
-38
@@ -8,11 +8,13 @@
|
|||||||
*/
|
*/
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
/* @noinspection ALL */
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
|
// phpcs:ignoreFile
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A helper file for Laravel 5, to provide autocomplete information to your IDE
|
* A helper file for Laravel, to provide autocomplete information to your IDE
|
||||||
* Generated for Laravel <?= $version ?> on <?= date("Y-m-d H:i:s") ?>.
|
* Generated for Laravel <?= $version ?>.
|
||||||
*
|
*
|
||||||
* This file should not be included in your code, only analyzed by your IDE!
|
* This file should not be included in your code, only analyzed by your IDE!
|
||||||
*
|
*
|
||||||
@@ -20,66 +22,70 @@
|
|||||||
* @see https://github.com/barryvdh/laravel-ide-helper
|
* @see https://github.com/barryvdh/laravel-ide-helper
|
||||||
*/
|
*/
|
||||||
|
|
||||||
<?php foreach($namespaces_by_extends_ns as $namespace => $aliases): ?>
|
<?php foreach ($namespaces_by_extends_ns as $namespace => $aliases) : ?>
|
||||||
<?php if ($namespace == '\Illuminate\Database\Eloquent'): continue; endif; ?>
|
namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
||||||
namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
<?php foreach ($aliases as $alias) : ?>
|
||||||
<?php foreach($aliases as $alias): ?>
|
<?= trim($alias->getDocComment(' ')) ?>
|
||||||
|
<?= $alias->getClassType() ?> <?= $alias->getExtendsClass() ?> {
|
||||||
<?= trim($alias->getDocComment(' ')) ?>
|
<?php foreach ($alias->getMethods() as $method) : ?>
|
||||||
<?= $alias->getClassType() ?> <?= $alias->getExtendsClass() ?> {
|
<?= trim($method->getDocComment(' ')) ?>
|
||||||
<?php foreach($alias->getMethods() as $method): ?>
|
|
||||||
|
|
||||||
<?= trim($method->getDocComment(' ')) ?>
|
|
||||||
public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>)
|
public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>)
|
||||||
{<?php if($method->getDeclaringClass() !== $method->getRoot()): ?>
|
{<?php if ($method->getDeclaringClass() !== $method->getRoot()) : ?>
|
||||||
|
|
||||||
//Method inherited from <?= $method->getDeclaringClass() ?>
|
//Method inherited from <?= $method->getDeclaringClass() ?>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php if($method->isInstanceCall()):?>
|
<?php if ($method->isInstanceCall()) : ?>
|
||||||
/** @var <?=$method->getRoot()?> $instance */
|
/** @var <?=$method->getRoot()?> $instance */
|
||||||
<?php endif?>
|
<?php endif?>
|
||||||
<?= $method->shouldReturn() ? 'return ': '' ?><?= $method->getRootMethodCall() ?>;
|
<?= $method->shouldReturn() ? 'return ' : '' ?><?= $method->getRootMethodCall() ?>;
|
||||||
}
|
}
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
}
|
}
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
}
|
}
|
||||||
|
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
|
||||||
<?php foreach($namespaces_by_alias_ns as $namespace => $aliases): ?>
|
<?php foreach ($namespaces_by_alias_ns as $namespace => $aliases) : ?>
|
||||||
namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
||||||
<?php foreach($aliases as $alias): ?>
|
<?php foreach ($aliases as $alias) : ?>
|
||||||
|
<?= $alias->getClassType() ?> <?= $alias->getShortName() ?> extends <?= $alias->getExtends() ?> {<?php if ($alias->getExtendsNamespace() == '\Illuminate\Database\Eloquent') : ?>
|
||||||
<?= $alias->getClassType() ?> <?= $alias->getShortName() ?> extends <?= $alias->getExtends() ?> {<?php if ($alias->getExtendsNamespace() == '\Illuminate\Database\Eloquent'): ?>
|
<?php foreach ($alias->getMethods() as $method) : ?>
|
||||||
<?php foreach($alias->getMethods() as $method): ?>
|
<?= trim($method->getDocComment(' ')) ?>
|
||||||
<?= trim($method->getDocComment(' ')) ?>
|
|
||||||
public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>)
|
public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>)
|
||||||
{<?php if($method->getDeclaringClass() !== $method->getRoot()): ?>
|
{<?php if ($method->getDeclaringClass() !== $method->getRoot()) : ?>
|
||||||
|
|
||||||
//Method inherited from <?= $method->getDeclaringClass() ?>
|
//Method inherited from <?= $method->getDeclaringClass() ?>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php if($method->isInstanceCall()):?>
|
<?php if ($method->isInstanceCall()) : ?>
|
||||||
/** @var <?=$method->getRoot()?> $instance */
|
/** @var <?=$method->getRoot()?> $instance */
|
||||||
<?php endif?>
|
<?php endif?>
|
||||||
<?= $method->shouldReturn() ? 'return ': '' ?><?= $method->getRootMethodCall() ?>;
|
<?= $method->shouldReturn() ? 'return ' : '' ?><?= $method->getRootMethodCall() ?>;
|
||||||
}
|
}
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
<?php endif; ?>}
|
<?php endif; ?>}
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
}
|
}
|
||||||
|
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
|
||||||
<?php if($helpers): ?>
|
<?php foreach($real_time_facades as $name): ?>
|
||||||
|
<?php $nested = explode('\\', str_replace('\\' . class_basename($name), '', $name)); ?>
|
||||||
|
namespace <?php echo implode('\\', $nested); ?> {
|
||||||
|
/**
|
||||||
|
* @mixin <?= str_replace('Facades', '', $name) ?>
|
||||||
|
*/
|
||||||
|
class <?= class_basename($name) ?> extends <?= str_replace('Facades', '', $name) ?> {}
|
||||||
|
}
|
||||||
|
<?php endforeach; ?>
|
||||||
|
|
||||||
|
<?php if ($helpers) : ?>
|
||||||
namespace {
|
namespace {
|
||||||
<?= $helpers ?>
|
<?= $helpers ?>
|
||||||
}
|
}
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php if($include_fluent): ?>
|
<?php if ($include_fluent) : ?>
|
||||||
namespace Illuminate\Support {
|
namespace Illuminate\Support {
|
||||||
/**
|
/**
|
||||||
* Methods commonly used in migrations
|
* Methods commonly used in migrations
|
||||||
@@ -106,7 +112,7 @@ namespace Illuminate\Support {
|
|||||||
}
|
}
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
|
||||||
<?php foreach ($factories as $factory): ?>
|
<?php foreach ($factories as $factory) : ?>
|
||||||
namespace <?=$factory->getNamespaceName()?> {
|
namespace <?=$factory->getNamespaceName()?> {
|
||||||
/**
|
/**
|
||||||
* @method \Illuminate\Database\Eloquent\Collection|<?=$factory->getShortName()?>[]|<?=$factory->getShortName()?> create($attributes = [])
|
* @method \Illuminate\Database\Eloquent\Collection|<?=$factory->getShortName()?>[]|<?=$factory->getShortName()?> create($attributes = [])
|
||||||
|
|||||||
@@ -1,34 +1,39 @@
|
|||||||
<?= '<?php' ?>
|
<?= '<?php' ?>
|
||||||
|
|
||||||
|
/* @noinspection ALL */
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
|
// phpcs:ignoreFile
|
||||||
|
|
||||||
namespace PHPSTORM_META {
|
namespace PHPSTORM_META {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PhpStorm Meta file, to provide autocomplete information for PhpStorm
|
* PhpStorm Meta file, to provide autocomplete information for PhpStorm
|
||||||
* Generated on <?= date("Y-m-d H:i:s") ?>.
|
|
||||||
*
|
*
|
||||||
* @author Barry vd. Heuvel <[email protected]>
|
* @author Barry vd. Heuvel <[email protected]>
|
||||||
* @see https://github.com/barryvdh/laravel-ide-helper
|
* @see https://github.com/barryvdh/laravel-ide-helper
|
||||||
*/
|
*/
|
||||||
<?php foreach ($methods as $method): ?>
|
<?php foreach ($methods as $method) : ?>
|
||||||
override(<?= $method ?>, map([
|
override(<?= $method ?>, map([
|
||||||
'' => '@',
|
'' => '@',
|
||||||
<?php foreach($bindings as $abstract => $class): ?>
|
<?php foreach ($bindings as $abstract => $class) : ?>
|
||||||
'<?= $abstract ?>' => \<?= $class ?>::class,
|
'<?= $abstract ?>' => \<?= $class ?>::class,
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
]));
|
]));
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
|
||||||
<?php if (count($factories)): ?>
|
<?php if (count($factories)) : ?>
|
||||||
override(\factory(0), map([
|
override(\factory(0), map([
|
||||||
'' => '@FactoryBuilder',
|
'' => '@FactoryBuilder',
|
||||||
<?php foreach($factories as $factory): ?>
|
<?php foreach ($factories as $factory) : ?>
|
||||||
'<?= $factory->getName() ?>' => \<?= $factory->getName() ?>FactoryBuilder::class,
|
'<?= $factory->getName() ?>' => \<?= $factory->getName() ?>FactoryBuilder::class,
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
]));
|
]));
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
|
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::instance(0), type(1));
|
||||||
|
override(\Illuminate\Foundation\Testing\Concerns\InteractsWithContainer::spy(0), map(["" => "@&\Mockery\MockInterface"]));
|
||||||
override(\Illuminate\Support\Arr::add(0), type(0));
|
override(\Illuminate\Support\Arr::add(0), type(0));
|
||||||
override(\Illuminate\Support\Arr::except(0), type(0));
|
override(\Illuminate\Support\Arr::except(0), type(0));
|
||||||
override(\Illuminate\Support\Arr::first(0), elementType(0));
|
override(\Illuminate\Support\Arr::first(0), elementType(0));
|
||||||
@@ -58,5 +63,6 @@ namespace PHPSTORM_META {
|
|||||||
override(\last(0), elementType(0));
|
override(\last(0), elementType(0));
|
||||||
override(\with(0), type(0));
|
override(\with(0), type(0));
|
||||||
override(\tap(0), type(0));
|
override(\tap(0), type(0));
|
||||||
|
override(\optional(0), type(0));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+58
-47
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Laravel IDE Helper Generator
|
* Laravel IDE Helper Generator
|
||||||
*
|
*
|
||||||
@@ -10,17 +11,21 @@
|
|||||||
|
|
||||||
namespace Barryvdh\LaravelIdeHelper;
|
namespace Barryvdh\LaravelIdeHelper;
|
||||||
|
|
||||||
use Closure;
|
|
||||||
use ReflectionClass;
|
|
||||||
use Barryvdh\Reflection\DocBlock;
|
use Barryvdh\Reflection\DocBlock;
|
||||||
use Barryvdh\Reflection\DocBlock\Context;
|
use Barryvdh\Reflection\DocBlock\Context;
|
||||||
use Barryvdh\Reflection\DocBlock\Tag\MethodTag;
|
|
||||||
use Illuminate\Config\Repository as ConfigRepository;
|
|
||||||
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
||||||
|
use Barryvdh\Reflection\DocBlock\Tag\MethodTag;
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Config\Repository as ConfigRepository;
|
||||||
|
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||||
|
use Illuminate\Support\Facades\Facade;
|
||||||
|
use ReflectionClass;
|
||||||
|
use Throwable;
|
||||||
|
|
||||||
class Alias
|
class Alias
|
||||||
{
|
{
|
||||||
protected $alias;
|
protected $alias;
|
||||||
|
/** @psalm-var class-string $facade */
|
||||||
protected $facade;
|
protected $facade;
|
||||||
protected $extends = null;
|
protected $extends = null;
|
||||||
protected $extendsClass = null;
|
protected $extendsClass = null;
|
||||||
@@ -29,13 +34,14 @@ class Alias
|
|||||||
protected $short;
|
protected $short;
|
||||||
protected $namespace = '__root';
|
protected $namespace = '__root';
|
||||||
protected $root = null;
|
protected $root = null;
|
||||||
protected $classes = array();
|
protected $classes = [];
|
||||||
protected $methods = array();
|
protected $methods = [];
|
||||||
protected $usedMethods = array();
|
protected $usedMethods = [];
|
||||||
protected $valid = false;
|
protected $valid = false;
|
||||||
protected $magicMethods = array();
|
protected $magicMethods = [];
|
||||||
protected $interfaces = array();
|
protected $interfaces = [];
|
||||||
protected $phpdoc = null;
|
protected $phpdoc = null;
|
||||||
|
protected $classAliases = [];
|
||||||
|
|
||||||
/** @var ConfigRepository */
|
/** @var ConfigRepository */
|
||||||
protected $config;
|
protected $config;
|
||||||
@@ -43,11 +49,12 @@ class Alias
|
|||||||
/**
|
/**
|
||||||
* @param ConfigRepository $config
|
* @param ConfigRepository $config
|
||||||
* @param string $alias
|
* @param string $alias
|
||||||
|
* @psalm-param class-string $facade
|
||||||
* @param string $facade
|
* @param string $facade
|
||||||
* @param array $magicMethods
|
* @param array $magicMethods
|
||||||
* @param array $interfaces
|
* @param array $interfaces
|
||||||
*/
|
*/
|
||||||
public function __construct($config, $alias, $facade, $magicMethods = array(), $interfaces = array())
|
public function __construct($config, $alias, $facade, $magicMethods = [], $interfaces = [])
|
||||||
{
|
{
|
||||||
$this->alias = $alias;
|
$this->alias = $alias;
|
||||||
$this->magicMethods = $magicMethods;
|
$this->magicMethods = $magicMethods;
|
||||||
@@ -60,12 +67,12 @@ class Alias
|
|||||||
|
|
||||||
$this->detectRoot();
|
$this->detectRoot();
|
||||||
|
|
||||||
if ((!$this->isTrait() && $this->root)) {
|
if (!$this->root || $this->isTrait()) {
|
||||||
$this->valid = true;
|
|
||||||
} else {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->valid = true;
|
||||||
|
|
||||||
$this->addClass($this->root);
|
$this->addClass($this->root);
|
||||||
$this->detectFake();
|
$this->detectFake();
|
||||||
$this->detectNamespace();
|
$this->detectNamespace();
|
||||||
@@ -73,13 +80,14 @@ class Alias
|
|||||||
$this->detectExtendsNamespace();
|
$this->detectExtendsNamespace();
|
||||||
|
|
||||||
if (!empty($this->namespace)) {
|
if (!empty($this->namespace)) {
|
||||||
|
$this->classAliases = (new UsesResolver())->loadFromClass($this->root);
|
||||||
|
|
||||||
//Create a DocBlock and serializer instance
|
//Create a DocBlock and serializer instance
|
||||||
$this->phpdoc = new DocBlock(new ReflectionClass($alias), new Context($this->namespace));
|
$this->phpdoc = new DocBlock(new ReflectionClass($alias), new Context($this->namespace, $this->classAliases));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ($facade === '\Illuminate\Database\Eloquent\Model') {
|
if ($facade === '\Illuminate\Database\Eloquent\Model') {
|
||||||
$this->usedMethods = array('decrement', 'increment');
|
$this->usedMethods = ['decrement', 'increment'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,13 +206,17 @@ class Alias
|
|||||||
protected function detectFake()
|
protected function detectFake()
|
||||||
{
|
{
|
||||||
$facade = $this->facade;
|
$facade = $this->facade;
|
||||||
|
|
||||||
|
if (!is_subclass_of($facade, Facade::class)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!method_exists($facade, 'fake')) {
|
if (!method_exists($facade, 'fake')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$real = $facade::getFacadeRoot();
|
$real = $facade::getFacadeRoot();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$facade::fake();
|
$facade::fake();
|
||||||
$fake = $facade::getFacadeRoot();
|
$fake = $facade::getFacadeRoot();
|
||||||
@@ -286,12 +298,12 @@ class Alias
|
|||||||
//When the database connection is not set, some classes will be skipped
|
//When the database connection is not set, some classes will be skipped
|
||||||
} catch (\PDOException $e) {
|
} catch (\PDOException $e) {
|
||||||
$this->error(
|
$this->error(
|
||||||
"PDOException: " . $e->getMessage() .
|
'PDOException: ' . $e->getMessage() .
|
||||||
"\nPlease configure your database connection correctly, or use the sqlite memory driver (-M)." .
|
"\nPlease configure your database connection correctly, or use the sqlite memory driver (-M)." .
|
||||||
" Skipping $facade."
|
" Skipping $facade."
|
||||||
);
|
);
|
||||||
} catch (\Exception $e) {
|
} catch (Throwable $e) {
|
||||||
$this->error("Exception: " . $e->getMessage() . "\nSkipping $facade.");
|
$this->error('Exception: ' . $e->getMessage() . "\nSkipping $facade.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -303,10 +315,7 @@ class Alias
|
|||||||
protected function isTrait()
|
protected function isTrait()
|
||||||
{
|
{
|
||||||
// Check if the facade is not a Trait
|
// Check if the facade is not a Trait
|
||||||
if (function_exists('trait_exists') && trait_exists($this->facade)) {
|
return trait_exists($this->facade);
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,16 +324,16 @@ class Alias
|
|||||||
protected function addMagicMethods()
|
protected function addMagicMethods()
|
||||||
{
|
{
|
||||||
foreach ($this->magicMethods as $magic => $real) {
|
foreach ($this->magicMethods as $magic => $real) {
|
||||||
list($className, $name) = explode('::', $real);
|
[$className, $name] = explode('::', $real);
|
||||||
if ((!class_exists($className) && !interface_exists($className)) || !method_exists($className, $name)) {
|
if ((!class_exists($className) && !interface_exists($className)) || !method_exists($className, $name)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$method = new \ReflectionMethod($className, $name);
|
$method = new \ReflectionMethod($className, $name);
|
||||||
$class = new \ReflectionClass($className);
|
$class = new ReflectionClass($className);
|
||||||
|
|
||||||
if (!in_array($magic, $this->usedMethods)) {
|
if (!in_array($magic, $this->usedMethods)) {
|
||||||
if ($class !== $this->root) {
|
if ($class !== $this->root) {
|
||||||
$this->methods[] = new Method($method, $this->alias, $class, $magic, $this->interfaces);
|
$this->methods[] = new Method($method, $this->alias, $class, $magic, $this->interfaces, $this->classAliases);
|
||||||
}
|
}
|
||||||
$this->usedMethods[] = $magic;
|
$this->usedMethods[] = $magic;
|
||||||
}
|
}
|
||||||
@@ -338,9 +347,8 @@ class Alias
|
|||||||
*/
|
*/
|
||||||
protected function detectMethods()
|
protected function detectMethods()
|
||||||
{
|
{
|
||||||
|
|
||||||
foreach ($this->classes as $class) {
|
foreach ($this->classes as $class) {
|
||||||
$reflection = new \ReflectionClass($class);
|
$reflection = new ReflectionClass($class);
|
||||||
|
|
||||||
$methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC);
|
$methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC);
|
||||||
if ($methods) {
|
if ($methods) {
|
||||||
@@ -354,7 +362,8 @@ class Alias
|
|||||||
$this->alias,
|
$this->alias,
|
||||||
$reflection,
|
$reflection,
|
||||||
$method->name,
|
$method->name,
|
||||||
$this->interfaces
|
$this->interfaces,
|
||||||
|
$this->classAliases
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
$this->usedMethods[] = $method->name;
|
$this->usedMethods[] = $method->name;
|
||||||
@@ -363,8 +372,9 @@ class Alias
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if the class is macroable
|
// Check if the class is macroable
|
||||||
|
// (Eloquent\Builder is also macroable but doesn't use Macroable trait)
|
||||||
$traits = collect($reflection->getTraitNames());
|
$traits = collect($reflection->getTraitNames());
|
||||||
if ($traits->contains('Illuminate\Support\Traits\Macroable')) {
|
if ($traits->contains('Illuminate\Support\Traits\Macroable') || $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) {
|
||||||
@@ -375,7 +385,8 @@ class Alias
|
|||||||
$this->alias,
|
$this->alias,
|
||||||
$reflection,
|
$reflection,
|
||||||
$macro_name,
|
$macro_name,
|
||||||
$this->interfaces
|
$this->interfaces,
|
||||||
|
$this->classAliases
|
||||||
);
|
);
|
||||||
$this->usedMethods[] = $macro_name;
|
$this->usedMethods[] = $macro_name;
|
||||||
}
|
}
|
||||||
@@ -413,22 +424,22 @@ class Alias
|
|||||||
{
|
{
|
||||||
$serializer = new DocBlockSerializer(1, $prefix);
|
$serializer = new DocBlockSerializer(1, $prefix);
|
||||||
|
|
||||||
if ($this->phpdoc) {
|
if (!$this->phpdoc) {
|
||||||
if ($this->config->get('ide-helper.include_class_docblocks')) {
|
return '';
|
||||||
// if a class doesn't expose any DocBlock tags
|
|
||||||
// we can perform reflection on the class and
|
|
||||||
// add in the original class DocBlock
|
|
||||||
if (count($this->phpdoc->getTags()) === 0) {
|
|
||||||
$class = new ReflectionClass($this->root);
|
|
||||||
$this->phpdoc = new DocBlock($class->getDocComment());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->removeDuplicateMethodsFromPhpDoc();
|
|
||||||
return $serializer->getDocComment($this->phpdoc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
if ($this->config->get('ide-helper.include_class_docblocks')) {
|
||||||
|
// if a class doesn't expose any DocBlock tags
|
||||||
|
// we can perform reflection on the class and
|
||||||
|
// add in the original class DocBlock
|
||||||
|
if (count($this->phpdoc->getTags()) === 0) {
|
||||||
|
$class = new ReflectionClass($this->root);
|
||||||
|
$this->phpdoc = new DocBlock($class->getDocComment());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->removeDuplicateMethodsFromPhpDoc();
|
||||||
|
return $serializer->getDocComment($this->phpdoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Laravel IDE Helper Generator - Eloquent Model Mixin
|
* Laravel IDE Helper Generator - Eloquent Model Mixin
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Laravel IDE Helper Generator
|
* Laravel IDE Helper Generator
|
||||||
*
|
*
|
||||||
@@ -14,8 +15,8 @@ use Barryvdh\LaravelIdeHelper\Eloquent;
|
|||||||
use Barryvdh\LaravelIdeHelper\Generator;
|
use Barryvdh\LaravelIdeHelper\Generator;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
use Illuminate\Filesystem\Filesystem;
|
use Illuminate\Filesystem\Filesystem;
|
||||||
use Symfony\Component\Console\Input\InputOption;
|
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A command to generate autocomplete information for your IDE
|
* A command to generate autocomplete information for your IDE
|
||||||
@@ -24,7 +25,6 @@ use Symfony\Component\Console\Input\InputArgument;
|
|||||||
*/
|
*/
|
||||||
class GeneratorCommand extends Command
|
class GeneratorCommand extends Command
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The console command name.
|
* The console command name.
|
||||||
*
|
*
|
||||||
@@ -42,7 +42,7 @@ class GeneratorCommand extends Command
|
|||||||
/** @var \Illuminate\Config\Repository */
|
/** @var \Illuminate\Config\Repository */
|
||||||
protected $config;
|
protected $config;
|
||||||
|
|
||||||
/** @var \Illuminate\Filesystem\Filesystem */
|
/** @var Filesystem */
|
||||||
protected $files;
|
protected $files;
|
||||||
|
|
||||||
/** @var \Illuminate\View\Factory */
|
/** @var \Illuminate\View\Factory */
|
||||||
@@ -54,11 +54,12 @@ class GeneratorCommand extends Command
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Config\Repository $config
|
* @param \Illuminate\Config\Repository $config
|
||||||
* @param \Illuminate\Filesystem\Filesystem $files
|
* @param Filesystem $files
|
||||||
* @param \Illuminate\View\Factory $view
|
* @param \Illuminate\View\Factory $view
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
/*ConfigRepository */ $config,
|
/*ConfigRepository */
|
||||||
|
$config,
|
||||||
Filesystem $files,
|
Filesystem $files,
|
||||||
/* Illuminate\View\Factory */
|
/* Illuminate\View\Factory */
|
||||||
$view
|
$view
|
||||||
@@ -76,52 +77,53 @@ class GeneratorCommand extends Command
|
|||||||
*/
|
*/
|
||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
if (file_exists(base_path() . '/vendor/compiled.php') ||
|
if (
|
||||||
|
file_exists(base_path() . '/vendor/compiled.php') ||
|
||||||
file_exists(base_path() . '/bootstrap/cache/compiled.php') ||
|
file_exists(base_path() . '/bootstrap/cache/compiled.php') ||
|
||||||
file_exists(base_path() . '/storage/framework/compiled.php')) {
|
file_exists(base_path() . '/storage/framework/compiled.php')
|
||||||
|
) {
|
||||||
$this->error(
|
$this->error(
|
||||||
'Error generating IDE Helper: first delete your compiled file (php artisan clear-compiled)'
|
'Error generating IDE Helper: first delete your compiled file (php artisan clear-compiled)'
|
||||||
);
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$filename = $this->argument('filename');
|
||||||
|
|
||||||
|
// Add the php extension if missing
|
||||||
|
// This is a backwards-compatible shim and can be removed in the future
|
||||||
|
if (substr($filename, -4, 4) !== '.php') {
|
||||||
|
$filename .= '.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->option('memory')) {
|
||||||
|
$this->useMemoryDriver();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$helpers = '';
|
||||||
|
if ($this->option('helpers') || ($this->config->get('ide-helper.include_helpers'))) {
|
||||||
|
foreach ($this->config->get('ide-helper.helper_files', []) as $helper) {
|
||||||
|
if (file_exists($helper)) {
|
||||||
|
$helpers .= str_replace(['<?php', '?>'], '', $this->files->get($helper));
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$filename = $this->argument('filename');
|
|
||||||
$format = $this->option('format');
|
|
||||||
|
|
||||||
// Strip the php extension
|
|
||||||
if (substr($filename, -4, 4) == '.php') {
|
|
||||||
$filename = substr($filename, 0, -4);
|
|
||||||
}
|
|
||||||
|
|
||||||
$filename .= '.' . $format;
|
|
||||||
|
|
||||||
if ($this->option('memory')) {
|
|
||||||
$this->useMemoryDriver();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$helpers = '';
|
$helpers = '';
|
||||||
if ($this->option('helpers') || ($this->config->get('ide-helper.include_helpers'))) {
|
}
|
||||||
foreach ($this->config->get('ide-helper.helper_files', array()) as $helper) {
|
|
||||||
if (file_exists($helper)) {
|
|
||||||
$helpers .= str_replace(array('<?php', '?>'), '', $this->files->get($helper));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$helpers = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$generator = new Generator($this->config, $this->view, $this->getOutput(), $helpers);
|
$generator = new Generator($this->config, $this->view, $this->getOutput(), $helpers);
|
||||||
$content = $generator->generate($format);
|
$content = $generator->generate();
|
||||||
$written = $this->files->put($filename, $content);
|
$written = $this->files->put($filename, $content);
|
||||||
|
|
||||||
if ($written !== false) {
|
if ($written !== false) {
|
||||||
$this->info("A new helper file was written to $filename");
|
$this->info("A new helper file was written to $filename");
|
||||||
|
|
||||||
if ($this->option('write_mixins')) {
|
if ($this->option('write_mixins')) {
|
||||||
Eloquent::writeEloquentModelHelper($this, $this->files);
|
Eloquent::writeEloquentModelHelper($this, $this->files);
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$this->error("The helper file could not be created at $filename");
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
$this->error("The helper file could not be created at $filename");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,10 +132,10 @@ class GeneratorCommand extends Command
|
|||||||
//Use a sqlite database in memory, to avoid connection errors on Database facades
|
//Use a sqlite database in memory, to avoid connection errors on Database facades
|
||||||
$this->config->set(
|
$this->config->set(
|
||||||
'database.connections.sqlite',
|
'database.connections.sqlite',
|
||||||
array(
|
[
|
||||||
'driver' => 'sqlite',
|
'driver' => 'sqlite',
|
||||||
'database' => ':memory:',
|
'database' => ':memory:',
|
||||||
)
|
]
|
||||||
);
|
);
|
||||||
$this->config->set('database.default', 'sqlite');
|
$this->config->set('database.default', 'sqlite');
|
||||||
}
|
}
|
||||||
@@ -147,11 +149,11 @@ class GeneratorCommand extends Command
|
|||||||
{
|
{
|
||||||
$filename = $this->config->get('ide-helper.filename');
|
$filename = $this->config->get('ide-helper.filename');
|
||||||
|
|
||||||
return array(
|
return [
|
||||||
array(
|
[
|
||||||
'filename', InputArgument::OPTIONAL, 'The path to the helper file', $filename
|
'filename', InputArgument::OPTIONAL, 'The path to the helper file', $filename,
|
||||||
),
|
],
|
||||||
);
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -161,15 +163,12 @@ class GeneratorCommand extends Command
|
|||||||
*/
|
*/
|
||||||
protected function getOptions()
|
protected function getOptions()
|
||||||
{
|
{
|
||||||
$format = $this->config->get('ide-helper.format');
|
|
||||||
$writeMixins = $this->config->get('ide-helper.write_eloquent_model_mixins');
|
$writeMixins = $this->config->get('ide-helper.write_eloquent_model_mixins');
|
||||||
|
|
||||||
return array(
|
return [
|
||||||
array('format', "F", InputOption::VALUE_OPTIONAL, 'The format for the IDE Helper', $format),
|
['write_mixins', 'W', InputOption::VALUE_OPTIONAL, 'Write mixins to Laravel Model?', $writeMixins],
|
||||||
array('write_mixins', "W", InputOption::VALUE_OPTIONAL, 'Write mixins to Laravel Model?', $writeMixins),
|
['helpers', 'H', InputOption::VALUE_NONE, 'Include the helper files'],
|
||||||
array('helpers', "H", InputOption::VALUE_NONE, 'Include the helper files'),
|
['memory', 'M', InputOption::VALUE_NONE, 'Use sqlite memory driver'],
|
||||||
array('memory', "M", InputOption::VALUE_NONE, 'Use sqlite memory driver'),
|
];
|
||||||
array('sublime', "S", InputOption::VALUE_NONE, 'DEPRECATED: Use different style for SublimeText CodeIntel'),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+37
-12
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Laravel IDE Helper Generator
|
* Laravel IDE Helper Generator
|
||||||
*
|
*
|
||||||
@@ -12,6 +13,7 @@ namespace Barryvdh\LaravelIdeHelper\Console;
|
|||||||
|
|
||||||
use Barryvdh\LaravelIdeHelper\Factories;
|
use Barryvdh\LaravelIdeHelper\Factories;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
|
use RuntimeException;
|
||||||
use Symfony\Component\Console\Input\InputOption;
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
|
||||||
@@ -22,7 +24,6 @@ use Symfony\Component\Console\Output\OutputInterface;
|
|||||||
*/
|
*/
|
||||||
class MetaCommand extends Command
|
class MetaCommand extends Command
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The console command name.
|
* The console command name.
|
||||||
*
|
*
|
||||||
@@ -43,25 +44,28 @@ class MetaCommand extends Command
|
|||||||
/** @var \Illuminate\Contracts\View\Factory */
|
/** @var \Illuminate\Contracts\View\Factory */
|
||||||
protected $view;
|
protected $view;
|
||||||
|
|
||||||
/** @var \Illuminate\Contracts\Config */
|
/** @var \Illuminate\Contracts\Config\Repository */
|
||||||
protected $config;
|
protected $config;
|
||||||
|
|
||||||
protected $methods = [
|
protected $methods = [
|
||||||
'new \Illuminate\Contracts\Container\Container',
|
'new \Illuminate\Contracts\Container\Container',
|
||||||
'\Illuminate\Container\Container::makeWith(0)',
|
'\Illuminate\Container\Container::makeWith(0)',
|
||||||
|
'\Illuminate\Contracts\Container\Container::get(0)',
|
||||||
'\Illuminate\Contracts\Container\Container::make(0)',
|
'\Illuminate\Contracts\Container\Container::make(0)',
|
||||||
'\Illuminate\Contracts\Container\Container::makeWith(0)',
|
'\Illuminate\Contracts\Container\Container::makeWith(0)',
|
||||||
|
'\App::get(0)',
|
||||||
'\App::make(0)',
|
'\App::make(0)',
|
||||||
'\App::makeWith(0)',
|
'\App::makeWith(0)',
|
||||||
'\app(0)',
|
'\app(0)',
|
||||||
'\resolve(0)',
|
'\resolve(0)',
|
||||||
|
'\Psr\Container\ContainerInterface::get(0)',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Contracts\Filesystem\Filesystem $files
|
* @param \Illuminate\Contracts\Filesystem\Filesystem $files
|
||||||
* @param \Illuminate\Contracts\View\Factory $view
|
* @param \Illuminate\Contracts\View\Factory $view
|
||||||
* @param \Illuminate\Contracts\Config $config
|
* @param \Illuminate\Contracts\Config\Repository $config
|
||||||
*/
|
*/
|
||||||
public function __construct($files, $view, $config)
|
public function __construct($files, $view, $config)
|
||||||
{
|
{
|
||||||
@@ -81,9 +85,9 @@ class MetaCommand extends Command
|
|||||||
// Needs to run before exception handler is registered
|
// Needs to run before exception handler is registered
|
||||||
$factories = $this->config->get('ide-helper.include_factory_builders') ? Factories::all() : [];
|
$factories = $this->config->get('ide-helper.include_factory_builders') ? Factories::all() : [];
|
||||||
|
|
||||||
$this->registerClassAutoloadExceptions();
|
$ourAutoloader = $this->registerClassAutoloadExceptions();
|
||||||
|
|
||||||
$bindings = array();
|
$bindings = [];
|
||||||
foreach ($this->getAbstracts() as $abstract) {
|
foreach ($this->getAbstracts() as $abstract) {
|
||||||
// Validator and seeder cause problems
|
// Validator and seeder cause problems
|
||||||
if (in_array($abstract, ['validator', 'seeder'])) {
|
if (in_array($abstract, ['validator', 'seeder'])) {
|
||||||
@@ -92,17 +96,24 @@ class MetaCommand extends Command
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
$concrete = $this->laravel->make($abstract);
|
$concrete = $this->laravel->make($abstract);
|
||||||
|
|
||||||
|
if ($concrete === null) {
|
||||||
|
throw new RuntimeException("Cannot create instance for '$abstract', received 'null'");
|
||||||
|
}
|
||||||
|
|
||||||
$reflectionClass = new \ReflectionClass($concrete);
|
$reflectionClass = new \ReflectionClass($concrete);
|
||||||
if (is_object($concrete) && !$reflectionClass->isAnonymous()) {
|
if (is_object($concrete) && !$reflectionClass->isAnonymous()) {
|
||||||
$bindings[$abstract] = get_class($concrete);
|
$bindings[$abstract] = get_class($concrete);
|
||||||
}
|
}
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
if ($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
|
if ($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
|
||||||
$this->comment("Cannot make '$abstract': ".$e->getMessage());
|
$this->comment("Cannot make '$abstract': " . $e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->unregisterClassAutoloadExceptions($ourAutoloader);
|
||||||
|
|
||||||
$content = $this->view->make('meta', [
|
$content = $this->view->make('meta', [
|
||||||
'bindings' => $bindings,
|
'bindings' => $bindings,
|
||||||
'methods' => $this->methods,
|
'methods' => $this->methods,
|
||||||
@@ -138,12 +149,16 @@ class MetaCommand extends Command
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Register an autoloader the throws exceptions when a class is not found.
|
* Register an autoloader the throws exceptions when a class is not found.
|
||||||
|
*
|
||||||
|
* @return callable
|
||||||
*/
|
*/
|
||||||
protected function registerClassAutoloadExceptions()
|
protected function registerClassAutoloadExceptions(): callable
|
||||||
{
|
{
|
||||||
spl_autoload_register(function ($class) {
|
$autoloader = function ($class) {
|
||||||
throw new \ReflectionException("Class '$class' not found.");
|
throw new \ReflectionException("Class '$class' not found.");
|
||||||
});
|
};
|
||||||
|
spl_autoload_register($autoloader);
|
||||||
|
return $autoloader;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -155,8 +170,18 @@ class MetaCommand extends Command
|
|||||||
{
|
{
|
||||||
$filename = $this->config->get('ide-helper.meta_filename');
|
$filename = $this->config->get('ide-helper.meta_filename');
|
||||||
|
|
||||||
return array(
|
return [
|
||||||
array('filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the meta file', $filename),
|
['filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the meta file', $filename],
|
||||||
);
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove our custom autoloader that we pushed onto the autoload stack
|
||||||
|
*
|
||||||
|
* @param callable $ourAutoloader
|
||||||
|
*/
|
||||||
|
private function unregisterClassAutoloadExceptions(callable $ourAutoloader): void
|
||||||
|
{
|
||||||
|
spl_autoload_unregister($ourAutoloader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1129
-277
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Contracts;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
interface ModelHookInterface
|
||||||
|
{
|
||||||
|
public function run(ModelsCommand $command, Model $model): void;
|
||||||
|
}
|
||||||
+25
-20
@@ -5,14 +5,15 @@
|
|||||||
*
|
*
|
||||||
* @author Charles A. Peterson <[email protected]>
|
* @author Charles A. Peterson <[email protected]>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Barryvdh\LaravelIdeHelper;
|
namespace Barryvdh\LaravelIdeHelper;
|
||||||
|
|
||||||
use Illuminate\Console\Command;
|
|
||||||
use Illuminate\Filesystem\Filesystem;
|
|
||||||
use Barryvdh\Reflection\DocBlock;
|
use Barryvdh\Reflection\DocBlock;
|
||||||
use Barryvdh\Reflection\DocBlock\Context;
|
use Barryvdh\Reflection\DocBlock\Context;
|
||||||
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
||||||
use Barryvdh\Reflection\DocBlock\Tag;
|
use Barryvdh\Reflection\DocBlock\Tag;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
use Illuminate\Filesystem\Filesystem;
|
||||||
|
|
||||||
class Eloquent
|
class Eloquent
|
||||||
{
|
{
|
||||||
@@ -84,25 +85,29 @@ class Eloquent
|
|||||||
}
|
}
|
||||||
|
|
||||||
$filename = $reflection->getFileName();
|
$filename = $reflection->getFileName();
|
||||||
if ($filename) {
|
if (!$filename) {
|
||||||
$contents = $files->get($filename);
|
|
||||||
if ($contents) {
|
|
||||||
$count = 0;
|
|
||||||
$contents = str_replace($originalDoc, $docComment, $contents, $count);
|
|
||||||
if ($count > 0) {
|
|
||||||
if ($files->put($filename, $contents)) {
|
|
||||||
$command->info('Wrote expected docblock to ' . $filename);
|
|
||||||
} else {
|
|
||||||
$command->error('File write failed to ' . $filename);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$command->error('Content did not change ' . $contents);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$command->error('No file contents found ' . $filename);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$command->error('Filename not found ' . $class);
|
$command->error('Filename not found ' . $class);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$contents = $files->get($filename);
|
||||||
|
if (!$contents) {
|
||||||
|
$command->error('No file contents found ' . $filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$count = 0;
|
||||||
|
$contents = str_replace($originalDoc, $docComment, $contents, $count);
|
||||||
|
if ($count <= 0) {
|
||||||
|
$command->error('Content did not change ' . $contents);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$files->put($filename, $contents)) {
|
||||||
|
$command->error('File write failed to ' . $filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$command->info('Wrote expected docblock to ' . $filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-8
@@ -8,23 +8,29 @@ use ReflectionClass;
|
|||||||
|
|
||||||
class Factories
|
class Factories
|
||||||
{
|
{
|
||||||
|
|
||||||
public static function all()
|
public static function all()
|
||||||
{
|
{
|
||||||
$factories = [];
|
$factories = [];
|
||||||
|
|
||||||
$factory = app(Factory::class);
|
if (static::isLaravelSevenOrLower()) {
|
||||||
|
$factory = app(Factory::class);
|
||||||
|
|
||||||
$definitions = (new ReflectionClass(Factory::class))->getProperty('definitions');
|
$definitions = (new ReflectionClass(Factory::class))->getProperty('definitions');
|
||||||
$definitions->setAccessible(true);
|
$definitions->setAccessible(true);
|
||||||
|
|
||||||
foreach ($definitions->getValue($factory) as $factory_target => $config) {
|
foreach ($definitions->getValue($factory) as $factory_target => $config) {
|
||||||
try {
|
try {
|
||||||
$factories[] = new ReflectionClass($factory_target);
|
$factories[] = new ReflectionClass($factory_target);
|
||||||
} catch (Exception $exception) {
|
} catch (Exception $exception) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $factories;
|
return $factories;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static function isLaravelSevenOrLower()
|
||||||
|
{
|
||||||
|
return class_exists('Illuminate\Database\Eloquent\Factory');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+141
-108
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Laravel IDE Helper Generator
|
* Laravel IDE Helper Generator
|
||||||
*
|
*
|
||||||
@@ -10,9 +11,15 @@
|
|||||||
|
|
||||||
namespace Barryvdh\LaravelIdeHelper;
|
namespace Barryvdh\LaravelIdeHelper;
|
||||||
|
|
||||||
use Illuminate\Foundation\Application;
|
|
||||||
use Illuminate\Foundation\AliasLoader;
|
use Illuminate\Foundation\AliasLoader;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
|
use Illuminate\Support\Facades\Facade;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
use Illuminate\Support\Traits\Macroable;
|
||||||
|
use PhpParser\Lexer\Emulative;
|
||||||
|
use PhpParser\Node\Stmt\Class_;
|
||||||
|
use PhpParser\Node\Stmt\Namespace_;
|
||||||
|
use PhpParser\Parser\Php7;
|
||||||
use ReflectionClass;
|
use ReflectionClass;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
|
||||||
@@ -24,23 +31,25 @@ class Generator
|
|||||||
/** @var \Illuminate\View\Factory */
|
/** @var \Illuminate\View\Factory */
|
||||||
protected $view;
|
protected $view;
|
||||||
|
|
||||||
/** @var \Symfony\Component\Console\Output\OutputInterface */
|
/** @var OutputInterface */
|
||||||
protected $output;
|
protected $output;
|
||||||
|
|
||||||
protected $extra = array();
|
protected $extra = [];
|
||||||
protected $magic = array();
|
protected $magic = [];
|
||||||
protected $interfaces = array();
|
protected $interfaces = [];
|
||||||
protected $helpers;
|
protected $helpers;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param \Illuminate\Config\Repository $config
|
* @param \Illuminate\Config\Repository $config
|
||||||
* @param \Illuminate\View\Factory $view
|
* @param \Illuminate\View\Factory $view
|
||||||
* @param \Symfony\Component\Console\Output\OutputInterface $output
|
* @param OutputInterface $output
|
||||||
* @param string $helpers
|
* @param string $helpers
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
/*ConfigRepository */ $config,
|
/*ConfigRepository */
|
||||||
/* Illuminate\View\Factory */ $view,
|
$config,
|
||||||
|
/* Illuminate\View\Factory */
|
||||||
|
$view,
|
||||||
OutputInterface $output = null,
|
OutputInterface $output = null,
|
||||||
$helpers = ''
|
$helpers = ''
|
||||||
) {
|
) {
|
||||||
@@ -50,9 +59,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'), []);
|
||||||
// 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, '\\');
|
||||||
@@ -63,26 +72,15 @@ class Generator
|
|||||||
/**
|
/**
|
||||||
* Generate the helper file contents;
|
* Generate the helper file contents;
|
||||||
*
|
*
|
||||||
* @param string $format The format to generate the helper in (php/json)
|
|
||||||
* @return string;
|
* @return string;
|
||||||
*/
|
*/
|
||||||
public function generate($format = 'php')
|
public function generate()
|
||||||
{
|
|
||||||
// Check if the generator for this format exists
|
|
||||||
$method = 'generate'.ucfirst($format).'Helper';
|
|
||||||
if (method_exists($this, $method)) {
|
|
||||||
return $this->$method();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->generatePhpHelper();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function generatePhpHelper()
|
|
||||||
{
|
{
|
||||||
$app = app();
|
$app = app();
|
||||||
return $this->view->make('helper')
|
return $this->view->make('helper')
|
||||||
->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('helpers', $this->helpers)
|
->with('helpers', $this->helpers)
|
||||||
->with('version', $app->version())
|
->with('version', $app->version())
|
||||||
->with('include_fluent', $this->config->get('ide-helper.include_fluent', true))
|
->with('include_fluent', $this->config->get('ide-helper.include_fluent', true))
|
||||||
@@ -90,51 +88,18 @@ class Generator
|
|||||||
->render();
|
->render();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generateJsonHelper()
|
|
||||||
{
|
|
||||||
$classes = array();
|
|
||||||
foreach ($this->getValidAliases() as $aliases) {
|
|
||||||
foreach ($aliases as $alias) {
|
|
||||||
$functions = array();
|
|
||||||
foreach ($alias->getMethods() as $method) {
|
|
||||||
$functions[$method->getName()] = '('. $method->getParamsWithDefault().')';
|
|
||||||
}
|
|
||||||
$classes[$alias->getAlias()] = array(
|
|
||||||
'functions' => $functions,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$flags = JSON_FORCE_OBJECT;
|
|
||||||
if (defined('JSON_PRETTY_PRINT')) {
|
|
||||||
$flags |= JSON_PRETTY_PRINT;
|
|
||||||
}
|
|
||||||
|
|
||||||
return json_encode(array(
|
|
||||||
'php' => array(
|
|
||||||
'classes' => $classes,
|
|
||||||
),
|
|
||||||
), $flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
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'));
|
||||||
$this->interfaces['\Illuminate\Contracts\Auth\Authenticatable'] = $defaultUserModel;
|
$this->interfaces['\Illuminate\Contracts\Auth\Authenticatable'] = $defaultUserModel;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (class_exists('Auth') && is_a('Auth', '\Illuminate\Support\Facades\Auth', true)) {
|
if (
|
||||||
if (class_exists('\Illuminate\Foundation\Application')) {
|
class_exists('Auth') && is_a('Auth', '\Illuminate\Support\Facades\Auth', true)
|
||||||
$authMethod = version_compare(Application::VERSION, '5.2', '>=') ? 'guard' : 'driver';
|
&& app()->bound('auth')
|
||||||
} else {
|
) {
|
||||||
$refClass = new ReflectionClass('\Laravel\Lumen\Application');
|
$class = get_class(\Auth::guard());
|
||||||
$versionStr = $refClass->newInstanceWithoutConstructor()->version();
|
$this->extra['Auth'] = [$class];
|
||||||
$authMethod = strpos($versionStr, 'Lumen (5.0') === 0 ?
|
|
||||||
'driver' :
|
|
||||||
(strpos($versionStr, 'Lumen (5.1') === 0 ? 'driver' : 'guard');
|
|
||||||
}
|
|
||||||
$class = get_class(\Auth::$authMethod());
|
|
||||||
$this->extra['Auth'] = array($class);
|
|
||||||
$this->interfaces['\Illuminate\Auth\UserProviderInterface'] = $class;
|
$this->interfaces['\Illuminate\Auth\UserProviderInterface'] = $class;
|
||||||
}
|
}
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
@@ -143,7 +108,7 @@ class Generator
|
|||||||
try {
|
try {
|
||||||
if (class_exists('DB') && is_a('DB', '\Illuminate\Support\Facades\DB', true)) {
|
if (class_exists('DB') && is_a('DB', '\Illuminate\Support\Facades\DB', true)) {
|
||||||
$class = get_class(\DB::connection());
|
$class = get_class(\DB::connection());
|
||||||
$this->extra['DB'] = array($class);
|
$this->extra['DB'] = [$class];
|
||||||
$this->interfaces['\Illuminate\Database\ConnectionInterface'] = $class;
|
$this->interfaces['\Illuminate\Database\ConnectionInterface'] = $class;
|
||||||
}
|
}
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
@@ -153,7 +118,7 @@ class Generator
|
|||||||
if (class_exists('Cache') && is_a('Cache', '\Illuminate\Support\Facades\Cache', true)) {
|
if (class_exists('Cache') && is_a('Cache', '\Illuminate\Support\Facades\Cache', true)) {
|
||||||
$driver = get_class(\Cache::driver());
|
$driver = get_class(\Cache::driver());
|
||||||
$store = get_class(\Cache::getStore());
|
$store = get_class(\Cache::getStore());
|
||||||
$this->extra['Cache'] = array($driver, $store);
|
$this->extra['Cache'] = [$driver, $store];
|
||||||
$this->interfaces['\Illuminate\Cache\StoreInterface'] = $store;
|
$this->interfaces['\Illuminate\Cache\StoreInterface'] = $store;
|
||||||
}
|
}
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
@@ -162,25 +127,16 @@ class Generator
|
|||||||
try {
|
try {
|
||||||
if (class_exists('Queue') && is_a('Queue', '\Illuminate\Support\Facades\Queue', true)) {
|
if (class_exists('Queue') && is_a('Queue', '\Illuminate\Support\Facades\Queue', true)) {
|
||||||
$class = get_class(\Queue::connection());
|
$class = get_class(\Queue::connection());
|
||||||
$this->extra['Queue'] = array($class);
|
$this->extra['Queue'] = [$class];
|
||||||
$this->interfaces['\Illuminate\Queue\QueueInterface'] = $class;
|
$this->interfaces['\Illuminate\Queue\QueueInterface'] = $class;
|
||||||
}
|
}
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
if (class_exists('SSH') && is_a('SSH', '\Illuminate\Support\Facades\SSH', true)) {
|
|
||||||
$class = get_class(\SSH::connection());
|
|
||||||
$this->extra['SSH'] = array($class);
|
|
||||||
$this->interfaces['\Illuminate\Remote\ConnectionInterface'] = $class;
|
|
||||||
}
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (class_exists('Storage') && is_a('Storage', '\Illuminate\Support\Facades\Storage', true)) {
|
if (class_exists('Storage') && is_a('Storage', '\Illuminate\Support\Facades\Storage', true)) {
|
||||||
$class = get_class(\Storage::disk());
|
$class = get_class(\Storage::disk());
|
||||||
$this->extra['Storage'] = array($class);
|
$this->extra['Storage'] = [$class];
|
||||||
$this->interfaces['\Illuminate\Contracts\Filesystem\Filesystem'] = $class;
|
$this->interfaces['\Illuminate\Contracts\Filesystem\Filesystem'] = $class;
|
||||||
}
|
}
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
@@ -203,7 +159,12 @@ class Generator
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$magicMethods = array_key_exists($name, $this->magic) ? $this->magic[$name] : array();
|
// Skip the swoole
|
||||||
|
if ($facade == 'SwooleTW\Http\Server\Facades\Server' && $name == 'Server' && !class_exists('Swoole\Http\Server')) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$magicMethods = array_key_exists($name, $this->magic) ? $this->magic[$name] : [];
|
||||||
$alias = new Alias($this->config, $name, $facade, $magicMethods, $this->interfaces);
|
$alias = new Alias($this->config, $name, $facade, $magicMethods, $this->interfaces);
|
||||||
if ($alias->isValid()) {
|
if ($alias->isValid()) {
|
||||||
//Add extra methods, from other classes (magic static calls)
|
//Add extra methods, from other classes (magic static calls)
|
||||||
@@ -218,6 +179,51 @@ class Generator
|
|||||||
return $aliases;
|
return $aliases;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getRealTimeFacades()
|
||||||
|
{
|
||||||
|
$facades = [];
|
||||||
|
$realTimeFacadeFiles = glob(storage_path('framework/cache/facade-*.php'));
|
||||||
|
foreach ($realTimeFacadeFiles as $file) {
|
||||||
|
try {
|
||||||
|
$name = $this->getFullyQualifiedClassNameInFile($file);
|
||||||
|
$facades[$name] = $name;
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $facades;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getFullyQualifiedClassNameInFile(string $path)
|
||||||
|
{
|
||||||
|
$contents = file_get_contents($path);
|
||||||
|
|
||||||
|
$parsers = new Php7(new Emulative());
|
||||||
|
|
||||||
|
$parsed = collect($parsers->parse($contents) ?: []);
|
||||||
|
|
||||||
|
$namespace = $parsed->first(function ($node) {
|
||||||
|
return $node instanceof Namespace_;
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($namespace) {
|
||||||
|
$name = $namespace->name->toString();
|
||||||
|
|
||||||
|
$class = collect($namespace->stmts)->first(function ($node) {
|
||||||
|
return $node instanceof Class_;
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($class) {
|
||||||
|
$name .= '\\' . $class->name->toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Regroup aliases by namespace of extended classes
|
* Regroup aliases by namespace of extended classes
|
||||||
*
|
*
|
||||||
@@ -225,7 +231,13 @@ class Generator
|
|||||||
*/
|
*/
|
||||||
protected function getAliasesByExtendsNamespace()
|
protected function getAliasesByExtendsNamespace()
|
||||||
{
|
{
|
||||||
return $this->getValidAliases()->groupBy(function (Alias $alias) {
|
$aliases = $this->getValidAliases()->filter(static function (Alias $alias) {
|
||||||
|
return is_subclass_of($alias->getExtends(), Facade::class);
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->addMacroableClasses($aliases);
|
||||||
|
|
||||||
|
return $aliases->groupBy(function (Alias $alias) {
|
||||||
return $alias->getExtendsNamespace();
|
return $alias->getExtendsNamespace();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -282,36 +294,6 @@ class Generator
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the driver/connection/store from the managers
|
|
||||||
*
|
|
||||||
* @param $alias
|
|
||||||
* @return array|bool|string
|
|
||||||
*/
|
|
||||||
public function getDriver($alias)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
if ($alias == "Auth") {
|
|
||||||
$driver = \Auth::driver();
|
|
||||||
} elseif ($alias == "DB") {
|
|
||||||
$driver = \DB::connection();
|
|
||||||
} elseif ($alias == "Cache") {
|
|
||||||
$driver = get_class(\Cache::driver());
|
|
||||||
$store = get_class(\Cache::getStore());
|
|
||||||
return array($driver, $store);
|
|
||||||
} elseif ($alias == "Queue") {
|
|
||||||
$driver = \Queue::connection();
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return get_class($driver);
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
$this->error("Could not determine driver/connection for $alias.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a string as error output.
|
* Write a string as error output.
|
||||||
*
|
*
|
||||||
@@ -326,4 +308,55 @@ class Generator
|
|||||||
echo $string . "\r\n";
|
echo $string . "\r\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add all macroable classes which are not already loaded as an alias and have defined macros.
|
||||||
|
*
|
||||||
|
* @param Collection $aliases
|
||||||
|
*/
|
||||||
|
protected function addMacroableClasses(Collection $aliases)
|
||||||
|
{
|
||||||
|
$macroable = $this->getMacroableClasses($aliases);
|
||||||
|
|
||||||
|
foreach ($macroable as $class) {
|
||||||
|
$reflection = new ReflectionClass($class);
|
||||||
|
|
||||||
|
if (!$reflection->getStaticProperties()['macros']) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$aliases[] = new Alias($this->config, $class, $class, [], $this->interfaces);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all loaded macroable classes which are not loaded as an alias.
|
||||||
|
*
|
||||||
|
* @param Collection $aliases
|
||||||
|
* @return Collection
|
||||||
|
*/
|
||||||
|
protected function getMacroableClasses(Collection $aliases)
|
||||||
|
{
|
||||||
|
return (new Collection(get_declared_classes()))
|
||||||
|
->filter(function ($class) {
|
||||||
|
$reflection = new ReflectionClass($class);
|
||||||
|
|
||||||
|
// Filter out internal classes and class aliases
|
||||||
|
return !$reflection->isInternal() && $reflection->getName() === $class;
|
||||||
|
})
|
||||||
|
->filter(function ($class) {
|
||||||
|
$traits = class_uses_recursive($class);
|
||||||
|
|
||||||
|
// Filter only classes with the macroable trait
|
||||||
|
return isset($traits[Macroable::class]);
|
||||||
|
})
|
||||||
|
->filter(function ($class) use ($aliases) {
|
||||||
|
$class = Str::start($class, '\\');
|
||||||
|
|
||||||
|
// Filter out aliases
|
||||||
|
return !$aliases->first(function (Alias $alias) use ($class) {
|
||||||
|
return $alias->getExtends() === $class;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Laravel IDE Helper Generator
|
* Laravel IDE Helper Generator
|
||||||
*
|
*
|
||||||
@@ -14,22 +15,18 @@ use Barryvdh\LaravelIdeHelper\Console\EloquentCommand;
|
|||||||
use Barryvdh\LaravelIdeHelper\Console\GeneratorCommand;
|
use Barryvdh\LaravelIdeHelper\Console\GeneratorCommand;
|
||||||
use Barryvdh\LaravelIdeHelper\Console\MetaCommand;
|
use Barryvdh\LaravelIdeHelper\Console\MetaCommand;
|
||||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Listeners\GenerateModelHelper;
|
||||||
|
use Illuminate\Console\Events\CommandFinished;
|
||||||
|
use Illuminate\Contracts\Support\DeferrableProvider;
|
||||||
|
use Illuminate\Database\Events\MigrationsEnded;
|
||||||
use Illuminate\Support\ServiceProvider;
|
use Illuminate\Support\ServiceProvider;
|
||||||
use Illuminate\View\Engines\EngineResolver;
|
use Illuminate\View\Engines\EngineResolver;
|
||||||
use Illuminate\View\Engines\PhpEngine;
|
use Illuminate\View\Engines\PhpEngine;
|
||||||
use Illuminate\View\Factory;
|
use Illuminate\View\Factory;
|
||||||
use Illuminate\View\FileViewFinder;
|
use Illuminate\View\FileViewFinder;
|
||||||
|
|
||||||
class IdeHelperServiceProvider extends ServiceProvider
|
class IdeHelperServiceProvider extends ServiceProvider implements DeferrableProvider
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates if loading of the provider is deferred.
|
|
||||||
*
|
|
||||||
* @var bool
|
|
||||||
*/
|
|
||||||
protected $defer = true;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bootstrap the application events.
|
* Bootstrap the application events.
|
||||||
*
|
*
|
||||||
@@ -37,6 +34,13 @@ class IdeHelperServiceProvider extends ServiceProvider
|
|||||||
*/
|
*/
|
||||||
public function boot()
|
public function boot()
|
||||||
{
|
{
|
||||||
|
if (!$this->app->runningUnitTests() && $this->app['config']->get('ide-helper.post_migrate', [])) {
|
||||||
|
$this->app['events']->listen(CommandFinished::class, GenerateModelHelper::class);
|
||||||
|
$this->app['events']->listen(MigrationsEnded::class, function () {
|
||||||
|
GenerateModelHelper::$shouldRun = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->app->has('view')) {
|
if ($this->app->has('view')) {
|
||||||
$viewPath = __DIR__ . '/../resources/views';
|
$viewPath = __DIR__ . '/../resources/views';
|
||||||
$this->loadViewsFrom($viewPath, 'ide-helper');
|
$this->loadViewsFrom($viewPath, 'ide-helper');
|
||||||
@@ -85,7 +89,7 @@ class IdeHelperServiceProvider extends ServiceProvider
|
|||||||
|
|
||||||
$this->app->singleton(
|
$this->app->singleton(
|
||||||
'command.ide-helper.eloquent',
|
'command.ide-helper.eloquent',
|
||||||
function ($app) use ($localViewFactory) {
|
function ($app) {
|
||||||
return new EloquentCommand($app['files']);
|
return new EloquentCommand($app['files']);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -105,7 +109,7 @@ class IdeHelperServiceProvider extends ServiceProvider
|
|||||||
*/
|
*/
|
||||||
public function provides()
|
public function provides()
|
||||||
{
|
{
|
||||||
return array('command.ide-helper.generate', 'command.ide-helper.models');
|
return ['command.ide-helper.generate', 'command.ide-helper.models'];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -115,7 +119,7 @@ class IdeHelperServiceProvider extends ServiceProvider
|
|||||||
{
|
{
|
||||||
$resolver = new EngineResolver();
|
$resolver = new EngineResolver();
|
||||||
$resolver->register('php', function () {
|
$resolver->register('php', function () {
|
||||||
return new PhpEngine();
|
return new PhpEngine($this->app['files']);
|
||||||
});
|
});
|
||||||
$finder = new FileViewFinder($this->app['files'], [__DIR__ . '/../resources/views']);
|
$finder = new FileViewFinder($this->app['files'], [__DIR__ . '/../resources/views']);
|
||||||
$factory = new Factory($resolver, $finder, $this->app['events']);
|
$factory = new Factory($resolver, $finder, $this->app['events']);
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Listeners;
|
||||||
|
|
||||||
|
use Illuminate\Console\Events\CommandFinished;
|
||||||
|
use Illuminate\Contracts\Config\Repository as Config;
|
||||||
|
use Illuminate\Contracts\Console\Kernel as Artisan;
|
||||||
|
|
||||||
|
class GenerateModelHelper
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Tracks whether we should run the models command on the CommandFinished event or not.
|
||||||
|
* Set to true by the MigrationsEnded event, needs to be cleared before artisan call to prevent infinite loop.
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public static $shouldRun = false;
|
||||||
|
|
||||||
|
/** @var Artisan */
|
||||||
|
protected $artisan;
|
||||||
|
|
||||||
|
/** @var Config */
|
||||||
|
protected $config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Artisan $artisan
|
||||||
|
* @param Config $config
|
||||||
|
*/
|
||||||
|
public function __construct(Artisan $artisan, Config $config)
|
||||||
|
{
|
||||||
|
$this->artisan = $artisan;
|
||||||
|
$this->config = $config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the event.
|
||||||
|
*
|
||||||
|
* @param CommandFinished $event
|
||||||
|
*/
|
||||||
|
public function handle(CommandFinished $event)
|
||||||
|
{
|
||||||
|
if (!self::$shouldRun) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self::$shouldRun = false;
|
||||||
|
|
||||||
|
foreach ($this->config->get('ide-helper.post_migrate', []) as $command) {
|
||||||
|
$this->artisan->call($command, [], $event->output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+83
-2
@@ -4,6 +4,8 @@ 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\Support\Collection;
|
||||||
|
|
||||||
class Macro extends Method
|
class Macro extends Method
|
||||||
{
|
{
|
||||||
@@ -15,15 +17,17 @@ class Macro extends Method
|
|||||||
* @param \ReflectionClass $class
|
* @param \ReflectionClass $class
|
||||||
* @param null $methodName
|
* @param null $methodName
|
||||||
* @param array $interfaces
|
* @param array $interfaces
|
||||||
|
* @param array $classAliases
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
$method,
|
$method,
|
||||||
$alias,
|
$alias,
|
||||||
$class,
|
$class,
|
||||||
$methodName = null,
|
$methodName = null,
|
||||||
$interfaces = array()
|
$interfaces = [],
|
||||||
|
$classAliases = []
|
||||||
) {
|
) {
|
||||||
parent::__construct($method, $alias, $class, $methodName, $interfaces);
|
parent::__construct($method, $alias, $class, $methodName, $interfaces, $classAliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -32,6 +36,83 @@ class Macro extends Method
|
|||||||
protected function initPhpDoc($method)
|
protected function initPhpDoc($method)
|
||||||
{
|
{
|
||||||
$this->phpdoc = new DocBlock($method);
|
$this->phpdoc = new DocBlock($method);
|
||||||
|
|
||||||
|
$this->addLocationToPhpDoc();
|
||||||
|
|
||||||
|
// Add macro parameters if they are missed in original docblock
|
||||||
|
if (!$this->phpdoc->hasTag('param')) {
|
||||||
|
foreach ($method->getParameters() as $parameter) {
|
||||||
|
$reflectionType = $parameter->getType();
|
||||||
|
|
||||||
|
$type = $this->concatReflectionTypes($reflectionType);
|
||||||
|
|
||||||
|
/** @psalm-suppress UndefinedClass */
|
||||||
|
if ($reflectionType && !$reflectionType instanceof \ReflectionUnionType && $reflectionType->allowsNull()) {
|
||||||
|
$type .= '|null';
|
||||||
|
}
|
||||||
|
|
||||||
|
$type = $type ?: 'mixed';
|
||||||
|
|
||||||
|
$name = $parameter->isVariadic() ? '...' : '';
|
||||||
|
$name .= '$' . $parameter->getName();
|
||||||
|
|
||||||
|
$this->phpdoc->appendTag(Tag::createInstance("@param {$type} {$name}"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add macro return type if it missed in original docblock
|
||||||
|
if ($method->hasReturnType() && !$this->phpdoc->hasTag('return')) {
|
||||||
|
$builder = EloquentBuilder::class;
|
||||||
|
$return = $method->getReturnType();
|
||||||
|
|
||||||
|
$type = $this->concatReflectionTypes($return);
|
||||||
|
|
||||||
|
/** @psalm-suppress UndefinedClass */
|
||||||
|
if (!$return instanceof \ReflectionUnionType) {
|
||||||
|
$type .= $this->root === "\\{$builder}" && $return->getName() === $builder ? '|static' : '';
|
||||||
|
$type .= $return->allowsNull() ? '|null' : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->phpdoc->appendTag(Tag::createInstance("@return {$type}"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function concatReflectionTypes(?\ReflectionType $type): string
|
||||||
|
{
|
||||||
|
/** @psalm-suppress UndefinedClass */
|
||||||
|
$returnTypes = $type instanceof \ReflectionUnionType
|
||||||
|
? $type->getTypes()
|
||||||
|
: [$type];
|
||||||
|
|
||||||
|
return Collection::make($returnTypes)
|
||||||
|
->filter()
|
||||||
|
->map->getName()
|
||||||
|
->implode('|');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function addLocationToPhpDoc()
|
||||||
|
{
|
||||||
|
if ($this->method->name === '__invoke') {
|
||||||
|
$enclosingClass = $this->method->getDeclaringClass();
|
||||||
|
} else {
|
||||||
|
$enclosingClass = $this->method->getClosureScopeClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$enclosingClass) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/** @var \ReflectionMethod $enclosingMethod */
|
||||||
|
$enclosingMethod = Collection::make($enclosingClass->getMethods())
|
||||||
|
->first(function (\ReflectionMethod $method) {
|
||||||
|
return $method->getStartLine() <= $this->method->getStartLine()
|
||||||
|
&& $method->getEndLine() >= $this->method->getEndLine();
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($enclosingMethod) {
|
||||||
|
$this->phpdoc->appendTag(Tag::createInstance(
|
||||||
|
'@see \\' . $enclosingClass->getName() . '::' . $enclosingMethod->getName() . '()'
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+51
-41
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Laravel IDE Helper Generator
|
* Laravel IDE Helper Generator
|
||||||
*
|
*
|
||||||
@@ -12,14 +13,16 @@ namespace Barryvdh\LaravelIdeHelper;
|
|||||||
|
|
||||||
use Barryvdh\Reflection\DocBlock;
|
use Barryvdh\Reflection\DocBlock;
|
||||||
use Barryvdh\Reflection\DocBlock\Context;
|
use Barryvdh\Reflection\DocBlock\Context;
|
||||||
use Barryvdh\Reflection\DocBlock\Tag;
|
|
||||||
use Barryvdh\Reflection\DocBlock\Tag\ReturnTag;
|
|
||||||
use Barryvdh\Reflection\DocBlock\Tag\ParamTag;
|
|
||||||
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
||||||
|
use Barryvdh\Reflection\DocBlock\Tag;
|
||||||
|
use Barryvdh\Reflection\DocBlock\Tag\ParamTag;
|
||||||
|
use Barryvdh\Reflection\DocBlock\Tag\ReturnTag;
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
class Method
|
class Method
|
||||||
{
|
{
|
||||||
/** @var \Barryvdh\Reflection\DocBlock */
|
/** @var DocBlock */
|
||||||
protected $phpdoc;
|
protected $phpdoc;
|
||||||
|
|
||||||
/** @var \ReflectionMethod */
|
/** @var \ReflectionMethod */
|
||||||
@@ -29,12 +32,13 @@ class Method
|
|||||||
protected $declaringClassName;
|
protected $declaringClassName;
|
||||||
protected $name;
|
protected $name;
|
||||||
protected $namespace;
|
protected $namespace;
|
||||||
protected $params = array();
|
protected $params = [];
|
||||||
protected $params_with_default = array();
|
protected $params_with_default = [];
|
||||||
protected $interfaces = array();
|
protected $interfaces = [];
|
||||||
protected $real_name;
|
protected $real_name;
|
||||||
protected $return = null;
|
protected $return = null;
|
||||||
protected $root;
|
protected $root;
|
||||||
|
protected $classAliases;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param \ReflectionMethod|\ReflectionFunctionAbstract $method
|
* @param \ReflectionMethod|\ReflectionFunctionAbstract $method
|
||||||
@@ -42,17 +46,19 @@ class Method
|
|||||||
* @param \ReflectionClass $class
|
* @param \ReflectionClass $class
|
||||||
* @param string|null $methodName
|
* @param string|null $methodName
|
||||||
* @param array $interfaces
|
* @param array $interfaces
|
||||||
|
* @param array $classAliases
|
||||||
*/
|
*/
|
||||||
public function __construct($method, $alias, $class, $methodName = null, $interfaces = array())
|
public function __construct($method, $alias, $class, $methodName = null, $interfaces = [], array $classAliases = [])
|
||||||
{
|
{
|
||||||
$this->method = $method;
|
$this->method = $method;
|
||||||
$this->interfaces = $interfaces;
|
$this->interfaces = $interfaces;
|
||||||
|
$this->classAliases = $classAliases;
|
||||||
$this->name = $methodName ?: $method->name;
|
$this->name = $methodName ?: $method->name;
|
||||||
$this->real_name = $method->isClosure() ? $this->name : $method->name;
|
$this->real_name = $method->isClosure() ? $this->name : $method->name;
|
||||||
$this->initClassDefinedProperties($method, $class);
|
$this->initClassDefinedProperties($method, $class);
|
||||||
|
|
||||||
//Reference the 'real' function in the declaring class
|
//Reference the 'real' function in the declaring class
|
||||||
$this->root = '\\' . ltrim($class->getName(), '\\');
|
$this->root = '\\' . ltrim($method->name === '__invoke' ? $method->getDeclaringClass()->getName() : $class->getName(), '\\');
|
||||||
|
|
||||||
//Create a DocBlock and serializer instance
|
//Create a DocBlock and serializer instance
|
||||||
$this->initPhpDoc($method);
|
$this->initPhpDoc($method);
|
||||||
@@ -77,7 +83,7 @@ class Method
|
|||||||
*/
|
*/
|
||||||
protected function initPhpDoc($method)
|
protected function initPhpDoc($method)
|
||||||
{
|
{
|
||||||
$this->phpdoc = new DocBlock($method, new Context($this->namespace));
|
$this->phpdoc = new DocBlock($method, new Context($this->namespace, $this->classAliases));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -116,7 +122,7 @@ class Method
|
|||||||
*/
|
*/
|
||||||
public function isInstanceCall()
|
public function isInstanceCall()
|
||||||
{
|
{
|
||||||
return ! ($this->method->isClosure() || $this->method->isStatic());
|
return !($this->method->isClosure() || $this->method->isStatic());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -248,33 +254,37 @@ class Method
|
|||||||
*/
|
*/
|
||||||
protected function normalizeReturn(DocBlock $phpdoc)
|
protected function normalizeReturn(DocBlock $phpdoc)
|
||||||
{
|
{
|
||||||
//Get the return type and adjust them for beter autocomplete
|
//Get the return type and adjust them for better autocomplete
|
||||||
$returnTags = $phpdoc->getTagsByName('return');
|
$returnTags = $phpdoc->getTagsByName('return');
|
||||||
if ($returnTags) {
|
|
||||||
/** @var ReturnTag $tag */
|
|
||||||
$tag = reset($returnTags);
|
|
||||||
// Get the expanded type
|
|
||||||
$returnValue = $tag->getType();
|
|
||||||
|
|
||||||
// Replace the interfaces
|
if (count($returnTags) === 0) {
|
||||||
foreach ($this->interfaces as $interface => $real) {
|
|
||||||
$returnValue = str_replace($interface, $real, $returnValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the changed content
|
|
||||||
$tag->setContent($returnValue . ' ' . $tag->getDescription());
|
|
||||||
$this->return = $returnValue;
|
|
||||||
|
|
||||||
if ($tag->getType() === '$this') {
|
|
||||||
$tag->setType($this->root);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$this->return = null;
|
$this->return = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var ReturnTag $tag */
|
||||||
|
$tag = reset($returnTags);
|
||||||
|
// Get the expanded type
|
||||||
|
$returnValue = $tag->getType();
|
||||||
|
|
||||||
|
// Replace the interfaces
|
||||||
|
foreach ($this->interfaces as $interface => $real) {
|
||||||
|
$returnValue = str_replace($interface, $real, $returnValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the changed content
|
||||||
|
$tag->setContent($returnValue . ' ' . $tag->getDescription());
|
||||||
|
$this->return = $returnValue;
|
||||||
|
|
||||||
|
if ($tag->getType() === '$this') {
|
||||||
|
Str::contains($this->root, Builder::class)
|
||||||
|
? $tag->setType($this->root . '|static')
|
||||||
|
: $tag->setType($this->root);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert keywwords that are incorrect.
|
* Convert keywords that are incorrect.
|
||||||
*
|
*
|
||||||
* @param string $string
|
* @param string $string
|
||||||
* @return string
|
* @return string
|
||||||
@@ -295,7 +305,7 @@ class Method
|
|||||||
*/
|
*/
|
||||||
public function shouldReturn()
|
public function shouldReturn()
|
||||||
{
|
{
|
||||||
if ($this->return !== "void" && $this->method->name !== "__construct") {
|
if ($this->return !== 'void' && $this->method->name !== '__construct') {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -306,13 +316,13 @@ class Method
|
|||||||
* Get the parameters and format them correctly
|
* Get the parameters and format them correctly
|
||||||
*
|
*
|
||||||
* @param \ReflectionMethod $method
|
* @param \ReflectionMethod $method
|
||||||
* @return array
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function getParameters($method)
|
public function getParameters($method)
|
||||||
{
|
{
|
||||||
//Loop through the default values for paremeters, and make the correct output string
|
//Loop through the default values for parameters, and make the correct output string
|
||||||
$params = array();
|
$params = [];
|
||||||
$paramsWithDefault = array();
|
$paramsWithDefault = [];
|
||||||
foreach ($method->getParameters() as $param) {
|
foreach ($method->getParameters() as $param) {
|
||||||
$paramStr = $param->isVariadic() ? '...$' . $param->getName() : '$' . $param->getName();
|
$paramStr = $param->isVariadic() ? '...$' . $param->getName() : '$' . $param->getName();
|
||||||
$params[] = $paramStr;
|
$params[] = $paramStr;
|
||||||
@@ -329,7 +339,7 @@ class Method
|
|||||||
} elseif (is_resource($default)) {
|
} elseif (is_resource($default)) {
|
||||||
//skip to not fail
|
//skip to not fail
|
||||||
} else {
|
} else {
|
||||||
$default = "'" . trim($default) . "'";
|
$default = var_export($default, true);
|
||||||
}
|
}
|
||||||
$paramStr .= " = $default";
|
$paramStr .= " = $default";
|
||||||
}
|
}
|
||||||
@@ -356,14 +366,14 @@ class Method
|
|||||||
}
|
}
|
||||||
if ($method) {
|
if ($method) {
|
||||||
$namespace = $method->getDeclaringClass()->getNamespaceName();
|
$namespace = $method->getDeclaringClass()->getNamespaceName();
|
||||||
$phpdoc = new DocBlock($method, new Context($namespace));
|
$phpdoc = new DocBlock($method, new Context($namespace, $this->classAliases));
|
||||||
|
|
||||||
if (strpos($phpdoc->getText(), '{@inheritdoc}') !== false) {
|
if (strpos($phpdoc->getText(), '{@inheritdoc}') !== false) {
|
||||||
//Not at the end yet, try another parent/interface..
|
//Not at the end yet, try another parent/interface..
|
||||||
return $this->getInheritDoc($method);
|
return $this->getInheritDoc($method);
|
||||||
} else {
|
|
||||||
return $phpdoc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $phpdoc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Parsers;
|
||||||
|
|
||||||
|
class PhpDocReturnTypeParser
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private string $typeAlias;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private array $namespaceAliases;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $typeAlias
|
||||||
|
* @param array $namespaceAliases
|
||||||
|
*/
|
||||||
|
public function __construct(string $typeAlias, array $namespaceAliases)
|
||||||
|
{
|
||||||
|
$this->typeAlias = $typeAlias;
|
||||||
|
$this->namespaceAliases = $namespaceAliases;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function parse(): string|null
|
||||||
|
{
|
||||||
|
$matches = [];
|
||||||
|
preg_match('/(\w+)(<.*>)/', $this->typeAlias, $matches);
|
||||||
|
$matchCount = count($matches);
|
||||||
|
|
||||||
|
if ($matchCount === 0 || $matchCount === 1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($this->namespaceAliases[$matches[1]])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->namespaceAliases[$matches[1]] . $this->parseTemplate($matches[2] ?? null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string|null $template
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function parseTemplate(string|null $template): string
|
||||||
|
{
|
||||||
|
if ($template === null || $template === '') {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$type = '';
|
||||||
|
$result = '';
|
||||||
|
|
||||||
|
foreach (str_split($template) as $char) {
|
||||||
|
$match = preg_match('/[A-z]/', $char);
|
||||||
|
|
||||||
|
if (!$match) {
|
||||||
|
$type = $this->namespaceAliases[$type] ?? $type;
|
||||||
|
$result .= $type;
|
||||||
|
$result .= $char;
|
||||||
|
$type = '';
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$type .= $char;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Laravel IDE Helper Generator
|
||||||
|
*
|
||||||
|
* @author Barry vd. Heuvel <[email protected]>
|
||||||
|
* @copyright 2014 Barry vd. Heuvel / Fruitcake Studio (http://www.fruitcakestudio.nl)
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||||
|
* @link https://github.com/barryvdh/laravel-ide-helper
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper;
|
||||||
|
|
||||||
|
use PhpParser\Node\Stmt\GroupUse;
|
||||||
|
use PhpParser\Node\Stmt\Namespace_;
|
||||||
|
use PhpParser\Node\Stmt\Use_;
|
||||||
|
use PhpParser\Node\Stmt\UseUse;
|
||||||
|
use PhpParser\ParserFactory;
|
||||||
|
|
||||||
|
class UsesResolver
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param string $classFQN
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function loadFromClass(string $classFQN): array
|
||||||
|
{
|
||||||
|
return $this->loadFromFile(
|
||||||
|
$classFQN,
|
||||||
|
(new \ReflectionClass($classFQN))->getFileName()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $classFQN
|
||||||
|
* @param string $filename
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function loadFromFile(string $classFQN, string $filename): array
|
||||||
|
{
|
||||||
|
return $this->loadFromCode(
|
||||||
|
$classFQN,
|
||||||
|
file_get_contents(
|
||||||
|
$filename
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $classFQN
|
||||||
|
* @param string $code
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function loadFromCode(string $classFQN, string $code): array
|
||||||
|
{
|
||||||
|
$classFQN = ltrim($classFQN, '\\');
|
||||||
|
|
||||||
|
$namespace = rtrim(
|
||||||
|
preg_replace(
|
||||||
|
'/([^\\\\]+)$/',
|
||||||
|
'',
|
||||||
|
$classFQN
|
||||||
|
),
|
||||||
|
'\\'
|
||||||
|
);
|
||||||
|
|
||||||
|
$parser = (new ParserFactory())->createForHostVersion();
|
||||||
|
$namespaceData = null;
|
||||||
|
|
||||||
|
foreach ($parser->parse($code) as $node) {
|
||||||
|
if ($node instanceof Namespace_ && $node->name->toCodeString() === $namespace) {
|
||||||
|
$namespaceData = $node;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($namespaceData === null) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var Namespace_ $namespaceData */
|
||||||
|
|
||||||
|
$aliases = [];
|
||||||
|
|
||||||
|
foreach ($namespaceData->stmts as $stmt) {
|
||||||
|
if ($stmt instanceof Use_) {
|
||||||
|
if ($stmt->type !== Use_::TYPE_NORMAL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($stmt->uses as $use) {
|
||||||
|
/** @var UseUse $use */
|
||||||
|
|
||||||
|
$alias = $use->alias ?
|
||||||
|
$use->alias->name :
|
||||||
|
self::classBasename($use->name->toCodeString());
|
||||||
|
|
||||||
|
$aliases[$alias] = '\\' . $use->name->toCodeString();
|
||||||
|
}
|
||||||
|
} elseif ($stmt instanceof GroupUse) {
|
||||||
|
foreach ($stmt->uses as $use) {
|
||||||
|
/** @var UseUse $use */
|
||||||
|
|
||||||
|
$alias = $use->alias ?
|
||||||
|
$use->alias->name :
|
||||||
|
self::classBasename($use->name->toCodeString());
|
||||||
|
|
||||||
|
$aliases[$alias] = '\\' . $stmt->prefix->toCodeString() . '\\' . $use->name->toCodeString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $aliases;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $classFQN
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function classBasename(string $classFQN): string
|
||||||
|
{
|
||||||
|
return preg_replace('/^.*\\\\([^\\\\]+)$/', '$1', $classFQN);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Alias;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Macro;
|
||||||
|
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||||
|
use Illuminate\Database\Query\Builder;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
* @coversDefaultClass \Barryvdh\LaravelIdeHelper\Alias
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
public function testDetectMethodsEloquentBuilderMacros(): void
|
||||||
|
{
|
||||||
|
// Mock
|
||||||
|
$macro = __FUNCTION__;
|
||||||
|
$alias = new AliasMock();
|
||||||
|
|
||||||
|
// Macros
|
||||||
|
EloquentBuilder::macro(
|
||||||
|
$macro,
|
||||||
|
function () {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Prepare
|
||||||
|
$alias->setClasses([EloquentBuilder::class]);
|
||||||
|
$alias->detectMethods();
|
||||||
|
|
||||||
|
// Test
|
||||||
|
$this->assertNotNull($this->getAliasMacro($alias, EloquentBuilder::class, $macro));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getAliasMacro(Alias $alias, string $class, string $method): ?Macro
|
||||||
|
{
|
||||||
|
return Arr::first(
|
||||||
|
$alias->getMethods(),
|
||||||
|
function ($macro) use ($class, $method) {
|
||||||
|
return $macro instanceof Macro
|
||||||
|
&& $macro->getDeclaringClass() === "\\{$class}"
|
||||||
|
&& $macro->getName() === $method;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
* @noinspection PhpMultipleClassesDeclarationsInOneFile
|
||||||
|
*/
|
||||||
|
class AliasMock extends Alias
|
||||||
|
{
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// no need to call parent
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string[] $classes
|
||||||
|
*/
|
||||||
|
public function setClasses(array $classes)
|
||||||
|
{
|
||||||
|
$this->classes = $classes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detectMethods()
|
||||||
|
{
|
||||||
|
parent::detectMethods();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console;
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console;
|
||||||
|
|
||||||
use Barryvdh\LaravelIdeHelper\Console\EloquentCommand;
|
use Barryvdh\LaravelIdeHelper\Console\EloquentCommand;
|
||||||
@@ -40,19 +42,20 @@ class EloquentCommandTest extends TestCase
|
|||||||
|
|
||||||
$tester = $this->runCommand($command);
|
$tester = $this->runCommand($command);
|
||||||
|
|
||||||
$expectedContent = '/**
|
$this->assertMatchesTxtSnapshot($actualContent);
|
||||||
*
|
|
||||||
*
|
|
||||||
* @mixin \Eloquent
|
|
||||||
* @mixin \Illuminate\Database\Eloquent\Builder
|
|
||||||
* @mixin \Illuminate\Database\Query\Builder
|
|
||||||
*/
|
|
||||||
abstract class Model implements';
|
|
||||||
$this->assertSame($expectedContent, $actualContent);
|
|
||||||
|
|
||||||
$display = $tester->getDisplay();
|
$display = $tester->getDisplay();
|
||||||
$this->assertRegExp(';Unexpected no document on Illuminate\\\Database\\\Eloquent\\\Model;', $display);
|
$this->assertMatchesRegularExpression(
|
||||||
$this->assertRegExp(';Wrote expected docblock to .*/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php;', $display);
|
';Unexpected no document on Illuminate\\\Database\\\Eloquent\\\Model;',
|
||||||
|
$display
|
||||||
|
);
|
||||||
|
$modelClassFilePath = preg_quote(
|
||||||
|
str_replace('/', DIRECTORY_SEPARATOR, '/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php')
|
||||||
|
);
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
';Wrote expected docblock to .*' . $modelClassFilePath . ';',
|
||||||
|
$display
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getVendorModelFilename(): string
|
private function getVendorModelFilename(): string
|
||||||
|
|||||||
@@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\MetaCommand;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\TestCase;
|
||||||
|
use Illuminate\Filesystem\Filesystem;
|
||||||
|
use Mockery\MockInterface;
|
||||||
|
use stdClass;
|
||||||
|
|
||||||
|
class MetaCommandTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testCommand(): void
|
||||||
|
{
|
||||||
|
$this->mockFilesystem();
|
||||||
|
|
||||||
|
/** @var Filesystem|MockInterface $mockFileSystem */
|
||||||
|
$mockFileSystem = $this->app->make(Filesystem::class);
|
||||||
|
$this->instance('files', $mockFileSystem);
|
||||||
|
|
||||||
|
$mockFileSystem
|
||||||
|
->shouldReceive('getRequire')
|
||||||
|
->andReturnUsing(function ($__path, $__data) {
|
||||||
|
return (static function () use ($__path, $__data) {
|
||||||
|
extract($__data, EXTR_SKIP);
|
||||||
|
|
||||||
|
return require $__path;
|
||||||
|
})();
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->artisan('ide-helper:meta');
|
||||||
|
|
||||||
|
// We're not testing the whole file, just some basic structure elements
|
||||||
|
self::assertStringContainsString("namespace PHPSTORM_META {\n", $this->mockFilesystemOutput);
|
||||||
|
self::assertStringContainsString("PhpStorm Meta file, to provide autocomplete information for PhpStorm\n", $this->mockFilesystemOutput);
|
||||||
|
self::assertStringContainsString('override(', $this->mockFilesystemOutput);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testUnregisterAutoloader(): void
|
||||||
|
{
|
||||||
|
$current = spl_autoload_functions();
|
||||||
|
$appended = function () {
|
||||||
|
};
|
||||||
|
|
||||||
|
$this->app->bind('registers-autoloader', function () use ($appended) {
|
||||||
|
spl_autoload_register($appended);
|
||||||
|
return new stdClass();
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->mockFilesystem();
|
||||||
|
|
||||||
|
/** @var Filesystem|MockInterface $mockFileSystem */
|
||||||
|
$mockFileSystem = $this->app->make(Filesystem::class);
|
||||||
|
$this->instance('files', $mockFileSystem);
|
||||||
|
|
||||||
|
$mockFileSystem
|
||||||
|
->shouldReceive('getRequire')
|
||||||
|
->andReturnUsing(function ($__path, $__data) {
|
||||||
|
return (static function () use ($__path, $__data) {
|
||||||
|
extract($__data, EXTR_SKIP);
|
||||||
|
|
||||||
|
return require $__path;
|
||||||
|
})();
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->artisan('ide-helper:meta');
|
||||||
|
|
||||||
|
self::assertSame(array_merge($current, [$appended]), spl_autoload_functions());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get package providers.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Foundation\Application $app
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getPackageProviders($app)
|
||||||
|
{
|
||||||
|
return [IdeHelperServiceProvider::class];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
<?php declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand;
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\SnapshotPhpDriver;
|
||||||
use Barryvdh\LaravelIdeHelper\Tests\TestCase;
|
use Barryvdh\LaravelIdeHelper\Tests\TestCase;
|
||||||
use Illuminate\Foundation\Application;
|
|
||||||
|
|
||||||
abstract class AbstractModelsCommand extends TestCase
|
abstract class AbstractModelsCommand extends TestCase
|
||||||
{
|
{
|
||||||
@@ -11,14 +14,21 @@ abstract class AbstractModelsCommand extends TestCase
|
|||||||
{
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
|
|
||||||
// Skip older Laravel version for these tests
|
|
||||||
if (version_compare(Application::VERSION, '6.0', '<')) {
|
|
||||||
$this->markTestSkipped('This test requires Laravel 6.0 or higher');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->loadMigrationsFrom(__DIR__ . '/migrations');
|
$this->loadMigrationsFrom(__DIR__ . '/migrations');
|
||||||
$this->artisan('migrate');
|
$this->artisan('migrate');
|
||||||
|
$this->mockFilesystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get package providers.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Foundation\Application $app
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getPackageProviders($app)
|
||||||
|
{
|
||||||
|
return [IdeHelperServiceProvider::class];
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getEnvironmentSetUp($app)
|
protected function getEnvironmentSetUp($app)
|
||||||
@@ -33,5 +43,18 @@ abstract class AbstractModelsCommand extends TestCase
|
|||||||
'database' => ':memory:',
|
'database' => ':memory:',
|
||||||
'prefix' => '',
|
'prefix' => '',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// Load the Models from the Test dir
|
||||||
|
$config->set('ide-helper.model_locations', [
|
||||||
|
dirname((new \ReflectionClass(static::class))->getFileName()) . '/Models',
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Don't override integer -> int for tests
|
||||||
|
$config->set('ide-helper.type_overrides', []);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function assertMatchesMockedSnapshot()
|
||||||
|
{
|
||||||
|
$this->assertMatchesSnapshot($this->mockFilesystemOutput, new SnapshotPhpDriver());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections;
|
||||||
|
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
|
class AdvancedCastCollection extends Collection
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums;
|
||||||
|
|
||||||
|
enum AdvancedCastEnum
|
||||||
|
{
|
||||||
|
case apple;
|
||||||
|
case banana;
|
||||||
|
case orange;
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum;
|
||||||
|
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
|
||||||
|
use Illuminate\Database\Eloquent\Casts\AsCollection;
|
||||||
|
use Illuminate\Database\Eloquent\Casts\AsEnumCollection;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class AdvancedCast extends Model
|
||||||
|
{
|
||||||
|
protected function casts(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'cast_to_date_serialization' => 'date:Y-m-d',
|
||||||
|
'cast_to_datetime_serialization' => 'datetime:Y-m-d H:i:s',
|
||||||
|
'cast_to_custom_datetime' => 'custom_datetime:Y-m-d H:i:s',
|
||||||
|
'cast_to_immutable_date' => 'immutable_date',
|
||||||
|
'cast_to_immutable_custom_datetime' => 'immutable_custom_datetime:Y-m-d H:i:s',
|
||||||
|
'cast_to_immutable_datetime' => 'immutable_datetime',
|
||||||
|
'cast_to_timestamp' => 'timestamp',
|
||||||
|
'cast_to_encrypted' => 'encrypted',
|
||||||
|
'cast_to_encrypted_array' => 'encrypted:array',
|
||||||
|
'cast_to_encrypted_collection' => 'encrypted:collection',
|
||||||
|
'cast_to_encrypted_json' => 'encrypted:json',
|
||||||
|
'cast_to_encrypted_object' => 'encrypted:object',
|
||||||
|
'cast_to_as_collection' => AsCollection::class,
|
||||||
|
'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class),
|
||||||
|
'cast_to_as_enum_collection' => AsEnumCollection::class,
|
||||||
|
'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class),
|
||||||
|
'cast_to_as_array_object' => AsArrayObject::class,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts;
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Models;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Collections\AdvancedCastCollection;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AdvancedCasts\Enums\AdvancedCastEnum;
|
||||||
|
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
|
||||||
|
use Illuminate\Database\Eloquent\Casts\AsCollection;
|
||||||
|
use Illuminate\Database\Eloquent\Casts\AsEnumCollection;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @property \Illuminate\Support\Carbon $cast_to_date_serialization
|
||||||
|
* @property \Illuminate\Support\Carbon $cast_to_datetime_serialization
|
||||||
|
* @property \Illuminate\Support\Carbon $cast_to_custom_datetime
|
||||||
|
* @property \Carbon\CarbonImmutable $cast_to_immutable_date
|
||||||
|
* @property \Carbon\CarbonImmutable $cast_to_immutable_custom_datetime
|
||||||
|
* @property \Carbon\CarbonImmutable $cast_to_immutable_datetime
|
||||||
|
* @property int $cast_to_timestamp
|
||||||
|
* @property mixed $cast_to_encrypted
|
||||||
|
* @property array $cast_to_encrypted_array
|
||||||
|
* @property \Illuminate\Support\Collection $cast_to_encrypted_collection
|
||||||
|
* @property array $cast_to_encrypted_json
|
||||||
|
* @property object $cast_to_encrypted_object
|
||||||
|
* @property \Illuminate\Support\Collection $cast_to_as_collection
|
||||||
|
* @property \Illuminate\Support\Collection $cast_to_as_enum_collection
|
||||||
|
* @property \ArrayObject $cast_to_as_array_object
|
||||||
|
* @property AdvancedCastCollection $cast_to_as_collection_using
|
||||||
|
* @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 newQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast query()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToAsArrayObject($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToAsCollection($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToAsEnumCollection($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToCustomDatetime($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToDateSerialization($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToDatetimeSerialization($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToEncrypted($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToEncryptedArray($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToEncryptedCollection($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToEncryptedJson($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToEncryptedObject($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToImmutableCustomDatetime($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToImmutableDate($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToImmutableDatetime($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|AdvancedCast whereCastToTimestamp($value)
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class AdvancedCast extends Model
|
||||||
|
{
|
||||||
|
protected function casts(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'cast_to_date_serialization' => 'date:Y-m-d',
|
||||||
|
'cast_to_datetime_serialization' => 'datetime:Y-m-d H:i:s',
|
||||||
|
'cast_to_custom_datetime' => 'custom_datetime:Y-m-d H:i:s',
|
||||||
|
'cast_to_immutable_date' => 'immutable_date',
|
||||||
|
'cast_to_immutable_custom_datetime' => 'immutable_custom_datetime:Y-m-d H:i:s',
|
||||||
|
'cast_to_immutable_datetime' => 'immutable_datetime',
|
||||||
|
'cast_to_timestamp' => 'timestamp',
|
||||||
|
'cast_to_encrypted' => 'encrypted',
|
||||||
|
'cast_to_encrypted_array' => 'encrypted:array',
|
||||||
|
'cast_to_encrypted_collection' => 'encrypted:collection',
|
||||||
|
'cast_to_encrypted_json' => 'encrypted:json',
|
||||||
|
'cast_to_encrypted_object' => 'encrypted:object',
|
||||||
|
'cast_to_as_collection' => AsCollection::class,
|
||||||
|
'cast_to_as_collection_using' => AsCollection::using(AdvancedCastCollection::class),
|
||||||
|
'cast_to_as_enum_collection' => AsEnumCollection::class,
|
||||||
|
'cast_to_as_enum_collection_of' => AsEnumCollection::of(AdvancedCastEnum::class),
|
||||||
|
'cast_to_as_array_object' => AsArrayObject::class,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AllowGlobDirectory\Services\Post\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Post extends Model
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AllowGlobDirectory;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
|
||||||
|
|
||||||
|
final class Test extends AbstractModelsCommand
|
||||||
|
{
|
||||||
|
/** @var string */
|
||||||
|
private $cwd;
|
||||||
|
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->cwd = getcwd();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function tearDown(): void
|
||||||
|
{
|
||||||
|
chdir($this->cwd);
|
||||||
|
|
||||||
|
parent::tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test(): void
|
||||||
|
{
|
||||||
|
$command = $this->app->make(ModelsCommand::class);
|
||||||
|
|
||||||
|
chdir(__DIR__);
|
||||||
|
|
||||||
|
$tester = $this->runCommand($command, [
|
||||||
|
'--dir' => ['Services/*/Models'],
|
||||||
|
'--write' => true,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertSame(0, $tester->getStatusCode());
|
||||||
|
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
|
||||||
|
$this->assertMatchesMockedSnapshot();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AllowGlobDirectory\Services\Post\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 string|null $decimal_nullable
|
||||||
|
* @property string $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 newModelQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post newQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|Post query()
|
||||||
|
* @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
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ArrayCastsWithComment\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @property array<int, string>|null $cast_to_array -- These three should not be duplicated
|
||||||
|
* @property array<int, string> $cast_to_json some-description
|
||||||
|
* @property \Illuminate\Support\Collection<int, string> $cast_to_collection some-description
|
||||||
|
*
|
||||||
|
* @property array|null $cast_to_encrypted_array -- These three are OK (no types)
|
||||||
|
* @property array $cast_to_encrypted_json some-description
|
||||||
|
* @property \Illuminate\Support\Collection $cast_to_encrypted_collection some-description
|
||||||
|
*
|
||||||
|
* @property string $cast_to_string -- The next three are OK (no description), this not included
|
||||||
|
*
|
||||||
|
* @property array<int, string>|null $cast_to_immutable_date
|
||||||
|
* @property array<int, string> $cast_to_immutable_date_serialization
|
||||||
|
* @property \Illuminate\Support\Collection<int, string> $cast_to_immutable_custom_datetime
|
||||||
|
*/
|
||||||
|
class ArrayCastsWithComment extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'simple_casts';
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'cast_to_array' => 'array',
|
||||||
|
'cast_to_json' => 'json',
|
||||||
|
'cast_to_collection' => 'collection',
|
||||||
|
|
||||||
|
'cast_to_encrypted_array' => 'array',
|
||||||
|
'cast_to_encrypted_json' => 'json',
|
||||||
|
'cast_to_encrypted_collection' => 'collection',
|
||||||
|
|
||||||
|
'cast_to_string' => 'string',
|
||||||
|
|
||||||
|
'cast_to_immutable_date' => 'array',
|
||||||
|
'cast_to_immutable_date_serialization' => 'json',
|
||||||
|
'cast_to_immutable_custom_datetime' => 'collection',
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ArrayCastsWithComment;
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ArrayCastsWithComment\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @property array<int, string>|null $cast_to_array -- These three should not be duplicated
|
||||||
|
* @property array<int, string> $cast_to_json some-description
|
||||||
|
* @property \Illuminate\Support\Collection<int, string> $cast_to_collection some-description
|
||||||
|
* @property array|null $cast_to_encrypted_array -- These three are OK (no types)
|
||||||
|
* @property array $cast_to_encrypted_json some-description
|
||||||
|
* @property \Illuminate\Support\Collection $cast_to_encrypted_collection some-description
|
||||||
|
* @property string $cast_to_string -- The next three are OK (no description), this not included
|
||||||
|
* @property array<int, string>|null $cast_to_immutable_date
|
||||||
|
* @property array<int, string> $cast_to_immutable_date_serialization
|
||||||
|
* @property \Illuminate\Support\Collection<int, string> $cast_to_immutable_custom_datetime
|
||||||
|
* @property string $cast_to_int
|
||||||
|
* @property string $cast_to_integer
|
||||||
|
* @property string $cast_to_real
|
||||||
|
* @property string $cast_to_float
|
||||||
|
* @property string $cast_to_double
|
||||||
|
* @property string $cast_to_decimal
|
||||||
|
* @property string $cast_to_bool
|
||||||
|
* @property string $cast_to_boolean
|
||||||
|
* @property string $cast_to_object
|
||||||
|
* @property string $cast_to_date
|
||||||
|
* @property string $cast_to_datetime
|
||||||
|
* @property string $cast_to_date_serialization
|
||||||
|
* @property string $cast_to_datetime_serialization
|
||||||
|
* @property string $cast_to_custom_datetime
|
||||||
|
* @property string $cast_to_immutable_datetime
|
||||||
|
* @property string $cast_to_immutable_datetime_serialization
|
||||||
|
* @property string $cast_to_timestamp
|
||||||
|
* @property string $cast_to_encrypted
|
||||||
|
* @property string $cast_to_encrypted_object
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment newModelQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment newQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment query()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToArray($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToBool($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToBoolean($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToCollection($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToCustomDatetime($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToDate($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToDateSerialization($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToDatetime($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToDatetimeSerialization($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToDecimal($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToDouble($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToEncrypted($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToEncryptedArray($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToEncryptedCollection($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToEncryptedJson($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToEncryptedObject($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToFloat($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToImmutableCustomDatetime($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToImmutableDate($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToImmutableDateSerialization($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToImmutableDatetime($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToImmutableDatetimeSerialization($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToInt($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToInteger($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToJson($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToObject($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToReal($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToString($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ArrayCastsWithComment whereCastToTimestamp($value)
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class ArrayCastsWithComment extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'simple_casts';
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'cast_to_array' => 'array',
|
||||||
|
'cast_to_json' => 'json',
|
||||||
|
'cast_to_collection' => 'collection',
|
||||||
|
|
||||||
|
'cast_to_encrypted_array' => 'array',
|
||||||
|
'cast_to_encrypted_json' => 'json',
|
||||||
|
'cast_to_encrypted_collection' => 'collection',
|
||||||
|
|
||||||
|
'cast_to_string' => 'string',
|
||||||
|
|
||||||
|
'cast_to_immutable_date' => 'array',
|
||||||
|
'cast_to_immutable_date_serialization' => 'json',
|
||||||
|
'cast_to_immutable_custom_datetime' => 'collection',
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Attributes\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class BackedAttribute extends Model
|
||||||
|
{
|
||||||
|
protected function name(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
},
|
||||||
|
function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nameRead(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nameWrite(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
set: function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nonBackedSet(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
set: function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nonBackedGet(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
get: function (): ?string {
|
||||||
|
return 'test';
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Attributes\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Simple extends Model
|
||||||
|
{
|
||||||
|
// With a backed property
|
||||||
|
protected function name(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
},
|
||||||
|
function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Without backed properties
|
||||||
|
|
||||||
|
protected function typeHintedGetAndSet(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (): ?string {
|
||||||
|
return $this->name;
|
||||||
|
},
|
||||||
|
function (?string $name) {
|
||||||
|
$this->name = $name;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function divergingTypeHintedGetAndSet(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (): int {
|
||||||
|
return strlen($this->name);
|
||||||
|
},
|
||||||
|
function (?string $name) {
|
||||||
|
$this->name = $name;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function typeHintedGet(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::get(function (): ?string {
|
||||||
|
return $this->name;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function typeHintedSet(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::set(function (?string $name) {
|
||||||
|
$this->name = $name;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nonTypeHintedGetAndSet(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function () {
|
||||||
|
return $this->name;
|
||||||
|
},
|
||||||
|
function ($name) {
|
||||||
|
$this->name = $name;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nonTypeHintedGet(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::get(function () {
|
||||||
|
return $this->name;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nonTypeHintedSet(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::set(function ($name) {
|
||||||
|
$this->name = $name;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function parameterlessSet(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::set(function () {
|
||||||
|
$this->name = null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ide-helper does not recognize this method being an Attribute
|
||||||
|
* because the method has no actual return type;
|
||||||
|
* phpdoc is ignored here deliberately due to performance reasons and also
|
||||||
|
* isn't supported by Laravel itself.
|
||||||
|
*
|
||||||
|
* @return Attribute
|
||||||
|
*/
|
||||||
|
protected function notAnAttribute()
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (?string $value): ?string {
|
||||||
|
return $value;
|
||||||
|
},
|
||||||
|
function (?string $value): ?string {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Attributes;
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,213 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Attributes\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @property int $id
|
||||||
|
* @property string|null $name
|
||||||
|
* @property string|null $name_read
|
||||||
|
* @property string|null $name_write
|
||||||
|
* @property-read string|null $non_backed_get
|
||||||
|
* @property-write string|null $non_backed_set
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|BackedAttribute newModelQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|BackedAttribute newQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|BackedAttribute query()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|BackedAttribute whereId($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|BackedAttribute whereName($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|BackedAttribute whereNameRead($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|BackedAttribute whereNameWrite($value)
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class BackedAttribute extends Model
|
||||||
|
{
|
||||||
|
protected function name(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
},
|
||||||
|
function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nameRead(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nameWrite(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
set: function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nonBackedSet(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
set: function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nonBackedGet(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
get: function (): ?string {
|
||||||
|
return 'test';
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Attributes\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @property int $id
|
||||||
|
* @property int $diverging_type_hinted_get_and_set
|
||||||
|
* @property string|null $name
|
||||||
|
* @property-read mixed $non_type_hinted_get
|
||||||
|
* @property mixed $non_type_hinted_get_and_set
|
||||||
|
* @property-write mixed $non_type_hinted_set
|
||||||
|
* @property-write mixed $parameterless_set
|
||||||
|
* @property-read string|null $type_hinted_get
|
||||||
|
* @property string|null $type_hinted_get_and_set
|
||||||
|
* @property-write string|null $type_hinted_set
|
||||||
|
* @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
|
||||||
|
*/
|
||||||
|
class Simple extends Model
|
||||||
|
{
|
||||||
|
// With a backed property
|
||||||
|
protected function name(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
},
|
||||||
|
function (?string $name): ?string {
|
||||||
|
return $name;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Without backed properties
|
||||||
|
|
||||||
|
protected function typeHintedGetAndSet(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (): ?string {
|
||||||
|
return $this->name;
|
||||||
|
},
|
||||||
|
function (?string $name) {
|
||||||
|
$this->name = $name;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function divergingTypeHintedGetAndSet(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (): int {
|
||||||
|
return strlen($this->name);
|
||||||
|
},
|
||||||
|
function (?string $name) {
|
||||||
|
$this->name = $name;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function typeHintedGet(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::get(function (): ?string {
|
||||||
|
return $this->name;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function typeHintedSet(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::set(function (?string $name) {
|
||||||
|
$this->name = $name;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nonTypeHintedGetAndSet(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function () {
|
||||||
|
return $this->name;
|
||||||
|
},
|
||||||
|
function ($name) {
|
||||||
|
$this->name = $name;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nonTypeHintedGet(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::get(function () {
|
||||||
|
return $this->name;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function nonTypeHintedSet(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::set(function ($name) {
|
||||||
|
$this->name = $name;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function parameterlessSet(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::set(function () {
|
||||||
|
$this->name = null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ide-helper does not recognize this method being an Attribute
|
||||||
|
* because the method has no actual return type;
|
||||||
|
* phpdoc is ignored here deliberately due to performance reasons and also
|
||||||
|
* isn't supported by Laravel itself.
|
||||||
|
*
|
||||||
|
* @return Attribute
|
||||||
|
*/
|
||||||
|
protected function notAnAttribute()
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
function (?string $value): ?string {
|
||||||
|
return $value;
|
||||||
|
},
|
||||||
|
function (?string $value): ?string {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Comment\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
||||||
|
|
||||||
|
class Simple extends Model
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* There is not comment.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getNotCommentAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* comment There is not format comment, invalid.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFakerCommentAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment There is format comment, success.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFormatCommentAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment There is format comment, success.
|
||||||
|
* This is second line, success too.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFormatCommentLineTwoAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment There is format comment, success.
|
||||||
|
* @comment This is others format comment, invalid.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getManyFormatCommentAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment Set the user's first name.
|
||||||
|
* @param $value
|
||||||
|
*/
|
||||||
|
public function setFirstNameAttribute($value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment Scope a query to only include active users.
|
||||||
|
*
|
||||||
|
* @param $query
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function scopeActive($query)
|
||||||
|
{
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment HasMany relations.
|
||||||
|
*
|
||||||
|
* @return HasMany
|
||||||
|
*/
|
||||||
|
public function relationHasMany(): HasMany
|
||||||
|
{
|
||||||
|
return $this->hasMany(Simple::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment MorphTo relations.
|
||||||
|
* @return MorphTo
|
||||||
|
*/
|
||||||
|
public function relationMorphTo(): MorphTo
|
||||||
|
{
|
||||||
|
return $this->morphTo();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment Others relations.
|
||||||
|
* @return HasOne
|
||||||
|
*/
|
||||||
|
public function relationHasOne(): HasOne
|
||||||
|
{
|
||||||
|
return $this->hasOne(Simple::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment I'm a setter
|
||||||
|
*/
|
||||||
|
public function setBothSameNameAttribute(): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment I'm a getter
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getBothSameNameAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment I'm a setter
|
||||||
|
*/
|
||||||
|
public function setBothWithoutGetterCommentAttribute(): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getBothWithoutGetterCommentAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Comment;
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,160 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Comment\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @property int $id
|
||||||
|
* @property string $both_same_name I'm a getter
|
||||||
|
* @property string $both_without_getter_comment
|
||||||
|
* @property-read string $faker_comment
|
||||||
|
* @property-read string $format_comment There is format comment, success.
|
||||||
|
* @property-read string $format_comment_line_two There is format comment, success.
|
||||||
|
* This is second line, success too.
|
||||||
|
* @property-read string $many_format_comment There is format comment, success.
|
||||||
|
* @property-read string $not_comment
|
||||||
|
* @property-read \Illuminate\Database\Eloquent\Collection<int, Simple> $relationHasMany HasMany relations.
|
||||||
|
* @property-read int|null $relation_has_many_count
|
||||||
|
* @property-read Simple|null $relationHasOne Others relations.
|
||||||
|
* @property-read Model|\Eloquent $relationMorphTo MorphTo relations.
|
||||||
|
* @property-write mixed $first_name Set the user's first name.
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|Simple active() Scope a query to only include active users.
|
||||||
|
* @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
|
||||||
|
*/
|
||||||
|
class Simple extends Model
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* There is not comment.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getNotCommentAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* comment There is not format comment, invalid.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFakerCommentAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment There is format comment, success.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFormatCommentAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment There is format comment, success.
|
||||||
|
* This is second line, success too.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFormatCommentLineTwoAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment There is format comment, success.
|
||||||
|
* @comment This is others format comment, invalid.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getManyFormatCommentAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment Set the user's first name.
|
||||||
|
* @param $value
|
||||||
|
*/
|
||||||
|
public function setFirstNameAttribute($value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment Scope a query to only include active users.
|
||||||
|
*
|
||||||
|
* @param $query
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function scopeActive($query)
|
||||||
|
{
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment HasMany relations.
|
||||||
|
*
|
||||||
|
* @return HasMany
|
||||||
|
*/
|
||||||
|
public function relationHasMany(): HasMany
|
||||||
|
{
|
||||||
|
return $this->hasMany(Simple::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment MorphTo relations.
|
||||||
|
* @return MorphTo
|
||||||
|
*/
|
||||||
|
public function relationMorphTo(): MorphTo
|
||||||
|
{
|
||||||
|
return $this->morphTo();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment Others relations.
|
||||||
|
* @return HasOne
|
||||||
|
*/
|
||||||
|
public function relationHasOne(): HasOne
|
||||||
|
{
|
||||||
|
return $this->hasOne(Simple::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment I'm a setter
|
||||||
|
*/
|
||||||
|
public function setBothSameNameAttribute(): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment I'm a getter
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getBothSameNameAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @comment I'm a setter
|
||||||
|
*/
|
||||||
|
public function setBothWithoutGetterCommentAttribute(): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getBothWithoutGetterCommentAttribute(): string
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomCollection\Collections;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Collection;
|
||||||
|
|
||||||
|
class SimpleCollection extends Collection
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomCollection\Models;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomCollection\Collections\SimpleCollection;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
|
|
||||||
|
class Simple extends Model
|
||||||
|
{
|
||||||
|
public function newCollection(array $models = [])
|
||||||
|
{
|
||||||
|
return new SimpleCollection($models);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function relationHasMany(): HasMany
|
||||||
|
{
|
||||||
|
return $this->hasMany(Simple::class);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomCollection;
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomCollection\Models;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomCollection\Collections\SimpleCollection;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @property int $id
|
||||||
|
* @property-read SimpleCollection<int, Simple> $relationHasMany
|
||||||
|
* @property-read int|null $relation_has_many_count
|
||||||
|
* @method static SimpleCollection<int, static> all($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 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
|
||||||
|
{
|
||||||
|
public function newCollection(array $models = [])
|
||||||
|
{
|
||||||
|
return new SimpleCollection($models);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function relationHasMany(): HasMany
|
||||||
|
{
|
||||||
|
return $this->hasMany(Simple::class);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
<?php declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate\Models;
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate\Models;
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
<?php declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate;
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate;
|
||||||
|
|
||||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
|
||||||
use Carbon\CarbonImmutable;
|
use Carbon\CarbonImmutable;
|
||||||
use Illuminate\Filesystem\Filesystem;
|
|
||||||
use Illuminate\Support\Carbon;
|
use Illuminate\Support\Carbon;
|
||||||
use Illuminate\Support\Facades\Date;
|
use Illuminate\Support\Facades\Date;
|
||||||
use Mockery;
|
|
||||||
|
|
||||||
class Test extends AbstractModelsCommand
|
class Test extends AbstractModelsCommand
|
||||||
{
|
{
|
||||||
@@ -26,38 +26,8 @@ class Test extends AbstractModelsCommand
|
|||||||
parent::tearDown();
|
parent::tearDown();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getEnvironmentSetUp($app)
|
|
||||||
{
|
|
||||||
parent::getEnvironmentSetUp($app);
|
|
||||||
|
|
||||||
$app['config']->set('ide-helper', [
|
|
||||||
'model_locations' => [
|
|
||||||
// This is calculated from the base_path() which points to
|
|
||||||
// vendor/orchestra/testbench-core/laravel
|
|
||||||
'/../../../../tests/Console/ModelsCommand/CustomDate/Models',
|
|
||||||
],
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test(): void
|
public function test(): void
|
||||||
{
|
{
|
||||||
$actualContent = null;
|
|
||||||
$mockFilesystem = Mockery::mock(Filesystem::class);
|
|
||||||
$mockFilesystem
|
|
||||||
->shouldReceive('get')
|
|
||||||
->andReturn(file_get_contents(__DIR__ . '/Models/CustomDate.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, [
|
||||||
@@ -65,33 +35,7 @@ class Test extends AbstractModelsCommand
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
$this->assertSame(0, $tester->getStatusCode());
|
$this->assertSame(0, $tester->getStatusCode());
|
||||||
$this->assertEmpty($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\CustomDate\Models;
|
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate\Models\CustomDate
|
|
||||||
*
|
|
||||||
* @property \Carbon\CarbonImmutable|null $created_at
|
|
||||||
* @property \Carbon\CarbonImmutable|null $updated_at
|
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate\Models\CustomDate newModelQuery()
|
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate\Models\CustomDate newQuery()
|
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate\Models\CustomDate query()
|
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate\Models\CustomDate whereCreatedAt($value)
|
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate\Models\CustomDate whereUpdatedAt($value)
|
|
||||||
* @mixin \Eloquent
|
|
||||||
*/
|
|
||||||
class CustomDate extends Model
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
PHP;
|
|
||||||
|
|
||||||
$this->assertSame($expectedContent, $actualContent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomDate\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @property \Carbon\CarbonImmutable|null $created_at
|
||||||
|
* @property \Carbon\CarbonImmutable|null $updated_at
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|CustomDate newModelQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|CustomDate newQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|CustomDate query()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|CustomDate whereCreatedAt($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|CustomDate whereUpdatedAt($value)
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class CustomDate extends Model
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomPhpdocTags\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `@SuppressWarnings` tag below contains no space before the `(` but when
|
||||||
|
* the class phpdoc is written back, one is inserted.
|
||||||
|
*
|
||||||
|
* @link https://github.com/barryvdh/laravel-ide-helper/issues/666
|
||||||
|
*
|
||||||
|
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
|
||||||
|
*/
|
||||||
|
class Simple extends Model
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomPhpdocTags;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
|
||||||
|
|
||||||
|
class Test extends AbstractModelsCommand
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* This test makes sure that custom phpdoc tags are not mangled, e.g.
|
||||||
|
* there are no spaces inserted etc.
|
||||||
|
*
|
||||||
|
* @link https://github.com/barryvdh/laravel-ide-helper/issues/666
|
||||||
|
*/
|
||||||
|
public function testNoSpaceAfterCustomPhpdocTag(): 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\CustomPhpdocTags\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `@SuppressWarnings` tag below contains no space before the `(` but when
|
||||||
|
* the class phpdoc is written back, one is inserted.
|
||||||
|
*
|
||||||
|
* @link https://github.com/barryvdh/laravel-ide-helper/issues/666
|
||||||
|
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
|
||||||
|
* @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
|
||||||
|
*/
|
||||||
|
class Simple extends Model
|
||||||
|
{
|
||||||
|
}
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGeneratePhpdocWithExternalEloquentBuilder\Builders;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
|
|
||||||
|
class PostExternalQueryBuilder extends Builder
|
||||||
|
{
|
||||||
|
public function isActive(): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isStatus(string $status): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
}
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGeneratePhpdocWithExternalEloquentBuilder\Models;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGeneratePhpdocWithExternalEloquentBuilder\Builders\PostExternalQueryBuilder;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Post extends Model
|
||||||
|
{
|
||||||
|
public function newEloquentBuilder($query): PostExternalQueryBuilder
|
||||||
|
{
|
||||||
|
return new PostExternalQueryBuilder($query);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGeneratePhpdocWithExternalEloquentBuilder;
|
||||||
|
|
||||||
|
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_model_external_builder_methods', false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test(): void
|
||||||
|
{
|
||||||
|
$command = $this->app->make(ModelsCommand::class);
|
||||||
|
|
||||||
|
$tester = $this->runCommand($command, [
|
||||||
|
'--nowrite' => true,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertSame(0, $tester->getStatusCode());
|
||||||
|
$this->assertStringContainsString('Model information was written to _ide_helper_models.php', $tester->getDisplay());
|
||||||
|
$this->assertMatchesMockedSnapshot();
|
||||||
|
}
|
||||||
|
}
|
||||||
+166
@@ -0,0 +1,166 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// @formatter:off
|
||||||
|
// phpcs:ignoreFile
|
||||||
|
/**
|
||||||
|
* A helper file for your Eloquent Models
|
||||||
|
* Copy the phpDocs from this file to the correct Model,
|
||||||
|
* And remove them from this file, to prevent double declarations.
|
||||||
|
*
|
||||||
|
* @author Barry vd. Heuvel <[email protected]>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGeneratePhpdocWithExternalEloquentBuilder\Models{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @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 string|null $decimal_nullable
|
||||||
|
* @property string $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 \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGeneratePhpdocWithExternalEloquentBuilder\Builders\PostExternalQueryBuilder<static>|Post newModelQuery()
|
||||||
|
* @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGeneratePhpdocWithExternalEloquentBuilder\Builders\PostExternalQueryBuilder<static>|Post newQuery()
|
||||||
|
* @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGeneratePhpdocWithExternalEloquentBuilder\Builders\PostExternalQueryBuilder<static>|Post query()
|
||||||
|
* @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)
|
||||||
|
*/
|
||||||
|
class Post extends \Eloquent {}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DynamicRelations\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||||
|
|
||||||
|
class Dynamic extends Model
|
||||||
|
{
|
||||||
|
/** @var \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DynamicRelations\OtherModels\Account */
|
||||||
|
protected $account;
|
||||||
|
|
||||||
|
// Regular relations
|
||||||
|
public function regularHasMany(): HasMany
|
||||||
|
{
|
||||||
|
return $this->hasMany(Dynamic::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dynamic relations
|
||||||
|
public function dynamicHasMany(): HasMany
|
||||||
|
{
|
||||||
|
return $this->hasMany(Dynamic::class)->where('date', '>=', $this->account->created_at);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dynamicHasOne(): HasOne
|
||||||
|
{
|
||||||
|
return $this->hasOne(Dynamic::class)->where('date', '>=', $this->account->created_at);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dynamicBelongsTo(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Dynamic::class)->where('date', '>=', $this->account->created_at);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DynamicRelations\OtherModels;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Account extends Model
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DynamicRelations;
|
||||||
|
|
||||||
|
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,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$errors = [
|
||||||
|
'Error resolving relation model of Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DynamicRelations\Models\Dynamic:dynamicBelongsTo() : Attempt to read property "created_at" on null',
|
||||||
|
'Error resolving relation model of Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DynamicRelations\Models\Dynamic:dynamicHasMany() : Attempt to read property "created_at" on null',
|
||||||
|
'Error resolving relation model of Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DynamicRelations\Models\Dynamic:dynamicHasOne() : Attempt to read property "created_at" on null',
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->assertSame(0, $tester->getStatusCode());
|
||||||
|
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
|
||||||
|
foreach ($errors as $error) {
|
||||||
|
$this->assertStringContainsString($error, $tester->getDisplay());
|
||||||
|
}
|
||||||
|
$this->assertMatchesMockedSnapshot();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DynamicRelations\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @property-read \Illuminate\Database\Eloquent\Collection<int, Dynamic> $regularHasMany
|
||||||
|
* @property-read int|null $regular_has_many_count
|
||||||
|
* @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 query()
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class Dynamic extends Model
|
||||||
|
{
|
||||||
|
/** @var \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DynamicRelations\OtherModels\Account */
|
||||||
|
protected $account;
|
||||||
|
|
||||||
|
// Regular relations
|
||||||
|
public function regularHasMany(): HasMany
|
||||||
|
{
|
||||||
|
return $this->hasMany(Dynamic::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dynamic relations
|
||||||
|
public function dynamicHasMany(): HasMany
|
||||||
|
{
|
||||||
|
return $this->hasMany(Dynamic::class)->where('date', '>=', $this->account->created_at);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dynamicHasOne(): HasOne
|
||||||
|
{
|
||||||
|
return $this->hasOne(Dynamic::class)->where('date', '>=', $this->account->created_at);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dynamicBelongsTo(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Dynamic::class)->where('date', '>=', $this->account->created_at);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithCustomNamespace;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
|
||||||
|
class ModelWithCustomNamespaceFactory extends Factory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name of the factory's corresponding model.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $model = ModelWithCustomNamespace::class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define the model's default state.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function definition()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
|
||||||
|
class ModelWithFactoryFactory extends Factory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name of the factory's corresponding model.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $model = ModelWithFactory::class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define the model's default state.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function definition()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithNestedFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
|
||||||
|
class ModelWithNestedFactoryFactory extends Factory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name of the factory's corresponding model.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $model = ModelWithNestedFactory::class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define the model's default state.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function definition()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace\ModelWithCustomNamespaceFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class ModelWithCustomNamespace extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new factory instance for the model.
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Database\Eloquent\Factories\Factory
|
||||||
|
*/
|
||||||
|
protected static function newFactory()
|
||||||
|
{
|
||||||
|
return ModelWithCustomNamespaceFactory::new();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class ModelWithFactory extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||||
|
|
||||||
|
class ModelWithNestedFactory extends ModelWithFactory
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class ModelWithoutFactory extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
|
class Test extends AbstractModelsCommand
|
||||||
|
{
|
||||||
|
public function testFactory(): void
|
||||||
|
{
|
||||||
|
Factory::guessFactoryNamesUsing(static::getFactoryNameResolver());
|
||||||
|
|
||||||
|
$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->assertStringNotContainsString('not found', $tester->getDisplay());
|
||||||
|
$this->assertMatchesMockedSnapshot();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getFactoryNameResolver(): Closure
|
||||||
|
{
|
||||||
|
// This mimics the default resolver, but with adjusted test namespaces.
|
||||||
|
// Illuminate\Database\Eloquent\Factories\Factory::resolveFactoryName
|
||||||
|
return function (string $modelName): string {
|
||||||
|
$appNamespace = 'Barryvdh\\LaravelIdeHelper\\Tests\\Console\\ModelsCommand\\Factories\\';
|
||||||
|
|
||||||
|
$modelName = Str::startsWith($modelName, $appNamespace . 'Models\\')
|
||||||
|
? Str::after($modelName, $appNamespace . 'Models\\')
|
||||||
|
: Str::after($modelName, $appNamespace);
|
||||||
|
|
||||||
|
return $appNamespace . 'Factories\\' . $modelName . 'Factory';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace\ModelWithCustomNamespaceFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @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 newQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithCustomNamespace query()
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class ModelWithCustomNamespace extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new factory instance for the model.
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Database\Eloquent\Factories\Factory
|
||||||
|
*/
|
||||||
|
protected static function newFactory()
|
||||||
|
{
|
||||||
|
return ModelWithCustomNamespaceFactory::new();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @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 newQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithFactory query()
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class ModelWithFactory extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
}
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @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 newQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder<static>|ModelWithNestedFactory query()
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class ModelWithNestedFactory extends ModelWithFactory
|
||||||
|
{
|
||||||
|
}
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @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 query()
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class ModelWithoutFactory extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhpDocWithEnumDefaults\Enums;
|
||||||
|
|
||||||
|
enum PostStatus
|
||||||
|
{
|
||||||
|
case Published;
|
||||||
|
|
||||||
|
case Unpublished;
|
||||||
|
|
||||||
|
case Archived;
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhpDocWithEnumDefaults\Models;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhpDocWithEnumDefaults\Enums\PostStatus;
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Post extends Model
|
||||||
|
{
|
||||||
|
public function scopeHasStatus(Builder $query, ?PostStatus $status = PostStatus::Published)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhpDocWithEnumDefaults;
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
+168
@@ -0,0 +1,168 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhpDocWithEnumDefaults\Models;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhpDocWithEnumDefaults\Enums\PostStatus;
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
|
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 string|null $decimal_nullable
|
||||||
|
* @property string $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 Builder<static>|Post hasStatus(?\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhpDocWithEnumDefaults\Enums\PostStatus $status = \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhpDocWithEnumDefaults\Enums\PostStatus::Published)
|
||||||
|
* @method static Builder<static>|Post newModelQuery()
|
||||||
|
* @method static Builder<static>|Post newQuery()
|
||||||
|
* @method static Builder<static>|Post query()
|
||||||
|
* @method static Builder<static>|Post whereBigIntegerNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereBigIntegerNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereBinaryNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereBinaryNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereBooleanNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereBooleanNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereCharNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereCharNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereCreatedAt($value)
|
||||||
|
* @method static Builder<static>|Post whereDateNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereDateNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereDatetimeNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereDatetimeNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereDatetimetzNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereDatetimetzNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereDecimalNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereDecimalNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereDoubleNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereDoubleNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereEnumNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereEnumNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereFloatNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereFloatNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereId($value)
|
||||||
|
* @method static Builder<static>|Post whereIntegerNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereIntegerNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereIpaddressNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereIpaddressNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereJsonNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereJsonNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereJsonbNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereJsonbNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereLongTextNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereLongTextNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereMacaddressNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereMacaddressNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereMediumIntegerNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereMediumIntegerNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereMediumTextNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereMediumTextNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereSmallIntegerNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereSmallIntegerNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereStringNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereStringNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTextNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTextNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTimeNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTimeNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTimestampNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTimestampNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTimestamptzNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTimestamptzNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTimetzNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTimetzNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTinyIntegerNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereTinyIntegerNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUnsignedBigIntegerNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUnsignedBigIntegerNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUnsignedIntegerNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUnsignedIntegerNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUnsignedMediumIntegerNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUnsignedMediumIntegerNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUnsignedSmallIntegerNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUnsignedSmallIntegerNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUnsignedTinyIntegerNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUnsignedTinyIntegerNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUpdatedAt($value)
|
||||||
|
* @method static Builder<static>|Post whereUuidNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereUuidNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereYearNotNullable($value)
|
||||||
|
* @method static Builder<static>|Post whereYearNullable($value)
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class Post extends Model
|
||||||
|
{
|
||||||
|
public function scopeHasStatus(Builder $query, ?PostStatus $status = PostStatus::Published)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
<?php declare(strict_types=1);
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhpdoc\Models;
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GenerateBasicPhpdoc\Models;
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user