mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-19 10:33:11 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
73b1012b92 | ||
|
|
ca94ffd99a | ||
|
|
c1ddd30532 | ||
|
|
dcbe6c953f | ||
|
|
867a6fd9b4 | ||
|
|
39a96c3b95 | ||
|
|
057efb0ee7 | ||
|
|
1010cdbd26 | ||
|
|
2f61602e7a | ||
|
|
9fe65e7ed3 | ||
|
|
16a4297992 | ||
|
|
c8ebf563a0 | ||
|
|
843067b907 | ||
|
|
f0f7051012 | ||
|
|
e1af93f43b | ||
|
|
b19b1d69ba | ||
|
|
92d7f2e706 | ||
|
|
f0c138c4fd | ||
|
|
b8d5fc3663 | ||
|
|
df994eb767 | ||
|
|
0cae143470 | ||
|
|
c2dec69d64 | ||
|
|
dedd69e8b4 | ||
|
|
40c02c524d | ||
|
|
04c1139223 | ||
|
|
172e430c12 | ||
|
|
244e936b74 | ||
|
|
f7f7e9e65a | ||
|
|
1a813703fe | ||
|
|
d58731cd9b | ||
|
|
b246d9ab23 |
+29
-2
@@ -2,12 +2,39 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
[Next release](https://github.com/barryvdh/laravel-ide-helper/compare/v2.9.1...master)
|
||||
[Next release](https://github.com/barryvdh/laravel-ide-helper/compare/v2.10.0...master)
|
||||
--------------
|
||||
|
||||
2021-04-09, 2.10.0
|
||||
------------------
|
||||
### Added
|
||||
- Allowing Methods to be set or unset in ModelHooks [\#1198 / jenga201](https://github.com/barryvdh/laravel-ide-helper/pull/1198)\
|
||||
Note: the visibility of `\Barryvdh\LaravelIdeHelper\Console\ModelsCommand::setMethod` has been changed to **public**!
|
||||
|
||||
### Fixed
|
||||
- Fixing issue where incorrect autoloader unregistered [\#1210 / tezhm](https://github.com/barryvdh/laravel-ide-helper/pull/1210)
|
||||
|
||||
2021-04-02, 2.9.3
|
||||
-----------------
|
||||
### Fixed
|
||||
- Support both customized namespace factories as well as default resolvable ones [\#1201 / wimski](https://github.com/barryvdh/laravel-ide-helper/pull/1201)
|
||||
|
||||
2021-04-01, 2.9.2
|
||||
-----------------
|
||||
### Added
|
||||
- Model hooks for adding custom information from external sources to model classes through the ModelsCommand [\#945 / wimski](https://github.com/barryvdh/laravel-ide-helper/pull/945)
|
||||
|
||||
### Fixed
|
||||
- Fix ide-helper:models exception if model doesn't have factory [\#1196 / ahmed-aliraqi](https://github.com/barryvdh/laravel-ide-helper/pull/1196)
|
||||
- Running tests triggering post_migrate hooks [\#1193 / netpok](https://github.com/barryvdh/laravel-ide-helper/pull/1193)
|
||||
- Array_merge error when config is cached prior to package install [\#1184 / netpok](https://github.com/barryvdh/laravel-ide-helper/pull/1184)
|
||||
|
||||
2021-03-15, 2.9.1
|
||||
-----------------
|
||||
### Added
|
||||
- Generate PHPDoc for Laravel 8.x factories [\#1074 / ahmed-aliraqi](https://github.com/barryvdh/laravel-ide-helper/pull/1074)
|
||||
- Add a comment to a property like table columns [\#1168 / biiiiiigmonster](https://github.com/barryvdh/laravel-ide-helper/pull/1168)
|
||||
- Added `post_migrate` hook to run commands after a migration [\#1163 / netpol](https://github.com/barryvdh/laravel-ide-helper/pull/1163)
|
||||
- Added `post_migrate` hook to run commands after a migration [\#1163 / netpok](https://github.com/barryvdh/laravel-ide-helper/pull/1163)
|
||||
|
||||
### Fixed
|
||||
- Error when generating helper for invokable classes [\#1124 / standaniels](https://github.com/barryvdh/laravel-ide-helper/pull/1124)
|
||||
|
||||
@@ -14,6 +14,9 @@ Generation is done based on the files in your project, so they are always up-to-
|
||||
- [Usage](#usage)
|
||||
- [Automatic PHPDoc generation for Laravel Facades](#automatic-phpdoc-generation-for-laravel-facades)
|
||||
- [Automatic PHPDocs for models](#automatic-phpdocs-for-models)
|
||||
- [Model Directories](#model-directories)
|
||||
- [Ignore Models](#ignore-models)
|
||||
- [Model Hooks](#model-hooks)
|
||||
- [Automatic PHPDocs generation for Laravel Fluent methods](#automatic-phpdocs-generation-for-laravel-fluent-methods)
|
||||
- [Auto-completion for factory builders](#auto-completion-for-factory-builders)
|
||||
- [PhpStorm Meta for Container instances](#phpstorm-meta-for-container-instances)
|
||||
@@ -175,6 +178,8 @@ With the `--write-mixin (-M)` option
|
||||
*/
|
||||
```
|
||||
|
||||
#### Model Directories
|
||||
|
||||
By default, models in `app/models` are scanned. The optional argument tells what models to use (also outside app/models).
|
||||
|
||||
```bash
|
||||
@@ -189,6 +194,8 @@ php artisan ide-helper:models --dir="path/to/models" --dir="app/src/Model"
|
||||
|
||||
You can publish the config file (`php artisan vendor:publish`) and set the default directories.
|
||||
|
||||
#### Ignore Models
|
||||
|
||||
Models can be ignored using the `--ignore (-I)` option
|
||||
|
||||
```bash
|
||||
@@ -270,6 +277,44 @@ For those special cases, you can map them via the config `custom_db_types`. Exam
|
||||
],
|
||||
```
|
||||
|
||||
#### Model Hooks
|
||||
|
||||
If you need additional information on your model from sources that are not handled by default, you can hook in to the
|
||||
generation process with model hooks to add extra information on the fly.
|
||||
Simply create a class that implements `ModelHookInterface` and add it to the `model_hooks` array in the config:
|
||||
|
||||
```php
|
||||
'model_hooks' => [
|
||||
MyCustomHook::class,
|
||||
],
|
||||
```
|
||||
|
||||
The `run` method will be called during generation for every model and receives the current running `ModelsCommand` and the current `Model`, e.g.:
|
||||
|
||||
```php
|
||||
class MyCustomHook implements ModelHookInterface
|
||||
{
|
||||
public function run(ModelsCommand $command, Model $model): void
|
||||
{
|
||||
if (! $model instanceof MyModel) {
|
||||
return;
|
||||
}
|
||||
|
||||
$command->setProperty('custom', 'string', true, false, 'My custom property');
|
||||
$command->unsetMethod('method');
|
||||
$command->setMethod('method', $command->getMethodType($model, '\Some\Class'), ['$param']);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```php
|
||||
/**
|
||||
* MyModel
|
||||
*
|
||||
* @property integer $id
|
||||
* @property-read string $custom
|
||||
```
|
||||
|
||||
### Automatic PHPDocs generation for Laravel Fluent methods
|
||||
|
||||
If you need PHPDocs support for Fluent methods in migration, for example
|
||||
|
||||
@@ -144,6 +144,21 @@ return [
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Models hooks
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Define which hook classes you want to run for models to add custom information
|
||||
|
|
||||
| Hooks should implement Barryvdh\LaravelIdeHelper\Contracts\ModelHookInterface.
|
||||
|
|
||||
*/
|
||||
|
||||
'model_hooks' => [
|
||||
// App\Support\IdeHelper\MyModelHook::class
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Extra classes
|
||||
|
||||
@@ -17,9 +17,4 @@
|
||||
<code>\Storage</code>
|
||||
</UndefinedClass>
|
||||
</file>
|
||||
<file src="src/IdeHelperServiceProvider.php">
|
||||
<TooFewArguments occurrences="1">
|
||||
<code>new PhpEngine()</code>
|
||||
</TooFewArguments>
|
||||
</file>
|
||||
</files>
|
||||
|
||||
@@ -84,7 +84,7 @@ class MetaCommand extends Command
|
||||
// Needs to run before exception handler is registered
|
||||
$factories = $this->config->get('ide-helper.include_factory_builders') ? Factories::all() : [];
|
||||
|
||||
$this->registerClassAutoloadExceptions();
|
||||
$ourAutoloader = $this->registerClassAutoloadExceptions();
|
||||
|
||||
$bindings = [];
|
||||
foreach ($this->getAbstracts() as $abstract) {
|
||||
@@ -106,7 +106,7 @@ class MetaCommand extends Command
|
||||
}
|
||||
}
|
||||
|
||||
$this->unregisterClassAutoloadExceptions();
|
||||
$this->unregisterClassAutoloadExceptions($ourAutoloader);
|
||||
|
||||
$content = $this->view->make('meta', [
|
||||
'bindings' => $bindings,
|
||||
@@ -143,12 +143,16 @@ class MetaCommand extends Command
|
||||
|
||||
/**
|
||||
* Register an autoloader the throws exceptions when a class is not found.
|
||||
*
|
||||
* @return callable
|
||||
*/
|
||||
protected function registerClassAutoloadExceptions()
|
||||
protected function registerClassAutoloadExceptions(): callable
|
||||
{
|
||||
spl_autoload_register(function ($class) {
|
||||
$autoloader = function ($class) {
|
||||
throw new \ReflectionException("Class '$class' not found.");
|
||||
});
|
||||
};
|
||||
spl_autoload_register($autoloader);
|
||||
return $autoloader;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -167,11 +171,11 @@ class MetaCommand extends Command
|
||||
|
||||
/**
|
||||
* Remove our custom autoloader that we pushed onto the autoload stack
|
||||
*
|
||||
* @param callable $ourAutoloader
|
||||
*/
|
||||
private function unregisterClassAutoloadExceptions()
|
||||
private function unregisterClassAutoloadExceptions(callable $ourAutoloader): void
|
||||
{
|
||||
$autoloadFunctions = spl_autoload_functions();
|
||||
$ourAutoloader = array_pop($autoloadFunctions);
|
||||
spl_autoload_unregister($ourAutoloader);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Console;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Contracts\ModelHookInterface;
|
||||
use Barryvdh\Reflection\DocBlock;
|
||||
use Barryvdh\Reflection\DocBlock\Context;
|
||||
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
|
||||
@@ -279,6 +280,9 @@ class ModelsCommand extends Command
|
||||
$this->getSoftDeleteMethods($model);
|
||||
$this->getCollectionMethods($model);
|
||||
$this->getFactoryMethods($model);
|
||||
|
||||
$this->runModelHooks($model);
|
||||
|
||||
$output .= $this->createPhpDocs($name);
|
||||
$ignore[] = $name;
|
||||
$this->nullableColumns = [];
|
||||
@@ -336,7 +340,7 @@ class ModelsCommand extends Command
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Model $model
|
||||
*/
|
||||
protected function castPropertiesType($model)
|
||||
public function castPropertiesType($model)
|
||||
{
|
||||
$casts = $model->getCasts();
|
||||
foreach ($casts as $name => $type) {
|
||||
@@ -412,7 +416,7 @@ class ModelsCommand extends Command
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Model $model
|
||||
*/
|
||||
protected function getPropertiesFromTable($model)
|
||||
public function getPropertiesFromTable($model)
|
||||
{
|
||||
$table = $model->getConnection()->getTablePrefix() . $model->getTable();
|
||||
$schema = $model->getConnection()->getDoctrineSchemaManager();
|
||||
@@ -509,7 +513,7 @@ class ModelsCommand extends Command
|
||||
/**
|
||||
* @param \Illuminate\Database\Eloquent\Model $model
|
||||
*/
|
||||
protected function getPropertiesFromMethods($model)
|
||||
public function getPropertiesFromMethods($model)
|
||||
{
|
||||
$methods = get_class_methods($model);
|
||||
if ($methods) {
|
||||
@@ -721,7 +725,7 @@ class ModelsCommand extends Command
|
||||
* @param string|null $comment
|
||||
* @param bool $nullable
|
||||
*/
|
||||
protected function setProperty($name, $type = null, $read = null, $write = null, $comment = '', $nullable = false)
|
||||
public function setProperty($name, $type = null, $read = null, $write = null, $comment = '', $nullable = false)
|
||||
{
|
||||
if (!isset($this->properties[$name])) {
|
||||
$this->properties[$name] = [];
|
||||
@@ -745,7 +749,7 @@ class ModelsCommand extends Command
|
||||
}
|
||||
}
|
||||
|
||||
protected function setMethod($name, $type = '', $arguments = [], $comment = '')
|
||||
public function setMethod($name, $type = '', $arguments = [], $comment = '')
|
||||
{
|
||||
$methods = array_change_key_case($this->methods, CASE_LOWER);
|
||||
|
||||
@@ -757,6 +761,18 @@ class ModelsCommand extends Command
|
||||
}
|
||||
}
|
||||
|
||||
public function unsetMethod($name)
|
||||
{
|
||||
unset($this->methods[strtolower($name)]);
|
||||
}
|
||||
|
||||
public function getMethodType(Model $model, string $classType)
|
||||
{
|
||||
$modelName = $this->getClassNameInDestinationFile($model, get_class($model));
|
||||
$builder = $this->getClassNameInDestinationFile($model, $classType);
|
||||
return $builder . '|' . $modelName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $class
|
||||
* @return string
|
||||
@@ -1087,13 +1103,19 @@ class ModelsCommand extends Command
|
||||
return;
|
||||
}
|
||||
|
||||
$traits = class_uses(get_class($model), true);
|
||||
$modelName = get_class($model);
|
||||
|
||||
$traits = class_uses($modelName, true);
|
||||
if (!in_array('Illuminate\\Database\\Eloquent\\Factories\\HasFactory', $traits)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$modelName = get_class($model);
|
||||
$factory = get_class($modelName::factory());
|
||||
if ($modelName::newFactory()) {
|
||||
$factory = get_class($modelName::newFactory());
|
||||
} else {
|
||||
$factory = Factory::resolveFactoryName($modelName);
|
||||
}
|
||||
|
||||
$factory = '\\' . trim($factory, '\\');
|
||||
|
||||
if (!class_exists($factory)) {
|
||||
@@ -1351,4 +1373,26 @@ class ModelsCommand extends Command
|
||||
|
||||
return $parameterName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Database\Eloquent\Model $model
|
||||
* @throws \Illuminate\Contracts\Container\BindingResolutionException
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
protected function runModelHooks($model): void
|
||||
{
|
||||
$hooks = $this->laravel['config']->get('ide-helper.model_hooks', []);
|
||||
|
||||
foreach ($hooks as $hook) {
|
||||
$hookInstance = $this->laravel->make($hook);
|
||||
|
||||
if (!$hookInstance instanceof ModelHookInterface) {
|
||||
throw new \RuntimeException(
|
||||
'Your IDE helper model hook must implement Barryvdh\LaravelIdeHelper\Contracts\ModelHookInterface'
|
||||
);
|
||||
}
|
||||
|
||||
$hookInstance->run($this, $model);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Contracts;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
interface ModelHookInterface
|
||||
{
|
||||
public function run(ModelsCommand $command, Model $model): void;
|
||||
}
|
||||
+3
-3
@@ -54,9 +54,9 @@ class Generator
|
||||
// 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'));
|
||||
$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, '\\');
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper;
|
||||
|
||||
class Helpers
|
||||
{
|
||||
public static function isLaravel(): bool
|
||||
{
|
||||
return class_exists('Illuminate\Foundation\Application');
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,6 @@ use Barryvdh\LaravelIdeHelper\Listeners\GenerateModelHelper;
|
||||
use Illuminate\Console\Events\CommandFinished;
|
||||
use Illuminate\Contracts\Support\DeferrableProvider;
|
||||
use Illuminate\Database\Events\MigrationsEnded;
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\View\Engines\EngineResolver;
|
||||
use Illuminate\View\Engines\PhpEngine;
|
||||
@@ -35,7 +34,7 @@ class IdeHelperServiceProvider extends ServiceProvider implements DeferrableProv
|
||||
*/
|
||||
public function boot()
|
||||
{
|
||||
if ($this->app['config']->get('ide-helper.post_migrate', [])) {
|
||||
if (!$this->app->runningUnitTests() && $this->app['config']->get('ide-helper.post_migrate', [])) {
|
||||
$this->app['events']->listen(CommandFinished::class, GenerateModelHelper::class);
|
||||
$this->app['events']->listen(MigrationsEnded::class, function () {
|
||||
GenerateModelHelper::$shouldRun = true;
|
||||
@@ -120,10 +119,6 @@ class IdeHelperServiceProvider extends ServiceProvider implements DeferrableProv
|
||||
{
|
||||
$resolver = new EngineResolver();
|
||||
$resolver->register('php', function () {
|
||||
if (Helpers::isLaravel() && (int) Application::VERSION < 8) {
|
||||
return new PhpEngine();
|
||||
}
|
||||
|
||||
return new PhpEngine($this->app['files']);
|
||||
});
|
||||
$finder = new FileViewFinder($this->app['files'], [__DIR__ . '/../resources/views']);
|
||||
|
||||
@@ -8,6 +8,7 @@ use Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\TestCase;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
use Mockery\MockInterface;
|
||||
use stdClass;
|
||||
|
||||
class MetaCommandTest extends TestCase
|
||||
{
|
||||
@@ -37,6 +38,38 @@ class MetaCommandTest extends TestCase
|
||||
self::assertStringContainsString('override(', $this->mockFilesystemOutput);
|
||||
}
|
||||
|
||||
public function testUnregisterAutoloader(): void
|
||||
{
|
||||
$current = spl_autoload_functions();
|
||||
$appended = function () {
|
||||
};
|
||||
|
||||
$this->app->bind('registers-autoloader', function () use ($appended) {
|
||||
spl_autoload_register($appended);
|
||||
return new stdClass();
|
||||
});
|
||||
|
||||
$this->mockFilesystem();
|
||||
|
||||
/** @var Filesystem|MockInterface $mockFileSystem */
|
||||
$mockFileSystem = $this->app->make(Filesystem::class);
|
||||
$this->instance('files', $mockFileSystem);
|
||||
|
||||
$mockFileSystem
|
||||
->shouldReceive('getRequire')
|
||||
->andReturnUsing(function ($__path, $__data) {
|
||||
return (static function () use ($__path, $__data) {
|
||||
extract($__data, EXTR_SKIP);
|
||||
|
||||
return require $__path;
|
||||
})();
|
||||
});
|
||||
|
||||
$this->artisan('ide-helper:meta');
|
||||
|
||||
self::assertSame(array_merge($current, [$appended]), spl_autoload_functions());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get package providers.
|
||||
*
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithCustomNamespace;
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
class ModelWithCustomNamespaceFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* The name of the factory's corresponding model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $model = ModelWithCustomNamespace::class;
|
||||
|
||||
/**
|
||||
* Define the model's default state.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function definition()
|
||||
{
|
||||
return [
|
||||
//
|
||||
];
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -4,17 +4,17 @@ declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Getter\Models\Simple;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithFactory;
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
class SimpleFactory extends Factory
|
||||
class ModelWithFactoryFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* The name of the factory's corresponding model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $model = Simple::class;
|
||||
protected $model = ModelWithFactory::class;
|
||||
|
||||
/**
|
||||
* Define the model's default state.
|
||||
+3
-3
@@ -4,11 +4,11 @@ declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\SimpleFactory;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace\ModelWithCustomNamespaceFactory;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Simple extends Model
|
||||
class ModelWithCustomNamespace extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
@@ -19,6 +19,6 @@ class Simple extends Model
|
||||
*/
|
||||
protected static function newFactory()
|
||||
{
|
||||
return SimpleFactory::new();
|
||||
return ModelWithCustomNamespaceFactory::new();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class ModelWithFactory extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class ModelWithoutFactory extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
}
|
||||
@@ -6,7 +6,10 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
|
||||
use Closure;
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class Test extends AbstractModelsCommand
|
||||
{
|
||||
@@ -18,6 +21,8 @@ class Test extends AbstractModelsCommand
|
||||
);
|
||||
}
|
||||
|
||||
Factory::guessFactoryNamesUsing(static::getFactoryNameResolver());
|
||||
|
||||
$command = $this->app->make(ModelsCommand::class);
|
||||
|
||||
$tester = $this->runCommand($command, [
|
||||
@@ -26,6 +31,22 @@ class Test extends AbstractModelsCommand
|
||||
|
||||
$this->assertSame(0, $tester->getStatusCode());
|
||||
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
|
||||
$this->assertStringNotContainsString('not found', $tester->getDisplay());
|
||||
$this->assertMatchesMockedSnapshot();
|
||||
}
|
||||
|
||||
public static function getFactoryNameResolver(): Closure
|
||||
{
|
||||
// This mimics the default resolver, but with adjusted test namespaces.
|
||||
// Illuminate\Database\Eloquent\Factories\Factory::resolveFactoryName
|
||||
return function (string $modelName): string {
|
||||
$appNamespace = 'Barryvdh\\LaravelIdeHelper\\Tests\\Console\\ModelsCommand\\Factories\\';
|
||||
|
||||
$modelName = Str::startsWith($modelName, $appNamespace . 'Models\\')
|
||||
? Str::after($modelName, $appNamespace . 'Models\\')
|
||||
: Str::after($modelName, $appNamespace);
|
||||
|
||||
return $appNamespace . 'Factories\\' . $modelName . 'Factory';
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,22 +4,20 @@ declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\SimpleFactory;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace\ModelWithCustomNamespaceFactory;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\Simple
|
||||
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithCustomNamespace
|
||||
*
|
||||
* @property integer $id
|
||||
* @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\SimpleFactory factory(...$parameters)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple newModelQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple newQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple query()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple whereId($value)
|
||||
* @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace\ModelWithCustomNamespaceFactory factory(...$parameters)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithCustomNamespace newModelQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithCustomNamespace newQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithCustomNamespace query()
|
||||
* @mixin \Eloquent
|
||||
*/
|
||||
class Simple extends Model
|
||||
class ModelWithCustomNamespace extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
@@ -30,6 +28,49 @@ class Simple extends Model
|
||||
*/
|
||||
protected static function newFactory()
|
||||
{
|
||||
return SimpleFactory::new();
|
||||
return ModelWithCustomNamespaceFactory::new();
|
||||
}
|
||||
}
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithFactory
|
||||
*
|
||||
* @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\ModelWithFactoryFactory factory(...$parameters)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithFactory newModelQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithFactory newQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithFactory query()
|
||||
* @mixin \Eloquent
|
||||
*/
|
||||
class ModelWithFactory extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
}
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithoutFactory
|
||||
*
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithoutFactory newModelQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithoutFactory newQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithoutFactory query()
|
||||
* @mixin \Eloquent
|
||||
*/
|
||||
class ModelWithoutFactory extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Contracts\ModelHookInterface;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class CustomMethod implements ModelHookInterface
|
||||
{
|
||||
public function run(ModelsCommand $command, Model $model): void
|
||||
{
|
||||
$command->setMethod('custom', $command->getMethodType($model, Builder::class), ['$custom']);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Contracts\ModelHookInterface;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class CustomProperty implements ModelHookInterface
|
||||
{
|
||||
public function run(ModelsCommand $command, Model $model): void
|
||||
{
|
||||
$command->setProperty('custom', 'string', true, false);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Contracts\ModelHookInterface;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class UnsetMethod implements ModelHookInterface
|
||||
{
|
||||
public function run(ModelsCommand $command, Model $model): void
|
||||
{
|
||||
$command->unsetMethod('query');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Simple extends Model
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks\CustomMethod;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks\CustomProperty;
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Hooks\UnsetMethod;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
use Mockery;
|
||||
|
||||
class Test extends AbstractModelsCommand
|
||||
{
|
||||
protected function getEnvironmentSetUp($app)
|
||||
{
|
||||
parent::getEnvironmentSetUp($app);
|
||||
|
||||
$app['config']->set('ide-helper', [
|
||||
'model_locations' => [
|
||||
// This is calculated from the base_path() which points to
|
||||
// vendor/orchestra/testbench-core/laravel
|
||||
'/../../../../tests/Console/ModelsCommand/ModelHooks/Models',
|
||||
],
|
||||
'model_hooks' => [
|
||||
CustomProperty::class,
|
||||
CustomMethod::class,
|
||||
UnsetMethod::class,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function test(): void
|
||||
{
|
||||
$actualContent = null;
|
||||
|
||||
$mockFilesystem = Mockery::mock(Filesystem::class);
|
||||
$mockFilesystem
|
||||
->shouldReceive('get')
|
||||
->andReturn(file_get_contents(__DIR__ . '/Models/Simple.php'))
|
||||
->once();
|
||||
$mockFilesystem
|
||||
->shouldReceive('put')
|
||||
->with(
|
||||
Mockery::any(),
|
||||
Mockery::capture($actualContent)
|
||||
)
|
||||
->andReturn(1) // Simulate we wrote _something_ to the file
|
||||
->once();
|
||||
|
||||
$this->instance(Filesystem::class, $mockFilesystem);
|
||||
|
||||
$command = $this->app->make(ModelsCommand::class);
|
||||
|
||||
$tester = $this->runCommand($command, [
|
||||
'--write' => true,
|
||||
]);
|
||||
|
||||
$this->assertSame(0, $tester->getStatusCode());
|
||||
$this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay());
|
||||
|
||||
$expectedContent = <<<'PHP'
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\ModelHooks\Models\Simple
|
||||
*
|
||||
* @property int $id
|
||||
* @property-read string $custom
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple custom($custom)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple newModelQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple newQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple whereId($value)
|
||||
* @mixin \Eloquent
|
||||
*/
|
||||
class Simple extends Model
|
||||
{
|
||||
}
|
||||
|
||||
PHP;
|
||||
|
||||
$this->assertSame($expectedContent, $actualContent);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user