AngularJS 및 Zend 2 프레임워크로 편안한 애플리케이션 만들기 (2)

백엔드를 Doctrine ORM으로 교체


Doctrine은 PHP용으로 매우 인기 있는 데이터 액세스 솔루션으로, 저수준 DBAL 및 고수준 OR 매핑 솔루션을 포함합니다.
Doctrine에는 Zend 기반 프로젝트에서 Doctrine을 지원하는 몇 가지 Zend 특정 모듈이 있습니다.
이 게시물에서는 백엔드 코드를 Doctrine ORM으로 교체하려고 합니다.

교리 구성


composer.json 파일을 열고 교리를 종속성으로 추가합니다.
"doctrine/doctrine-orm-module":"0.*",
종속성을 업데이트합니다.
php composer.phar update
성공적으로 실행된 후 공급업체 폴더 아래에 교리 폴더가 있습니다. 몇 초 정도 걸릴 수 있습니다.
config/application.config.php 파일을 열고 DoctrineModule 및 DoctrineORMModule을 선언합니다.
'modules' => array(
    // 'ZendDeveloperTools',
    'DoctrineModule',
    'DoctrineORMModule',
    'Application',
    'Album'
),
앨범 모듈 구성 파일/modlue/Album/config/module.config.php를 열고 Doctrine에 대해 다음 구성을 추가합니다.
'doctrine' => array(
    'driver' => array(
        'album_entities' => array(
        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
        'cache' => 'array',
        'paths' => array(__DIR__ . '/../src/Album/Model')
        ),
        'orm_default' => array(
        'drivers' => array(
            'Album\Model' => 'album_entities'
        )
        )
    )
)
새로운 독립형 교리.locale.php 파일에서 데이터베이스 연결을 선언하십시오.
return array(
    'doctrine' => array(
        'connection' => array(
            'orm_default' => array(
                'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
                'params' => array(
                    'host' => 'localhost',
                    'port' => '3306',
                    'user' => 'root',
                    'password' => '',
                    'dbname' => 'zf2tutorial',
                )
            )
        )
    )
);
이 파일을/config/autoload 폴더에 넣습니다.

엔티티 클래스 생성


Album 엔터티 클래스의 내용을 다음과 같이 변경합니다.
namespace Album\Model;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Album {

    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;

    /** @ORM\Column(type="string") */
    private $artist;

    /** @ORM\Column(type="string") */
    private $title;


    public function getId() {
        return $this->id;
    }

    public function getArtist() {
        return $this->artist;
    }

    public function getTitle() {
        return $this->title;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function setArtist($artist) {
        $this->artist = $artist;
    }

    public function setTitle($title) {
        $this->title = $title;
    }

}
엔티티 클래스는 Java EE 개발자라면 이해하기 쉽고 주석은 JPA/Hibernate 주석과 모두 유사합니다.
Doctrine 명령줄 도구를 사용하여 엔터티 주석에서 스키마 선언의 유효성을 검사할 수 있습니다.
vendor\bin\doctrine-module orm:validate-schema
이전 Album 클래스와 달리 Doctrine은 모든 속성이 비공개이거나 보호되어야 한다고 요구합니다.
또한 Doctrine 도구를 사용하여 주석에서 표를 생성할 수도 있습니다.
테이블 앨범을 제거하고 다음 명령을 실행합니다.
vendor\bin\doctrine-module orm:schema-tool:create
zf2tutorial 데이터베이스에 새 앨범 테이블을 생성합니다.

컨트롤러 클래스 생성

AlbumController의 내용을 다음과 같이 변경합니다.

 getServiceLocator()
                ->get('Doctrine\ORM\EntityManager');

        $results= $em->createQuery('select a from Album\Model\Album as a')->getArrayResult();


        return new JsonModel(array(
            'data' => $results)
        );
    }

    public function get($id) {
        $em = $this
                ->getServiceLocator()
                ->get('Doctrine\ORM\EntityManager');

        $album = $em->find('Album\Model\Album', $id);

//        print_r($album->toArray());
//        
        return new JsonModel(array("data" => $album->toArray()));
    }

    public function create($data) {
        $em = $this
                ->getServiceLocator()
                ->get('Doctrine\ORM\EntityManager');

        $album = new Album();
        $album->setArtist($data['artist']);
        $album->setTitle($data['title']);

        $em->persist($album);
        $em->flush();

        return new JsonModel(array(
            'data' => $album->getId(),
        ));
    }

    public function update($id, $data) {
        $em = $this
                ->getServiceLocator()
                ->get('Doctrine\ORM\EntityManager');

        $album = $em->find('Album\Model\Album', $id);
        $album->setArtist($data['artist']);
        $album->setTitle($data['title']);

        $album = $em->merge($album);
        $em->flush();

        return new JsonModel(array(
            'data' => $album->getId(),
        ));
    }

    public function delete($id) {
        $em = $this
                ->getServiceLocator()
                ->get('Doctrine\ORM\EntityManager');

        $album = $em->find('Album\Model\Album', $id);
        $em->remove($album);
        $em->flush();

        return new JsonModel(array(
            'data' => 'deleted',
        ));
    }

}
Doctrine\ORM\EntityManager의 역할은 JPA EntityManager. Doctrine\ORM\EntityManager와 매우 유사하며 기본적으로 Zend 서비스에 등록되어 있으므로 직접 사용할 수 있습니다.
내가 만난 문제는 find 메서드가 배열 대신 PHP 개체를 반환하고 Album 개체의 모든 속성이 비공개로 선언되고 개체를 클라이언트에 반환하는 것입니다. 속성은 JSON 문자열로 직렬화할 수 없습니다.
객체를 배열로 변환하기 위해 앨범 클래스에 toArray 메서드를 추가했는데 이 장벽이 일시적으로 극복되었습니다.
public function toArray(){
    return get_object_vars($this);
}
AlbumController 에서 get 메소드의 return 문이 로 변경됩니다.
return new JsonModel(array("data" => $album->toArray()));
내가 만난 또 다른 문제는 FQN 이름(Album\Model\Album)을 사용하여 쿼리의 Album 엔터티에 액세스해야 한다는 것입니다.
잘못 구성된 부분을 찾으면 알려주세요. 감사합니다.
샘플 코드: https://github.com/hantsy/angularjs-zf2-sample

좋은 웹페이지 즐겨찾기