mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 18:13:11 +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 | ||
|
|
e82de98cef | ||
|
|
456853be46 | ||
|
|
25c8de637d | ||
|
|
5a841a209d | ||
|
|
56660cab84 |
+1
-1
@@ -4,7 +4,7 @@ php:
|
|||||||
- 5.5
|
- 5.5
|
||||||
- 5.6
|
- 5.6
|
||||||
- 7.0
|
- 7.0
|
||||||
- hhvm
|
- 7.1
|
||||||
|
|
||||||
# This triggers builds to run on the new TravisCI infrastructure.
|
# This triggers builds to run on the new TravisCI infrastructure.
|
||||||
# See: http://docs.travis-ci.com/user/workers/container-based-infrastructure/
|
# See: http://docs.travis-ci.com/user/workers/container-based-infrastructure/
|
||||||
|
|||||||
+11
-4
@@ -11,13 +11,15 @@
|
|||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.4.0",
|
"php": ">=5.4.0",
|
||||||
"illuminate/support": "^5.0,<5.5",
|
"illuminate/support": "^5.0,<5.6",
|
||||||
"illuminate/console": "^5.0,<5.5",
|
"illuminate/console": "^5.0,<5.6",
|
||||||
"illuminate/filesystem": "^5.0,<5.5",
|
"illuminate/filesystem": "^5.0,<5.6",
|
||||||
"barryvdh/reflection-docblock": "^2.0.4",
|
"barryvdh/reflection-docblock": "^2.0.4",
|
||||||
"symfony/class-loader": "^2.3|^3.0"
|
"symfony/class-loader": "^2.3|^3.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
|
"illuminate/config": "^5.0,<5.6",
|
||||||
|
"illuminate/view": "^5.0,<5.6",
|
||||||
"phpunit/phpunit" : "4.*",
|
"phpunit/phpunit" : "4.*",
|
||||||
"scrutinizer/ocular": "~1.1",
|
"scrutinizer/ocular": "~1.1",
|
||||||
"squizlabs/php_codesniffer": "~2.3",
|
"squizlabs/php_codesniffer": "~2.3",
|
||||||
@@ -42,7 +44,12 @@
|
|||||||
},
|
},
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "2.2-dev"
|
"dev-master": "2.3-dev"
|
||||||
|
},
|
||||||
|
"laravel": {
|
||||||
|
"providers": [
|
||||||
|
"Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,17 @@ return array(
|
|||||||
|
|
||||||
'include_fluent' => false,
|
'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
|
| 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.
|
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.
|
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.
|
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.
|
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"
|
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
|
### Automatic phpDocs generation for Laravel Fluent methods
|
||||||
If you need phpDocs support for Fluent methods in migration, for example
|
If you need phpDocs support for Fluent methods in migration, for example
|
||||||
```php
|
```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:
|
After publishing vendor, simply change the `include_fluent` line your `config/ide-helper.php` file into:
|
||||||
```php
|
```php
|
||||||
|
|||||||
+26
-10
@@ -11,15 +11,15 @@ namespace {
|
|||||||
exit("This file should not be included, only analyzed by your IDE");
|
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): ?>
|
<?php foreach($aliases as $alias): ?>
|
||||||
|
|
||||||
<?= $alias->getClassType() ?> <?= $alias->getExtendsCLass() ?> {
|
<?= $alias->getClassType() ?> <?= $alias->getExtendsClass() ?> {
|
||||||
<?php foreach($alias->getMethods() as $method): ?>
|
<?php foreach($alias->getMethods() as $method): ?>
|
||||||
|
|
||||||
<?= trim($method->getDocComment(' ')) ?>
|
<?= trim($method->getDocComment(' ')) ?>
|
||||||
|
|
||||||
public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>)
|
public static function <?= $method->getName() ?>(<?= $method->getParamsWithDefault() ?>)
|
||||||
{<?php if($method->getDeclaringClass() !== $method->getRoot()): ?>
|
{<?php if($method->getDeclaringClass() !== $method->getRoot()): ?>
|
||||||
|
|
||||||
@@ -29,24 +29,40 @@ namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
|||||||
<?= $method->shouldReturn() ? 'return ': '' ?><?= $method->getRoot() ?>::<?= $method->getName() ?>(<?= $method->getParams() ?>);
|
<?= $method->shouldReturn() ? 'return ': '' ?><?= $method->getRoot() ?>::<?= $method->getName() ?>(<?= $method->getParams() ?>);
|
||||||
}
|
}
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
|
||||||
}
|
}
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
}
|
}
|
||||||
|
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
|
||||||
namespace {
|
<?php foreach($namespaces_by_alias_ns as $namespace => $aliases): ?>
|
||||||
<?= $helpers ?>
|
namespace <?= $namespace == '__root' ? '' : trim($namespace, '\\') ?> {
|
||||||
|
|
||||||
<?php foreach($namespaces as $namespace => $aliases): ?>
|
|
||||||
<?php foreach($aliases as $alias): ?>
|
<?php foreach($aliases as $alias): ?>
|
||||||
<?= $alias->getClassType() ?> <?= $alias->getShortName() ?> extends <?= $alias->getExtends() ?> {}
|
|
||||||
|
|
||||||
<?php endforeach; ?>
|
<?= $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 if($helpers): ?>
|
||||||
|
namespace {
|
||||||
|
<?= $helpers ?>
|
||||||
|
}
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php if($include_fluent): ?>
|
<?php if($include_fluent): ?>
|
||||||
namespace Illuminate\Support {
|
namespace Illuminate\Support {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -9,13 +9,42 @@ namespace PHPSTORM_META {
|
|||||||
* @author Barry vd. Heuvel <[email protected]>
|
* @author Barry vd. Heuvel <[email protected]>
|
||||||
* @see https://github.com/barryvdh/laravel-ide-helper
|
* @see https://github.com/barryvdh/laravel-ide-helper
|
||||||
*/
|
*/
|
||||||
$STATIC_METHOD_TYPES = [
|
<?php foreach ($methods as $method): ?>
|
||||||
<?php foreach($methods as $method): ?>
|
override(<?= $method ?>, map([
|
||||||
<?= $method ?> => [
|
'' => '@',
|
||||||
'' == '@',
|
|
||||||
<?php foreach($bindings as $abstract => $class): ?>
|
<?php foreach($bindings as $abstract => $class): ?>
|
||||||
'<?= $abstract ?>' instanceof \<?= $class ?>,
|
'<?= $abstract ?>' => <?= $class ?>::class,
|
||||||
<?php endforeach ?> ],
|
<?php endforeach; ?>
|
||||||
<?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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,9 +45,12 @@ class MetaCommand extends Command
|
|||||||
|
|
||||||
protected $methods = [
|
protected $methods = [
|
||||||
'new \Illuminate\Contracts\Container\Container',
|
'new \Illuminate\Contracts\Container\Container',
|
||||||
'\Illuminate\Contracts\Container\Container::make(\'\')',
|
'\Illuminate\Contracts\Container\Container::make(0)',
|
||||||
'\App::make(\'\')',
|
'\Illuminate\Contracts\Container\Container::makeWith(0)',
|
||||||
'\app(\'\')',
|
'\App::make(0)',
|
||||||
|
'\App::makeWith(0)',
|
||||||
|
'\app(0)',
|
||||||
|
'\resolve(0)',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -90,7 +93,7 @@ class MetaCommand extends Command
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$content = $this->view->make('ide-helper::meta', [
|
$content = $this->view->make('meta', [
|
||||||
'bindings' => $bindings,
|
'bindings' => $bindings,
|
||||||
'methods' => $this->methods,
|
'methods' => $this->methods,
|
||||||
])->render();
|
])->render();
|
||||||
|
|||||||
@@ -50,11 +50,16 @@ class ModelsCommand extends Command
|
|||||||
*/
|
*/
|
||||||
protected $description = 'Generate autocompletion for models';
|
protected $description = 'Generate autocompletion for models';
|
||||||
|
|
||||||
|
protected $write_model_magic_where;
|
||||||
protected $properties = array();
|
protected $properties = array();
|
||||||
protected $methods = array();
|
protected $methods = array();
|
||||||
protected $write = false;
|
protected $write = false;
|
||||||
protected $dirs = array();
|
protected $dirs = array();
|
||||||
protected $reset;
|
protected $reset;
|
||||||
|
/**
|
||||||
|
* @var bool[string]
|
||||||
|
*/
|
||||||
|
protected $nullableColumns = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Filesystem $files
|
* @param Filesystem $files
|
||||||
@@ -81,6 +86,7 @@ class ModelsCommand extends Command
|
|||||||
$model = $this->argument('model');
|
$model = $this->argument('model');
|
||||||
$ignore = $this->option('ignore');
|
$ignore = $this->option('ignore');
|
||||||
$this->reset = $this->option('reset');
|
$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 filename is default and Write is not specified, ask what to do
|
||||||
if (!$this->write && $filename === $this->filename && !$this->option('nowrite')) {
|
if (!$this->write && $filename === $this->filename && !$this->option('nowrite')) {
|
||||||
@@ -175,7 +181,8 @@ class ModelsCommand extends Command
|
|||||||
// handle abstract classes, interfaces, ...
|
// handle abstract classes, interfaces, ...
|
||||||
$reflectionClass = new \ReflectionClass($name);
|
$reflectionClass = new \ReflectionClass($name);
|
||||||
|
|
||||||
if (!$reflectionClass->isSubclassOf('Illuminate\Database\Eloquent\Model')) {
|
if (!$reflectionClass->isSubclassOf('Illuminate\Database\Eloquent\Model')
|
||||||
|
|| $reflectionClass->isSubclassOf('Illuminate\Database\Eloquent\Relations\Pivot')) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,8 +206,10 @@ class ModelsCommand extends Command
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->getPropertiesFromMethods($model);
|
$this->getPropertiesFromMethods($model);
|
||||||
$output .= $this->createPhpDocs($name);
|
$this->getSoftDeleteMethods($model);
|
||||||
$ignore[] = $name;
|
$output .= $this->createPhpDocs($name);
|
||||||
|
$ignore[] = $name;
|
||||||
|
$this->nullableColumns = [];
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$this->error("Exception: " . $e->getMessage() . "\nCould not analyze class $name.");
|
$this->error("Exception: " . $e->getMessage() . "\nCould not analyze class $name.");
|
||||||
}
|
}
|
||||||
@@ -346,13 +355,21 @@ class ModelsCommand extends Command
|
|||||||
case 'smallint':
|
case 'smallint':
|
||||||
$type = 'integer';
|
$type = 'integer';
|
||||||
break;
|
break;
|
||||||
|
case 'boolean':
|
||||||
|
switch (config('database.default')) {
|
||||||
|
case 'sqlite':
|
||||||
|
case 'mysql':
|
||||||
|
$type = 'integer';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$type = 'boolean';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'decimal':
|
case 'decimal':
|
||||||
case 'float':
|
case 'float':
|
||||||
$type = 'float';
|
$type = 'float';
|
||||||
break;
|
break;
|
||||||
case 'boolean':
|
|
||||||
$type = 'boolean';
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
$type = 'mixed';
|
$type = 'mixed';
|
||||||
break;
|
break;
|
||||||
@@ -360,12 +377,17 @@ class ModelsCommand extends Command
|
|||||||
}
|
}
|
||||||
|
|
||||||
$comment = $column->getComment();
|
$comment = $column->getComment();
|
||||||
$this->setProperty($name, $type, true, true, $comment);
|
if (!$column->getNotnull()) {
|
||||||
$this->setMethod(
|
$this->nullableColumns[$name] = true;
|
||||||
Str::camel("where_" . $name),
|
}
|
||||||
'\Illuminate\Database\Query\Builder|\\' . get_class($model),
|
$this->setProperty($name, $type, true, true, $comment, !$column->getNotnull());
|
||||||
array('$value')
|
if ($this->write_model_magic_where) {
|
||||||
);
|
$this->setMethod(
|
||||||
|
Str::camel("where_" . $name),
|
||||||
|
'\Illuminate\Database\Eloquent\Builder|\\' . get_class($model),
|
||||||
|
array('$value')
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -409,7 +431,7 @@ class ModelsCommand extends Command
|
|||||||
$args = $this->getParameters($reflection);
|
$args = $this->getParameters($reflection);
|
||||||
//Remove the first ($query) argument
|
//Remove the first ($query) argument
|
||||||
array_shift($args);
|
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)
|
} elseif (!method_exists('Illuminate\Database\Eloquent\Model', $method)
|
||||||
&& !Str::startsWith($method, 'get')
|
&& !Str::startsWith($method, 'get')
|
||||||
@@ -467,7 +489,14 @@ class ModelsCommand extends Command
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
//Single model is returned
|
//Single model is returned
|
||||||
$this->setProperty($method, $relatedModel, true, null);
|
$this->setProperty(
|
||||||
|
$method,
|
||||||
|
$relatedModel,
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
'',
|
||||||
|
$this->isRelationForeignKeyNullable($relationObj)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -478,13 +507,33 @@ class ModelsCommand extends Command
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $name
|
* Check if the foreign key of the relation is nullable
|
||||||
* @param string|null $type
|
*
|
||||||
* @param bool|null $read
|
* @param Relation $relation
|
||||||
* @param bool|null $write
|
*
|
||||||
* @param string|null $comment
|
* @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])) {
|
if (!isset($this->properties[$name])) {
|
||||||
$this->properties[$name] = array();
|
$this->properties[$name] = array();
|
||||||
@@ -494,7 +543,11 @@ class ModelsCommand extends Command
|
|||||||
$this->properties[$name]['comment'] = (string) $comment;
|
$this->properties[$name]['comment'] = (string) $comment;
|
||||||
}
|
}
|
||||||
if ($type !== null) {
|
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) {
|
if ($read !== null) {
|
||||||
$this->properties[$name]['read'] = $read;
|
$this->properties[$name]['read'] = $read;
|
||||||
@@ -689,9 +742,26 @@ class ModelsCommand extends Command
|
|||||||
$phpdoc = new DocBlock($reflection);
|
$phpdoc = new DocBlock($reflection);
|
||||||
|
|
||||||
if ($phpdoc->hasTag('return')) {
|
if ($phpdoc->hasTag('return')) {
|
||||||
$type = $phpdoc->getTagsByName('return')[0]->getContent();
|
$type = $phpdoc->getTagsByName('return')[0]->getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $type;
|
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), []);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+36
-15
@@ -12,7 +12,7 @@ namespace Barryvdh\LaravelIdeHelper;
|
|||||||
|
|
||||||
use Illuminate\Foundation\Application;
|
use Illuminate\Foundation\Application;
|
||||||
use Illuminate\Foundation\AliasLoader;
|
use Illuminate\Foundation\AliasLoader;
|
||||||
use Illuminate\Config\Repository as ConfigRepository;
|
use Illuminate\Support\Collection;
|
||||||
use ReflectionClass;
|
use ReflectionClass;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
|
||||||
@@ -80,18 +80,19 @@ class Generator
|
|||||||
public function generatePhpHelper()
|
public function generatePhpHelper()
|
||||||
{
|
{
|
||||||
$app = app();
|
$app = app();
|
||||||
return $this->view->make('ide-helper::helper')
|
return $this->view->make('helper')
|
||||||
->with('namespaces', $this->getNamespaces())
|
->with('namespaces_by_extends_ns', $this->getAliasesByExtendsNamespace())
|
||||||
|
->with('namespaces_by_alias_ns', $this->getAliasesByAliasNamespace())
|
||||||
->with('helpers', $this->helpers)
|
->with('helpers', $this->helpers)
|
||||||
->with('version', $app->version())
|
->with('version', $app->version())
|
||||||
->with('include_fluent', $this->config->get('ide-helper.include_fluent', false))
|
->with('include_fluent', $this->config->get('ide-helper.include_fluent', true))
|
||||||
->render();
|
->render();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generateJsonHelper()
|
public function generateJsonHelper()
|
||||||
{
|
{
|
||||||
$classes = array();
|
$classes = array();
|
||||||
foreach ($this->getNamespaces() as $aliases) {
|
foreach ($this->getValidAliases() as $aliases) {
|
||||||
foreach ($aliases as $alias) {
|
foreach ($aliases as $alias) {
|
||||||
$functions = array();
|
$functions = array();
|
||||||
foreach ($alias->getMethods() as $method) {
|
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
|
// Get all aliases
|
||||||
foreach ($this->getAliases() as $name => $facade) {
|
foreach ($this->getAliases() as $name => $facade) {
|
||||||
@@ -209,15 +210,35 @@ class Generator
|
|||||||
$alias->addClass($this->extra[$name]);
|
$alias->addClass($this->extra[$name]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$namespace = $alias->getExtendsNamespace() ?: $alias->getNamespace();
|
$aliases[] = $alias;
|
||||||
if (!isset($namespaces[$namespace])) {
|
|
||||||
$namespaces[$namespace] = array();
|
|
||||||
}
|
|
||||||
$namespaces[$namespace][] = $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()
|
protected function getAliases()
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ use Illuminate\Support\ServiceProvider;
|
|||||||
use Barryvdh\LaravelIdeHelper\Console\MetaCommand;
|
use Barryvdh\LaravelIdeHelper\Console\MetaCommand;
|
||||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||||
use Barryvdh\LaravelIdeHelper\Console\GeneratorCommand;
|
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
|
class IdeHelperServiceProvider extends ServiceProvider
|
||||||
{
|
{
|
||||||
@@ -53,11 +57,12 @@ class IdeHelperServiceProvider extends ServiceProvider
|
|||||||
{
|
{
|
||||||
$configPath = __DIR__ . '/../config/ide-helper.php';
|
$configPath = __DIR__ . '/../config/ide-helper.php';
|
||||||
$this->mergeConfigFrom($configPath, 'ide-helper');
|
$this->mergeConfigFrom($configPath, 'ide-helper');
|
||||||
|
$localViewFactory = $this->createLocalViewFactory();
|
||||||
|
|
||||||
$this->app->singleton(
|
$this->app->singleton(
|
||||||
'command.ide-helper.generate',
|
'command.ide-helper.generate',
|
||||||
function ($app) {
|
function ($app) use ($localViewFactory) {
|
||||||
return new GeneratorCommand($app['config'], $app['files'], $app['view']);
|
return new GeneratorCommand($app['config'], $app['files'], $localViewFactory);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -70,8 +75,8 @@ class IdeHelperServiceProvider extends ServiceProvider
|
|||||||
|
|
||||||
$this->app->singleton(
|
$this->app->singleton(
|
||||||
'command.ide-helper.meta',
|
'command.ide-helper.meta',
|
||||||
function ($app) {
|
function ($app) use ($localViewFactory) {
|
||||||
return new MetaCommand($app['files'], $app['view']);
|
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 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