Skip to content

Commit 561301a

Browse files
sstutzStefan Stutz
authored and
Stefan Stutz
committed
fix: load entity factories
1 parent 04915c1 commit 561301a

File tree

7 files changed

+114
-1
lines changed

7 files changed

+114
-1
lines changed

Diff for: .gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ composer.lock
1111
/tests/Stubs/storage/doctrine.generated.php
1212
.idea
1313
laravel-doctrine-orm.iml
14+
/workbench/bootstrap/cache/*
15+
/workbench/storage/logs/*

Diff for: src/DoctrineServiceProvider.php

+18
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,15 @@
3131
use LaravelDoctrine\ORM\Exceptions\ExtensionNotFound;
3232
use LaravelDoctrine\ORM\Extensions\ExtensionManager;
3333
use LaravelDoctrine\ORM\Notifications\DoctrineChannel;
34+
use LaravelDoctrine\ORM\Testing\Factory as EntityFactory;
3435
use LaravelDoctrine\ORM\Validation\PresenceVerifierProvider;
3536

3637
use function assert;
3738
use function class_exists;
3839
use function config;
3940
use function config_path;
41+
use function database_path;
42+
use function fake;
4043

4144
class DoctrineServiceProvider extends ServiceProvider
4245
{
@@ -68,6 +71,7 @@ public function register(): void
6871
$this->registerExtensions();
6972
$this->registerConsoleCommands();
7073
$this->registerCustomTypes();
74+
$this->registerEntityFactory();
7175
$this->registerProxyAutoloader();
7276

7377
if (! $this->shouldRegisterDoctrinePresenceValidator()) {
@@ -270,6 +274,20 @@ public function extendNotificationChannel(): void
270274
});
271275
}
272276

277+
/**
278+
* Register the Entity factory instance in the container.
279+
*/
280+
protected function registerEntityFactory(): void
281+
{
282+
$this->app->singleton(EntityFactory::class, static function ($app) {
283+
return EntityFactory::construct(
284+
fake(),
285+
$app->make('registry'),
286+
database_path('factories'),
287+
);
288+
});
289+
}
290+
273291
/**
274292
* Register proxy autoloader
275293
*/

Diff for: testbench.yaml

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
providers:
22
- LaravelDoctrine\ORM\DoctrineServiceProvider
33

4+
laravel: ./workbench
45
workbench:
56
start: '/'
67
install: true
78
health: false
89
discovers:
9-
web: fale
10+
web: false
1011
api: false
1112
commands: false
1213
components: false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace LaravelDoctrineTest\ORM\Feature;
6+
7+
use Doctrine\ORM\Configuration;
8+
use Doctrine\ORM\EntityManagerInterface;
9+
use Doctrine\ORM\Mapping\ClassMetadata;
10+
use Doctrine\Persistence\ManagerRegistry;
11+
use LaravelDoctrineTest\ORM\TestCase;
12+
use Mockery as m;
13+
use Workbench\App\Entities\User;
14+
15+
use function entity;
16+
17+
class DoctrineServiceProviderEntityFactoryTest extends TestCase
18+
{
19+
public function testEntityFactory(): void
20+
{
21+
$classMetaMock = m::mock(ClassMetadata::class);
22+
$classMetaMock->expects('getAssociationMappings')->andReturn([]);
23+
24+
$emMock = m::mock(EntityManagerInterface::class);
25+
$config = new Configuration();
26+
27+
$config->setProxyDir('tmp');
28+
$config->setProxyNamespace('');
29+
30+
$config->setAutoGenerateProxyClasses(true);
31+
$emMock->expects('getConfiguration')->twice()->andReturn($config);
32+
$emMock->expects('getClassMetadata')->andReturn($classMetaMock);
33+
$mrMock = m::mock(ManagerRegistry::class);
34+
$mrMock->expects('getManagers')->andReturn([$emMock]);
35+
$mrMock->expects('getManagerForClass')->andReturn($emMock);
36+
37+
$this->app->bind('registry', static fn () => $mrMock);
38+
39+
$user = entity(User::class)->make();
40+
41+
$this->assertInstanceOf(User::class, $user);
42+
}
43+
}

Diff for: workbench/app/Entities/User.php

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Workbench\App\Entities;
6+
7+
use Doctrine\ORM\Mapping as ORM;
8+
9+
#[ORM\Entity]
10+
#[ORM\Table(name: 'users')]
11+
class User
12+
{
13+
#[ORM\Id]
14+
#[ORM\GeneratedValue]
15+
#[ORM\Column]
16+
protected int|null $id = null;
17+
18+
#[ORM\Column(name: 'name')]
19+
public string $name;
20+
21+
#[ORM\Column(name: 'email')]
22+
public string $email;
23+
24+
#[ORM\Column(name: 'password')]
25+
public string $password;
26+
27+
public function __construct(string $name, string $email, string $password)
28+
{
29+
$this->name = $name;
30+
$this->email = $email;
31+
$this->password = $password;
32+
}
33+
}
File renamed without changes.

Diff for: workbench/database/factories/UserEntityFactory.php

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace Workbench\Database\Factories;
4+
5+
use Faker\Generator;
6+
use LaravelDoctrine\ORM\Testing\Factory;
7+
use Workbench\App\Entities\User;
8+
9+
/** @var Factory $factory */
10+
$factory->define(User::class, function (Generator $faker, array $attributes = []) {
11+
return [
12+
'name' => $faker->name(),
13+
'email' => $faker->safeEmail,
14+
'password' => 'password',
15+
];
16+
});

0 commit comments

Comments
 (0)