mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 01:57:13 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
87a02ff574 | ||
|
|
9e42ce11f4 | ||
|
|
dca7fa7b10 | ||
|
|
0e4b9b77c3 | ||
|
|
46901d2c80 | ||
|
|
25b5576f57 | ||
|
|
d6d99994c3 | ||
|
|
7e78d02d0a | ||
|
|
35d954fc39 | ||
|
|
5eeda63958 | ||
|
|
b76156b24c | ||
|
|
2a63d51496 | ||
|
|
3814fe86ca | ||
|
|
3ab73555d9 | ||
|
|
ff3844e4e1 | ||
|
|
d11bf58084 | ||
|
|
75e1f22ec6 | ||
|
|
144a50e8ee | ||
|
|
b611cb5eff |
+2
-2
@@ -4,7 +4,7 @@ php:
|
||||
- 5.5
|
||||
- 5.6
|
||||
- 7.0
|
||||
- hhvm
|
||||
- 7.1
|
||||
|
||||
# This triggers builds to run on the new TravisCI infrastructure.
|
||||
# See: http://docs.travis-ci.com/user/workers/container-based-infrastructure/
|
||||
@@ -28,4 +28,4 @@ script:
|
||||
- vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover
|
||||
|
||||
after_script:
|
||||
- if [[ $TRAVIS_PHP_VERSION != 'hhvm' && $TRAVIS_PHP_VERSION != '7.0' ]]; then php vendor/bin/ocular code-coverage:upload --format=php-clover coverage.clover; fi
|
||||
- if [[ $TRAVIS_PHP_VERSION != 'hhvm' && $TRAVIS_PHP_VERSION != '7.0' ]]; then php vendor/bin/ocular code-coverage:upload --format=php-clover coverage.clover; fi
|
||||
|
||||
+10
-3
@@ -11,13 +11,15 @@
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.4.0",
|
||||
"illuminate/support": "^5.0,<5.5",
|
||||
"illuminate/console": "^5.0,<5.5",
|
||||
"illuminate/filesystem": "^5.0,<5.5",
|
||||
"illuminate/support": "^5.0,<5.6",
|
||||
"illuminate/console": "^5.0,<5.6",
|
||||
"illuminate/filesystem": "^5.0,<5.6",
|
||||
"barryvdh/reflection-docblock": "^2.0.4",
|
||||
"symfony/class-loader": "^2.3|^3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"illuminate/config": "^5.0,<5.6",
|
||||
"illuminate/view": "^5.0,<5.6",
|
||||
"phpunit/phpunit" : "4.*",
|
||||
"scrutinizer/ocular": "~1.1",
|
||||
"squizlabs/php_codesniffer": "~2.3",
|
||||
@@ -43,6 +45,11 @@
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.3-dev"
|
||||
},
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,17 @@ return array(
|
||||
|
||||
'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
|
||||
|
||||
@@ -90,7 +90,7 @@ php artisan vendor:publish --provider="Barryvdh\LaravelIdeHelper\IdeHelperServic
|
||||
The generator tries to identify the real class, but if it cannot be found, you can define it in the config file.
|
||||
|
||||
Some classes need a working database connection. If you do not have a default working connection, some facades will not be included.
|
||||
You can use an in-memory SQLite driver by adding the -M option.
|
||||
You can use an in-memory SQLite driver by adding the `-M` option.
|
||||
|
||||
You can choose to include helper files. This is not enabled by default, but you can override it with the `--helpers (-H)` option.
|
||||
The `Illuminate/Support/helpers.php` is already set up, but you can add/remove your own files in the config file.
|
||||
@@ -149,12 +149,18 @@ Models can be ignored using the `--ignore (-I)` option
|
||||
php artisan ide-helper:models --ignore="Post,User"
|
||||
```
|
||||
|
||||
Note: With namespaces, wrap your model name in " signs: `php artisan ide-helper:models "API\User"`, or escape the slashes (`Api\\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();
|
||||
$table->string("somestring")->nullable()->index();
|
||||
```
|
||||
After publishing vendor, simply change the `include_fluent` line your `config/ide-helper.php` file into:
|
||||
```php
|
||||
|
||||
+29
-28
@@ -11,16 +11,15 @@ namespace {
|
||||
exit("This file should not be included, only analyzed by your IDE");
|
||||
}
|
||||
|
||||
<?php foreach($namespaces as $namespace => $aliases): ?>
|
||||
<?php foreach($namespaces_by_extends_ns as $namespace => $aliases): ?>
|
||||
<?php if ($namespace == '\Illuminate\Database\Eloquent'): continue; endif; ?>
|
||||
namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
||||
namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
||||
<?php foreach($aliases as $alias): ?>
|
||||
|
||||
<?= $alias->getClassType() ?> <?= $alias->getExtendsClass() ?> {
|
||||
<?php foreach($alias->getMethods() as $method): ?>
|
||||
|
||||
<?= trim($method->getDocComment(' ')) ?>
|
||||
|
||||
<?= trim($method->getDocComment(' ')) ?>
|
||||
public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>)
|
||||
{<?php if($method->getDeclaringClass() !== $method->getRoot()): ?>
|
||||
|
||||
@@ -29,39 +28,41 @@ namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
||||
|
||||
<?= $method->shouldReturn() ? 'return ': '' ?><?= $method->getRoot() ?>::<?= $method->getName() ?>(<?= $method->getParams() ?>);
|
||||
}
|
||||
<?php endforeach; ?>
|
||||
|
||||
}
|
||||
<?php endforeach; ?>
|
||||
<?php endforeach; ?>
|
||||
}
|
||||
<?php endforeach; ?>
|
||||
}
|
||||
|
||||
|
||||
<?php endforeach; ?>
|
||||
|
||||
namespace {
|
||||
<?= $helpers ?>
|
||||
|
||||
<?php foreach($namespaces as $namespace => $aliases): ?>
|
||||
<?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 ($namespace == '\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() ?>);
|
||||
}
|
||||
<?= $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 endforeach; ?>
|
||||
}
|
||||
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php if($helpers): ?>
|
||||
namespace {
|
||||
<?= $helpers ?>
|
||||
}
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if($include_fluent): ?>
|
||||
namespace Illuminate\Support {
|
||||
/**
|
||||
|
||||
@@ -9,13 +9,42 @@ namespace PHPSTORM_META {
|
||||
* @author Barry vd. Heuvel <[email protected]>
|
||||
* @see https://github.com/barryvdh/laravel-ide-helper
|
||||
*/
|
||||
$STATIC_METHOD_TYPES = [
|
||||
<?php foreach($methods as $method): ?>
|
||||
<?= $method ?> => [
|
||||
'' == '@',
|
||||
<?php foreach ($methods as $method): ?>
|
||||
override(<?= $method ?>, map([
|
||||
'' => '@',
|
||||
<?php foreach($bindings as $abstract => $class): ?>
|
||||
'<?= $abstract ?>' instanceof \<?= $class ?>,
|
||||
<?php endforeach ?> ],
|
||||
<?php endforeach ?>
|
||||
];
|
||||
'<?= $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));
|
||||
|
||||
}
|
||||
|
||||
@@ -312,6 +312,24 @@ class Alias
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 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) {
|
||||
$function = new \ReflectionFunction($macro_func);
|
||||
// Add macros
|
||||
$this->methods[] = new Macro(
|
||||
$function,
|
||||
$this->alias,
|
||||
$reflection,
|
||||
$macro_name,
|
||||
$this->interfaces
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -42,12 +42,15 @@ class MetaCommand extends Command
|
||||
|
||||
/** @var \Illuminate\Contracts\View\Factory */
|
||||
protected $view;
|
||||
|
||||
|
||||
protected $methods = [
|
||||
'new \Illuminate\Contracts\Container\Container',
|
||||
'\Illuminate\Contracts\Container\Container::make(\'\')',
|
||||
'\App::make(\'\')',
|
||||
'\app(\'\')',
|
||||
'\Illuminate\Contracts\Container\Container::make(0)',
|
||||
'\Illuminate\Contracts\Container\Container::makeWith(0)',
|
||||
'\App::make(0)',
|
||||
'\App::makeWith(0)',
|
||||
'\app(0)',
|
||||
'\resolve(0)',
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -77,7 +80,7 @@ class MetaCommand extends Command
|
||||
if (in_array($abstract, ['validator', 'seeder'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
$concrete = $this->laravel->make($abstract);
|
||||
if (is_object($concrete)) {
|
||||
@@ -90,7 +93,7 @@ class MetaCommand extends Command
|
||||
}
|
||||
}
|
||||
|
||||
$content = $this->view->make('ide-helper::meta', [
|
||||
$content = $this->view->make('meta', [
|
||||
'bindings' => $bindings,
|
||||
'methods' => $this->methods,
|
||||
])->render();
|
||||
@@ -113,7 +116,7 @@ class MetaCommand extends Command
|
||||
protected function getAbstracts()
|
||||
{
|
||||
$abstracts = $this->laravel->getBindings();
|
||||
|
||||
|
||||
// Return the abstract names only
|
||||
return array_keys($abstracts);
|
||||
}
|
||||
|
||||
@@ -50,11 +50,16 @@ 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;
|
||||
/**
|
||||
* @var bool[string]
|
||||
*/
|
||||
protected $nullableColumns = [];
|
||||
|
||||
/**
|
||||
* @param Filesystem $files
|
||||
@@ -81,6 +86,7 @@ class ModelsCommand extends Command
|
||||
$model = $this->argument('model');
|
||||
$ignore = $this->option('ignore');
|
||||
$this->reset = $this->option('reset');
|
||||
$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')) {
|
||||
@@ -200,8 +206,10 @@ class ModelsCommand extends Command
|
||||
}
|
||||
|
||||
$this->getPropertiesFromMethods($model);
|
||||
$output .= $this->createPhpDocs($name);
|
||||
$ignore[] = $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.");
|
||||
}
|
||||
@@ -347,13 +355,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;
|
||||
@@ -361,12 +377,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')
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -410,7 +431,7 @@ class ModelsCommand extends Command
|
||||
$args = $this->getParameters($reflection);
|
||||
//Remove the first ($query) argument
|
||||
array_shift($args);
|
||||
$this->setMethod($name, '\Illuminate\Database\Query\Builder|\\' . $reflection->class, $args);
|
||||
$this->setMethod($name, '\Illuminate\Database\Eloquent\Builder|\\' . $reflection->class, $args);
|
||||
}
|
||||
} elseif (!method_exists('Illuminate\Database\Eloquent\Model', $method)
|
||||
&& !Str::startsWith($method, 'get')
|
||||
@@ -468,7 +489,14 @@ class ModelsCommand extends Command
|
||||
);
|
||||
} else {
|
||||
//Single model is returned
|
||||
$this->setProperty($method, $relatedModel, true, null);
|
||||
$this->setProperty(
|
||||
$method,
|
||||
$relatedModel,
|
||||
true,
|
||||
null,
|
||||
'',
|
||||
$this->isRelationForeignKeyNullable($relationObj)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -479,13 +507,33 @@ class ModelsCommand extends Command
|
||||
}
|
||||
|
||||
/**
|
||||
* @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();
|
||||
@@ -495,7 +543,11 @@ class ModelsCommand extends Command
|
||||
$this->properties[$name]['comment'] = (string) $comment;
|
||||
}
|
||||
if ($type !== null) {
|
||||
$this->properties[$name]['type'] = $this->getTypeOverride($type);
|
||||
$newType = $this->getTypeOverride($type);
|
||||
if ($nullable) {
|
||||
$newType .='|null';
|
||||
}
|
||||
$this->properties[$name]['type'] = $newType;
|
||||
}
|
||||
if ($read !== null) {
|
||||
$this->properties[$name]['read'] = $read;
|
||||
@@ -690,9 +742,26 @@ class ModelsCommand extends Command
|
||||
$phpdoc = new DocBlock($reflection);
|
||||
|
||||
if ($phpdoc->hasTag('return')) {
|
||||
$type = $phpdoc->getTagsByName('return')[0]->getContent();
|
||||
$type = $phpdoc->getTagsByName('return')[0]->getType();
|
||||
}
|
||||
|
||||
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), []);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+37
-16
@@ -12,7 +12,7 @@ namespace Barryvdh\LaravelIdeHelper;
|
||||
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Foundation\AliasLoader;
|
||||
use Illuminate\Config\Repository as ConfigRepository;
|
||||
use Illuminate\Support\Collection;
|
||||
use ReflectionClass;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
@@ -80,18 +80,19 @@ class Generator
|
||||
public function generatePhpHelper()
|
||||
{
|
||||
$app = app();
|
||||
return $this->view->make('ide-helper::helper')
|
||||
->with('namespaces', $this->getNamespaces())
|
||||
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', false))
|
||||
->with('include_fluent', $this->config->get('ide-helper.include_fluent', true))
|
||||
->render();
|
||||
}
|
||||
|
||||
public function generateJsonHelper()
|
||||
{
|
||||
$classes = array();
|
||||
foreach ($this->getNamespaces() as $aliases) {
|
||||
foreach ($this->getValidAliases() as $aliases) {
|
||||
foreach ($aliases as $alias) {
|
||||
$functions = array();
|
||||
foreach ($alias->getMethods() as $method) {
|
||||
@@ -186,13 +187,13 @@ class Generator
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all namespaces/aliases that are valid for us to render
|
||||
* Find all aliases that are valid for us to render
|
||||
*
|
||||
* @return array
|
||||
* @return Collection
|
||||
*/
|
||||
protected function getNamespaces()
|
||||
protected function getValidAliases()
|
||||
{
|
||||
$namespaces = array();
|
||||
$aliases = new Collection();
|
||||
|
||||
// Get all aliases
|
||||
foreach ($this->getAliases() as $name => $facade) {
|
||||
@@ -208,16 +209,36 @@ class Generator
|
||||
if (array_key_exists($name, $this->extra)) {
|
||||
$alias->addClass($this->extra[$name]);
|
||||
}
|
||||
|
||||
$namespace = $alias->getExtendsNamespace() ?: $alias->getNamespace();
|
||||
if (!isset($namespaces[$namespace])) {
|
||||
$namespaces[$namespace] = array();
|
||||
}
|
||||
$namespaces[$namespace][] = $alias;
|
||||
|
||||
$aliases[] = $alias;
|
||||
}
|
||||
}
|
||||
|
||||
return $namespaces;
|
||||
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()
|
||||
|
||||
@@ -14,6 +14,10 @@ use Illuminate\Support\ServiceProvider;
|
||||
use Barryvdh\LaravelIdeHelper\Console\MetaCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Console\GeneratorCommand;
|
||||
use Illuminate\View\Engines\EngineResolver;
|
||||
use Illuminate\View\Engines\PhpEngine;
|
||||
use Illuminate\View\Factory;
|
||||
use Illuminate\View\FileViewFinder;
|
||||
|
||||
class IdeHelperServiceProvider extends ServiceProvider
|
||||
{
|
||||
@@ -53,11 +57,12 @@ class IdeHelperServiceProvider extends ServiceProvider
|
||||
{
|
||||
$configPath = __DIR__ . '/../config/ide-helper.php';
|
||||
$this->mergeConfigFrom($configPath, 'ide-helper');
|
||||
$localViewFactory = $this->createLocalViewFactory();
|
||||
|
||||
$this->app->singleton(
|
||||
'command.ide-helper.generate',
|
||||
function ($app) {
|
||||
return new GeneratorCommand($app['config'], $app['files'], $app['view']);
|
||||
function ($app) use ($localViewFactory) {
|
||||
return new GeneratorCommand($app['config'], $app['files'], $localViewFactory);
|
||||
}
|
||||
);
|
||||
|
||||
@@ -70,8 +75,8 @@ class IdeHelperServiceProvider extends ServiceProvider
|
||||
|
||||
$this->app->singleton(
|
||||
'command.ide-helper.meta',
|
||||
function ($app) {
|
||||
return new MetaCommand($app['files'], $app['view']);
|
||||
function ($app) use ($localViewFactory) {
|
||||
return new MetaCommand($app['files'], $localViewFactory);
|
||||
}
|
||||
);
|
||||
|
||||
@@ -87,4 +92,20 @@ class IdeHelperServiceProvider extends ServiceProvider
|
||||
{
|
||||
return array('command.ide-helper.generate', 'command.ide-helper.models');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Factory
|
||||
*/
|
||||
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');
|
||||
|
||||
return $factory;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper;
|
||||
|
||||
use Barryvdh\Reflection\DocBlock;
|
||||
use Barryvdh\Reflection\DocBlock\Tag;
|
||||
|
||||
class Macro extends Method
|
||||
{
|
||||
/**
|
||||
* Macro constructor.
|
||||
*
|
||||
* @param \ReflectionFunction $method
|
||||
* @param string $alias
|
||||
* @param \ReflectionClass $class
|
||||
* @param null $methodName
|
||||
* @param array $interfaces
|
||||
*/
|
||||
public function __construct(\ReflectionFunction $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(), '\\');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user