관찰자 후 $ this 반환


27

인터넷과 타사 모듈에서 충돌하는 정보가 있습니다. $this옵저버 방식이 끝나면 다시 반환 해야합니까?

예 :

MyCompany_Module_Model_Observer.php

public function salesOrderSaveAfter($observer){
    //do stuff
    return $this;
}

답변:


30

핵심은 항상 return $this;옵저버 메소드와 관련이 있지만 실제로 그 이유는 없습니다.

다시 추적 dispatchEvent()하면 옵저버 메소드를 호출하는 주요 메소드를 찾을 수 있습니다 (in ./app/Core/Model/App.php)

protected function _callObserverMethod($object, $method, $observer)
{
    if (method_exists($object, $method)) {
        $object->$method($observer);
    } elseif (Mage::getIsDeveloperMode()) {
        Mage::throwException('Method "'.$method.'" is not defined in "'.get_class($object).'"');
    }
    return $this;
}

그러나 어떤 시점에서도 실제로는 체인 아래로 다른 옵저버로 전달되는 데 사용되거나 참조 된 리턴 값이 아닙니다.

아마도 Magento는 $this세션 / 레지스트리 를 사용하지 않고 클래스 인스턴스 내에서 데이터를 유지 / 전달하는 수단으로 더 오래 사용하려고 생각했을 것입니다 . 또는 막 붙어 있던 레거시 코드 일 수도 있습니다 .

나는 설득력있는 이유를 볼 수 없습니다. return $this그러나 그것이 핵심에서 그렇게한다면 그것은 우리가하는 것입니다.

일반적으로 핵심이 무엇이든간에 모범 사례로 간주됩니다. 충격적인 철자 실수를 제외하고 :)


6
"Ukringlish":-)
benmarks

나는 ... 나는 가끔 사용되지 않는 매개 변수의 IDE 경고 없애 $ 관찰자를 반환 할 것을 인정하는 것이 부끄럽다
다니엘 Sloof

@Daniel-관찰자 서명에 매개 변수를 추가하지 마십시오. PHP는 상관 없습니다. 그러나 다시, 통과 된 매개 변수는 미래에 필요할 수 있습니다.
nevvermind

7

$ this (pun 예정)를 유창한 인터페이스라고합니다. 정의 된 변수를 다시 참조하지 않고도 객체 내에서 여러 메서드를 호출 할 수 있습니다.


1
감사합니다-유창한 인터페이스를 이해합니다. $this관찰자에게 유창한 인터페이스를 실제로 사용하지 않을 때 돌아올 강력한 이유를 찾고 있습니다.
philwinkle

1
@ 케빈-당신은 마법사의 관찰자에 유창한 인터페이스가 필요하지 않습니다. 내가 아는 한에서는 아니다.
nevvermind

5

메소드가 다른 곳에서 유창한 인터페이스에 실제로 사용되는지 여부에 관계없이 메소드에 다른 리턴 값이없는 경우 항상 (아무것도) $this대신에 리턴하는 것은 마 젠토 규칙 void입니다.

이점은 유용하거나 유용하지 않을지에 대해 생각할 필요가 없으며 불필요한 유창한 인터페이스가 누락 된 인터페이스보다 낫다는 것입니다. 또한, 마 젠토 비록 가능성이 낮더라도 관찰자에게 사용하기 시작할 수 있습니다 .


0

몇 년 후 ... :)

핵심은 항상 $ this를 반환합니다. 관찰자 방법의 맥락에서-[...]

또는

메소드에 다른 리턴 값이없는 경우 항상 void (아무것도) 대신 $ this를 리턴하는 것은 단지 Magento 규칙입니다 ...]

아니야 1.9.3.x에서 일부 옵저버를 확인했으며 많은 사람들이 아무것도 반환하지 않습니다 ( void). 따라서 "핵심 코드의 기능"이 명확하지 않습니다.)

$return $this;내 코드에도 사용 했지만 오늘은 M1 코드에 변경 사항이 없습니다. 다른 코드를 읽는다면 void맹목적으로 추가 된 방법이 더 명확 return $this하지만 결코 사용되지 않는다고 생각합니다.


편집하다:

Aoe_Scheduler를 사용하는 경우 당신은 또한을 반환 할 수 있습니다 string또는 array크론 역사에 표시합니다.

여기에 이미지 설명을 입력하십시오

이 기능에 대한 문서를 찾을 수 없습니다 ... 관련 코드는 다음과 같습니다. https://github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.