Skip to content
This repository was archived by the owner on Aug 27, 2024. It is now read-only.

Commit 0edd480

Browse files
authored
Merge pull request #15 from Saritasa/feature/use-container-resolver-in-factory
Use container resolver for all built repositories in default factory
2 parents 153fcb2 + e4767bd commit 0edd480

File tree

3 files changed

+62
-8
lines changed

3 files changed

+62
-8
lines changed

src/Contracts/IRepositoryFactory.php

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Saritasa\LaravelRepositories\Contracts;
44

5+
use Illuminate\Contracts\Container\BindingResolutionException;
56
use Saritasa\LaravelRepositories\Exceptions\RepositoryException;
67
use Saritasa\LaravelRepositories\Exceptions\RepositoryRegisterException;
78

@@ -18,6 +19,7 @@ interface IRepositoryFactory
1819
* @return IRepository
1920
*
2021
* @throws RepositoryException
22+
* @throws BindingResolutionException
2123
*/
2224
public function getRepository(string $modelClass): IRepository;
2325

src/Repositories/RepositoryFactory.php

+29-5
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
namespace Saritasa\LaravelRepositories\Repositories;
44

5+
use Illuminate\Contracts\Container\BindingResolutionException;
6+
use Illuminate\Contracts\Container\Container;
57
use Illuminate\Database\Eloquent\Model;
68
use Saritasa\LaravelRepositories\Contracts\IRepository;
79
use Saritasa\LaravelRepositories\Contracts\IRepositoryFactory;
8-
use Saritasa\LaravelRepositories\Exceptions\RepositoryException;
910
use Saritasa\LaravelRepositories\Exceptions\RepositoryRegisterException;
1011

1112
/**
@@ -27,6 +28,24 @@ class RepositoryFactory implements IRepositoryFactory
2728
*/
2829
protected $sharedInstances = [];
2930

31+
/**
32+
* DI container instance.
33+
*
34+
* @var Container
35+
*/
36+
protected $container;
37+
38+
/**
39+
* Builds repositories for managing models.
40+
*
41+
* @param Container $container DI container instance
42+
*/
43+
public function __construct(Container $container)
44+
{
45+
$this->container = $container;
46+
}
47+
48+
3049
/** {@inheritdoc} */
3150
public function getRepository(string $modelClass): IRepository
3251
{
@@ -44,15 +63,20 @@ public function getRepository(string $modelClass): IRepository
4463
*
4564
* @return IRepository
4665
*
47-
* @throws RepositoryException
66+
* @throws BindingResolutionException
4867
*/
4968
protected function build(string $modelClass): IRepository
5069
{
51-
if (isset($this->registeredRepositories[$modelClass])) {
52-
return new $this->registeredRepositories[$modelClass]($modelClass);
70+
$repositoryClass = $this->registeredRepositories[$modelClass] ?? Repository::class;
71+
72+
$parameters = [];
73+
74+
if ($repositoryClass === Repository::class || is_subclass_of($repositoryClass, Repository::class)
75+
) {
76+
$parameters = ['modelClass' => $modelClass];
5377
}
5478

55-
return new Repository($modelClass);
79+
return $this->container->make($repositoryClass, $parameters);
5680
}
5781

5882
/** {@inheritdoc} */

tests/RepositoryFactoryTest.php

+31-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22

33
namespace Saritasa\LaravelRepositories\Tests;
44

5+
use Illuminate\Contracts\Container\BindingResolutionException;
6+
use Illuminate\Contracts\Container\Container;
57
use Illuminate\Database\Eloquent\Model;
8+
use Mockery;
9+
use Mockery\MockInterface;
610
use PHPUnit\Framework\TestCase;
11+
use Saritasa\LaravelRepositories\Contracts\IRepository;
712
use Saritasa\LaravelRepositories\Exceptions\RepositoryException;
813
use Saritasa\LaravelRepositories\Exceptions\RepositoryRegisterException;
914
use Saritasa\LaravelRepositories\Repositories\Repository;
@@ -15,6 +20,24 @@
1520
*/
1621
class RepositoryFactoryTest extends TestCase
1722
{
23+
/**
24+
* Connection instance mock.
25+
*
26+
* @var Container|MockInterface
27+
*/
28+
protected $container;
29+
30+
/**
31+
* Setup tests setting.
32+
*
33+
* @return void
34+
*/
35+
public function setUp(): void
36+
{
37+
parent::setUp();
38+
$this->container = Mockery::mock(Container::class);
39+
}
40+
1841
/**
1942
* Test register custom repositories for model with different cases.
2043
*
@@ -29,10 +52,11 @@ class RepositoryFactoryTest extends TestCase
2952
* @throws RepositoryRegisterException
3053
* @throws RepositoryException
3154
* @throws InvalidArgumentException
55+
* @throws BindingResolutionException
3256
*/
3357
public function testRegisterCustomRepositories(string $model, string $repository, bool $expectException): void
3458
{
35-
$repositoryFactory = new RepositoryFactory();
59+
$repositoryFactory = new RepositoryFactory($this->container);
3660

3761
if ($expectException) {
3862
$this->expectException(RepositoryRegisterException::class);
@@ -41,8 +65,10 @@ public function testRegisterCustomRepositories(string $model, string $repository
4165
$repositoryFactory->register($model, $repository);
4266

4367
if (!$expectException) {
68+
$expectedSRepository = Mockery::mock($repository);
69+
$this->container->shouldReceive('make')->andReturn($expectedSRepository);
4470
$actualRepositoryInstance = $repositoryFactory->getRepository($model);
45-
$this->assertEquals($repository, get_class($actualRepositoryInstance));
71+
$this->assertSame($expectedSRepository, $actualRepositoryInstance);
4672
}
4773
}
4874

@@ -73,13 +99,15 @@ public function registerRepositoriesData(): array
7399
* @throws RepositoryRegisterException
74100
* @throws RepositoryException
75101
* @throws InvalidArgumentException
102+
* @throws BindingResolutionException
76103
*/
77104
public function testThatEachTimeReturnsTheSameInstance(): void
78105
{
79-
$repositoryFactory = new RepositoryFactory();
106+
$repositoryFactory = new RepositoryFactory($this->container);
80107
$modelObject = new class extends Model {
81108
};
82109
$modelClass = get_class($modelObject);
110+
$this->container->shouldReceive('make')->andReturn(Mockery::mock(IRepository::class));
83111
$repositoryFactory->register($modelClass, Repository::class);
84112
$firstInstance = $repositoryFactory->getRepository($modelClass);
85113
$secondInstance = $repositoryFactory->getRepository($modelClass);

0 commit comments

Comments
 (0)