마 젠토 2 : 컨트롤러 동작에서 "보기"로 변수 전달


12

Magento 1에서 Controller 작업의 데이터를 "View"(예 : 레이아웃의 블록)로 전달하려면

  1. 를 통해 글로벌 레지스트리에 값 / 객체 추가 Mage::register

  2. 실행 후 블록 객체를 직접 페치하고 페치 된 블록 객체의 데이터 속성을 설정합니다. loadLayout

  3. phtml파일의 블록 객체에 대한 메소드를 호출 하고 블록 객체가 모델 / 데이터베이스 계층을 사용하여 컨트롤러 작업에 이전에 저장된 데이터를 읽도록합니다.

Magento 2에서 블록 객체 메소드를 사용하여 데이터베이스에서 읽는 것은 여전히 ​​작동하는 것으로 보입니다. 이는 특정 종류의 작업에 적합합니다. 하나,

  1. 더 이상 Magento 2에 글로벌 레지스트리가 없습니다 (또는 있습니까?)

  2. 레이아웃 시스템은 이제 팩토리를 통해 페이지 객체를 생성하여 작동하며 Magento 1에서와 같은 방식으로 블록 참조를 가져올 수 없습니다

Magento 2에서 컨트롤러 작업에서보기로 데이터를 직접 전달할 수 있습니까? 아니면 이것이 마젠 토의 새롭고 멋진 Design Pattern ™ 세계에 대한 직접적인 패턴입니까? 이 패턴이 너무 직접적인 패턴 인 경우 템플릿에 표시하려는 계산 된 정보가 있지만 해당 정보를 상태 저장 시스템에 저장하지 않으려면 어떻게해야합니까 (예 : 데이터를 저장하지 않으려는 경우) 데이터 베이스)

나는 이것을 직접 해킹하는 몇 가지 다른 방법을 생각할 수 있지만 Magento 2 당신이 그것을 하기원하는 방법에 관심 이 있습니다.

참고 : 이와 같은 것을 사용하여 컨트롤러 작업에서 블록 인스턴스를 가져올 수 있다는 것을 알고 있습니다.

$resultPage = $this->resultPageFactory->create();    
$block = $resultPage->getLayout()->getBlock('catalog.wysiwyg.js');        

var_dump(spl_object_hash($block));

Magento 2 핵심 코드가이 작업을 자주 수행합니다. 그러나 - 블록 객체 제어기 개체에서 가져온 것으로 보인다 (A)에 사용할 수있는 것보다 다른 목적 phtml을 통해 서식하거나 $this또는 $block((전자는 $this) 반면 이상 (실제로 템플릿을 렌더링하는 것을 목적으로 나타난다는 $block) 것으로 보인다 마 젠토 블록 유형의 인스턴스).

#File: path/to/template.phtml
var_dump(spl_object_hash($block));
var_dump(spl_object_hash($this));

컨트롤러 액션 메소드에서 데이터를 설정하면 phtml템플릿 에서 사용할 수 없으므로 spl_object_hash위 의 결과를 비교하면 세 가지 해시가 있기 때문에 "있는 것처럼 보입니다"라고 말합니다 . 그러나 위의 다른 오류가있을 수있을 정도로이 모든 것에 익숙합니다. 따라서 블록에 데이터를 설정하고 템플릿에서 데이터를 가져올 수 있다면 그것에 대해 듣고 싶습니다. !

답변:


17

# 1과 관련하여 레지스트리는 여전히 존재하며 Magento 1에서 알고있는 것과 매우 유사합니다. 보다:\Magento\Framework\Registry

의존성 주입을 통해 생성자에 추가하면 익숙 $registry->register($key, $value)하고 $registry->registry($key)메소드를 사용하여 데이터를 저장 / 액세스 할 수 있습니다.

아직 \ Magento \ Framework 네임 스페이스를 탐색하지 않는 것이 좋습니다. 이전에 Mage 또는 App에서 액세스 할 수 있었던 많은 부분이 여전히 존재합니다.

모범 사례까지는 대답 할 수 없지만 가능한 한 많은 논리를 컨트롤러에서 유지하는 것이 좋습니다. 핵심을 보는 것이 아마도 가장 좋은 방법 일 것입니다. 예를 들어, 고객 주소 편집 페이지를 참조하십시오 : 기본 컨트롤러 ; 필요한 경우 주소 ID를 가져오고로드하는 등 광범위한 블록 . 그들은 그것을 블록에서 직접 처리합니다. 그들은 컨트롤러에서 그것을하지 않고 그것을 통과시킵니다.


2
물론, 핵심은 어떤 부분을보고 어떤 부분을 무시해야하는지 아는 것입니다.
Alan Storm

1
마지막 단락에 +1 계산 된 값을 공유해야하는 경우 계산 동작을 지정하여 객체를 분리하고 해당 값이 필요한 블록에서 호출하십시오. 전역 변경 가능 상태이므로 레지스트리를 사용하지 않는 것이 좋습니다. 당신은 결코 확실 블록 (레이아웃을 죽일 수) 페이지에있는 경우이기 때문에 동작에서 블록으로 직접 주소도 권장하지 않습니다
안톤 Kril

@AntonKril 페이지 렌더러 도우미는 어떻습니까? 제품 페이지 도우미 인 CMS 페이지 도우미는 렌더링을 HTTP 요청과 분리하기위한 것입니까?
Ivan Chepurnyi

5

Controller Action에서 View로 변수를 전달 해서는 안됩니다 . 변수를보기 (템플릿 엔진)에 전달하려면 block to를 사용하십시오.


왜? 블록에서 뷰로 get / post 매개 변수를 어떻게 전달할 수 있습니까? 대부분의 논리가 컨트롤러에서보기로 전달하지 않습니까?
LucScu

블록에서 요청 오브젝트를 사용하십시오. Registry를 통해 컨트롤러에서 데이터 가져 오기를 차단하면 다른 컨트롤러와 함께 사용할 수 없습니다. 그것은 임시 커플 링과 나쁜 관행이라고합니다
KAndy

컨트롤러에서 블록으로 요청의 매개 변수를 전달하기 위해 $ block-> assign ()을 사용합니다. 또한 나쁜 습관입니까?
LucScu

페이지에 블록이 있는지 확실하지 않기 때문에 블록을 직접 처리하여 주소를 지정하지 않는 것이 좋습니다.
KAndy

내 경우에는 컨트롤러, 레이아웃 및 블록이 내 코드로만 제어되는 사용자 지정 시나리오이므로 컨트롤러에서 블록으로 논리 패스 요청의 매개 변수라고 생각합니다. 답글을 보내 주셔서 감사합니다.
LucScu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.