올바른 방법을 찾기가 어려웠으므로 아래에서 내가 만든 모범 사례를 찾을 수 있습니다. 즐기고, 필요한 경우 영어를 교정하고 내가 틀렸다면 나에게 말하십시오. :)
편집 : ... 그리고 나는 어떤면에서 잘못되었다는 것을 알았습니다. 그래서 Raphael의 답변으로 더 많은 것을 이해 한 후에 원래 게시물을 업데이트했습니다. 그에게 감사합니다!
아래에 사용 된 개념 :
이러한 개념에 익숙하면 아래 코드와 설명을 이해하는 것이 더 쉬울 것입니다.
- 주입 의존성 (
$this->variable코드의 모든 변수가 주입 될 때) - 서비스 계약 및 리포지토리
- 공장
맥락 :
더 많은 컨텍스트를 갖기 위해 다음과 같이 모듈을 올바르게 구성했다고 가정하십시오.
- 방법을 포함하는 블록 클래스 CustomBlock
getCustomModel($id), - 이 메소드는 param에 전달 된 id를 기반으로 CustomModel 객체를 반환합니다.
- CustomModel 유형은 모델에 해당합니다.
\Vendor\Module\Model\CustomModel - 이 모델은 (그것의 자원 모델과 함께 제공
\Vendor\Module\Model\ResourceModel\CustomModel) - (와)의 저장소와 함께
\Vendor\Module\Model\CustomModelRepository.
질문 :
- 모든 것이 CustomModel 객체를로드하도록하는 가장 좋은 방법은 무엇입니까?
load()이 메소드는 더 이상 사용되지 않으므로 CustomModel 객체를 사용할 수 없습니다 .
모범 사례에 따르면 CustomModel 서비스 계약을 사용해야합니다. 서비스 계약은 데이터 인터페이스 (예 : CustomModelInterface) 및 서비스 인터페이스 (예 : CustomModelRepositoryInterface)입니다. 그래서 내 블록은 다음과 같습니다
/ ** @var SlideRepositoryInterface * /
보호 된 $ slideRepository;
/ **
* CustomBlock 생성자
* ...
* @param CustomModelRepositoryInterface $ customModelRepository
* ...
* /
공공 함수 __construct (
...
CustomModelRepository 인터페이스 $ customModelRepository
...
) {
$ this-> customModelRepository = $ customModelRepository;
}
공용 함수 getCustomModel ($ id) {
return $ this-> customModelRepository-> get ($ id);
}
먼저 CustomModelRepositoryInterface생성자에 객체를 삽입 하고 getCustomModel()메서드 에서 사용합니다 .
수업 Api\CustomModelRepositoryInterface에는 많지 않습니다. 일반적으로 당신은 기본적인 방법을 선언합니다 (그러나 아무것도 다르게 할 방지 없음) : get, getList, save, delete, deleteById. 이 주제의 목적을 위해 다음은 get메소드 선언입니다.
/**
* Get info by id
*
* @param int $id
* @return Data\CustomModelInterface
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function get($id);
좋아, 그러나 내 CustomModel Interface가 블록 생성자에서 의존성 주입에 의해 호출되면 코드는 어디에 있습니까? 이 질문에 대한 답을 위해서는이 인터페이스를 구현하는 클래스를 찾는 Magento에 설명해야합니다. 모듈의 etc / di.xml 파일에서 다음을 추가해야합니다.
<preference for="Vendor\Module\Api\CustomModelRepositoryInterface" type="Vendor\Module\Model\CustomModelRepository" />
그래서 CustomModelRepositoryInterface클래스는 서비스 인터페이스입니다. 그것을 구현할 때 데이터 인터페이스 (적어도 Vendor\Module\Api\Data\CustomModelInterface및 Vendor\Module\Api\Data\CustomModelSearchResultsInterface) 를 구현해야합니다 . 모델은 각 인터페이스마다 라인 을 구현 Vendor\Module\Api\Data\CustomModelInterface하고 추가 <preference ... />해야합니다. 마지막으로 서비스 계약을 사용할 때마다 mySomethingInterface더 이상 생각 하지 마십시오 mySomething: magento가 di.xml환경 설정 메커니즘을 사용하도록하십시오 .
좋아, 다음은 무엇입니까? CustomModelRepositoryInterface블록 생성자를 주입 하면 CustomModelRepository객체를 얻습니다 . CustomModelRepository에 선언 된 메소드를 구현해야합니다 CustomModelRepositoryInterface. 그래서 우리는 이것을 가지고 있습니다 Vendor\Module\Model\CustomModelRepository:
공공 함수 get ($ id) {
$ customModel = $ this-> customModelFactory-> create ();
$ customModel->로드 ($ id);
if (! $ customModel-> getId ()) {
새로운 NoSuchEntityException 던지기 (__ ( 'ID가 "% 1"인 CustomModel이 없습니다.', $ id));
}
$ customModel을 반환;
}
우리는 무엇을하고 있습니까? CustomModel공장 덕분에 빈 객체를 만듭니다 . 다음으로 CustomModel모델로드 방법을 사용하여 데이터를로드합니다 . 다음으로 id를 매개 변수 NoSuchEntityException로로드하지 못하면 a를 반환합니다 CustomModel. 그러나 모든 것이 정상이면 모델 객체를 반환하고 수명을 계속합니다.
와우 ...! 이 예에서 그것은 무엇입니까?
$customModel->load($id);
load처음 과 같은 더 이상 사용되지 않는 방법입니까? 그렇습니다. 그것은 부끄러운 일이라고 생각하지만이 load () 메서드에는 이벤트가 전달되어 개발자가들을 수 있기 때문에 사용해야합니다 (아래 Raphael의 답변 참조).
앞으로는 엔터티 관리자가 저장합니다. 이것은 새로운 Magento 2 개념으로서의 또 다른 이야기이지만, 살펴보고 싶다면 Entity Manager가 이미 CMS 페이지의 리소스 모델 (v2.1)에 구현되어 있습니다.
public function load(AbstractModel $object, $value, $field = null)
{
$pageId = $this->getPageId($object, $value, $field);
if ($pageId) {
$this->entityManager->load($object, $pageId);
}
return $this;
}