Правильный ли, подход к проектированию приложения в 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 и не формирует ответ.
  • Вопрос задан
  • 1126 просмотров
Решения вопроса 1
prototype_denis
@prototype_denis
Symfony
services:
    app.product_repository:
        class: AppBundle\Repository\ProductRepository
        factory: ['@doctrine.orm.default_entity_manager', getRepository]
        arguments:
            - AppBundle\Entity\Product


// $this->container->get('app.product_repository')->getClassName();

Уберите методы save и delete. Не нужно тащить старые привычки на новую систему.
Symfony и Doctrine используют DataMapper, а не ActiveRecord

Хэндлер - это entity_manager

В контексте AppBundle вам не нужны интерфейсы и прочая абстракция - это реально излишне, за исключением моментов, кода вы работаете или с доменными моделями, которые лежат в папке vendor или наоборот - вы сами vendor и AppBundle должен зависеть от ваших интерфейсов.

Предполагаю, что 90% ваших вопросов связанных с архитектурой вы найдёте в ответах Сергей Протько

При работе с Symfony 80% времени должно уходить исключительно на конфигурацию приложения. Почитайте "Лучшие практики" и если у вас возникают вопросы, "а как это сюда воткнуть" - поверьте, google вас не подведёт, всё на много проще, чем кажется.

"Будет ли правильно на каждое действие (создать/редактировать/удалить) делать свой хендлер" - нет конечно же. Зачем вам плодить на каждое действие по классу, только для того, чтобы вызвать в нём буквально пару строк.

Относительно статей... Посвежее бы, правда. Сходите на github и посмотрите на самые популярные бандлы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Не правильный. Читайте Эрика Эванса. Читайте про unit of work. Читайте про "save your repositories from save".
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы