2014-01-15 2 views
3

젠드 프레임 워크 2로 구현 된 웹 응용 프로그램은 브라우저를 통해 사람과 사람 모두에게 액세스 할 수 있습니다.젠드 프레임 워크 2의 안정적인 응용 프로그램

처음에는 api 액세스를 위해 나머지 Rest 컨트롤러를 작성하려고했지만 api와 human 사용자 모두 컨트롤러에서 동일한 기능을 사용하기 때문에 현재 api는 POST 요청으로 메시지를 보냅니다. 인간이 사용하는 비 휴지 컨트롤러까지.

실제 휴식 컨트롤러의 구현이 현재의 방식보다 이점이 있는지 알고 싶습니다. 고맙습니다.

답변

3

양식을 원격 호출하여 양식 제출과 API 호출을 모두 처리하는 것처럼 들립니다. 다음은 몇 가지 고려 사항 : 당신이 제대로 당신의 웹 사이트를 확보하는 경우

  1. 보안 (인증, 검증 등)

    , 그 형태의 작업은 세션에 의해 부여되는 액세스하는 일부 인증 서비스 뒤에해야한다/사용자 로그인시 생성 된 쿠키 데이터 (인증은 지속됩니다). 따라서 쿠키를 처리하기 위해 API 호출이 필요합니다. 단순히 API 호출을위한 별도의 끝점이 있으면 응용 프로그램을 유지하는 것이 더 쉬울 것입니다. 그런 다음 RESTful API에서 흔히 볼 수있는 토큰 사용과 같은 상태 비 저장 인증 메소드와 같은 별도의 인증 서비스를 사용할 수있다.

    이렇게하면 API 호출을 통해 허용되는 작업과 그렇지 않은 작업을 쉽게 적용 할 수 있습니다. CSRF 공격에 대한 양식 제출은 항상 보안을 유지하는 것이 가장 좋습니다. 반대로 API 호출에는 원점에서 끝점에 액세스 할 수있는 기능이 필요합니다. 따라서 API 호출을위한 별도의 인터페이스를 만들어 보안 문제를 피하는 것이 훨씬 낫습니다. 데이터

    양식 제출의 일부의

  2. 대표는 재 지정과 같은 일이 어떤 일을 필요로 할 수도 있습니다. 이러한 작업 중 사용자 세션에 데이터를 작성해야 할 수 있습니다 (예 : 리디렉션 후에 표시되는 플래시 메시지 설정). API 호출을 통해 작동 할 때는 의미가 없습니다.

    또한 API 호출을위한 특정 형식으로 데이터를 나타 내기 위해 웹 사이트가 필요합니다 (XML, JSON 등). 다시 한 번 말하지만 두 가지 인터페이스, 즉 인간을위한 인터페이스가있는 경우 유지 관리가 더 쉽습니다. 다른 하나는 API 클라이언트 용입니다.

이것은 컨트롤러와 서비스에서 많은 논리를 옮기는 것이 항상 현명한 이유입니다. 이렇게하면 모든 도메인 논리가 한 곳에서 이루어 지므로 코드 중복없이 RESTful 컨트롤러와 같이 웹 사이트에 새로운 인터페이스를 생성 할 수 있습니다.

2

컨트롤러를 서로 다른 인터페이스에 연결하기 때문에 컨트롤러를 서비스 레이어로 사용하지 않을 것입니다. 이 문제를 해결할 수있는 두 가지 방법이 있습니다. 첫 번째는 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) 
    { 
     // 
    } 
} 

. 예, 약간의 코드 중복이있을 수 있지만 서비스를 사용하면 대부분이 중복을 제거합니다.

  1. 코드 중복의 약간의 양이 걱정되지는 추상화 될 수
  2. 코드가 공통의 목표를 제공하는 여러 장소에서 사용되는 오브젝트를 모두 디커플링 경우 : 일부 중복 코드가 남아있는 경우, 당신은 항상 고려해야 컨트롤러 플러그인에 넣으십시오.
관련 문제