올바른 방법을 찾기가 어려웠으므로 아래에서 내가 만든 모범 사례를 찾을 수 있습니다. 즐기고, 필요한 경우 영어를 교정하고 내가 틀렸다면 나에게 말하십시오. :)
편집 : ... 그리고 나는 어떤면에서 잘못되었다는 것을 알았습니다. 그래서 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;
}