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

 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

How to add new repository?

Comments

Popular posts from this blog

A Tailwind CSS Preset for Laravel 5.5

Short and safe array iteration

PHPStorm's performance