Compare commits

..
284 Commits
Author SHA1 Message Date
Barry vd. Heuvel 7db1843473 Remove Eloquent mixin thing 2018-09-06 20:41:09 +02:00
Barry vd. Heuvel 1989d0e794 Update .travis.yml 2018-09-04 16:19:48 +02:00
Barry vd. Heuvel 09db8c9a76 Update composer.json 2018-08-31 15:28:09 +02:00
Barry vd. Heuvel 4aa43fa613 Merge pull request #690 from kevinpijning/laravel-5.7-support
Laravel 5.7 support
2018-08-21 11:29:23 +02:00
kevin d55b48476e Laravel 5.7 support
Added Laravel 5.7 support
2018-08-15 09:57:53 +02:00
Barry vd. Heuvel 45e84b9070 Merge pull request #678 from BinotaLIU/add-fluent-change
add change modifier
2018-07-16 09:12:17 +02:00
BinotaLIU f472c26601 add change modifier 2018-07-05 19:31:23 +08:00
Barry vd. Heuvel 1deadced46 Merge pull request #675 from glamorous/bugfix/phpstan-error-formatter
bugfix - Space/Enter between starting php tag and comment for PHPStan
2018-06-21 14:14:18 +02:00
Jonas De Smet e1d1352ac5 bugfix - Space/Enter between starting php tag and comment for PHPStan 2018-06-19 14:59:59 +02:00
Barry vd. Heuvel 65e3278c86 Merge pull request #668 from falnyr/final-abstract-class
Added support for abstract/final models.
2018-06-13 10:16:26 +02:00
Barry vd. Heuvel efd7e51566 Merge pull request #671 from eidng8/patch-2
suppress formatter in meta file
2018-06-13 10:16:01 +02:00
Barry vd. Heuvel 2a5dda6a27 Merge pull request #672 from eidng8/patch-3
suppress formatter in helper file
2018-06-13 10:15:47 +02:00
Jackey Cheung 6577af8464 suppress formatter in helper file 2018-06-13 10:24:58 +08:00
Jackey Cheung 6c7bc371f9 suppress formatter in meta file 2018-06-13 10:21:51 +08:00
Jan Alfred Richter 217b8989c2 Added support for abstract/final models. 2018-05-31 15:39:22 +12:00
Barry vd. Heuvel c003eb40d7 Merge pull request #667 from BinotaLIU/master
nullable is actually support an argument
2018-05-29 17:29:40 +02:00
BinotaLIU 1a3d32f0d1 nullable actually support an argument 2018-05-29 22:28:49 +08:00
Barry vd. Heuvel bd733b7b7c Merge pull request #665 from JeppeKnockaert/fix-model-comments
Only skip non-models when generating docs
2018-05-24 14:10:51 +02:00
Jeppe Knockaert 93630fdf62 Only skip non-models when generating docs
The fix made in PR https://github.com/barryvdh/laravel-ide-helper/pull/614 for issue https://github.com/barryvdh/laravel-ide-helper/issues/253 was incorrect as it resulted in comments
no longer being generated for Models that are not Pivot Rlations.

This PR allow comments to be generated for both Pivot Models (as they are
a subclass of Eloquent\Model) and normal Models.
2018-05-24 11:43:03 +02:00
Barry vd. Heuvel f64ed52205 Merge pull request #664 from huydang284/master
ide-helper:models error when model's method has parameters and also has relation
2018-05-24 10:32:51 +02:00
Huy Dang ba28841870 fix case relation method has parameter 2018-05-22 13:26:27 +07:00
Barry vd. Heuvel b02a0bc6c9 Update phpunit.xml.dist 2018-05-07 13:03:54 +02:00
Barry vd. Heuvel a665961fb9 Update .travis.yml 2018-05-07 12:56:29 +02:00
Barry vd. Heuvel 83852e9de0 Update .travis.yml 2018-05-07 12:41:54 +02:00
Barry vd. Heuvel d2f29d997b Update .travis.yml 2018-05-07 11:56:03 +02:00
Barry vd. Heuvel cbacb28f19 Update .travis.yml 2018-05-07 11:55:44 +02:00
Barry vd. Heuvel 930e5bd301 Update composer.json 2018-05-07 11:49:06 +02:00
Barry vd. Heuvel 930d258cd4 Update composer.json 2018-05-07 11:48:47 +02:00
Barry vd. Heuvel 94248adae8 Merge pull request #600 from mike-grinspan/patch-1
Use Illuminate\Support\Carbon instead of Carbon\Carbon
2018-05-07 11:44:40 +02:00
Barry vd. Heuvel 50ecd8b815 Update CS, typo 2018-05-07 11:38:57 +02:00
Barry vd. Heuvel 1b70277203 Typo 2018-05-07 11:25:19 +02:00
Barry vd. Heuvel 87a03fd9c4 Merge pull request #576 from yuklia/docs-enhancment
Add notice about "Package Auto-Discovery" to docs
2018-05-07 11:23:21 +02:00
Barry vd. Heuvel b8a73bcab9 Merge pull request #581 from soltmar/master
Changed overwriting confirmation message
2018-05-07 11:23:06 +02:00
Barry vd. Heuvel 0556991c69 Merge pull request #583 from inxilpro/support-fakes
Support for ::fake() calls
2018-05-07 11:22:33 +02:00
Barry vd. Heuvel be78ac62cd Merge pull request #589 from mfn/patch-1
Keep "null"-ness of column even with model casts
2018-05-07 11:21:47 +02:00
Barry vd. Heuvel 265f00c322 Update LICENSE.md 2018-05-07 11:20:53 +02:00
Barry vd. Heuvel bbd96d3616 Merge pull request #609 from lx1036/patch
Sort keys for generating stable .phpstorm.meta.php
2018-05-07 11:17:33 +02:00
Barry vd. Heuvel 8d913089db Merge pull request #614 from WickedSik/master
Allow command to find and use pivot models
2018-05-07 11:17:07 +02:00
Barry vd. Heuvel 9a2588cb3a Merge pull request #612 from westphalen/master
Added Validator and Gate facades for Lumen
2018-05-07 11:16:47 +02:00
Barry vd. Heuvel e7fa36bdc3 Merge pull request #629 from bedezign/smart-reset
"smart-reset": Reset properties/methods, but keep the text
2018-05-07 11:15:59 +02:00
Barry vd. Heuvel b1e868c5fc Merge pull request #621 from Zae/feature/fix-callable-macros
Support php's array callable format for macro's.
2018-05-07 11:15:49 +02:00
Barry vd. Heuvel 203d60dc8c Merge branch 'master' into feature/fix-callable-macros 2018-05-07 11:15:43 +02:00
Barry vd. Heuvel f5275b700a Merge pull request #632 from JeppeKnockaert/feature/add-morphedByMany-relation
Add morphedByMany relationship
2018-05-07 11:13:27 +02:00
Barry vd. Heuvel 046a9bcc77 Merge pull request #647 from eidng8/eidng8-suppress-formatter
suppress PHPStorm formatter
2018-05-07 11:10:25 +02:00
Barry vd. Heuvel c6191830ab Merge pull request #660 from TomzxForks/fixes/659-use-composer-classmapgenerator
Replace Symfony ClassMapGenerator with Composer ClassMapGenerator
2018-05-07 11:09:58 +02:00
Barry vd. Heuvel cfff7721bc Merge pull request #661 from tzurbaev/patch-1
Remove `mixed` typehint from `Fluent::default` method
2018-05-07 11:09:27 +02:00
Timur Zurbaev 4691bc5fbd Remove mixed typehint from Fluent::default method 2018-05-05 10:09:30 +08:00
Tom Rochette b1b05b694b Remove dependecy to Symfony\Component\ClassLoader\ClassMapGenerator and replace it with Composer\Autoload\ClassMapGenerator. 2018-05-03 16:02:16 -04:00
Barry vd. Heuvel 98d6087a1e Merge pull request #568 from fisharebest/artisan-optimize
The 'artisan optimize' command is now deprecated.
2018-03-26 12:18:59 +02:00
Jackey Cheung c7b7ebf1b5 suppress PHPStorm formatter 2018-03-21 11:36:02 +08:00
Jeppe Knockaert 17982029f0 Move long one-line array to multiple lines 2018-02-14 12:15:38 +01:00
Jeppe Knockaert bda5120e9a Add morphedByMany relationship 2018-02-14 12:06:45 +01:00
Steve Guns d961482d22 Fixed PHPCS PSR2 issues 2018-02-14 08:59:19 +01:00
Steve Guns 8852b1ca9d Added "smart-reset": Reset properties/methods, but keep the docBlock text, if any 2018-02-11 19:09:33 +01:00
Barry vd. Heuvel b644e48801 Merge pull request #618 from glamorous/feature/docblocks-on-classes
Add DocBlocks for classes too
2018-02-10 14:47:48 +01:00
Barry vd. Heuvel 09610da602 Merge pull request #626 from barryvdh/revert-624-Fix/623
Revert "Fixes a bug where a missing DocBlock caused errors"
2018-02-08 17:01:01 +01:00
Barry vd. Heuvel 2d56afce8e Revert "Fixes a bug where a missing DocBlock caused errors" 2018-02-08 17:00:48 +01:00
Barry vd. Heuvel 5c304db44f Merge pull request #624 from iPaat/Fix/623
Fixes a bug where a missing DocBlock caused errors
2018-02-08 08:56:07 +01:00
Patrick 1fc4284af6 Fixes for Travis. 2018-02-07 13:24:36 +01:00
Patrick ea113e8c0b Fixes a bug where a missing DocBlock caused errors 2018-02-07 13:17:03 +01:00
Barry vd. Heuvel 387efb9b42 Allow L5.6 2018-02-07 09:31:35 +01:00
Ezra Pool 8ab907f219 Support php's array callable format for macro's.
This allows you to define methods like this as well: Str::macro('name', [$this, 'method']);
2018-02-03 21:10:48 +01:00
Jonas De Smet e29e035135 Add DocBlocks for classes too 2018-02-01 15:53:32 +01:00
Jurrien Dokter 7b2786ac2b Fixing issue #253 2018-01-27 13:01:07 +01:00
Sune Westphalen 76bd86dbaf Added Validator and Gate facades for Lumen. 2018-01-23 13:56:22 +07:00
Xiang Liu 7b067198a6 Sort keys for generating stable .phpstorm.meta.php 2018-01-15 12:44:44 +08:00
Mike b6f525b320 Use Illuminate\Support\Carbon instead of Carbon\Carbon in config/ide-helper.php 2017-12-27 17:26:16 -05:00
Mike d65f1cedcd Use Illuminate\Support\Carbon instead of Carbon\Carbon in readme.md 2017-12-27 17:25:44 -05:00
Mike df6b1b6f82 Use Illuminate\Support\Carbon instead of Carbon\Carbon 2017-12-27 17:17:00 -05:00
Markus Fischer 76a1952c41 Keep "null"-ness of column even with model casts
A cast in Laravel should only affect the type, but not the database intrinsics whether a column accepts `null` or not.

As an example, consider this table (Postgres syntax):
```sql
CREATE TABLE foo (
  some_column jsonb
);
```
This will be generated as: `@property string|null $some_column`

When providing a the following casts on the model:
```php
protected $casts = [
  'some_column' => 'array',
];
```
then the generated property changes to: `@property array $some_column`

However the DB still accepts `null`, but this can't be expressed via the casts.

This change will make the null "sticky" and generate: `@property array|null $some_column`
2017-10-28 18:01:18 +02:00
Chris Morrell d45b02efb1 Support for ::fake() calls 2017-10-13 11:41:30 -04:00
Mariusz b0abafb8c7 Changed overwriting confirmation message
When running php artisan ide-helper:models below message was presented:
"Do you want to overwrite the existing model files? Choose no to write to _ide_helper_models.php instead? (Yes/No):  (yes/no) [no]:"
This commit changes message to:
"Do you want to overwrite the existing model files? Choose no to write to _ide_helper_models.php instead? (yes/no) [no]:"
2017-10-11 11:43:16 +01:00
Yulia Kostrikova 6b0e9ec48d Add notice about "Package Auto-Discovery" to docs 2017-09-21 00:40:49 +03:00
M. Vugteveen 28f0ac3781 also show time in generated files (#574) 2017-09-13 14:18:03 +02:00
Greg Roach 721a7cd3f7 The 'artisan optimize' command is deprecated 2017-09-02 21:25:00 +01:00
Carl Evison ea6d6d0105 update to the latest code intel (#567) 2017-09-02 17:44:59 +02:00
Subodh Dahal 01320a48e3 Bugfix: Undefined property: Barryvdh\LaravelIdeHelper\Console\MetaCommand::$config (#562) 2017-08-28 15:16:15 +02:00
Charles Peterson fedcb57295 Add an eloquent command (#544)
* Add an eloquent command for adding the `@mixin \Eloquent` to the Illuminate\Database\Eloquent\Model

* spacing updates...

* multi-line function call syntax

* Write helper mixin to Eloquent/Model after helper created

* Cleanup into helper - similar to Generator

* syntax cleanup
2017-08-28 15:12:54 +02:00
Barry vd. Heuvel ce72ff4663 Remove exit for static code analysers 2017-08-28 13:39:24 +02:00
Zakaria Acharki cb6f52f4d6 Minor typo fix (#548) 2017-08-28 13:38:22 +02:00
Chris Morrell 55c9bfc33b Allow for configurable meta filename (#553) 2017-08-28 13:37:22 +02:00
Chris Morrell a9ea231679 Support higher order tap() (#554) 2017-08-28 13:35:56 +02:00
Jan.Weskamp 2b1273c45e Fix for Laravel 5.5 (#540)
Command fire method is now handle
2017-07-16 02:24:12 +02:00
Stidges 08d39c125f Add back leading slash on meta class names (#532) 2017-07-06 21:25:44 +02:00
dannehl 87a02ff574 added L55-support (#525) 2017-06-16 16:08:59 +02:00
Michael Tsang 9e42ce11f4 return eloquent builder instead of plain database builder from model methods (#522) 2017-06-15 17:22:20 +02:00
Stidges dca7fa7b10 Use new PhpStorm advanced metadata format (#523) 2017-06-14 20:49:19 +02:00
Abdelrahman Omran 0e4b9b77c3 Support Auto-Discovery (#524) 2017-06-14 19:56:10 +02:00
leo 46901d2c80 set include_fluent default to true (#512) 2017-06-08 12:19:59 +02:00
Max Matiukhin 25b5576f57 generate methods for the SoftDeletes trait (#518) 2017-06-08 12:19:38 +02:00
Michael Tsang d6d99994c3 return eloquent builder instead of plain database builder from model methods (#521) 2017-06-08 12:19:27 +02:00
Barry vd. Heuvel 7e78d02d0a Update .travis.yml 2017-06-06 16:29:23 +02:00
Victor Isadov 35d954fc39 Note for \Eloquent (#515)
https://github.com/barryvdh/laravel-ide-helper/issues/514
2017-06-06 16:18:54 +02:00
Jez McKean 5eeda63958 replaced curly quotes and other minor tweaks (#510) 2017-05-29 19:44:30 +02:00
Matthew Erwin b76156b24c Adds support for macros (#500)
* Adds support for macros

* Fixes formatting
2017-05-05 11:22:12 +02:00
Emir Beganović 2a63d51496 Add PHP 7.1 to build script (#492) 2017-04-14 17:57:13 +02:00
Neil Farrington 3814fe86ca Resolve displaying @return types with descriptions (#491) 2017-04-14 08:56:19 +02:00
JC Lee 3ab73555d9 Add support for pgsql for boolean types. (#489) 2017-04-11 07:31:58 +02:00
Antoine Aflalo ff3844e4e1 Implements Nullable (#487)
* Add nullable support

Fixes #407

* Add nullable to setProperty

Better do it like this to still be able to override the base type if wanted

* Cleanup nullableColumns between models iterations

Also rename it to nullableColumns since it contains multiple columns

* Fix formatting
2017-04-08 10:19:23 +02:00
JC Lee d11bf58084 Fix #480 where tinyint is casts as bool (#481)
* Fix #480 where tinyint is casts as bool

`tinyint` is classified by bool as doctrine/dbal, but it should not be so in our use case. `tinyint` is better PHPDoc'ed as int. If the user wants bool, he should use Eloquent's `$casts` property to do that.

* Pass PSR-2 check

* Remove comment as requested
2017-04-05 09:45:19 +02:00
theMadness 75e1f22ec6 Decoupled from main app View Factory (#475) 2017-03-31 11:14:28 +02:00
Ivan Boldyrev 144a50e8ee Add disable write magic methods on models (#466)
* Add desable write magic methods on models

* Fix property name

* Opps commit

* Fix

* Change default parameter of property
2017-03-16 11:46:50 +01:00
Florian Lefèvre b611cb5eff Add namespaced aliases (#456)
* Add namespaced aliases

* Move aliases regouping logic in Generator

* Fix getValidAliases return type
2017-03-05 20:04:42 +01:00
Barry vd. Heuvel e82de98cef Add Eloquent methods back 2017-02-22 13:27:33 +01:00
arasharg 456853be46 ignore intermediate table models (#454) 2017-02-22 08:59:06 +01:00
Barry vd. Heuvel 25c8de637d Skip eloquent
Fixes #https://github.com/barryvdh/laravel-ide-helper/issues/451
2017-02-20 13:54:53 +01:00
Emmanuel Maggion 5a841a209d Fix case (#452) 2017-02-20 11:52:55 +01:00
Barry vd. Heuvel 56660cab84 Update composer.json 2017-02-14 16:45:07 +01:00
Zimin Cao 555d3e3700 Add documentation in readme.md for Laravel Fluent methods support (#446)
* Added readme for Fluent methods

* Add readme for Laravel Fluent methods
2017-02-13 20:20:12 +01:00
Tommi Finnilae 963ead0a01 Correct Fluent helper output (#445)
'references()' and 'on()' argument names were backwards
2017-02-13 12:53:06 +01:00
Florian Lefèvre 8c306035aa Fix facades fullpath autocomplete (#441)
* Add method to retrieve namespace of extended class

* Regroup classes by namespace of the class they extends

* Restore facades shortnames

* Fix classnames used for methods declaration
2017-02-13 12:52:36 +01:00
Barry vd. Heuvel f1e93f042d Update helper.php 2017-02-03 15:05:31 +01:00
Charles Peterson 5280b47750 readme spelling (#436)
just a couple spelling fixes for the readme file.
2017-02-01 09:59:19 +01:00
Florian Lefèvre 525733122e Add facades fullpath autocomplete (#437)
* Add method to retrieve namespace of extended class

* Regroup classes by namespace of the class they extends

* Restore facades shortnames
2017-02-01 07:21:31 +01:00
Django Eijgensteijn a7fc2ec489 Sorting model docs (#424) 2017-01-05 22:20:42 +01:00
Barry vd. Heuvel 8caca941b3 Update IdeHelperServiceProvider.php 2017-01-05 10:02:31 +01:00
Barry vd. Heuvel e96943fe6f Use singleton instead of share 2017-01-05 09:58:45 +01:00
Barry vd. Heuvel df3ecb2843 Update composer.json 2016-12-09 12:13:18 +01:00
Jackey Cheung 105f14a50d Add Fluent helpers (using config option) (#404)
* add fluent option to Generator

* add fluent to helper output

* add fluent option to config

* typo
2016-11-15 09:21:23 +01:00
Barry vd. Heuvel 5fad258f5d Merge pull request #397 from ockle/scope-typehints
Scope parameter typehints
2016-10-13 09:23:59 +02:00
ockle 13e65d3885 if model scope method parameters have typehints, add them to the docblock 2016-10-12 21:53:42 +01:00
Barry vd. Heuvel 22612733a2 Merge pull request #389 from pinepain/return_type
Use accessor docblock return type to guess property type
2016-09-08 08:54:27 +02:00
Barry vd. Heuvel dc476f9736 Merge pull request #388 from KarimGeiger/master
Fix "Using $this when not in object context" bug
2016-09-07 15:05:31 +02:00
Bogdan Padalko 71cb03ca6a Use accessor docblock return type to guess property type 2016-09-06 12:24:42 +03:00
Karim Geiger abe2df5853 Fix "Using $this when not in object context" bug
This commit fixes the "Using $this when not in object context" bug for the Lumen configuration. Since the `bootstrap/app.php`-file is not in object context, and the `app` instance accessible using the `$app` variable directly, using `$this->app` will result in a fatal error.
2016-09-05 23:24:04 +02:00
Barry vd. Heuvel 2de6ab6038 Merge pull request #387 from DarkGhostHunter/master
Update readme.md
2016-09-03 00:21:49 +02:00
Italo c229335651 Update readme.md
Typos and H2
2016-09-02 19:14:12 -03:00
Italo 495361e501 Update readme.md 2016-09-02 13:44:58 -03:00
Barry vd. Heuvel 7583353915 Merge pull request #386 from dimsav/patch-1
Minor style fix in readme
2016-09-02 16:16:38 +02:00
Dimitris Savvopoulos 16c570c589 Minor style fix in readme 2016-09-02 12:50:36 +03:00
Barry vd. Heuvel 884eaeeb1a Check if getCasts() exists
Fixes #382
2016-08-26 13:37:21 +02:00
Barry vd. Heuvel b6706683b2 Merge pull request #380 from ellisio/patch-1
hotfix for type overrides
2016-08-26 13:27:42 +02:00
Andrew Ellis 6f9b90c204 hotfix for type overrides
Oops, looks like I forgot to commit one call to the new method. This is related to #377.
2016-08-25 18:53:51 -06:00
Barry vd. Heuvel e1a0f034a1 Merge pull request #377 from ellisio/type-overrides
Allow Type Overrides
2016-08-24 22:41:37 +02:00
Andrew Ellis b75f879383 uncommented defaults 2016-08-24 14:23:02 -06:00
Andrew Ellis ad800d197f and one more blank line fix for travis-ci 2016-08-19 12:39:16 -06:00
Andrew Ellis f3a3533b2d fixed blank line errors for travis-ci build 2016-08-19 12:37:17 -06:00
Andrew Ellis e938cd3a31 added missing comma 2016-08-19 12:25:22 -06:00
Andrew Ellis f8c6ec95f6 allow a user to define the type overrides 2016-08-19 12:20:34 -06:00
Barry vd. Heuvel 0a4ff969d2 Merge pull request #375 from leo108/master
add support for $casts
2016-08-19 09:26:14 +02:00
leo108 4b47c0b61c add support for $casts 2016-08-19 07:35:07 +08:00
Barry vd. Heuvel 7598293bc6 Merge pull request #372 from chrisforrence/readme-updates
README updates
2016-08-14 18:38:30 +02:00
Chris Forrence 035b14176b Add instructions on installing for development 2016-08-12 17:39:45 -04:00
Chris Forrence cb08c6ff81 Grammar-related changes 2016-08-12 17:28:25 -04:00
Barry vd. Heuvel 28af7cd19c Update composer.json 2016-07-04 13:52:48 +02:00
Barry vd. Heuvel 8f004f5d6b Merge pull request #326 from valorin/master
Allow for camel case model properties.
2016-07-04 13:45:34 +02:00
Barry vd. Heuvel da677f1ba5 Merge pull request #357 from tnorthcutt/patch-1
An --> A
2016-07-04 13:44:48 +02:00
Barry vd. Heuvel 321844d9a5 Merge pull request #361 from cnanney/patch-1
Use FQN for app() methods
2016-06-29 21:27:36 +02:00
Chris Nanney 928389d7a4 Use FQN for app() methods 2016-06-29 10:21:17 -05:00
Travis Northcutt dbfcfd66c5 An --> A 2016-06-14 07:23:16 -06:00
Barry vd. Heuvel a9484c67d1 Merge branch 'master' of github.com:barryvdh/laravel-ide-helper 2016-06-13 21:36:24 +02:00
Barry vd. Heuvel 3064296216 Use fork of reflection docblock 2016-06-13 21:35:48 +02:00
Barry vd. Heuvel f057a4f820 Merge pull request #351 from ferdiunal/patch-1
Laravel 5.2.* composer.json file
2016-06-08 22:28:01 +02:00
Barry vd. Heuvel 091f78508c Add cache 2016-06-08 22:23:10 +02:00
Barry vd. Heuvel cf4fcd810c Prefest dist installs 2016-06-08 22:20:46 +02:00
Barry vd. Heuvel d3203de671 Remove other badges 2016-06-08 22:12:12 +02:00
Barry vd. Heuvel 093171e01f Update badges/licence 2016-06-08 22:11:14 +02:00
Barry vd. Heuvel 2d82419167 Test method output 2016-06-08 22:06:05 +02:00
Barry vd. Heuvel 0e84805e37 Update gitignore 2016-06-08 21:39:39 +02:00
Barry vd. Heuvel 7a07515149 Remove build dir 2016-06-08 21:39:24 +02:00
Barry vd. Heuvel bae462604e Add test config, CS rules and fix CS 2016-06-08 21:36:25 +02:00
Ferdi ÜNAL b28c8cbae1 Laravel 5.2.* composer.json file 2016-05-26 14:43:33 +03:00
Barry vd. Heuvel d734ecabcc Merge pull request #350 from Kurre/hasManyThrough-relationship
Add hasManyThrough relationship
2016-05-25 11:51:22 +02:00
Tommi Finnilä 4f227d5c57 Add hasManyThrough relationship 2016-05-25 09:28:34 +01:00
Barry vd. Heuvel 35ebf3a2ba Merge pull request #338 from cnanney/patch-1
Look for additional facade aliases in app config array
2016-05-12 07:32:54 +02:00
Barry vd. Heuvel f7b31bdbdc Merge pull request #345 from alexbowers/patch-1
Support Laravel 5.3.x (beta)
2016-05-01 09:29:05 +02:00
Alex Bowers 8de1673535 Update composer.json 2016-05-01 00:08:49 +01:00
Chris Nanney d818b72f82 Look for additional facade aliases in app config array
In my Lumen app, I load my providers and aliases from a `config/app.php` file like in Laravel. Maybe that is uncommon, but this simple PR will include those aliases as well if any are present.
2016-03-29 14:56:12 -05:00
Barry vd. Heuvel e97ed532f0 Merge pull request #327 from vedmant/master
Added support for default storage driver shortcuts, eg. Storage::exists('file.jpg');
2016-03-03 15:38:04 +01:00
Vedmant 606183ea12 Added support for default storage driver shortcuts, eg. Storage::exists('file.jpg'); 2016-03-03 16:33:28 +02:00
Stephen Rees-Carter a72cd81e5f Allow for camel case model properties. 2016-03-03 21:36:10 +11:00
Barry vd. Heuvel f1ebd847aa Check on actual model, not facade
Fixes #311
2016-03-03 09:45:00 +01:00
Barry vd. Heuvel 83597196f9 Prevent double mixin tags 2016-03-03 09:43:49 +01:00
Barry vd. Heuvel 19553f63e4 Update composer.json 2016-03-02 11:03:09 +01:00
Barry vd. Heuvel f50470ba49 Add morphOne, fix morphTo
Fixes #236 thanks to @boxfrommars
2016-03-02 10:54:41 +01:00
Barry vd. Heuvel 7762e07f0a Use new provider config
Fixes #274, #324
2016-03-02 10:47:25 +01:00
Barry vd. Heuvel 467b5f5b5f Always add whereColumn
Fixes #300, #325
2016-03-02 10:42:37 +01:00
Barry vd. Heuvel c213be3d3c Merge pull request #305 from matiaspub/patch-1
Add extend \Eloquent for ide-helper:models command
2016-03-02 10:39:21 +01:00
Barry vd. Heuvel 4b8ba85b34 Merge pull request #315 from icedfish/ignore_exception
Ignore abstract class or interface, not throw exception
2016-01-28 09:19:58 +01:00
Barry vd. Heuvel d4c0ae5851 Merge pull request #314 from icedfish/recover-helper-function
recover model's whereXXX() helper function
2016-01-28 07:21:05 +01:00
Yu Bing 3a01e351de Ignore abstract class or interface, not throw exception 2016-01-28 11:37:08 +08:00
Yu Bing add34665a8 fix typo 2016-01-28 11:20:48 +08:00
Yu Bing c77752bb58 recover model's whereXXX() helper function 2016-01-28 11:18:42 +08:00
Barry vd. Heuvel aa8f772a46 Merge pull request #310 from naerymdan/master
Add support for Lumen 5.0, 5.1 and 5.2+
2016-01-22 14:33:15 +01:00
Vincent Labreche 0c4c55f349 Add support for Lumen 5.0, 5.1 and 5.2+ 2016-01-22 08:30:36 -05:00
Barry vd. Heuvel ed972acf19 Merge pull request #308 from barryvdh/revert-303-master
Revert "Don't use force aliases loading"
2016-01-21 15:55:37 +01:00
Barry vd. Heuvel 60e642e881 Revert "Don't use force aliases loading" 2016-01-21 15:55:29 +01:00
Sergius 4069863d0c Add extend \Eloquent for ide-helper:models command
It's help author to close many issues! )
Like: #269, #259, #248, #209, #191, #74, 
and https://github.com/laravel/framework/issues/7558 )))
etc. maybe
2016-01-12 15:33:05 +02:00
Barry vd. Heuvel da05897cb7 Merge pull request #303 from dkulyk/master
Don't use force aliases loading
2016-01-11 13:00:09 +01:00
Dmytro Kulyk 74bac1a4e9 Don't use force aliases loading
Another autoloader throw exception if aliases not exists.
2016-01-11 13:45:41 +02:00
Barry vd. Heuvel 33cee80609 Merge pull request #302 from Propaganistas/patch-1
Fix Auth driver detection in Laravel 5.2
2016-01-08 18:03:38 +01:00
Propaganistas dee3878566 Fix Auth driver detection in Laravel 5.2 2016-01-06 20:31:08 +01:00
Barry vd. Heuvel eb5736a7bd Merge pull request #298 from onigoetz/patch-1
Allow symfony/class-loader 3.0 to be installed
2016-01-03 11:48:37 +01:00
Stéphane Goetz cc794a2fba Allow symfony/class-loader 3.0 to be installed 2016-01-03 11:25:12 +01:00
Barry vd. Heuvel d82e8f191f Fix meta for 5.2 seeder
Fixes #287
2015-12-21 20:48:06 +01:00
Barry vd. Heuvel 5497e7d506 Merge pull request #294 from bytestream/master
Fixes #293
2015-12-14 14:33:18 +01:00
Kieran 2f83db311f Fixes #293 2015-12-14 13:29:24 +00:00
Barry vd. Heuvel d56bbb2356 Merge pull request #290 from nikolay-zakharov/dev-resource-fails
Fixed: fails to generate with resources
2015-12-11 15:38:48 +01:00
Nikolay Zakharov 2fb1135fc5 Fixed: fails to generate with resources 2015-12-11 17:18:14 +03:00
Barry vd. Heuvel aec17e3327 Update composer.json 2015-12-11 09:26:59 +01:00
Barry vd. Heuvel 0c560cb375 Merge pull request #288 from miraage/fix/models-command
fix(models-command): check for default reflectionparameter value
2015-12-07 08:55:26 +01:00
miraage 5708012a77 fix(models-command): check for default reflectionparameter value to prevent fail in variadic params 2015-12-06 13:49:27 +03:00
Barry vd. Heuvel af6d9a7fa1 Merge pull request #275 from Houbsi/master
Automatic phpDocs for models: added copy/past
2015-10-22 14:34:24 +02:00
Mike Houben f708b9a46c Automatic phpDocs for models: added copy/past
With this information it's much easier to install.
2015-10-22 14:31:54 +02:00
Barry vd. Heuvel e3de462538 Resolve user model at runtime
Fixes #274
2015-10-22 14:26:11 +02:00
Barry vd. Heuvel 76f09aaa65 Remove magic where 2015-10-19 09:32:38 +02:00
Barry vd. Heuvel 56f89502e3 Tweak relation object
Tweaks #273
2015-10-19 09:31:08 +02:00
Barry vd. Heuvel 11037acfe6 Merge pull request #273 from klaude/custom-collection-support
Add custom collection support
2015-10-19 09:30:05 +02:00
Kevin Laude e48974e545 Add custom collection support
Add support for models that override Eloquent's newCollection() with a
custom collection type. Do this by executing the relationship on the
model then executing that relationship's newCollection() method to see
what type of colletion class is returned.

Remove the now-unused
Barryvdh\LaravelIdeHelper\Console\ModelsCommand::getClassName() method.
2015-10-18 20:54:25 -05:00
Barry vd. Heuvel 38a97cf07c Swap facade/alias
See #202
2015-08-18 10:57:06 +02:00
Barry vd. Heuvel 74ee804dde Update readme 2015-08-14 09:50:36 +02:00
Barry vd. Heuvel 83999f8467 Bump version 2015-08-13 13:40:00 +02:00
Barry vd. Heuvel fab54d90dd Merge pull request #252 from mahmutbayri/master
Trim tag text.…
2015-08-13 13:12:39 +02:00
Mahmut Bayri 5d4056fe87 Trim tag text. If tag doesn't have comment or the comment has any space at the end of line, phpcs (with --standard=PSR2) dedects an error. 2015-08-13 13:42:10 +03:00
Barry vd. Heuvel 3fbe330998 Update readme.md 2015-08-10 21:05:06 +02:00
Barry vd. Heuvel 78d233fea7 Skip validator 2015-08-10 21:01:41 +02:00
Barry vd. Heuvel 0d13a51ff5 Use preset list of aliases in Lumen 2015-08-10 21:00:31 +02:00
Barry vd. Heuvel 326e8ea25f Bring back changes
Missed them from previous commit
2015-08-10 20:38:57 +02:00
Barry vd. Heuvel e7ee934bb1 Inject filesystem 2015-08-10 20:36:00 +02:00
Barry vd. Heuvel 99953adb73 Inject filesystem instance 2015-08-10 20:35:04 +02:00
Barry vd. Heuvel 0d333c6228 Check for config_path (Lumen)
For #202
2015-08-10 20:23:56 +02:00
Barry vd. Heuvel 0a717d1e79 Merge pull request #243 from bebnev/master
fix get_class($this) in relationship functions
2015-08-09 15:04:14 +02:00
bebnev dc62d35bed fix parsing relations arguments 2015-08-09 15:28:04 +03:00
Barry vd. Heuvel 2b7733c6b9 Merge pull request #242 from bebnev/master
fix model docBlocks duplicates
2015-08-01 16:59:45 +02:00
bebnev 76674be735 fix model docBlocks duplicates
Add each parsed model to ignore list, so if it exists more than once it will not be parsed twice.
2015-08-01 17:13:43 +04:00
Barry vd. Heuvel e34b7fb84b Merge pull request #232 from konomae/patch-1
Fix vendor:publish provider name
2015-07-14 11:09:59 +02:00
konomae e77a7b5a9c Fix vendor:publish provider name 2015-07-14 17:54:07 +09:00
Barry vd. Heuvel 19f7d75c10 Update readme.md 2015-06-25 13:32:53 +02:00
Barry vd. Heuvel 0373861536 Add generic factory 2015-06-25 10:58:59 +02:00
Barry vd. Heuvel 3a4671f3ea Update meta file 2015-06-18 14:58:06 +02:00
Barry vd. Heuvel 8515b7ac0b Use verbosity to hide some errors 2015-06-18 09:11:05 +02:00
Barry vd. Heuvel 541b9508e2 Update compiled locations 2015-06-11 16:11:52 +02:00
Barry vd. Heuvel afe1fe88ba Merge pull request #222 from akshayagarwal/patch-1
Update provider include syntax for Laravel 5.1.1 LTS
2015-06-11 08:41:55 +02:00
Akshay Agarwal a59a5e1ae1 Update provider include syntax for Laravel 5.1.1 LTS 2015-06-10 21:04:26 +05:30
Barry vd. Heuvel bb3bba2c5b Catch non-existant class fatal exceptions
Add autoloader that throws an error, so we can catch errors instead of fatal crashes.
Fixes #220
2015-06-08 09:04:31 +02:00
Barry vd. Heuvel 5aa0f55d2f Update composer.json 2015-06-07 15:09:00 +02:00
Barry vd. Heuvel 89b585b242 Merge pull request #212 from modder2/modder2-patch-1
Bug fix with model relations
2015-05-15 12:26:15 +02:00
Alexander f5b1248a37 Bug fix with model relations
If relation has other methods, generating doc is fail.
E.g.
$this->belongsToMany('App\User')->withTimestamps();
generate this:
@property-read \Illuminate\Database\Eloquent\Collection|\App\User')->withTimestamps([] $drinks
2015-05-14 14:44:54 +03:00
Barry vd. Heuvel 8b190ac295 Merge pull request #211 from MrCue/master
Update ModelsCommand.php
2015-05-14 13:40:20 +02:00
MrCue a861bcaf1b Update ModelsCommand.php
Work with tables in different databases
2015-05-13 16:46:47 +01:00
Barry vd. Heuvel bb3bd2645d Merge pull request #190 from MalikinSergey/patch-1
Add Query\Builder return type to magic scope* methods
2015-05-06 12:08:42 +02:00
Barry vd. Heuvel 687a8c9b47 Merge pull request #178 from fhteam/master_custom_types_support
Custom database types support for L5 branch
2015-05-06 12:02:57 +02:00
Barry vd. Heuvel b1dedc3ee6 5.1 support 2015-05-03 16:00:11 +02:00
Barry vd. Heuvel dac46a081d Merge pull request #201 from elliotwms/patch-1
Indefinite article
2015-04-22 17:46:01 +02:00
Elliot Williams 0c38360317 Indefinite article
I'm pretty sure it should be `a helper file` as opposed to `an helper file`
2015-04-22 16:42:49 +01:00
Malikin Sergey 1d3a98f0e5 Add Query\Builder return type to magic scope* methods 2015-03-29 13:30:50 +03:00
Barry vd. Heuvel d9f79eb128 Merge pull request #188 from grrnikos/master
update readme.md
2015-03-25 21:00:56 +01:00
Nikos Gr 7ef2d2f398 update readme.md 2015-03-25 21:56:47 +02:00
Barry vd. Heuvel 5afcbdc7c8 Supress FQN warning 2015-03-17 10:13:32 +01:00
Barry vd. Heuvel d8d5517f2c Tweak @noinspection 2015-03-17 09:00:28 +01:00
Barry vd. Heuvel f518de4ae1 Filter abstracts for common errors
Fixes #184
2015-03-17 08:57:14 +01:00
Barry vd. Heuvel a89273d7ad Add non-static 2015-03-16 14:56:44 +01:00
Barry vd. Heuvel d9004f98cc Update readme 2015-03-16 14:55:13 +01:00
Barry vd. Heuvel 765a274c05 More methods 2015-03-16 14:26:28 +01:00
Barry vd. Heuvel b6a5262f3b TWeak meta methods 2015-03-16 14:14:57 +01:00
Barry vd. Heuvel d922d7e7ce Add actual command 2015-03-16 13:13:00 +01:00
Barry vd. Heuvel 89240e3ceb Add gist 2015-03-16 13:05:56 +01:00
Barry vd. Heuvel d9077b753c Note about missing classes. 2015-03-16 13:01:21 +01:00
Barry vd. Heuvel 683ed695a5 Fix views 2015-03-16 12:59:27 +01:00
Barry vd. Heuvel f8c4d4e77a Fix class imports 2015-03-16 12:52:48 +01:00
Barry vd. Heuvel b1a4494b1c Add note about meta file 2015-03-16 12:40:17 +01:00
Barry vd. Heuvel 70c06f5b37 Add meta command for phpstorm 2015-03-16 12:14:15 +01:00
Vladislav Rastrusny 8378f1bd67 Adding custom DB types support for models 2015-03-03 13:02:47 +03:00
Barry vd. Heuvel 81b7febfc6 Merge pull request #175 from robgeorgeuk/patch-1
New publish config syntax for Laravel 5
2015-02-23 16:55:54 +01:00
Rob George 208043b56f New publish config syntax for Laravel 5 2015-02-23 15:45:25 +00:00
Barry vd. Heuvel 4cd891eadc Merge pull request #169 from mattwells/master
Authenticatable Contract for User model
2015-02-17 13:55:39 +01:00
Matt Wells 7917ba911f Authenticatable Contract for User model 2015-02-17 10:54:52 +00:00
Barry vd. Heuvel 1f5e436d00 Merge pull request #167 from Flynsarmy/octoberConfig
Add support for October CMS config
2015-02-12 10:50:01 +01:00
flynsarmy fb3280eaff Add support for October CMS config 2015-02-12 19:03:29 +10:00
Barry vd. Heuvel 800ac05377 Revert
wrong branch
2015-02-07 23:18:26 +01:00
Barry vd. Heuvel 50059faa6f Add constraint
Fixes #164
2015-02-07 23:10:38 +01:00
Barry vd. Heuvel bb8d0169ba Merge pull request #162 from claar/patch-1
Bump L4 version number
2015-02-05 18:11:23 +01:00
Ben Claar fe692a4e77 Bump L4 version number 2015-02-05 11:03:19 -06:00
Barry vd. Heuvel c3a622fcc9 Rename 1.8 branch 2015-02-05 09:11:12 +01:00
Barry vd. Heuvel 317ef794a5 Check for correct facades 2015-02-04 09:12:01 +01:00
Barry vd. Heuvel 5c846ca16a Merge pull request #155 from Flynsarmy/authMethodExists
Check for driver method on Auth facade
2015-02-04 07:41:52 +01:00
Barry vd. Heuvel 1d4df779d8 Update branches 2015-02-03 21:01:58 +01:00
Barry vd. Heuvel 8f0d346eaa Tweak config 2015-02-03 20:57:49 +01:00
Barry vd. Heuvel 73003c0bea Swap resource arguments 2015-01-29 08:13:38 +01:00
Barry vd. Heuvel f12c785688 Skip Redis if not available 2015-01-28 10:04:48 +01:00
Barry vd. Heuvel c0aaabb6d7 Update config 2015-01-28 10:02:50 +01:00
Barry vd. Heuvel 1e6752a29f Update readme 2015-01-28 09:38:57 +01:00
Barry vd. Heuvel ab50c245d0 Update config/resources for L5 2015-01-28 09:34:45 +01:00
flynsarmy ab85ca4c5a Check for driver method on Auth facade 2015-01-28 14:31:20 +10:00
29 changed files with 2525 additions and 1236 deletions
+15
View File
@@ -0,0 +1,15 @@
; This file is for unifying the coding style for different editors and IDEs.
; More information at http://editorconfig.org
root = true
[*]
charset = utf-8
indent_size = 4
indent_style = space
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
+10
View File
@@ -0,0 +1,10 @@
# Path-based git attributes
# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
# Ignore all test and documentation with "export-ignore".
/.gitattributes export-ignore
/.gitignore export-ignore
/.travis.yml export-ignore
/phpunit.xml.dist export-ignore
/.scrutinizer.yml export-ignore
/tests export-ignore
+2 -1
View File
@@ -1,3 +1,4 @@
/vendor
build
vendor
composer.lock
.idea
+23
View File
@@ -0,0 +1,23 @@
filter:
excluded_paths: [tests/*]
checks:
php:
remove_extra_empty_lines: true
remove_php_closing_tag: true
remove_trailing_whitespace: true
fix_use_statements:
remove_unused: true
preserve_multiple: false
preserve_blanklines: true
order_alphabetically: true
fix_php_opening_tag: true
fix_linefeed: true
fix_line_ending: true
fix_identation_4spaces: true
fix_doc_comments: true
tools:
external_code_coverage:
timeout: 600
runs: 3
+1
View File
@@ -0,0 +1 @@
preset: psr2
+27
View File
@@ -0,0 +1,27 @@
language: php
php:
- 7.0
- 7.1
- 7.2
# This triggers builds to run on the new TravisCI infrastructure.
# See: http://docs.travis-ci.com/user/workers/container-based-infrastructure/
sudo: false
## Cache composer
cache:
directories:
- $HOME/.composer/cache
matrix:
include:
- php: 7.0
env: 'COMPOSER_FLAGS="--prefer-stable --prefer-lowest"'
before_script:
- travis_retry composer update ${COMPOSER_FLAGS} --no-interaction --prefer-dist
script:
- vendor/bin/phpcs --standard=psr2 src/
- vendor/bin/phpunit
+21
View File
@@ -0,0 +1,21 @@
# The MIT License (MIT)
Copyright (c) Barry vd. Heuvel <barryvdh@gmail.com>
> Permission is hereby granted, free of charge, to any person obtaining a copy
> of this software and associated documentation files (the "Software"), to deal
> in the Software without restriction, including without limitation the rights
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in
> all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> THE SOFTWARE.
+28 -7
View File
@@ -10,14 +10,20 @@
}
],
"require": {
"php": ">=5.3.0",
"illuminate/support": "4.x",
"illuminate/console": "4.x",
"illuminate/filesystem": "4.x",
"phpdocumentor/reflection-docblock": "2.0.x",
"symfony/class-loader": "~2.3"
"php": ">=7",
"illuminate/support": "^5.5,<5.8",
"illuminate/console": "^5.5,<5.8",
"illuminate/filesystem": "^5.5,<5.8",
"barryvdh/reflection-docblock": "^2.0.4",
"composer/composer": "^1.6"
},
"require-dev": {
"illuminate/config": "^5.1,<5.8",
"illuminate/view": "^5.1,<5.8",
"phpro/grumphp": "^0.14",
"phpunit/phpunit" : "4.*",
"scrutinizer/ocular": "~1.1",
"squizlabs/php_codesniffer": "^3",
"doctrine/dbal": "~2.3"
},
"suggest": {
@@ -28,9 +34,24 @@
"Barryvdh\\LaravelIdeHelper\\": "src"
}
},
"autoload-dev": {
"psr-4": {
"Barryvdh\\LaravelIdeHelper\\": "tests"
}
},
"scripts": {
"test": "phpunit",
"check-style": "phpcs -p --standard=PSR2 src/",
"fix-style": "phpcbf -p --standard=PSR2 src/"
},
"extra": {
"branch-alias": {
"dev-master": "1.11-dev"
"dev-master": "2.5-dev"
},
"laravel": {
"providers": [
"Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider"
]
}
}
}
+181
View File
@@ -0,0 +1,181 @@
<?php
return array(
/*
|--------------------------------------------------------------------------
| Filename & Format
|--------------------------------------------------------------------------
|
| The default filename (without extension) and the format (php or json)
|
*/
'filename' => '_ide_helper',
'format' => 'php',
'meta_filename' => '.phpstorm.meta.php',
/*
|--------------------------------------------------------------------------
| Fluent helpers
|--------------------------------------------------------------------------
|
| Set to true to generate commonly used Fluent methods
|
*/
'include_fluent' => false,
/*
|--------------------------------------------------------------------------
| Write Model Magic methods
|--------------------------------------------------------------------------
|
| Set to false to disable write magic methods of model
|
*/
'write_model_magic_where' => true,
/*
|--------------------------------------------------------------------------
| Helper files to include
|--------------------------------------------------------------------------
|
| Include helper files. By default not included, but can be toggled with the
| -- helpers (-H) option. Extra helper files can be included.
|
*/
'include_helpers' => false,
'helper_files' => array(
base_path().'/vendor/laravel/framework/src/Illuminate/Support/helpers.php',
),
/*
|--------------------------------------------------------------------------
| Model locations to include
|--------------------------------------------------------------------------
|
| Define in which directories the ide-helper:models command should look
| for models.
|
*/
'model_locations' => array(
'app',
),
/*
|--------------------------------------------------------------------------
| Extra classes
|--------------------------------------------------------------------------
|
| These implementations are not really extended, but called with magic functions
|
*/
'extra' => array(
'Eloquent' => array('Illuminate\Database\Eloquent\Builder', 'Illuminate\Database\Query\Builder'),
'Session' => array('Illuminate\Session\Store'),
),
'magic' => array(
'Log' => array(
'debug' => 'Monolog\Logger::addDebug',
'info' => 'Monolog\Logger::addInfo',
'notice' => 'Monolog\Logger::addNotice',
'warning' => 'Monolog\Logger::addWarning',
'error' => 'Monolog\Logger::addError',
'critical' => 'Monolog\Logger::addCritical',
'alert' => 'Monolog\Logger::addAlert',
'emergency' => 'Monolog\Logger::addEmergency',
)
),
/*
|--------------------------------------------------------------------------
| Interface implementations
|--------------------------------------------------------------------------
|
| These interfaces will be replaced with the implementing class. Some interfaces
| are detected by the helpers, others can be listed below.
|
*/
'interfaces' => array(
),
/*
|--------------------------------------------------------------------------
| 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(
),
/*
|--------------------------------------------------------------------------
| Support for camel cased models
|--------------------------------------------------------------------------
|
| There are some Laravel packages (such as Eloquence) that allow for accessing
| Eloquent model properties via camel case, instead of snake case.
|
| Enabling this option will support these packages by saving all model
| properties as camel case, instead of snake case.
|
| For example, normally you would see this:
|
| * @property \Illuminate\Support\Carbon $created_at
| * @property \Illuminate\Support\Carbon $updated_at
|
| With this enabled, the properties will be this:
|
| * @property \Illuminate\Support\Carbon $createdAt
| * @property \Illuminate\Support\Carbon $updatedAt
|
| Note, it is currently an all-or-nothing option.
|
*/
'model_camel_case_properties' => false,
/*
|--------------------------------------------------------------------------
| Property Casts
|--------------------------------------------------------------------------
|
| Cast the given "real type" to the given "type".
|
*/
'type_overrides' => array(
'integer' => 'int',
'boolean' => 'bool',
),
);
+15
View File
@@ -0,0 +1,15 @@
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]
+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php"
backupGlobals="false"
backupStaticAttributes="false"
colors="true"
verbose="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
<testsuites>
<testsuite name="Unit Tests">
<directory>tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">src/</directory>
</whitelist>
</filter>
</phpunit>
-5
View File
@@ -1,5 +0,0 @@
{
"providers": [
"Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider"
]
}
+218 -70
View File
@@ -1,114 +1,262 @@
## Laravel IDE Helper Generator
[![Latest Stable Version](https://poser.pugx.org/barryvdh/laravel-ide-helper/version.png)](https://packagist.org/packages/barryvdh/laravel-ide-helper) [![Total Downloads](https://poser.pugx.org/barryvdh/laravel-ide-helper/d/total.png)](https://packagist.org/packages/barryvdh/laravel-ide-helper)
## Laravel 5 IDE Helper Generator
### For Laravel 5, check the [2.0 branch](https://github.com/barryvdh/laravel-ide-helper)
[![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
_Checkout [this Laracasts video](https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/15) for a quick introduction/explanation!_
_Check out [this Laracasts video](https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/15) for a quick introduction/explanation!_
This packages generates a file that your IDE can understand, so it can provide accurate autocompletion. Generation is done, based on the files in your project, so they are alway 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)
* [`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)
* Generated version: https://gist.github.com/barryvdh/5227822
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).
Note: You do need CodeIntel for Sublime Text: https://github.com/SublimeCodeIntel/SublimeCodeIntel
* 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
### New: PhpStorm Meta for Container instances
Note: You do need CodeComplice for Sublime Text: https://github.com/spectacles/CodeComplice
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 ann `Illuminate\Events\Dispatcher` object, so with the meta file you can call `app('events')` and it will autocomplete the Dispatcher methods.
php artisan ide-helper:meta
app('events')->fire();
\App::make('events')->fire();
/** @var \Illuminate\Foundation\Application $app */
$app->make('events')->fire();
Pre-generated example: https://gist.github.com/barryvdh/bb6ffc5d11e0a75dba67
> Note: You might need to restart PhpStorm and make sure `.phpstorm.meta.php` is indexed.
### Automatic phpDoc generation for Laravel Facades
### Install
Require this package with composer using the following command:
composer require barryvdh/laravel-ide-helper ~1.11
```bash
composer require barryvdh/laravel-ide-helper
```
After updating composer, add the ServiceProvider to the providers array in app/config/app.php
After updating composer, add the service provider to the `providers` array in `config/app.php`
'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider',
```php
Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
```
**Laravel 5.5** uses Package Auto-Discovery, so doesn't require you to manually add the ServiceProvider.
You can now re-generate the docs yourself (for future updates) in artisan
To install this package on only development systems, add the `--dev` flag to your composer command:
php artisan ide-helper:generate
```bash
composer require --dev barryvdh/laravel-ide-helper
```
Note: bootstrap/compiled.php has to be cleared first, so run `php artisan clear-compiled` before generating (and `php artisan optimize` after..)
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:
"scripts":{
"post-update-cmd":[
"php artisan clear-compiled",
"php artisan ide-helper:generate",
"php artisan optimize"
]
},
```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.
You can also publish the config file to change implementations (ie. interface to specific class) or set defaults for `--helpers` or `--sublime`.
php artisan config:publish barryvdh/laravel-ide-helper
```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 working default connection, some facades will not be included.
You can use a in-memory sqlite driver, using the -M option.
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 this 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.
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
### Automatic phpDocs for models
> **Note:** Since v1.10 you need to require `doctrine/dbal: ~2.3` in your own composer.json.
> You need to require `doctrine/dbal: ~2.3` in your own composer.json to get database columns.
If you don't want to write your properties yourself, you can use the command `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)`).
```bash
composer require doctrine/dbal
```
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, only the newly found columns/relations are saved as phpdocs.
With the `--reset (-R)` option, the existing phpdocs are ignored, and only the newly found columns/relations are saved as phpdocs.
php artisan ide-helper:models Post
```bash
php artisan ide-helper:models Post
```
/**
* An Eloquent Model: 'Post'
*
* @property integer $id
* @property integer $author_id
* @property string $title
* @property string $text
* @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at
* @property-read \User $author
* @property-read \Illuminate\Database\Eloquent\Collection|\Comment[] $comments
*/
```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).
By default, models in `app/models` are scanned. The optional argument tells what models to use (also outside app/models).
php artisan ide-helper:models Post User
```bash
php artisan ide-helper:models Post User
```
You can also scan a different directory, using the --dir option (relative from the base path):
You can also scan a different directory, using the `--dir` option (relative from the base path):
php artisan ide-helper:models --dir="app/workbench/name/package/models" --dir="app/src/Model"
You can publish the config file (`php artisan config:publish barryvdh/laravel-ide-helper`) and set the default directories.
```bash
php artisan ide-helper:models --dir="path/to/models" --dir="app/src/Model"
```
Models can be ignored using the --ignore (-I) option
You can publish the config file (`php artisan vendor:publish`) and set the default directories.
php artisan ide-helper:models --ignore="Post,User"
Models can be ignored using the `--ignore (-I)` option
Note: With namespaces, wrap your model name in " signs: `php artisan ide-helper:models "API\User"`, or escape the slashes (`Api\\User`)
```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.
## 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-scrutinizer]: https://img.shields.io/scrutinizer/coverage/g/barryvdh/laravel-ide-helper.svg?style=flat-square
[ico-code-quality]: https://img.shields.io/scrutinizer/g/barryvdh/laravel-ide-helper.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-scrutinizer]: https://scrutinizer-ci.com/g/barryvdh/laravel-ide-helper/code-structure
[link-code-quality]: https://scrutinizer-ci.com/g/barryvdh/laravel-ide-helper
[link-downloads]: https://packagist.org/packages/barryvdh/laravel-ide-helper
[link-author]: https://github.com/barryvdh
[link-contributors]: ../../contributors
+93
View File
@@ -0,0 +1,93 @@
<?= '<?php' ?>
// @formatter:off
/**
* A helper file for Laravel 5, to provide autocomplete information to your IDE
* Generated for Laravel <?= $version ?> on <?= date("Y-m-d H:i:s") ?>.
*
* This file should not be included in your code, only analyzed by your IDE!
*
* @author Barry vd. Heuvel <[email protected]>
* @see https://github.com/barryvdh/laravel-ide-helper
*/
<?php foreach($namespaces_by_extends_ns as $namespace => $aliases): ?>
<?php if ($namespace == '\Illuminate\Database\Eloquent'): continue; endif; ?>
namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
<?php foreach($aliases as $alias): ?>
<?= trim($alias->getDocComment(' ')) ?>
<?= $alias->getClassType() ?> <?= $alias->getExtendsClass() ?> {
<?php foreach($alias->getMethods() as $method): ?>
<?= trim($method->getDocComment(' ')) ?>
public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>)
{<?php if($method->getDeclaringClass() !== $method->getRoot()): ?>
//Method inherited from <?= $method->getDeclaringClass() ?>
<?php endif; ?>
<?= $method->shouldReturn() ? 'return ': '' ?><?= $method->getRoot() ?>::<?= $method->getName() ?>(<?= $method->getParams() ?>);
}
<?php endforeach; ?>
}
<?php endforeach; ?>
}
<?php endforeach; ?>
<?php foreach($namespaces_by_alias_ns as $namespace => $aliases): ?>
namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
<?php foreach($aliases as $alias): ?>
<?= $alias->getClassType() ?> <?= $alias->getShortName() ?> extends <?= $alias->getExtends() ?> {<?php if ($alias->getExtendsNamespace() == '\Illuminate\Database\Eloquent'): ?>
<?php foreach($alias->getMethods() as $method): ?>
<?= trim($method->getDocComment(' ')) ?>
public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>)
{<?php if($method->getDeclaringClass() !== $method->getRoot()): ?>
//Method inherited from <?= $method->getDeclaringClass() ?>
<?php endif; ?>
<?= $method->shouldReturn() ? 'return ': '' ?><?= $method->getRoot() ?>::<?= $method->getName() ?>(<?= $method->getParams() ?>);
}
<?php endforeach; ?>
<?php endif; ?>}
<?php endforeach; ?>
}
<?php endforeach; ?>
<?php if($helpers): ?>
namespace {
<?= $helpers ?>
}
<?php endif; ?>
<?php if($include_fluent): ?>
namespace Illuminate\Support {
/**
* Methods commonly used in migrations
*
* @method Fluent after(string $column) Add the after modifier
* @method Fluent charset(string $charset) Add the character set modifier
* @method Fluent collation(string $collation) Add the collation modifier
* @method Fluent comment(string $comment) Add comment
* @method Fluent default($value) Add the default modifier
* @method Fluent first() Select first row
* @method Fluent index(string $name = null) Add the in dex clause
* @method Fluent on(string $table) `on` of a foreign key
* @method Fluent onDelete(string $action) `on delete` of a foreign key
* @method Fluent onUpdate(string $action) `on update` of a foreign key
* @method Fluent primary() Add the primary key modifier
* @method Fluent references(string $column) `references` of a foreign key
* @method Fluent nullable(bool $value = true) Add the nullable modifier
* @method Fluent unique(string $name = null) Add unique index clause
* @method Fluent unsigned() Add the unsigned modifier
* @method Fluent useCurrent() Add the default timestamp value
* @method Fluent change() Add the change modifier
*/
class Fluent {}
}
<?php endif ?>
+53
View File
@@ -0,0 +1,53 @@
<?= '<?php' ?>
// @formatter:off
namespace PHPSTORM_META {
/**
* PhpStorm Meta file, to provide autocomplete information for PhpStorm
* Generated on <?= date("Y-m-d H:i:s") ?>.
*
* @author Barry vd. Heuvel <[email protected]>
* @see https://github.com/barryvdh/laravel-ide-helper
*/
<?php foreach ($methods as $method): ?>
override(<?= $method ?>, map([
'' => '@',
<?php foreach($bindings as $abstract => $class): ?>
'<?= $abstract ?>' => \<?= $class ?>::class,
<?php endforeach; ?>
]));
<?php endforeach; ?>
override(\Illuminate\Support\Arr::add(0), type(0));
override(\Illuminate\Support\Arr::except(0), type(0));
override(\Illuminate\Support\Arr::first(0), elementType(0));
override(\Illuminate\Support\Arr::last(0), elementType(0));
override(\Illuminate\Support\Arr::get(0), elementType(0));
override(\Illuminate\Support\Arr::only(0), type(0));
override(\Illuminate\Support\Arr::prepend(0), type(0));
override(\Illuminate\Support\Arr::pull(0), elementType(0));
override(\Illuminate\Support\Arr::set(0), type(0));
override(\Illuminate\Support\Arr::shuffle(0), type(0));
override(\Illuminate\Support\Arr::sort(0), type(0));
override(\Illuminate\Support\Arr::sortRecursive(0), type(0));
override(\Illuminate\Support\Arr::where(0), type(0));
override(\array_add(0), type(0));
override(\array_except(0), type(0));
override(\array_first(0), elementType(0));
override(\array_last(0), elementType(0));
override(\array_get(0), elementType(0));
override(\array_only(0), type(0));
override(\array_prepend(0), type(0));
override(\array_pull(0), elementType(0));
override(\array_set(0), type(0));
override(\array_sort(0), type(0));
override(\array_sort_recursive(0), type(0));
override(\array_where(0), type(0));
override(\head(0), elementType(0));
override(\last(0), elementType(0));
override(\with(0), type(0));
override(\tap(0), type(0));
}
+414 -284
View File
@@ -1,284 +1,414 @@
<?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;
class Alias
{
protected $alias;
protected $facade;
protected $extends = null;
protected $classType = 'class';
protected $short;
protected $namespace = '__root';
protected $root = null;
protected $classes = array();
protected $methods = array();
protected $usedMethods = array();
protected $valid = false;
protected $magicMethods = array();
protected $interfaces = array();
/**
* @param string $alias
* @param string $facade
* @param array $magicMethods
* @param array $interfaces
*/
public function __construct($alias, $facade, $magicMethods = array(), $interfaces = array())
{
$this->alias = $alias;
$this->magicMethods = $magicMethods;
$this->interfaces = $interfaces;
// Make the class absolute
$facade = '\\' . ltrim($facade, '\\');
$this->facade = $facade;
$this->detectRoot();
if ((!$this->isTrait() && $this->root)) {
$this->valid = true;
} else {
return;
}
$this->addClass($this->root);
$this->detectNamespace();
$this->detectClassType();
if($facade === '\Illuminate\Database\Eloquent\Model'){
$this->usedMethods = array('decrement', 'increment');
}
}
/**
* Add one or more classes to analyze
*
* @param array|string $classes
*/
public function addClass($classes)
{
$classes = (array)$classes;
foreach ($classes as $class) {
if (class_exists($class) || interface_exists($class)) {
$this->classes[] = $class;
}else{
echo "Class not exists: $class\r\n";
}
}
}
/**
* Check if this class is valid to process.
* @return bool
*/
public function isValid()
{
return $this->valid;
}
/**
* Get the classtype, 'interface' or 'class'
*
* @return string
*/
public function getClasstype()
{
return $this->classType;
}
/**
* Get the class which this alias extends
*
* @return null|string
*/
public function getExtends()
{
return $this->extends;
}
/**
* Get the Alias by which this class is called
*
* @return string
*/
public function getAlias()
{
return $this->alias;
}
/**
* Return the short name (without namespace)
*/
public function getShortName(){
return $this->short;
}
/**
* Get the namespace from the alias
*
* @return string
*/
public function getNamespace()
{
return $this->namespace;
}
/**
* Get the methods found by this Alias
*
* @return array
*/
public function getMethods()
{
$this->addMagicMethods();
$this->detectMethods();
return $this->methods;
}
/**
* Detect the namespace
*/
protected function detectNamespace()
{
if (strpos($this->alias, '\\')) {
$nsParts = explode('\\', $this->alias);
$this->short = array_pop($nsParts);
$this->namespace = implode('\\', $nsParts);
}else{
$this->short = $this->alias;
}
}
/**
* Detect the class type
*/
protected function detectClassType()
{
//Some classes extend the facade
if (interface_exists($this->facade)) {
$this->classType = 'interface';
$this->extends = $this->facade;
} else {
$this->classType = 'class';
if (class_exists($this->facade)) {
$this->extends = $this->facade;
}
}
}
/**
* Get the real root of a facade
*
* @return bool|string
*/
protected function detectRoot()
{
$facade = $this->facade;
try {
//If possible, get the facade root
if (method_exists($facade, 'getFacadeRoot')) {
$root = get_class($facade::getFacadeRoot());
} else {
$root = $facade;
}
//If it doesn't exist, skip it
if (!class_exists($root) && !interface_exists($root)) {
return;
}
$this->root = $root;
//When the database connection is not set, some classes will be skipped
} catch (\PDOException $e) {
$this->error(
"PDOException: " . $e->getMessage() . "\nPlease configure your database connection correctly, or use the sqlite memory driver (-M). Skipping $facade."
);
} catch (\Exception $e) {
$this->error("Exception: " . $e->getMessage() . "\nSkipping $facade.");
}
}
/**
* Detect if this class is a trait or not.
*
* @return bool
*/
protected function isTrait()
{
// Check if the facade is not a Trait
if (function_exists('trait_exists') && trait_exists($this->facade)) {
return true;
}
return false;
}
/**
* Add magic methods, as defined in the configuration files
*/
protected function addMagicMethods()
{
foreach($this->magicMethods as $magic => $real){
list($className, $name) = explode('::', $real);
if(!class_exists($className) && !interface_exists($className)){
continue;
}
$method = new \ReflectionMethod($className, $name);
$class = new \ReflectionClass($className);
if(!in_array($method->name, $this->usedMethods)){
if($class !== $this->root){
$this->methods[] = new Method($method, $this->alias, $class, $magic, $this->interfaces);
}
$this->usedMethods[] = $magic;
}
}
}
/**
* Get the methods for one or multiple classes.
*
* @return string
*/
protected function detectMethods()
{
foreach ($this->classes as $class) {
$reflection = new \ReflectionClass($class);
$methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC);
if ($methods) {
foreach ($methods as $method) {
if (!in_array($method->name, $this->usedMethods)) {
// Only add the methods to the output when the root is not the same as the class.
// And don't add the __*() methods
if ($this->extends !== $class && substr($method->name, 0, 2) !== '__') {
$this->methods[] = new Method($method, $this->alias, $reflection, $method->name, $this->interfaces);
}
$this->usedMethods[] = $method->name;
}
}
}
}
}
/**
* Output an error.
*
* @param string $string
* @return void
*/
protected function error($string)
{
echo $string . "\r\n";
}
}
<?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 Barryvdh\Reflection\DocBlock;
use Barryvdh\Reflection\DocBlock\Context;
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
use ReflectionClass;
class Alias
{
protected $alias;
protected $facade;
protected $extends = null;
protected $extendsClass = null;
protected $extendsNamespace = null;
protected $classType = 'class';
protected $short;
protected $namespace = '__root';
protected $root = null;
protected $classes = array();
protected $methods = array();
protected $usedMethods = array();
protected $valid = false;
protected $magicMethods = array();
protected $interfaces = array();
protected $phpdoc = null;
/**
* @param string $alias
* @param string $facade
* @param array $magicMethods
* @param array $interfaces
*/
public function __construct($alias, $facade, $magicMethods = array(), $interfaces = array())
{
$this->alias = $alias;
$this->magicMethods = $magicMethods;
$this->interfaces = $interfaces;
// Make the class absolute
$facade = '\\' . ltrim($facade, '\\');
$this->facade = $facade;
$this->detectRoot();
if ((!$this->isTrait() && $this->root)) {
$this->valid = true;
} else {
return;
}
$this->addClass($this->root);
$this->detectFake();
$this->detectNamespace();
$this->detectClassType();
$this->detectExtendsNamespace();
if (!empty($this->namespace)) {
//Create a DocBlock and serializer instance
$this->phpdoc = new DocBlock(new ReflectionClass($alias), new Context($this->namespace));
}
if ($facade === '\Illuminate\Database\Eloquent\Model') {
$this->usedMethods = array('decrement', 'increment');
}
}
/**
* Add one or more classes to analyze
*
* @param array|string $classes
*/
public function addClass($classes)
{
$classes = (array)$classes;
foreach ($classes as $class) {
if (class_exists($class) || interface_exists($class)) {
$this->classes[] = $class;
} else {
echo "Class not exists: $class\r\n";
}
}
}
/**
* Check if this class is valid to process.
* @return bool
*/
public function isValid()
{
return $this->valid;
}
/**
* Get the classtype, 'interface' or 'class'
*
* @return string
*/
public function getClasstype()
{
return $this->classType;
}
/**
* Get the class which this alias extends
*
* @return null|string
*/
public function getExtends()
{
return $this->extends;
}
/**
* Get the class short name which this alias extends
*
* @return null|string
*/
public function getExtendsClass()
{
return $this->extendsClass;
}
/**
* Get the namespace of the class which this alias extends
*
* @return null|string
*/
public function getExtendsNamespace()
{
return $this->extendsNamespace;
}
/**
* Get the Alias by which this class is called
*
* @return string
*/
public function getAlias()
{
return $this->alias;
}
/**
* Return the short name (without namespace)
*/
public function getShortName()
{
return $this->short;
}
/**
* Get the namespace from the alias
*
* @return string
*/
public function getNamespace()
{
return $this->namespace;
}
/**
* Get the methods found by this Alias
*
* @return array
*/
public function getMethods()
{
$this->addMagicMethods();
$this->detectMethods();
return $this->methods;
}
/**
* Detect class returned by ::fake()
*/
protected function detectFake()
{
$facade = $this->facade;
if (!method_exists($facade, 'fake')) {
return;
}
$real = $facade::getFacadeRoot();
try {
$facade::fake();
$fake = $facade::getFacadeRoot();
if ($fake !== $real) {
$this->addClass(get_class($fake));
}
} finally {
$facade::swap($real);
}
}
/**
* Detect the namespace
*/
protected function detectNamespace()
{
if (strpos($this->alias, '\\')) {
$nsParts = explode('\\', $this->alias);
$this->short = array_pop($nsParts);
$this->namespace = implode('\\', $nsParts);
} else {
$this->short = $this->alias;
}
}
/**
* Detect the extends namespace
*/
protected function detectExtendsNamespace()
{
if (strpos($this->extends, '\\') !== false) {
$nsParts = explode('\\', $this->extends);
$this->extendsClass = array_pop($nsParts);
$this->extendsNamespace = implode('\\', $nsParts);
}
}
/**
* Detect the class type
*/
protected function detectClassType()
{
//Some classes extend the facade
if (interface_exists($this->facade)) {
$this->classType = 'interface';
$this->extends = $this->facade;
} else {
$this->classType = 'class';
if (class_exists($this->facade)) {
$this->extends = $this->facade;
}
}
}
/**
* Get the real root of a facade
*
* @return bool|string
*/
protected function detectRoot()
{
$facade = $this->facade;
try {
//If possible, get the facade root
if (method_exists($facade, 'getFacadeRoot')) {
$root = get_class($facade::getFacadeRoot());
} else {
$root = $facade;
}
//If it doesn't exist, skip it
if (!class_exists($root) && !interface_exists($root)) {
return;
}
$this->root = $root;
//When the database connection is not set, some classes will be skipped
} catch (\PDOException $e) {
$this->error(
"PDOException: " . $e->getMessage() .
"\nPlease configure your database connection correctly, or use the sqlite memory driver (-M)." .
" Skipping $facade."
);
} catch (\Exception $e) {
$this->error("Exception: " . $e->getMessage() . "\nSkipping $facade.");
}
}
/**
* Detect if this class is a trait or not.
*
* @return bool
*/
protected function isTrait()
{
// Check if the facade is not a Trait
if (function_exists('trait_exists') && trait_exists($this->facade)) {
return true;
}
return false;
}
/**
* Add magic methods, as defined in the configuration files
*/
protected function addMagicMethods()
{
foreach ($this->magicMethods as $magic => $real) {
list($className, $name) = explode('::', $real);
if (!class_exists($className) && !interface_exists($className)) {
continue;
}
$method = new \ReflectionMethod($className, $name);
$class = new \ReflectionClass($className);
if (!in_array($method->name, $this->usedMethods)) {
if ($class !== $this->root) {
$this->methods[] = new Method($method, $this->alias, $class, $magic, $this->interfaces);
}
$this->usedMethods[] = $magic;
}
}
}
/**
* Get the methods for one or multiple classes.
*
* @return string
*/
protected function detectMethods()
{
foreach ($this->classes as $class) {
$reflection = new \ReflectionClass($class);
$methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC);
if ($methods) {
foreach ($methods as $method) {
if (!in_array($method->name, $this->usedMethods)) {
// Only add the methods to the output when the root is not the same as the class.
// And don't add the __*() methods
if ($this->extends !== $class && substr($method->name, 0, 2) !== '__') {
$this->methods[] = new Method(
$method,
$this->alias,
$reflection,
$method->name,
$this->interfaces
);
}
$this->usedMethods[] = $method->name;
}
}
}
// Check if the class is macroable
$traits = collect($reflection->getTraitNames());
if ($traits->contains('Illuminate\Support\Traits\Macroable')) {
$properties = $reflection->getStaticProperties();
$macros = isset($properties['macros']) ? $properties['macros'] : [];
foreach ($macros as $macro_name => $macro_func) {
// Add macros
$this->methods[] = new Macro(
$this->getMacroFunction($macro_func),
$this->alias,
$reflection,
$macro_name,
$this->interfaces
);
}
}
}
}
/**
* @param $macro_func
*
* @return \ReflectionFunctionAbstract
* @throws \ReflectionException
*/
protected function getMacroFunction($macro_func)
{
if (is_array($macro_func) && is_callable($macro_func)) {
return new \ReflectionMethod($macro_func[0], $macro_func[1]);
}
return new \ReflectionFunction($macro_func);
}
/*
* Get the docblock for this alias
*
* @param string $prefix
* @return mixed
*/
public function getDocComment($prefix = "\t\t")
{
$serializer = new DocBlockSerializer(1, $prefix);
if ($this->phpdoc) {
return $serializer->getDocComment($this->phpdoc);
}
return '';
}
/**
* Output an error.
*
* @param string $string
* @return void
*/
protected function error($string)
{
echo $string . "\r\n";
}
}
+61
View File
@@ -0,0 +1,61 @@
<?php
/**
* Laravel IDE Helper Generator - Eloquent Model Mixin
*
* @author Charles A. Peterson <[email protected]>
* @copyright 2017 Charles A. Peterson / 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\Console;
use Barryvdh\LaravelIdeHelper\Eloquent;
use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
/**
* A command to add \Eloquent mixin to Eloquent\Model
*
* @author Charles A. Peterson <[email protected]>
*/
class EloquentCommand extends Command
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'ide-helper:eloquent';
/**
* @var Filesystem $files
*/
protected $files;
/**
* The console command description.
*
* @var string
*/
protected $description = 'Add \Eloquent helper to \Eloquent\Model';
/**
* @param Filesystem $files
*/
public function __construct(Filesystem $files)
{
parent::__construct();
$this->files = $files;
}
/**
* Execute the console command.
*
* @return void
*/
public function handle()
{
Eloquent::writeEloquentModelHelper($this, $this->files);
}
}
+13 -12
View File
@@ -10,14 +10,13 @@
namespace Barryvdh\LaravelIdeHelper\Console;
use Barryvdh\LaravelIdeHelper\Eloquent;
use Barryvdh\LaravelIdeHelper\Generator;
use Illuminate\Config\Repository as ConfigRepository;
use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
/**
* A command to generate autocomplete information for your IDE
*
@@ -59,8 +58,9 @@ class GeneratorCommand extends Command
* @param \Illuminate\View\Factory $view
*/
public function __construct(
ConfigRepository $config,
Filesystem $files, /* Illuminate\View\Factory */
/*ConfigRepository */ $config,
Filesystem $files,
/* Illuminate\View\Factory */
$view
) {
$this->config = $config;
@@ -74,11 +74,13 @@ class GeneratorCommand extends Command
*
* @return void
*/
public function fire()
public function handle()
{
if (file_exists($compiled = base_path() . '/bootstrap/compiled.php')) {
if (file_exists(base_path() . '/vendor/compiled.php') ||
file_exists(base_path() . '/bootstrap/cache/compiled.php') ||
file_exists(base_path() . '/storage/framework/compiled.php')) {
$this->error(
'Error generating IDE Helper: first delete bootstrap/compiled.php (php artisan clear-compiled)'
'Error generating IDE Helper: first delete your compiled file (php artisan clear-compiled)'
);
} else {
$filename = $this->argument('filename');
@@ -97,8 +99,8 @@ class GeneratorCommand extends Command
$helpers = '';
if ($this->option('helpers') || ($this->config->get('laravel-ide-helper::include_helpers'))) {
foreach ($this->config->get('laravel-ide-helper::helper_files', array()) as $helper) {
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));
}
@@ -139,7 +141,7 @@ class GeneratorCommand extends Command
*/
protected function getArguments()
{
$filename = $this->config->get('laravel-ide-helper::filename');
$filename = $this->config->get('ide-helper.filename');
return array(
array(
@@ -155,7 +157,7 @@ class GeneratorCommand extends Command
*/
protected function getOptions()
{
$format = $this->config->get('laravel-ide-helper::format');
$format = $this->config->get('ide-helper.format');
return array(
array('format', "F", InputOption::VALUE_OPTIONAL, 'The format for the IDE Helper', $format),
@@ -164,5 +166,4 @@ class GeneratorCommand extends Command
array('sublime', "S", InputOption::VALUE_NONE, 'DEPRECATED: Use different style for SublimeText CodeIntel'),
);
}
}
+70 -24
View File
@@ -12,13 +12,15 @@ namespace Barryvdh\LaravelIdeHelper\Console;
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
/**
* A command to generate phpstorm meta data
*
* @author Barry vd. Heuvel <[email protected]>
*/
class MetaCommand extends Command {
class MetaCommand extends Command
{
/**
* The console command name.
@@ -26,7 +28,6 @@ class MetaCommand extends Command {
* @var string
*/
protected $name = 'ide-helper:meta';
protected $filename = '.phpstorm.meta.php';
/**
* The console command description.
@@ -35,27 +36,36 @@ class MetaCommand extends Command {
*/
protected $description = 'Generate metadata for PhpStorm';
/** @var \Illuminate\Filesystem\Filesystem */
/** @var \Illuminate\Contracts\Filesystem\Filesystem */
protected $files;
/** @var \Illuminate\View\Factory */
/** @var \Illuminate\Contracts\View\Factory */
protected $view;
protected $methods = array(
'\Illuminate\Foundation\Application::make',
'\Illuminate\Container\Container::make',
'\App::make',
'app',
);
/** @var \Illuminate\Contracts\Config */
protected $config;
protected $methods = [
'new \Illuminate\Contracts\Container\Container',
'\Illuminate\Contracts\Container\Container::make(0)',
'\Illuminate\Contracts\Container\Container::makeWith(0)',
'\App::make(0)',
'\App::makeWith(0)',
'\app(0)',
'\resolve(0)',
];
/**
*
* @param \Illuminate\Filesystem\Filesystem $files
* @param \Illuminate\View\Factory $view
* @param \Illuminate\Contracts\Filesystem\Filesystem $files
* @param \Illuminate\Contracts\View\Factory $view
* @param \Illuminate\Contracts\Config $config
*/
public function __construct($files, $view) {
public function __construct($files, $view, $config)
{
$this->files = $files;
$this->view = $view;
$this->config = $config;
parent::__construct();
}
@@ -64,28 +74,35 @@ class MetaCommand extends Command {
*
* @return void
*/
public function fire()
public function handle()
{
$filename = $this->option('filename');
$this->registerClassAutoloadExceptions();
$bindings = array();
foreach ($this->getAbstracts() as $abstract) {
// Validator and seeder cause problems
if (in_array($abstract, ['validator', 'seeder'])) {
continue;
}
foreach ($this->laravel->getBindings() as $abstract => $options) {
try {
$concrete = $this->laravel->make($abstract);
if (is_object($concrete)) {
$bindings[$abstract] = get_class($concrete);
}
}catch (\Exception $e) {
$this->error("Cannot make $abstract: ".$e->getMessage());
} catch (\Exception $e) {
if ($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
$this->comment("Cannot make '$abstract': ".$e->getMessage());
}
}
}
$content = $this->view->make('laravel-ide-helper::meta', array(
$content = $this->view->make('meta', [
'bindings' => $bindings,
'methods' => $this->methods,
))->render();
])->render();
$filename = $this->option('filename');
$written = $this->files->put($filename, $content);
if ($written !== false) {
@@ -95,6 +112,33 @@ class MetaCommand extends Command {
}
}
/**
* Get a list of abstracts from the Laravel Application.
*
* @return array
*/
protected function getAbstracts()
{
$abstracts = $this->laravel->getBindings();
// Return the abstract names only
$keys = array_keys($abstracts);
sort($keys);
return $keys;
}
/**
* Register an autoloader the throws exceptions when a class is not found.
*/
protected function registerClassAutoloadExceptions()
{
spl_autoload_register(function ($class) {
throw new \Exception("Class '$class' not found.");
});
}
/**
* Get the console command options.
*
@@ -102,8 +146,10 @@ class MetaCommand extends Command {
*/
protected function getOptions()
{
$filename = $this->config->get('ide-helper.meta_filename');
return array(
array('filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the meta file', $this->filename),
array('filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the meta file', $filename),
);
}
}
+375 -95
View File
@@ -10,15 +10,19 @@
namespace Barryvdh\LaravelIdeHelper\Console;
use Composer\Autoload\ClassMapGenerator;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Str;
use Illuminate\Filesystem\Filesystem;
use ReflectionClass;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\ClassLoader\ClassMapGenerator;
use phpDocumentor\Reflection\DocBlock;
use phpDocumentor\Reflection\DocBlock\Context;
use phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Serializer as DocBlockSerializer;
use Symfony\Component\Console\Output\OutputInterface;
use Barryvdh\Reflection\DocBlock;
use Barryvdh\Reflection\DocBlock\Context;
use Barryvdh\Reflection\DocBlock\Tag;
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
/**
* A command to generate autocomplete information for your IDE
@@ -27,6 +31,10 @@ use phpDocumentor\Reflection\DocBlock\Serializer as DocBlockSerializer;
*/
class ModelsCommand extends Command
{
/**
* @var Filesystem $files
*/
protected $files;
/**
* The console command name.
@@ -43,34 +51,52 @@ class ModelsCommand extends Command
*/
protected $description = 'Generate autocompletion for models';
protected $write_model_magic_where;
protected $properties = array();
protected $methods = array();
protected $write = false;
protected $dirs = array();
protected $reset;
protected $keep_text;
/**
* @var bool[string]
*/
protected $nullableColumns = [];
/**
* @param Filesystem $files
*/
public function __construct(Filesystem $files)
{
parent::__construct();
$this->files = $files;
}
/**
* Execute the console command.
*
* @return void
*/
public function fire()
public function handle()
{
$filename = $this->option('filename');
$this->write = $this->option('write');
$this->dirs = array_merge(
$this->laravel['config']->get('laravel-ide-helper::model_locations'),
$this->laravel['config']->get('ide-helper.model_locations'),
$this->option('dir')
);
$model = $this->argument('model');
$ignore = $this->option('ignore');
$this->reset = $this->option('reset');
if ($this->option('smart-reset')) {
$this->keep_text = $this->reset = true;
}
$this->write_model_magic_where = $this->laravel['config']->get('ide-helper.write_model_magic_where', true);
//If filename is default and Write is not specified, ask what to do
if (!$this->write && $filename === $this->filename && !$this->option('nowrite')) {
if ($this->confirm(
"Do you want to overwrite the existing model files? Choose no to write to $filename instead? (Yes/No): "
"Do you want to overwrite the existing model files? Choose no to write to $filename instead?"
)
) {
$this->write = true;
@@ -80,7 +106,7 @@ class ModelsCommand extends Command
$content = $this->generateDocs($model, $ignore);
if (!$this->write) {
$written = \File::put($filename, $content);
$written = $this->files->put($filename, $content);
if ($written !== false) {
$this->info("Model information was written to $filename");
} else {
@@ -98,7 +124,7 @@ class ModelsCommand extends Command
protected function getArguments()
{
return array(
array('model', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Which models to include', array()),
array('model', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Which models to include', array()),
);
}
@@ -110,12 +136,13 @@ class ModelsCommand extends Command
protected function getOptions()
{
return array(
array('filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the helper file', $this->filename),
array('dir', 'D', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The model dir', array()),
array('write', 'W', InputOption::VALUE_NONE, 'Write to Model file'),
array('nowrite', 'N', InputOption::VALUE_NONE, 'Don\'t write to Model file'),
array('reset', 'R', InputOption::VALUE_NONE, 'Remove the original phpdocs instead of appending'),
array('ignore', 'I', InputOption::VALUE_OPTIONAL, 'Which models to ignore', ''),
array('filename', 'F', InputOption::VALUE_OPTIONAL, 'The path to the helper file', $this->filename),
array('dir', 'D', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The model dir', array()),
array('write', 'W', InputOption::VALUE_NONE, 'Write to Model file'),
array('nowrite', 'N', InputOption::VALUE_NONE, 'Don\'t write to Model file'),
array('reset', 'R', InputOption::VALUE_NONE, 'Remove the original phpdocs instead of appending'),
array('smart-reset', 'r', InputOption::VALUE_NONE, 'Refresh the properties/methods list, but keep the text'),
array('ignore', 'I', InputOption::VALUE_OPTIONAL, 'Which models to ignore', ''),
);
}
@@ -124,8 +151,10 @@ class ModelsCommand extends Command
$output = "<?php
// @formatter:off
/**
* An helper file for your Eloquent Models
* 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.
*
@@ -148,7 +177,9 @@ class ModelsCommand extends Command
foreach ($models as $name) {
if (in_array($name, $ignore)) {
$this->comment("Ignoring model '$name'");
if ($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
$this->comment("Ignoring model '$name'");
}
continue;
}
$this->properties = array();
@@ -156,16 +187,19 @@ class ModelsCommand extends Command
if (class_exists($name)) {
try {
// handle abstract classes, interfaces, ...
$reflectionClass = new \ReflectionClass($name);
$reflectionClass = new ReflectionClass($name);
if (!$reflectionClass->isSubclassOf('Illuminate\Database\Eloquent\Model')) {
continue;
}
$this->comment("Loading model '$name'");
if ($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
$this->comment("Loading model '$name'");
}
if (!$reflectionClass->IsInstantiable()) {
throw new \Exception($name . ' is not instantiable.');
// ignore abstract class or interface
continue;
}
$model = $this->laravel->make($name);
@@ -174,23 +208,29 @@ class ModelsCommand extends Command
$this->getPropertiesFromTable($model);
}
if (method_exists($model, 'getCasts')) {
$this->castPropertiesType($model);
}
$this->getPropertiesFromMethods($model);
$output .= $this->createPhpDocs($name);
$this->getSoftDeleteMethods($model);
$output .= $this->createPhpDocs($name);
$ignore[] = $name;
$this->nullableColumns = [];
} catch (\Exception $e) {
$this->error("Exception: " . $e->getMessage() . "\nCould not analyze class $name.");
}
}
}
if (!$hasDoctrine) {
$this->error(
'Warning: `"doctrine/dbal": "~2.3"` is required to load database information. Please require that in your composer.json and run `composer update`.'
'Warning: `"doctrine/dbal": "~2.3"` is required to load database information. '.
'Please require that in your composer.json and run `composer update`.'
);
}
return $output;
}
@@ -208,6 +248,77 @@ class ModelsCommand extends Command
return $models;
}
/**
* cast the properties's type from $casts.
*
* @param \Illuminate\Database\Eloquent\Model $model
*/
protected function castPropertiesType($model)
{
$casts = $model->getCasts();
foreach ($casts as $name => $type) {
switch ($type) {
case 'boolean':
case 'bool':
$realType = 'boolean';
break;
case 'string':
$realType = 'string';
break;
case 'array':
case 'json':
$realType = 'array';
break;
case 'object':
$realType = 'object';
break;
case 'int':
case 'integer':
case 'timestamp':
$realType = 'integer';
break;
case 'real':
case 'double':
case 'float':
$realType = 'float';
break;
case 'date':
case 'datetime':
$realType = '\Illuminate\Support\Carbon';
break;
case 'collection':
$realType = '\Illuminate\Support\Collection';
break;
default:
$realType = 'mixed';
break;
}
if (!isset($this->properties[$name])) {
continue;
} else {
$this->properties[$name]['type'] = $this->getTypeOverride($realType);
if (isset($this->nullableColumns[$name])) {
$this->properties[$name]['type'] .= '|null';
}
}
}
}
/**
* Returns the overide type for the give type.
*
* @param string $type
* @return string
*/
protected function getTypeOverride($type)
{
$typeOverrides = $this->laravel['config']->get('ide-helper.type_overrides', array());
return isset($typeOverrides[$type]) ? $typeOverrides[$type] : $type;
}
/**
* Load the properties from the database table.
*
@@ -217,15 +328,27 @@ class ModelsCommand extends Command
{
$table = $model->getConnection()->getTablePrefix() . $model->getTable();
$schema = $model->getConnection()->getDoctrineSchemaManager($table);
$schema->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
$databasePlatform = $schema->getDatabasePlatform();
$databasePlatform->registerDoctrineTypeMapping('enum', 'string');
$columns = $schema->listTableColumns($table);
$platformName = $databasePlatform->getName();
$customTypes = $this->laravel['config']->get("ide-helper.custom_db_types.{$platformName}", array());
foreach ($customTypes as $yourTypeName => $doctrineTypeName) {
$databasePlatform->registerDoctrineTypeMapping($yourTypeName, $doctrineTypeName);
}
$database = null;
if (strpos($table, '.')) {
list($database, $table) = explode('.', $table);
}
$columns = $schema->listTableColumns($table, $database);
if ($columns) {
foreach ($columns as $column) {
$name = $column->getName();
if (in_array($name, $model->getDates())) {
$type = '\Carbon\Carbon';
$type = '\Illuminate\Support\Carbon';
} else {
$type = $column->getType()->getName();
switch ($type) {
@@ -243,13 +366,21 @@ class ModelsCommand extends Command
case 'smallint':
$type = 'integer';
break;
case 'boolean':
switch (config('database.default')) {
case 'sqlite':
case 'mysql':
$type = 'integer';
break;
default:
$type = 'boolean';
break;
}
break;
case 'decimal':
case 'float':
$type = 'float';
break;
case 'boolean':
$type = 'boolean';
break;
default:
$type = 'mixed';
break;
@@ -257,12 +388,17 @@ class ModelsCommand extends Command
}
$comment = $column->getComment();
$this->setProperty($name, $type, true, true, $comment);
$this->setMethod(
Str::camel("where_" . $name),
'\Illuminate\Database\Query\Builder|\\' . get_class($model),
array('$value')
);
if (!$column->getNotnull()) {
$this->nullableColumns[$name] = true;
}
$this->setProperty($name, $type, true, true, $comment, !$column->getNotnull());
if ($this->write_model_magic_where) {
$this->setMethod(
Str::camel("where_" . $name),
'\Illuminate\Database\Eloquent\Builder|\\' . get_class($model),
array('$value')
);
}
}
}
}
@@ -274,21 +410,24 @@ class ModelsCommand extends Command
{
$methods = get_class_methods($model);
if ($methods) {
sort($methods);
foreach ($methods as $method) {
if (Str::startsWith($method, 'get') && Str::endsWith(
$method,
'Attribute'
) && $method !== 'getAttribute'
$method,
'Attribute'
) && $method !== 'getAttribute'
) {
//Magic get<name>Attribute
$name = Str::snake(substr($method, 3, -9));
if (!empty($name)) {
$this->setProperty($name, null, true, null);
$reflection = new \ReflectionMethod($model, $method);
$type = $this->getReturnTypeFromDocBlock($reflection);
$this->setProperty($name, $type, true, null);
}
} elseif (Str::startsWith($method, 'set') && Str::endsWith(
$method,
'Attribute'
) && $method !== 'setAttribute'
$method,
'Attribute'
) && $method !== 'setAttribute'
) {
//Magic set<name>Attribute
$name = Str::snake(substr($method, 3, -9));
@@ -303,10 +442,11 @@ class ModelsCommand extends Command
$args = $this->getParameters($reflection);
//Remove the first ($query) argument
array_shift($args);
$this->setMethod($name, '\\' . $reflection->class, $args);
$this->setMethod($name, '\Illuminate\Database\Eloquent\Builder|\\' . $reflection->class, $args);
}
} elseif (!method_exists('Eloquent', $method) && !Str::startsWith($method, 'get')) {
} elseif (!method_exists('Illuminate\Database\Eloquent\Model', $method)
&& !Str::startsWith($method, 'get')
) {
//Use reflection to inspect the code, based on Illuminate/Support/SerializableClosure.php
$reflection = new \ReflectionMethod($model, $method);
@@ -318,52 +458,106 @@ class ModelsCommand extends Command
$code .= $file->current();
$file->next();
}
$code = trim(preg_replace('/\s\s+/', '', $code));
$begin = strpos($code, 'function(');
$code = substr($code, $begin, strrpos($code, '}') - $begin + 1);
foreach (array(
'hasMany',
'belongsToMany',
'hasOne',
'belongsTo',
'morphTo',
'morphMany',
'morphToMany'
'hasMany',
'hasManyThrough',
'belongsToMany',
'hasOne',
'belongsTo',
'morphOne',
'morphTo',
'morphMany',
'morphToMany',
'morphedByMany'
) as $relation) {
$search = '$this->' . $relation . '(';
if ($pos = stripos($code, $search)) {
$code = substr($code, $pos + strlen($search));
$arguments = explode(',', substr($code, 0, strpos($code, ');')));
//Remove quotes, ensure 1 \ in front of the model
$returnModel = $this->getClassName($arguments[0], $model);
if ($relation === "belongsToMany" or $relation === 'hasMany' or $relation === 'morphMany' or $relation === 'morphToMany') {
//Collection or array of models (because Collection is Arrayable)
$this->setProperty(
$method,
'\Illuminate\Database\Eloquent\Collection|' . $returnModel . '[]',
true,
null
);
} else {
//Single model is returned
$this->setProperty($method, $returnModel, true, null);
//Resolve the relation's model to a Relation object.
$methodReflection = new \ReflectionMethod($model, $method);
if ($methodReflection->getNumberOfParameters()) {
return;
}
$relationObj = $model->$method();
if ($relationObj instanceof Relation) {
$relatedModel = '\\' . get_class($relationObj->getRelated());
$relations = [
'hasManyThrough',
'belongsToMany',
'hasMany',
'morphMany',
'morphToMany',
'morphedByMany',
];
if (in_array($relation, $relations)) {
//Collection or array of models (because Collection is Arrayable)
$this->setProperty(
$method,
$this->getCollectionClass($relatedModel) . '|' . $relatedModel . '[]',
true,
null
);
} elseif ($relation === "morphTo") {
// Model isn't specified because relation is polymorphic
$this->setProperty(
$method,
'\Illuminate\Database\Eloquent\Model|\Eloquent',
true,
null
);
} else {
//Single model is returned
$this->setProperty(
$method,
$relatedModel,
true,
null,
'',
$this->isRelationForeignKeyNullable($relationObj)
);
}
}
}
}
}
}
}
}
/**
* @param string $name
* @param string|null $type
* @param bool|null $read
* @param bool|null $write
* @param string|null $comment
* Check if the foreign key of the relation is nullable
*
* @param Relation $relation
*
* @return bool
*/
protected function setProperty($name, $type = null, $read = null, $write = null, $comment='')
private function isRelationForeignKeyNullable(Relation $relation)
{
$reflectionObj = new \ReflectionObject($relation);
if (!$reflectionObj->hasProperty('foreignKey')) {
return false;
}
$fkProp = $reflectionObj->getProperty('foreignKey');
$fkProp->setAccessible(true);
return isset($this->nullableColumns[$fkProp->getValue($relation)]);
}
/**
* @param string $name
* @param string|null $type
* @param bool|null $read
* @param bool|null $write
* @param string|null $comment
* @param bool $nullable
*/
protected function setProperty($name, $type = null, $read = null, $write = null, $comment = '', $nullable = false)
{
if (!isset($this->properties[$name])) {
$this->properties[$name] = array();
@@ -373,7 +567,11 @@ class ModelsCommand extends Command
$this->properties[$name]['comment'] = (string) $comment;
}
if ($type !== null) {
$this->properties[$name]['type'] = $type;
$newType = $this->getTypeOverride($type);
if ($nullable) {
$newType .='|null';
}
$this->properties[$name]['type'] = $newType;
}
if ($read !== null) {
$this->properties[$name]['read'] = $read;
@@ -385,7 +583,9 @@ class ModelsCommand extends Command
protected function setMethod($name, $type = '', $arguments = array())
{
if (!isset($this->methods[$name])) {
$methods = array_change_key_case($this->methods, CASE_LOWER);
if (!isset($methods[strtolower($name)])) {
$this->methods[$name] = array();
$this->methods[$name]['type'] = $type;
$this->methods[$name]['arguments'] = $arguments;
@@ -399,13 +599,19 @@ class ModelsCommand extends Command
protected function createPhpDocs($class)
{
$reflection = new \ReflectionClass($class);
$reflection = new ReflectionClass($class);
$namespace = $reflection->getNamespaceName();
$classname = $reflection->getShortName();
$originalDoc = $reflection->getDocComment();
$keyword = $this->getClassKeyword($reflection);
if ($this->reset) {
$phpdoc = new DocBlock('', new Context($namespace));
if ($this->keep_text) {
$phpdoc->setText(
(new DocBlock($reflection, new Context($namespace)))->getText()
);
}
} else {
$phpdoc = new DocBlock($reflection, new Context($namespace));
}
@@ -437,10 +643,18 @@ class ModelsCommand extends Command
} else {
$attr = 'property-read';
}
$tag = Tag::createInstance("@{$attr} {$property['type']} {$name} {$property['comment']}", $phpdoc);
if ($this->hasCamelCaseModelProperties()) {
$name = Str::camel($name);
}
$tagLine = trim("@{$attr} {$property['type']} {$name} {$property['comment']}");
$tag = Tag::createInstance($tagLine, $phpdoc);
$phpdoc->appendTag($tag);
}
ksort($this->methods);
foreach ($this->methods as $name => $method) {
if (in_array($name, $methods)) {
continue;
@@ -450,6 +664,10 @@ class ModelsCommand extends Command
$phpdoc->appendTag($tag);
}
if ($this->write && ! $phpdoc->getTagsByName('mixin')) {
$phpdoc->appendTag(Tag::createInstance("@mixin \\Eloquent", $phpdoc));
}
$serializer = new DocBlockSerializer();
$serializer->getDocComment($phpdoc);
$docComment = $serializer->getDocComment($phpdoc);
@@ -457,7 +675,7 @@ class ModelsCommand extends Command
if ($this->write) {
$filename = $reflection->getFileName();
$contents = \File::get($filename);
$contents = $this->files->get($filename);
if ($originalDoc) {
$contents = str_replace($originalDoc, $docComment, $contents);
} else {
@@ -468,12 +686,12 @@ class ModelsCommand extends Command
$contents = substr_replace($contents, $replace, $pos, strlen($needle));
}
}
if (\File::put($filename, $contents)) {
if ($this->files->put($filename, $contents)) {
$this->info('Written new phpDocBlock to ' . $filename);
}
}
$output = "namespace {$namespace}{\n{$docComment}\n\tclass {$classname} {}\n}\n\n";
$output = "namespace {$namespace}{\n{$docComment}\n\t{$keyword}class {$classname} extends \Eloquent {}\n}\n\n";
return $output;
}
@@ -488,10 +706,12 @@ class ModelsCommand extends Command
//Loop through the default values for paremeters, and make the correct output string
$params = array();
$paramsWithDefault = array();
/** @var \ReflectionParameter $param */
foreach ($method->getParameters() as $param) {
$paramStr = '$' . $param->getName();
$paramClass = $param->getClass();
$paramStr = (!is_null($paramClass) ? '\\' . $paramClass->getName() . ' ' : '') . '$' . $param->getName();
$params[] = $paramStr;
if ($param->isOptional()) {
if ($param->isOptional() && $param->isDefaultValueAvailable()) {
$default = $param->getDefaultValue();
if (is_bool($default)) {
$default = $default ? 'true' : 'false';
@@ -512,23 +732,83 @@ class ModelsCommand extends Command
}
/**
* Determine a model classes' collection type.
*
* @see http://laravel.com/docs/eloquent-collections#custom-collections
* @param string $className
* @param \Illuminate\Database\Eloquent\Model $model
* @return string
*/
private function getClassName($className, $model)
private function getCollectionClass($className)
{
// If the class name was resolved via get_class($this) or static::class
if (strpos($className, 'get_class($this)') !== false || strpos($className, 'static::class') !== false) {
return get_class($model);
// Return something in the very very unlikely scenario the model doesn't
// have a newCollection() method.
if (!method_exists($className, 'newCollection')) {
return '\Illuminate\Database\Eloquent\Collection';
}
// If the class name was resolved via ::class (PHP 5.5+)
if (strpos($className, '::class') !== false) {
$end = -1 * strlen('::class');
return substr($className, 0, $end);
/** @var \Illuminate\Database\Eloquent\Model $model */
$model = new $className;
return '\\' . get_class($model->newCollection());
}
/**
* @return bool
*/
protected function hasCamelCaseModelProperties()
{
return $this->laravel['config']->get('ide-helper.model_camel_case_properties', false);
}
/**
* Get method return type based on it DocBlock comment
*
* @param \ReflectionMethod $reflection
*
* @return null|string
*/
protected function getReturnTypeFromDocBlock(\ReflectionMethod $reflection)
{
$type = null;
$phpdoc = new DocBlock($reflection);
if ($phpdoc->hasTag('return')) {
$type = $phpdoc->getTagsByName('return')[0]->getType();
}
return "\\" . ltrim(trim($className, " \"'"), "\\") ;
return $type;
}
/**
* Generates methods provided by the SoftDeletes trait
* @param \Illuminate\Database\Eloquent\Model $model
*/
protected function getSoftDeleteMethods($model)
{
$traits = class_uses(get_class($model), true);
if (in_array('Illuminate\\Database\\Eloquent\\SoftDeletes', $traits)) {
$this->setMethod('forceDelete', 'bool|null', []);
$this->setMethod('restore', 'bool|null', []);
$this->setMethod('withTrashed', '\Illuminate\Database\Query\Builder|\\' . get_class($model), []);
$this->setMethod('withoutTrashed', '\Illuminate\Database\Query\Builder|\\' . get_class($model), []);
$this->setMethod('onlyTrashed', '\Illuminate\Database\Query\Builder|\\' . get_class($model), []);
}
}
/**
* @param ReflectionClass $reflection
* @return string
*/
private function getClassKeyword(ReflectionClass $reflection)
{
if ($reflection->isFinal()) {
$keyword = 'final ';
} elseif ($reflection->isAbstract()) {
$keyword = 'abstract ';
} else {
$keyword = '';
}
return $keyword;
}
}
+78
View File
@@ -0,0 +1,78 @@
<?php
/**
* Laravel IDE Helper to add \Eloquent mixin to Eloquent\Model
*
* @author Charles A. Peterson <artistan@gmail.com>
*/
namespace Barryvdh\LaravelIdeHelper;
use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
use Barryvdh\Reflection\DocBlock;
use Barryvdh\Reflection\DocBlock\Context;
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
use Barryvdh\Reflection\DocBlock\Tag;
class Eloquent
{
/**
* Write mixin helper to the Eloquent\Model
* This is needed since laravel/framework v5.4.29
*
* @param Command $command
* @param Filesystem $files
*
* @return void
*/
public static function writeEloquentModelHelper(Command $command, Filesystem $files)
{
$class = 'Illuminate\Database\Eloquent\Model';
$reflection = new \ReflectionClass($class);
$namespace = $reflection->getNamespaceName();
$originalDoc = $reflection->getDocComment();
if (!$originalDoc) {
$command->info('Unexpected no document on ' . $class);
}
$phpdoc = new DocBlock($reflection, new Context($namespace));
$mixins = $phpdoc->getTagsByName('mixin');
foreach ($mixins as $m) {
if ($m->getContent() === '\Eloquent') {
$command->info('Tag Exists: @mixin \Eloquent in ' . $class);
return;
}
}
// add the Eloquent mixin
$phpdoc->appendTag(Tag::createInstance("@mixin \\Eloquent", $phpdoc));
$serializer = new DocBlockSerializer();
$serializer->getDocComment($phpdoc);
$docComment = $serializer->getDocComment($phpdoc);
$filename = $reflection->getFileName();
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 @mixin \Eloquent 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);
}
}
}
+323 -234
View File
@@ -1,235 +1,324 @@
<?php
/**
* Laravel IDE Helper Generator
*
* @author Barry vd. Heuvel <barryvdh@gmail.com>
* @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 Illuminate\Foundation\AliasLoader;
use Illuminate\Config\Repository as ConfigRepository;
use Symfony\Component\Console\Output\OutputInterface;
class Generator
{
/** @var \Illuminate\Config\Repository */
protected $config;
/** @var \Illuminate\View\Factory */
protected $view;
/** @var \Symfony\Component\Console\Output\OutputInterface */
protected $output;
protected $extra = array();
protected $magic = array();
protected $interfaces = array();
protected $helpers;
/**
* @param \Illuminate\Config\Repository $config
* @param \Illuminate\View\Factory $view
* @param \Symfony\Component\Console\Output\OutputInterface $output
* @param string $helpers
*/
public function __construct(ConfigRepository $config,
/* Illuminate\View\Factory */ $view,
OutputInterface $output = null,
$helpers = ''
) {
$this->config = $config;
$this->view = $view;
// Find the drivers to add to the extra/interfaces
$this->detectDrivers();
$this->extra = array_merge($this->extra, $this->config->get('laravel-ide-helper::extra'));
$this->magic = array_merge($this->magic, $this->config->get('laravel-ide-helper::magic'));
$this->interfaces = array_merge($this->interfaces, $this->config->get('laravel-ide-helper::interfaces'));
// Make all interface classes absolute
foreach ($this->interfaces as &$interface) {
$interface = '\\' . ltrim($interface, '\\');
}
$this->helpers = $helpers;
}
/**
* Generate the helper file contents;
*
* @param string $format The format to generate the helper in (php/json)
* @return string;
*/
public function generate($format = 'php')
{
// 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();
return $this->view->make('laravel-ide-helper::ide-helper')
->with('namespaces', $this->getNamespaces())
->with('helpers', $this->helpers)
->with('version', $app::VERSION)
->render();
}
public function generateJsonHelper()
{
$classes = array();
foreach ($this->getNamespaces() 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()
{
try{
<?php
/**
* Laravel IDE Helper Generator
*
* @author Barry vd. Heuvel <barryvdh@gmail.com>
* @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 Illuminate\Foundation\Application;
use Illuminate\Foundation\AliasLoader;
use Illuminate\Support\Collection;
use ReflectionClass;
use Symfony\Component\Console\Output\OutputInterface;
class Generator
{
/** @var \Illuminate\Config\Repository */
protected $config;
/** @var \Illuminate\View\Factory */
protected $view;
/** @var \Symfony\Component\Console\Output\OutputInterface */
protected $output;
protected $extra = array();
protected $magic = array();
protected $interfaces = array();
protected $helpers;
/**
* @param \Illuminate\Config\Repository $config
* @param \Illuminate\View\Factory $view
* @param \Symfony\Component\Console\Output\OutputInterface $output
* @param string $helpers
*/
public function __construct(
/*ConfigRepository */ $config,
/* Illuminate\View\Factory */ $view,
OutputInterface $output = null,
$helpers = ''
) {
$this->config = $config;
$this->view = $view;
// Find the drivers to add to the extra/interfaces
$this->detectDrivers();
$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->interfaces = array_merge($this->interfaces, $this->config->get('ide-helper.interfaces'));
// Make all interface classes absolute
foreach ($this->interfaces as &$interface) {
$interface = '\\' . ltrim($interface, '\\');
}
$this->helpers = $helpers;
}
/**
* Generate the helper file contents;
*
* @param string $format The format to generate the helper in (php/json)
* @return string;
*/
public function generate($format = 'php')
{
// 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();
return $this->view->make('helper')
->with('namespaces_by_extends_ns', $this->getAliasesByExtendsNamespace())
->with('namespaces_by_alias_ns', $this->getAliasesByAliasNamespace())
->with('helpers', $this->helpers)
->with('version', $app->version())
->with('include_fluent', $this->config->get('ide-helper.include_fluent', true))
->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()
{
$defaultUserModel = config('auth.providers.users.model', config('auth.model', 'App\User'));
$this->interfaces['\Illuminate\Contracts\Auth\Authenticatable'] = $defaultUserModel;
try {
if (class_exists('Auth') && is_a('Auth', '\Illuminate\Support\Facades\Auth', true)) {
$class = get_class(\Auth::driver());
$this->extra['Auth'] = array($class);
$this->interfaces['\Illuminate\Auth\UserProviderInterface'] = $class;
}
}catch (\Exception $e) {}
try{
if (class_exists('DB') && is_a('DB', '\Illuminate\Support\Facades\DB', true)) {
$class = get_class(\DB::connection());
$this->extra['DB'] = array($class);
$this->interfaces['\Illuminate\Database\ConnectionInterface'] = $class;
}
}catch (\Exception $e) {}
try{
if (class_exists('Cache') && is_a('Cache', '\Illuminate\Support\Facades\Cache', true)) {
$driver = get_class(\Cache::driver());
$store = get_class(\Cache::getStore());
$this->extra['Cache'] = array($driver, $store);
$this->interfaces['\Illuminate\Cache\StoreInterface'] = $store;
}
}catch (\Exception $e) {}
try{
if (class_exists('Queue') && is_a('Queue', '\Illuminate\Support\Facades\Queue', true)) {
$class = get_class(\Queue::connection());
$this->extra['Queue'] = array($class);
$this->interfaces['\Illuminate\Queue\QueueInterface'] = $class;
}
}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) {}
}
/**
* Find all namespaces/aliases that are valid for us to render
*
* @return array
*/
protected function getNamespaces()
{
$namespaces = array();
// Get all aliases
foreach (AliasLoader::getInstance()->getAliases() as $name => $facade) {
$magicMethods = array_key_exists($name, $this->magic) ? $this->magic[$name] : array();
$alias = new Alias($name, $facade, $magicMethods, $this->interfaces);
if ($alias->isValid()) {
//Add extra methods, from other classes (magic static calls)
if (array_key_exists($name, $this->extra)) {
$alias->addClass($this->extra[$name]);
}
$namespace = $alias->getNamespace();
if (!isset($namespaces[$namespace])) {
$namespaces[$namespace] = array();
}
$namespaces[$namespace][] = $alias;
}
}
return $namespaces;
}
/**
* 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.
*
* @param string $string
* @return void
*/
protected function error($string)
{
if($this->output){
$this->output->writeln("<error>$string</error>");
}else{
echo $string . "\r\n";
}
}
}
if (class_exists('\Illuminate\Foundation\Application')) {
$authMethod = version_compare(Application::VERSION, '5.2', '>=') ? 'guard' : 'driver';
} else {
$refClass = new ReflectionClass('\Laravel\Lumen\Application');
$versionStr = $refClass->newInstanceWithoutConstructor()->version();
$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;
}
} catch (\Exception $e) {
}
try {
if (class_exists('DB') && is_a('DB', '\Illuminate\Support\Facades\DB', true)) {
$class = get_class(\DB::connection());
$this->extra['DB'] = array($class);
$this->interfaces['\Illuminate\Database\ConnectionInterface'] = $class;
}
} catch (\Exception $e) {
}
try {
if (class_exists('Cache') && is_a('Cache', '\Illuminate\Support\Facades\Cache', true)) {
$driver = get_class(\Cache::driver());
$store = get_class(\Cache::getStore());
$this->extra['Cache'] = array($driver, $store);
$this->interfaces['\Illuminate\Cache\StoreInterface'] = $store;
}
} catch (\Exception $e) {
}
try {
if (class_exists('Queue') && is_a('Queue', '\Illuminate\Support\Facades\Queue', true)) {
$class = get_class(\Queue::connection());
$this->extra['Queue'] = array($class);
$this->interfaces['\Illuminate\Queue\QueueInterface'] = $class;
}
} 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 {
if (class_exists('Storage') && is_a('Storage', '\Illuminate\Support\Facades\Storage', true)) {
$class = get_class(\Storage::disk());
$this->extra['Storage'] = array($class);
$this->interfaces['\Illuminate\Contracts\Filesystem\Filesystem'] = $class;
}
} catch (\Exception $e) {
}
}
/**
* Find all aliases that are valid for us to render
*
* @return Collection
*/
protected function getValidAliases()
{
$aliases = new Collection();
// Get all aliases
foreach ($this->getAliases() as $name => $facade) {
// Skip the Redis facade, if not available (otherwise Fatal PHP Error)
if ($facade == 'Illuminate\Support\Facades\Redis' && !class_exists('Predis\Client')) {
continue;
}
$magicMethods = array_key_exists($name, $this->magic) ? $this->magic[$name] : array();
$alias = new Alias($name, $facade, $magicMethods, $this->interfaces);
if ($alias->isValid()) {
//Add extra methods, from other classes (magic static calls)
if (array_key_exists($name, $this->extra)) {
$alias->addClass($this->extra[$name]);
}
$aliases[] = $alias;
}
}
return $aliases;
}
/**
* Regroup aliases by namespace of extended classes
*
* @return Collection
*/
protected function getAliasesByExtendsNamespace()
{
return $this->getValidAliases()->groupBy(function (Alias $alias) {
return $alias->getExtendsNamespace();
});
}
/**
* Regroup aliases by namespace of alias
*
* @return Collection
*/
protected function getAliasesByAliasNamespace()
{
return $this->getValidAliases()->groupBy(function (Alias $alias) {
return $alias->getNamespace();
});
}
protected function getAliases()
{
// For Laravel, use the AliasLoader
if (class_exists('Illuminate\Foundation\AliasLoader')) {
return AliasLoader::getInstance()->getAliases();
}
$facades = [
'App' => 'Illuminate\Support\Facades\App',
'Auth' => 'Illuminate\Support\Facades\Auth',
'Bus' => 'Illuminate\Support\Facades\Bus',
'DB' => 'Illuminate\Support\Facades\DB',
'Cache' => 'Illuminate\Support\Facades\Cache',
'Cookie' => 'Illuminate\Support\Facades\Cookie',
'Crypt' => 'Illuminate\Support\Facades\Crypt',
'Event' => 'Illuminate\Support\Facades\Event',
'Hash' => 'Illuminate\Support\Facades\Hash',
'Log' => 'Illuminate\Support\Facades\Log',
'Mail' => 'Illuminate\Support\Facades\Mail',
'Queue' => 'Illuminate\Support\Facades\Queue',
'Request' => 'Illuminate\Support\Facades\Request',
'Schema' => 'Illuminate\Support\Facades\Schema',
'Session' => 'Illuminate\Support\Facades\Session',
'Storage' => 'Illuminate\Support\Facades\Storage',
'Validator' => 'Illuminate\Support\Facades\Validator',
'Gate' => 'Illuminate\Support\Facades\Gate',
];
$facades = array_merge($facades, $this->config->get('app.aliases', []));
// Only return the ones that actually exist
return array_filter($facades, function ($alias) {
return class_exists($alias);
});
}
/**
* 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.
*
* @param string $string
* @return void
*/
protected function error($string)
{
if ($this->output) {
$this->output->writeln("<error>$string</error>");
} else {
echo $string . "\r\n";
}
}
}
+58 -42
View File
@@ -10,10 +10,15 @@
namespace Barryvdh\LaravelIdeHelper;
use Illuminate\Support\ServiceProvider;
use Barryvdh\LaravelIdeHelper\Console\EloquentCommand;
use Barryvdh\LaravelIdeHelper\Console\GeneratorCommand;
use Barryvdh\LaravelIdeHelper\Console\MetaCommand;
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
use Barryvdh\LaravelIdeHelper\Console\GeneratorCommand;
use Illuminate\Support\ServiceProvider;
use Illuminate\View\Engines\EngineResolver;
use Illuminate\View\Engines\PhpEngine;
use Illuminate\View\Factory;
use Illuminate\View\FileViewFinder;
class IdeHelperServiceProvider extends ServiceProvider
{
@@ -32,7 +37,16 @@ class IdeHelperServiceProvider extends ServiceProvider
*/
public function boot()
{
$this->package('barryvdh/laravel-ide-helper', 'laravel-ide-helper', __DIR__);
$viewPath = __DIR__.'/../resources/views';
$this->loadViewsFrom($viewPath, 'ide-helper');
$configPath = __DIR__ . '/../config/ide-helper.php';
if (function_exists('config_path')) {
$publishPath = config_path('ide-helper.php');
} else {
$publishPath = base_path('config/ide-helper.php');
}
$this->publishes([$configPath => $publishPath], 'config');
}
/**
@@ -42,25 +56,44 @@ class IdeHelperServiceProvider extends ServiceProvider
*/
public function register()
{
$this->app['command.ide-helper.generate'] = $this->app->share(
$configPath = __DIR__ . '/../config/ide-helper.php';
$this->mergeConfigFrom($configPath, 'ide-helper');
$localViewFactory = $this->createLocalViewFactory();
$this->app->singleton(
'command.ide-helper.generate',
function ($app) use ($localViewFactory) {
return new GeneratorCommand($app['config'], $app['files'], $localViewFactory);
}
);
$this->app->singleton(
'command.ide-helper.models',
function ($app) {
return new GeneratorCommand($app['config'], $app['files'], $app['view']);
return new ModelsCommand($app['files']);
}
);
$this->app['command.ide-helper.models'] = $this->app->share(
function () {
return new ModelsCommand();
$this->app->singleton(
'command.ide-helper.meta',
function ($app) use ($localViewFactory) {
return new MetaCommand($app['files'], $localViewFactory, $app['config']);
}
);
$this->app['command.ide-helper.meta'] = $this->app->share(
function ($app) {
return new MetaCommand($app['files'], $app['view']);
}
$this->app->singleton(
'command.ide-helper.eloquent',
function ($app) use ($localViewFactory) {
return new EloquentCommand($app['files']);
}
);
$this->commands('command.ide-helper.generate', 'command.ide-helper.models', 'command.ide-helper.meta');
$this->commands(
'command.ide-helper.generate',
'command.ide-helper.models',
'command.ide-helper.meta',
'command.ide-helper.eloquent'
);
}
/**
@@ -72,37 +105,20 @@ class IdeHelperServiceProvider extends ServiceProvider
{
return array('command.ide-helper.generate', 'command.ide-helper.models');
}
/**
* Register the package's component namespaces.
*
* @param string $package
* @param string $namespace
* @param string $path
* @return void
* @return Factory
*/
public function package($package, $namespace = null, $path = null)
private function createLocalViewFactory()
{
$resolver = new EngineResolver();
$resolver->register('php', function () {
return new PhpEngine();
});
$finder = new FileViewFinder($this->app['files'], [__DIR__ . '/../resources/views']);
$factory = new Factory($resolver, $finder, $this->app['events']);
$factory->addExtension('php', 'php');
// Is it possible to register the config?
if (method_exists($this->app['config'], 'package')) {
$this->app['config']->package($package, $path.'/config', $namespace);
} else {
// Load the config for now..
$config = $this->app['files']->getRequire($path .'/config/config.php');
foreach($config as $key => $value){
$this->app['config']->set($namespace.'::'.$key, $value);
}
}
// Register view files
$appView = $this->app['path']."/views/packages/{$package}";
if ($this->app['files']->isDirectory($appView))
{
$this->app['view']->addNamespace($namespace, $appView);
}
$this->app['view']->addNamespace($namespace, $path.'/views');
return $factory;
}
}
+52
View File
@@ -0,0 +1,52 @@
<?php
namespace Barryvdh\LaravelIdeHelper;
use Barryvdh\Reflection\DocBlock;
use Barryvdh\Reflection\DocBlock\Tag;
class Macro extends Method
{
/**
* Macro constructor.
*
* @param \ReflectionFunctionAbstract $method
* @param string $alias
* @param \ReflectionClass $class
* @param null $methodName
* @param array $interfaces
*/
public function __construct(
\ReflectionFunctionAbstract $method,
$alias,
$class,
$methodName = null,
$interfaces = array()
) {
$this->method = $method;
$this->interfaces = $interfaces;
$this->name = $methodName ?: $method->name;
$this->namespace = $class->getNamespaceName();
//Create a DocBlock and serializer instance
$this->phpdoc = new DocBlock($method);
//Normalize the description and inherit the docs from parents/interfaces
try {
$this->normalizeParams($this->phpdoc);
$this->normalizeReturn($this->phpdoc);
$this->normalizeDescription($this->phpdoc);
} catch (\Exception $e) {
}
//Get the parameters, including formatted default values
$this->getParameters($method);
//Make the method static
$this->phpdoc->appendTag(Tag::createInstance('@static', $this->phpdoc));
//Reference the 'real' function in the declaringclass
$this->declaringClassName = '\\' . ltrim($class->name, '\\');
$this->root = '\\' . ltrim($class->getName(), '\\');
}
}
+314 -311
View File
@@ -1,311 +1,314 @@
<?php
/**
* Laravel IDE Helper Generator
*
* @author Barry vd. Heuvel <barryvdh@gmail.com>
* @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 phpDocumentor\Reflection\DocBlock;
use phpDocumentor\Reflection\DocBlock\Context;
use phpDocumentor\Reflection\DocBlock\Tag;
use phpDocumentor\Reflection\DocBlock\Tag\ReturnTag;
use phpDocumentor\Reflection\DocBlock\Tag\ParamTag;
use phpDocumentor\Reflection\DocBlock\Serializer as DocBlockSerializer;
class Method
{
/** @var \phpDocumentor\Reflection\DocBlock */
protected $phpdoc;
/** @var \ReflectionMethod */
protected $method;
protected $output = '';
protected $name;
protected $namespace;
protected $params = array();
protected $params_with_default = array();
protected $interfaces = array();
protected $return = null;
/**
* @param \ReflectionMethod $method
* @param string $alias
* @param string $class
* @param string|null $methodName
* @param array $interfaces
*/
public function __construct(\ReflectionMethod $method, $alias, $class, $methodName = null, $interfaces = array())
{
$this->method = $method;
$this->interfaces = $interfaces;
$this->name = $methodName ?: $method->name;
$this->namespace = $method->getDeclaringClass()->getNamespaceName();
//Create a DocBlock and serializer instance
$this->phpdoc = new DocBlock($method, new Context($this->namespace));
//Normalize the description and inherit the docs from parents/interfaces
try {
$this->normalizeParams($this->phpdoc);
$this->normalizeReturn($this->phpdoc);
$this->normalizeDescription($this->phpdoc);
} catch (\Exception $e) {}
//Get the parameters, including formatted default values
$this->getParameters($method);
//Make the method static
$this->phpdoc->appendTag(Tag::createInstance('@static', $this->phpdoc));
//Reference the 'real' function in the declaringclass
$declaringClass = $method->getDeclaringClass();
$this->declaringClassName = '\\' . ltrim($declaringClass->name, '\\');
$this->root = '\\' . ltrim($class->getName(), '\\');
}
/**
* Get the class wherein the function resides
*
* @return string
*/
public function getDeclaringClass()
{
return $this->declaringClassName;
}
/**
* Return the class from which this function would be called
*
* @return string
*/
public function getRoot()
{
return $this->root;
}
/**
* Get the docblock for this method
*
* @param string $prefix
* @return mixed
*/
public function getDocComment($prefix = "\t\t")
{
$serializer = new DocBlockSerializer(1, $prefix);
return $serializer->getDocComment($this->phpdoc);
}
/**
* Get the method name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Get the parameters for this method
*
* @param bool $implode Wether to implode the array or not
* @return string
*/
public function getParams($implode = true)
{
return $implode ? implode(', ', $this->params) : $this->params;
}
/**
* Get the parameters for this method including default values
*
* @param bool $implode Wether to implode the array or not
* @return string
*/
public function getParamsWithDefault($implode = true)
{
return $implode ? implode(', ', $this->params_with_default) : $this->params_with_default;
}
/**
* Get the description and get the inherited docs.
*
* @param DocBlock $phpdoc
*/
protected function normalizeDescription(DocBlock $phpdoc)
{
//Get the short + long description from the DocBlock
$description = $phpdoc->getText();
//Loop through parents/interfaces, to fill in {@inheritdoc}
if (strpos($description, '{@inheritdoc}') !== false) {
$inheritdoc = $this->getInheritDoc($this->method);
$inheritDescription = $inheritdoc->getText();
$description = str_replace('{@inheritdoc}', $inheritDescription, $description);
$phpdoc->setText($description);
$this->normalizeParams($inheritdoc);
$this->normalizeReturn($inheritdoc);
//Add the tags that are inherited
$inheritTags = $inheritdoc->getTags();
if ($inheritTags) {
/** @var Tag $tag */
foreach ($inheritTags as $tag) {
$tag->setDocBlock();
$phpdoc->appendTag($tag);
}
}
}
}
/**
* Normalize the parameters
*
* @param DocBlock $phpdoc
*/
protected function normalizeParams(DocBlock $phpdoc)
{
//Get the return type and adjust them for beter autocomplete
$paramTags = $phpdoc->getTagsByName('param');
if ($paramTags) {
/** @var ParamTag $tag */
foreach($paramTags as $tag){
// Convert the keywords
$content = $this->convertKeywords($tag->getContent());
$tag->setContent($content);
// Get the expanded type and re-set the content
$content = $tag->getType() . ' ' . $tag->getVariableName() . ' ' . $tag->getDescription();
$tag->setContent(trim($content));
}
}
}
/**
* Normalize the return tag (make full namespace, replace interfaces)
*
* @param DocBlock $phpdoc
*/
protected function normalizeReturn(DocBlock $phpdoc)
{
//Get the return type and adjust them for beter autocomplete
$returnTags = $phpdoc->getTagsByName('return');
if ($returnTags) {
/** @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;
}else{
$this->return = null;
}
}
/**
* Convert keywwords that are incorrect.
*
* @param string $string
* @return string
*/
protected function convertKeywords($string)
{
$string = str_replace('\Closure', 'Closure', $string);
$string = str_replace('Closure', '\Closure', $string);
$string = str_replace('dynamic', 'mixed', $string);
return $string;
}
/**
* Should the function return a value?
*
* @return bool
*/
public function shouldReturn()
{
if($this->return !== "void" && $this->method->name !== "__construct"){
return true;
}
return false;
}
/**
* Get the parameters and format them correctly
*
* @param $method
* @return array
*/
public function getParameters($method)
{
//Loop through the default values for paremeters, and make the correct output string
$params = array();
$paramsWithDefault = array();
foreach ($method->getParameters() as $param) {
$paramStr = '$' . $param->getName();
$params[] = $paramStr;
if ($param->isOptional()) {
$default = $param->isDefaultValueAvailable() ? $param->getDefaultValue() : null;
if (is_bool($default)) {
$default = $default ? 'true' : 'false';
} elseif (is_array($default)) {
$default = 'array()';
} elseif (is_null($default)) {
$default = 'null';
} elseif (is_int($default)) {
//$default = $default;
} else {
$default = "'" . trim($default) . "'";
}
$paramStr .= " = $default";
}
$paramsWithDefault[] = $paramStr;
}
$this->params = $params;
$this->params_with_default = $paramsWithDefault;
}
/**
* @param \ReflectionMethod $reflectionMethod
* @return DocBlock
*/
protected function getInheritDoc($reflectionMethod)
{
$parentClass = $reflectionMethod->getDeclaringClass()->getParentClass();
//Get either a parent or the interface
if ($parentClass) {
$method = $parentClass->getMethod($reflectionMethod->getName());
} else {
$method = $reflectionMethod->getPrototype();
}
if ($method) {
$namespace = $method->getDeclaringClass()->getNamespaceName();
$phpdoc = new DocBlock($method, new Context($namespace));
if (strpos($phpdoc->getText(), '{@inheritdoc}') !== false) {
//Not at the end yet, try another parent/interface..
return $this->getInheritDoc($method);
} else {
return $phpdoc;
}
}
}
}
<?php
/**
* Laravel IDE Helper Generator
*
* @author Barry vd. Heuvel <barryvdh@gmail.com>
* @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 Barryvdh\Reflection\DocBlock;
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;
class Method
{
/** @var \Barryvdh\Reflection\DocBlock */
protected $phpdoc;
/** @var \ReflectionMethod */
protected $method;
protected $output = '';
protected $name;
protected $namespace;
protected $params = array();
protected $params_with_default = array();
protected $interfaces = array();
protected $return = null;
/**
* @param \ReflectionMethod $method
* @param string $alias
* @param \ReflectionClass $class
* @param string|null $methodName
* @param array $interfaces
*/
public function __construct(\ReflectionMethod $method, $alias, $class, $methodName = null, $interfaces = array())
{
$this->method = $method;
$this->interfaces = $interfaces;
$this->name = $methodName ?: $method->name;
$this->namespace = $method->getDeclaringClass()->getNamespaceName();
//Create a DocBlock and serializer instance
$this->phpdoc = new DocBlock($method, new Context($this->namespace));
//Normalize the description and inherit the docs from parents/interfaces
try {
$this->normalizeParams($this->phpdoc);
$this->normalizeReturn($this->phpdoc);
$this->normalizeDescription($this->phpdoc);
} catch (\Exception $e) {
}
//Get the parameters, including formatted default values
$this->getParameters($method);
//Make the method static
$this->phpdoc->appendTag(Tag::createInstance('@static', $this->phpdoc));
//Reference the 'real' function in the declaringclass
$declaringClass = $method->getDeclaringClass();
$this->declaringClassName = '\\' . ltrim($declaringClass->name, '\\');
$this->root = '\\' . ltrim($class->getName(), '\\');
}
/**
* Get the class wherein the function resides
*
* @return string
*/
public function getDeclaringClass()
{
return $this->declaringClassName;
}
/**
* Return the class from which this function would be called
*
* @return string
*/
public function getRoot()
{
return $this->root;
}
/**
* Get the docblock for this method
*
* @param string $prefix
* @return mixed
*/
public function getDocComment($prefix = "\t\t")
{
$serializer = new DocBlockSerializer(1, $prefix);
return $serializer->getDocComment($this->phpdoc);
}
/**
* Get the method name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Get the parameters for this method
*
* @param bool $implode Wether to implode the array or not
* @return string
*/
public function getParams($implode = true)
{
return $implode ? implode(', ', $this->params) : $this->params;
}
/**
* Get the parameters for this method including default values
*
* @param bool $implode Wether to implode the array or not
* @return string
*/
public function getParamsWithDefault($implode = true)
{
return $implode ? implode(', ', $this->params_with_default) : $this->params_with_default;
}
/**
* Get the description and get the inherited docs.
*
* @param DocBlock $phpdoc
*/
protected function normalizeDescription(DocBlock $phpdoc)
{
//Get the short + long description from the DocBlock
$description = $phpdoc->getText();
//Loop through parents/interfaces, to fill in {@inheritdoc}
if (strpos($description, '{@inheritdoc}') !== false) {
$inheritdoc = $this->getInheritDoc($this->method);
$inheritDescription = $inheritdoc->getText();
$description = str_replace('{@inheritdoc}', $inheritDescription, $description);
$phpdoc->setText($description);
$this->normalizeParams($inheritdoc);
$this->normalizeReturn($inheritdoc);
//Add the tags that are inherited
$inheritTags = $inheritdoc->getTags();
if ($inheritTags) {
/** @var Tag $tag */
foreach ($inheritTags as $tag) {
$tag->setDocBlock();
$phpdoc->appendTag($tag);
}
}
}
}
/**
* Normalize the parameters
*
* @param DocBlock $phpdoc
*/
protected function normalizeParams(DocBlock $phpdoc)
{
//Get the return type and adjust them for beter autocomplete
$paramTags = $phpdoc->getTagsByName('param');
if ($paramTags) {
/** @var ParamTag $tag */
foreach ($paramTags as $tag) {
// Convert the keywords
$content = $this->convertKeywords($tag->getContent());
$tag->setContent($content);
// Get the expanded type and re-set the content
$content = $tag->getType() . ' ' . $tag->getVariableName() . ' ' . $tag->getDescription();
$tag->setContent(trim($content));
}
}
}
/**
* Normalize the return tag (make full namespace, replace interfaces)
*
* @param DocBlock $phpdoc
*/
protected function normalizeReturn(DocBlock $phpdoc)
{
//Get the return type and adjust them for beter autocomplete
$returnTags = $phpdoc->getTagsByName('return');
if ($returnTags) {
/** @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;
} else {
$this->return = null;
}
}
/**
* Convert keywwords that are incorrect.
*
* @param string $string
* @return string
*/
protected function convertKeywords($string)
{
$string = str_replace('\Closure', 'Closure', $string);
$string = str_replace('Closure', '\Closure', $string);
$string = str_replace('dynamic', 'mixed', $string);
return $string;
}
/**
* Should the function return a value?
*
* @return bool
*/
public function shouldReturn()
{
if ($this->return !== "void" && $this->method->name !== "__construct") {
return true;
}
return false;
}
/**
* Get the parameters and format them correctly
*
* @param \ReflectionMethod $method
* @return array
*/
public function getParameters($method)
{
//Loop through the default values for paremeters, and make the correct output string
$params = array();
$paramsWithDefault = array();
foreach ($method->getParameters() as $param) {
$paramStr = '$' . $param->getName();
$params[] = $paramStr;
if ($param->isOptional()) {
$default = $param->isDefaultValueAvailable() ? $param->getDefaultValue() : null;
if (is_bool($default)) {
$default = $default ? 'true' : 'false';
} elseif (is_array($default)) {
$default = 'array()';
} elseif (is_null($default)) {
$default = 'null';
} elseif (is_int($default)) {
//$default = $default;
} elseif (is_resource($default)) {
//skip to not fail
} else {
$default = "'" . trim($default) . "'";
}
$paramStr .= " = $default";
}
$paramsWithDefault[] = $paramStr;
}
$this->params = $params;
$this->params_with_default = $paramsWithDefault;
}
/**
* @param \ReflectionMethod $reflectionMethod
* @return DocBlock
*/
protected function getInheritDoc($reflectionMethod)
{
$parentClass = $reflectionMethod->getDeclaringClass()->getParentClass();
//Get either a parent or the interface
if ($parentClass) {
$method = $parentClass->getMethod($reflectionMethod->getName());
} else {
$method = $reflectionMethod->getPrototype();
}
if ($method) {
$namespace = $method->getDeclaringClass()->getNamespaceName();
$phpdoc = new DocBlock($method, new Context($namespace));
if (strpos($phpdoc->getText(), '{@inheritdoc}') !== false) {
//Not at the end yet, try another parent/interface..
return $this->getInheritDoc($method);
} else {
return $phpdoc;
}
}
}
}
-92
View File
@@ -1,92 +0,0 @@
<?php
use Illuminate\Support\Facades\Config;
return array(
/*
|--------------------------------------------------------------------------
| Filename & Format
|--------------------------------------------------------------------------
|
| The default filename (without extension) and the format (php or json)
|
*/
'filename' => '_ide_helper',
'format' => 'php',
/*
|--------------------------------------------------------------------------
| Helper files to include
|--------------------------------------------------------------------------
|
| Include helper files. By default not included, but can be toggled with the
| -- helpers (-H) option. Extra helper files can be included.
|
*/
'include_helpers' => false,
'helper_files' => array(
base_path().'/vendor/laravel/framework/src/Illuminate/Support/helpers.php',
),
/*
|--------------------------------------------------------------------------
| Model locations to include
|--------------------------------------------------------------------------
|
| Define in which directories the ide-helper:models command should look
| for models.
|
*/
'model_locations' => array(
'app/models',
),
/*
|--------------------------------------------------------------------------
| Extra classes
|--------------------------------------------------------------------------
|
| These implementations are not really extended, but called with magic functions
|
*/
'extra' => array(
'Artisan' => array('Illuminate\Foundation\Artisan'),
'Eloquent' => array('Illuminate\Database\Eloquent\Builder', 'Illuminate\Database\Query\Builder'),
'Session' => array('Illuminate\Session\Store'),
),
'magic' => array(
'Log' => array(
'debug' => 'Monolog\Logger::addDebug',
'info' => 'Monolog\Logger::addInfo',
'notice' => 'Monolog\Logger::addNotice',
'warning' => 'Monolog\Logger::addWarning',
'error' => 'Monolog\Logger::addError',
'critical' => 'Monolog\Logger::addCritical',
'alert' => 'Monolog\Logger::addAlert',
'emergency' => 'Monolog\Logger::addEmergency',
)
),
/*
|--------------------------------------------------------------------------
| Interface implementations
|--------------------------------------------------------------------------
|
| These interfaces will be replaced with the implementing class. Some interfaces
| are detected by the helpers, others can be listed below.
|
*/
'interfaces' => array(
'\Illuminate\Auth\UserInterface' => Config::get('auth.model', 'User'),
)
);
-39
View File
@@ -1,39 +0,0 @@
<?= '<?php' ?>
/**
* An helper file for Laravel 4, to provide autocomplete information to your IDE
* Generated for Laravel <?= $version ?> on <?= date("Y-m-d") ?>.
*
* @author Barry vd. Heuvel <barryvdh@gmail.com>
* @see https://github.com/barryvdh/laravel-ide-helper
*/
<?php foreach($namespaces as $namespace => $aliases): ?>
namespace <?= $namespace == '__root' ? '' : $namespace ?>{
<?php if($namespace == '__root'): ?>
exit("This file should not be included, only analyzed by your IDE");
<?= $helpers ?>
<?php endif; ?>
<?php foreach($aliases as $alias): ?>
<?= $alias->getClassType() ?> <?= $alias->getShortName() ?> <?= $alias->getExtends() ? 'extends ' . $alias->getExtends() : '' ?>{
<?php foreach($alias->getMethods() as $method): ?>
<?= trim($method->getDocComment(' ')) ?>
public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>){<?php if($method->getDeclaringClass() !== $method->getRoot()): ?>
//Method inherited from <?= $method->getDeclaringClass() ?>
<?php endif; ?>
<?= $method->shouldReturn() ? 'return ': '' ?><?= $method->getRoot() ?>::<?= $method->getName() ?>(<?= $method->getParams() ?>);
}
<?php endforeach; ?>
}
<?php endforeach; ?>
}
<?php endforeach; ?>
-20
View File
@@ -1,20 +0,0 @@
<?= '<?php' ?> namespace PHPSTORM_META {
/**
* PhpStorm Meta file, to provide autocomplete information for PhpStorm
* Generated on <?= date("Y-m-d") ?>.
*
* @author Barry vd. Heuvel <barryvdh@gmail.com>
* @see https://github.com/barryvdh/laravel-ide-helper
* @noinspection PhpUnusedLocalVariableInspection
* @noinspection PhpIllegalArrayKeyTypeInspection
*/
$STATIC_METHOD_TYPES = [
<?php foreach($methods as $method): ?>
<?= $method ?>('') => [
<?php foreach($bindings as $abstract => $class): ?>
'<?= $abstract ?>' instanceof \<?= $class ?>,
<?php endforeach ?> ],
<?php endforeach ?>
];
}
+58
View File
@@ -0,0 +1,58 @@
<?php
namespace Barryvdh\LaravelIdeHelper;
class ExampleTest extends \PHPUnit_Framework_TestCase
{
/**
* Test that we can actually instantiate the class
*/
public function testCanInstantiate()
{
$reflectionClass = new \ReflectionClass(ExampleClass::class);
$reflectionMethod = $reflectionClass->getMethod('setName');
$method = new Method($reflectionMethod, 'Example', $reflectionClass);
$this->assertInstanceOf(Method::class, $method);
}
/**
* Test the output of a class
*/
public function testOutput()
{
$reflectionClass = new \ReflectionClass(ExampleClass::class);
$reflectionMethod = $reflectionClass->getMethod('setName');
$method = new Method($reflectionMethod, 'Example', $reflectionClass);
$output = '/**
*
*
* @param string $last
* @param string $first
* @static
*/';
$this->assertEquals($output, $method->getDocComment(''));
$this->assertEquals('setName', $method->getName());
$this->assertEquals('\\'.ExampleClass::class, $method->getDeclaringClass());
$this->assertEquals('$last, $first', $method->getParams(true));
$this->assertEquals(['$last', '$first'], $method->getParams(false));
$this->assertEquals('$last, $first = \'Barry\'', $method->getParamsWithDefault(true));
$this->assertEquals(['$last', '$first = \'Barry\''], $method->getParamsWithDefault(false));
$this->assertEquals(true, $method->shouldReturn());
}
}
class ExampleClass
{
/**
* @param string $last
* @param string $first
*/
public function setName($last, $first = 'Barry')
{
return;
}
}