mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 10:07:12 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
73b1012b92 | ||
|
|
ca94ffd99a | ||
|
|
c1ddd30532 | ||
|
|
dcbe6c953f | ||
|
|
867a6fd9b4 | ||
|
|
39a96c3b95 | ||
|
|
057efb0ee7 | ||
|
|
1010cdbd26 | ||
|
|
2f61602e7a | ||
|
|
9fe65e7ed3 | ||
|
|
16a4297992 |
+15
-1
@@ -2,9 +2,23 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
[Next release](https://github.com/barryvdh/laravel-ide-helper/compare/v2.9.3...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
|
||||
|
||||
@@ -301,6 +301,8 @@ class MyCustomHook implements ModelHookInterface
|
||||
}
|
||||
|
||||
$command->setProperty('custom', 'string', true, false, 'My custom property');
|
||||
$command->unsetMethod('method');
|
||||
$command->setMethod('method', $command->getMethodType($model, '\Some\Class'), ['$param']);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -749,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);
|
||||
|
||||
@@ -761,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
|
||||
@@ -1091,18 +1103,17 @@ 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);
|
||||
$modelBaseName = class_basename($modelName);
|
||||
|
||||
$factory = "\Database\Factories\\{$modelBaseName}Factory";
|
||||
|
||||
if ($modelName::newFactory()) {
|
||||
$factory = get_class($modelName::newFactory());
|
||||
} else {
|
||||
$factory = Factory::resolveFactoryName($modelName);
|
||||
}
|
||||
|
||||
$factory = '\\' . trim($factory, '\\');
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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, [
|
||||
@@ -29,4 +34,19 @@ class Test extends AbstractModelsCommand
|
||||
$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,6 +4,61 @@ declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace\ModelWithCustomNamespaceFactory;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithCustomNamespace
|
||||
*
|
||||
* @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 ModelWithCustomNamespace extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
/**
|
||||
* Create a new factory instance for the model.
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Factories\Factory
|
||||
*/
|
||||
protected static function newFactory()
|
||||
{
|
||||
return ModelWithCustomNamespaceFactory::new();
|
||||
}
|
||||
}
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
||||
@@ -19,38 +74,3 @@ class ModelWithoutFactory extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
}
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
|
||||
|
||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\SimpleFactory;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\Simple
|
||||
*
|
||||
* @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)
|
||||
* @mixin \Eloquent
|
||||
*/
|
||||
class Simple extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
/**
|
||||
* Create a new factory instance for the model.
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Factories\Factory
|
||||
*/
|
||||
protected static function newFactory()
|
||||
{
|
||||
return SimpleFactory::new();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 UnsetMethod implements ModelHookInterface
|
||||
{
|
||||
public function run(ModelsCommand $command, Model $model): void
|
||||
{
|
||||
$command->unsetMethod('query');
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,9 @@ 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;
|
||||
|
||||
@@ -24,6 +26,8 @@ class Test extends AbstractModelsCommand
|
||||
],
|
||||
'model_hooks' => [
|
||||
CustomProperty::class,
|
||||
CustomMethod::class,
|
||||
UnsetMethod::class,
|
||||
],
|
||||
]);
|
||||
}
|
||||
@@ -71,9 +75,9 @@ use Illuminate\Database\Eloquent\Model;
|
||||
*
|
||||
* @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 query()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple whereId($value)
|
||||
* @mixin \Eloquent
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user