컨트롤러를 서로 다른 인터페이스에 연결하기 때문에 컨트롤러를 서비스 레이어로 사용하지 않을 것입니다. 이 문제를 해결할 수있는 두 가지 방법이 있습니다. 첫 번째는 RESTful 인터페이스를 사용하여 클라이언트 측 프론트 엔드를 만드는 것이고, 다른 하나는 컨트롤러 로직을 재사용 가능한 서비스로 오프 로딩하는 것입니다.
첫 번째 옵션을 사용하면 "그냥"RESTful 컨트롤러와 "사람"컨트롤러가 없습니다. 귀하의 API는 REST 인터페이스를 사용하고 HTML 버전의 경우 angular.js, backbone.js 또는 ember.js와 같은 것을 사용합니다. 이 도구는 REST API 백엔드에서 페이지를로드하는 데 적합하며 한 번 컨트롤러를 작성해야하므로 백엔드 개발 시간을 절약 할 수 있습니다.
두 번째 옵션은 대부분의 로직을 서비스 계층으로 오프로드하는 것입니다. 이렇게하면 컨트롤러를 슬림하게 만들 수 있습니다. 이것은 내가 주로 사용하는 방법입니다. 나는 하위 이름 공간 "Api"와 "Web"(MyModule\Controller\Api\FooController
)을 가지고 있으며 완전히 분리되어 있습니다. 라우팅이 다르며 인터페이스가 다릅니다. RESTful 컨트롤러는 get(), getList() 및 create()와 같은 메서드로 REST 매개 변수를 적용하며 웹 컨트롤러는 페이지에 매핑 된 1 : 1 (viewAction(), editAction() 등)입니다.
둘 다 동일한 서비스를 사용하므로 코드 재사용이 최대화됩니다. 블로그 게시물 컨트롤러와 같은 서비스의 예는이 (교리을 사용) :
서비스의이 종류는 모두 당신의 "인간"컨트롤러와 당신의 편안하고 컨트롤러에 사용할 수 있습니다
<?php
namespace Blog\Service;
use Doctrine\Common\Persistence\ObjectManager;
use Blog\Entity\Post as PostEntity;
class Post
{
protected $objectManager;
protected $objectRepository;
public function __construct(ObjectManager $objectManager)
{
$this->objectManager = $objectManager;
$this->objectRepository = $objectManager->getRepository('Blog\Entity\Post');
}
public function find($id)
{
return $this->objectRepository->find($id);
}
public function store(array $data)
{
$post = new PostEntity;
$post->fromArray($data);
$objectManager = $this->objectManager;
$objectManager->persist($post);
$objectManager->flush();
}
public function update(array $data, PostEntity $post)
{
//
}
public function delete(PostEntity $post)
{
//
}
}
. 예, 약간의 코드 중복이있을 수 있지만 서비스를 사용하면 대부분이 중복을 제거합니다.
- 코드 중복의 약간의 양이 걱정되지는 추상화 될 수
- 코드가 공통의 목표를 제공하는 여러 장소에서 사용되는 오브젝트를 모두 디커플링 경우 : 일부 중복 코드가 남아있는 경우, 당신은 항상 고려해야 컨트롤러 플러그인에 넣으십시오.