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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AngularJS의 ng-options best practise
쓸데없는 말은 하지 말고 바로 코드를 찍어라.
리소스를api에 직접 전달하지 말고 문자열이나 정형(예를 들어 귀속된ng-model="selected")을 권장합니다
angular에서 생성된
의value가 무엇인지, ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
"doctrine/doctrine-orm-module":"0.*",
php composer.phar update
'modules' => array(
// 'ZendDeveloperTools',
'DoctrineModule',
'DoctrineORMModule',
'Application',
'Album'
),
'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'
)
)
)
)
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',
)
)
)
)
);
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;
}
}
vendor\bin\doctrine-module orm:validate-schema
vendor\bin\doctrine-module orm:schema-tool:create
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',
));
}
}
public function toArray(){
return get_object_vars($this);
}
return new JsonModel(array("data" => $album->toArray()));
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AngularJS의 ng-options best practise쓸데없는 말은 하지 말고 바로 코드를 찍어라. 리소스를api에 직접 전달하지 말고 문자열이나 정형(예를 들어 귀속된ng-model="selected")을 권장합니다 angular에서 생성된 의value가 무엇인지, ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.