Ранее я очень долго просидел на 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 и не формирует ответ.