How to use Repository with Doctrine as Service in Symfony
How to use Repository with Doctrine as Service in Symfony
Clean, Reusable, Independent and SOLID Goal
# app/config/services.yml
services:
_defaults:
autowire: true
App\Repository\:
source: ../Repository
How do we Register Repositories Now
1. Entity Repository
<?php declare(strict_types=1);
namespace App\Repository;
use App\Entity\Post;
use Doctrine\ORM\EntityRepository;
final class PostRepository extends EntityRepository
{
/**
* Our custom method
*
* @return Post[]
*/
public function findPostsByAuthor(int $authorId): array
{
return $this->findBy([
'author' => $authorId
]);
}
}
Advantages
Disadvantages
<?php declare(strict_types=1);
namespace App\Repository;
use App\Sorter\PostSorter;
use Doctrine\ORM\EntityRepository;
final class PostRepository extends EntityRepository
{
public function __construct(PostSorter $postSorter)
{
$this->postSorter = $postSorter;
}
}
$this->postRepository->find('someString');
$post = $this->postRepository->find(1);
$post->whatMethods()!
2. Entity
<?php declare(strict_types=1);
namespace App\Entity;
use Doctrine\ORM\Entity;
use Doctrine\ORM\EntityRepository;
/**
* @Entity(repositoryClass="App\Repository\PostRepository")
*/
final class Post
{
...
}
$this->entityManager->getRepository(Post::class);
Advantages
Disadvantages
3. Use in Controller
services:
app.post_repository:
class: Doctrine\ORM\EntityRepository
factory: ['@doctrine.orm.default_entity_manager', getRepository]
arguments:
- App\Entity\Post
<?php declare(strict_types=1);
namespace App\Controller;
use App\Entity\Post;
use App\Repository\PostRepository;
use Doctrine\ORM\EntityManager;
final class PostController
{
/**
* @var PostRepository
*/
private $postRepository;
public function __construct(EntityManager $entityManager)
{
$this->postRepository = $entityManager->getRepository(Post::class);
}
}
Advantages
Disadvantages
$postRepository = $entityManager->getRepository(Post::class);
$postRepository->help()?;
$post = $this->postRepository->get(1);
$post->help()?;
/** @var App\Entity\Post $post */
$post = $this->postRepository->get(1);
$post->getName();
/** @var SomeService $someService */
$someService = $container->get(SomeService::class);
4. Registration services.yml
Advantages Summary
It's spread in most of documentation, both in Doctrine and Symfony and in many posts about Doctrine.
Disadvantages Summary
How to Make This Better with Symfony 3.3?
<?php declare(strict_types=1);
namespace App\Repository;
use App\Entity\Post;
use Doctrine\ORM\EntityRepository;
final class PostRepository extends EntityRepository
{
}
<?php declare(strict_types=1);
namespace App\Repository;
use App\Entity\Post;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
final class PostRepository
{
/**
* @var Repository
*/
private $repository;
public function __construct(EntityManager $entityManager)
{
$this->repository = $entityManager->getRepository(Post::class);
}
}
1. Entity Repository
<?php declare(strict_types=1);
namespace App\Repository;
use App\Entity\Post;
use App\Sorter\PostSorter;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
final class PostRepository
{
/**
* @var Repository
*/
private $repository;
/**
* @var PostSorter
*/
private $postSorter;
public function __construct(EntityManager $entityManager, PostSorter $postSorter)
{
$this->repository = $entityManager->getRepository(Post::class);
$this->postSorter = $postSorter;
}
public function get(int $id): Post
{
return $this->repository->get($id);
}
}
Advantages
2. Entity
<?php declare(strict_types=1);
namespace App\Entity;
use Doctrine\ORM\Entity;
use Doctrine\ORM\EntityRepository;
final class Post
{
...
}
Advantages
- App\Repository\ProductRepository
- App\Repository\ProductRedisRepository
- App\Repository\ProductBenchmarkRepository
3. Use in Controller
<?php declare(strict_types=1);
namespace App\Controller;
use App\Repository\PostRepository;
final class PostController
{
/**
* @var PostRepository
*/
private $postRepository;
public function __construct(PostRepository $postRepository)
{
$this->postRepository = $postRepository;
}
}
Advantages
4. Registration services.yml
# app/config/services.yml
services:
_defaults:
autowire: true
App\Repository\:
source: ../Repository
Comments
Post a Comment