Правильный ли, подход к проектированию приложения в symfony 3?

Ранее я очень долго просидел на Yii2, затем мигрировал на Laravel5, теперь нужно начинать постигать новый дзен.

Вопрос будет относительно подхода к проектированию приложения (не рассматриваем DDD).

Я организовал некий репозиторий, который будет оберткой над доктриновским репозиторием:
<?php

namespace AppBundle\Contract\Repository;

use AppBundle\Entity\Product;

/**
 * Interface Product Repository
 * @package AppBundle\Contract\Repository
 */
interface ProductRepository
{
    public function findById($id);

    public function findAll();

    public function save(Product $product);

    public function delete(Product $product);
}


<?php

namespace AppBundle\Repository;

use AppBundle\Contract\Repository\ProductRepository as ProductRepositoryInterface;
use AppBundle\Entity\Product;

class ProductRepository implements ProductRepositoryInterface
{
    public function findById($id)
    {
        return 'findById';
    }

    public function findAll()
    {
        return 'findAll';
    }

    public function save(Product $product)
    {
        return 'save Product';
    }

    public function delete(Product $product)
    {
        return 'delete Product';
    }
}


Хендлер (сервис):
<?php

namespace AppBundle\Contract\Handler;

use AppBundle\Entity\Product;

interface ProductCreateHandler
{
    public function process(Product $product);
}


<?php

namespace AppBundle\Services\Hendler;

use AppBundle\Contract\Handler\ProductCreateHandler as ProductCreateHandlerInterface;
use AppBundle\Contract\Repository\ProductRepository;
use AppBundle\Entity\Product;

class ProductCreateHandler implements ProductCreateHandlerInterface
{
    protected $productRepository;

    public function __construct(ProductRepository $productRepository)
    {
        $this->productRepository = $productRepository;
    }

    public function process(Product $product)
    {
        return 'Создать товар: ' . $product->getName();
    }
}


Конфигурация:
services:
   ...

# Репозитории
    app.product.repository:
        class: AppBundle\Repository\TestProductRepository

# Сервисы
    app.product.create.handler:
        class: AppBundle\Services\Hendler\ProductCreateHandler
        arguments: ['@app.product.repository']


Вопросов несколько:
- Будет ли правильно на каждое действие (создать/редактировать/удалить) делать свой хендлер (например ProductCreateHandler) ?

- Как правильно организовать работу с контроллерами?
Я обратил внимание на 3 эти статьи, но не всем понял, что авторы делают?
ankitchauhan22.blogspot.com.au/2013/02/controllers...
knpuniversity.com/screencast/question-answer-day/c...
https://pooteeweet.org/blog/1947
Тоесть они создают для каждого контроллера сервис и инжектят его в экшин ? Но по сути этим может заниматься хендлер, разница только в том, что он бросает exception и не формирует ответ.
  • Вопрос задан
  • 1161 просмотр
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Не правильный. Читайте Эрика Эванса. Читайте про unit of work. Читайте про "save your repositories from save".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы