마젠 토의 도우미 란 무엇입니까?


22

마젠 토의 도우미 란 무엇입니까?

어떤 경우에는 도우미를 사용하고 사용하지 않아야합니까?

답변:


27

이론적으로 도우미를 사용해서는 안됩니다.
헬퍼는 관련이없는 메소드의 모음 일 뿐이며 항상 싱글 톤으로 인스턴스화됩니다.
기본적으로 일부 네임 스페이스 (이 경우 클래스 이름)로 그룹화 된 함수를 사용한 절차 적 프로그래밍입니다. 그러나 Magento에는 핵심 헬퍼가 있으므로 메소드를 어디에 넣을지 모를 때나 메소드를 여러 위치 (모델, 컨트롤러, 템플릿)에서 호출해야 하는지를 알 수 있습니다.

최후의 수단으로 사용하십시오.

또한 Magento에는 번역상의 이유로 각 모듈에 대한 도우미가 필요합니다. 각 모듈에서
호출되는 도우미를 만들고 Data.php비워 둘 수 있습니다.


내가 도우미를 위해 찾은 유일한 "사용"은 항상 싱글 톤이어야한다는 것입니다. foreach루프 및 모든 종류의 광기 에서 컬렉션을로드하는 교육 레거시 코드를 작성했습니다 . 나는이 무서운 논리를 도우미로 리팩터링하고 그것을 유용한 객체 캐시로 사용하는 것을 발견했으며, 모델에 배치하는 getModel대신 실수로 호출했을 수있는 미래 개발자의 오류에 대한 여지를 거의 남지 않았습니다 getSingleton.
Luke Rodgers

@LukeRodgers. 나는 당신의 요점을 알지만 "실수로 getSingleton 대신 getModel을 호출했을 수도 있습니다"라고 도우미를 사용하는 진정한 이유라고 생각하지 않습니다. "저장"대신 "삭제"를 "실수로"호출 할 수 있다고 주장 할 수 있습니다. 이것을 피하기 위해 어떤 보호를 할 수 있습니까? "주의를 기울이는 것"은 소프트웨어 개발의 일부라고 생각합니다.
Marius

동의했다. 이 시나리오에서 나는 인류를 방어 적으로 코딩하려고 노력하고 있다고 생각합니다.
Luke Rodgers

핵심 헬퍼에 커스텀 메소드를 추가하는 방법은 무엇입니까?
tecjam

13

이 질문에는 두 가지 측면이 있습니다.

  1. 나만의 도우미를 작성해야합니까?
  2. 핵심 도우미를 사용해야합니까?

1. 쓰기 도우미

일반적으로 클래스라는 이름의 한 Helper, Util또는 유사한 단지와 클래스로 훨씬 이해가되지 않는다 "내가 어디에 넣어하는 방법을 알고하지 않는 것이 몇 가지 기능을 가지고 있습니다"라고.

Magento는 도우미를 싱글 톤으로 인스턴스화하고 대부분의 핵심 도우미에는 상태가 없으므로 메서드 는 클래스 가 static있거나 없을 수 있습니다 functions. 이 모든 것은 종종 코드 냄새 , 응용 프로그램 디자인의 결함으로 간주됩니다 .

Marius가 이미 지적했듯이 자신의 코드에 도우미를 사용할 필요가 없습니다. 모듈 별 번역을 사용하는 경우 모듈 당 기본 빈 도우미를 만들면 작동하지 않습니다. 모델 ( Mage_Core_Model_Abstract데이터베이스 데이터를 나타내지 않는 경우 확장 할 필요 가 없음) 또는 독립 라이브러리 클래스를 선호하십시오 .

그러나 "헬퍼를 전혀 사용하지 않음"에 대해 너무 엄격하지 않고 대신 다음과 같은 쿼리 바로 가기에 사용합니다.

  • 액세스 모듈 구성 :

    public function getFooBar() 
    {
        return Mage::getStoreConfig('module/foo/bar');
    }
  • 라이브러리 클래스의 팩토리 메소드

    public function getNewFooService()
    {
        return new \Foo\Service(...);
    }

다른 곳을 찾을 수 있지만 IMHO, 모듈 도우미는 종종 그런 것들에 충분 합니다.


2. 헬퍼 사용하기

핵심 도우미를 소비 하는 것은 자주 할 일입니다.

예 :

  • __()번역 방법 : 특정 모듈의 번역을 얻으려면을 사용해야합니다 Mage::helper('module-alias')->__('string to be translated'). $this->__(...)템플릿 또는 블록 내에서 사용하고 translate="..."XML 파일 에서 속성 을 사용하는 경우에는 암시 적으로 발생 합니다.
  • Mage::helper('core') 방법 : 현지화 된 날짜, 가격 및 통화 형식, 이스케이프 및 인코딩 데이터
  • Mage::helper('tax') 세금 구성에서 정보를 얻고이를 기반으로 가격을 계산하는 방법
  • Mage::helper('catalog/image') 캐시 및 크기 조정 된 카탈로그 이미지를 작성하고 해당 URL을 검색하기위한 인터페이스를 제공합니다.
  • Mage::helper('catalog/product_url_rewrite')->joinTableToSelect() URL 재 작성 테이블을 제품 콜렉션 조회에 결합합니다.

핵심 헬퍼에 숨겨져있는 유용한 기능은 더 많거나 적습니다. 코어 어딘가에서 사용할 수있는 특정 기능이 필요한 경우 헬퍼 메소드를 재사용 할 수 있는지 확인하십시오.

일반적으로 이러한 도우미는 상태 비 저장 개체이며 메서드는 쿼리 메서드입니다. 즉, 부작용이 없습니다.

그러나 항상 Magento는 자체 작성되지 않은 규칙을 위반하므로 예제로 사용해서는 안됩니다. 도우미를 사용하지하는 방법 A "좋은"예입니다 Mage_Catalog_Helper_Product_Compare이있는 $_itemCollection한 번만 초기화 할 수 있습니다 속성과 $_customerId세터로 변경 될 수 있습니다 속성을. 콜렉션이 첨부 된 카탈로그와 관련된 몇 가지 도우미를 찾을 수 있습니다. 코드를 사용하거나 다른 상황에서 재사용하는 코드에 대한 테스트를 작성하는 것은 재미 있지 않으므로 집에서 그렇게하지 마십시오.

catalog/image위에서 언급 한 도우미가 정말 헬퍼 안하는 도우미의 또 다른 예이다. init()먼저 현재 상태를 재설정 하는 제품을 전달한 다음 다양한 매개 변수 ( resize(), 등 setQuality()) 를 설정 하고 결국 __toString()메소드를 사용 하여 URL을 얻을 수 있습니다 . 템플릿에서 사용할 때 멋지게 보이지만 코드가 엉망이고 싱글 톤으로 의미가 없습니다.


TL; DR :

  • 핵심 도우미에는 유용한 도구가 포함되어 있습니다.
  • 번역 도우미가 필요합니다
  • 도우미는 무국적자 여야합니다
  • 자체 모듈에서는 헬퍼를 여러 기능 모음으로 사용하지 마십시오. 대부분의 경우 더 적절한 장소를 찾을 수 있습니다

플랫 파일을 기반으로 간단한 ERP 통합에서 도우미를 자주 사용했습니다. 로컬 디렉토리에서 파일을 쓰고 읽고 다른 객체 (제품, 순서 등)를 업데이트하기 만하면됩니다. 언급 된 인스턴스에는 상태 또는 해당 테이블이 없습니다. 이것에 대해 무엇을 가져가십니까?
musicliftsme

1
그것은 "부작용 없음"을 위반합니다. 파일을 읽고 쓰는 데 주로 사용 하는 것은 실제로 상태 (적어도 파일 리소스) 있는 모델 ReaderWriter모델 입니다. 예를 들어 CSV 파일에서 주문 상태 데이터를 읽으려면 sth가 필요합니다. 리카 모델이 사용하는 모델. 이 방법으로 나는 또한 "파일에서 데이터 읽기"와 " OrderStatusCsvReaderOrderStatusUpdater
마젠 토의

4

마리우스가 옳습니다. 나는 도우미가 말도 안된다고 생각합니다.

그러나 마 젠토 이론에서는 객체의 상태를 변경하지 않는 모든 것을 도우미에 넣어야합니다.

그러나 도우미에 넣을 수있는 모든 것, 모델에 넣을 수도 있습니다. 또한 모델의 다른 인스턴스를 얻을 수있어 테스트에 도움이됩니다.


2

저는 Magento를 처음 접했지만 Helper는 Magento의 서비스와 같습니다. "다른 목적으로 재사용 할 수있는 관련 소프트웨어 기능 세트"입니다. 모듈은 서비스를 통해 제공된 기능을 내 보냅니다. 다른 모듈을 사용하도록 초대하는 기능에는 도우미를 사용하십시오.

모델은 객체의 상태를 가져 오거나 설정하는 것과 직접 관련이 있거나 모델의 인스턴스화 된 객체에 연결된 방법 만 제공해야합니다.


1

도움말은 모델, 템플릿 등에서 중복 된 코드를 방지하고 때로는 필요할 때 유용합니다.

  • 사용자 정의 모듈이 활성화 Mage::getStoreConfigFlag('my/module/enabled')되어 있는지 확인하기 위해이를 확인하려는 모든 파일에 다음과 같은 것을 배치 하거나Mage::helper('my_module')->isEnabled() 이점과 함께 사용할 수 있습니다 .
    • 예를 들어 어떤 이유로 구성 경로가 변경되면 하나의 파일 만 조정하면됩니다.
    • 도우미 isEnabled()메서드 를 다시 작성할 수 있으며 여러 파일을 다시 쓰는 대신 해당 메서드를 사용하는 모든 클래스에 영향을 미칩니다
  • 13 @ @ 사용자 정의 확장을 작성하는 방법? : 필요 하지 않은 경우 클래스를 다시 쓰지 마십시오. 관찰자를 사용하고 재정의하려는 클래스의 매개 변수 및 인스턴스로받는 도우미 메서드를 사용할 수없는 경우 사용합니다. 잘못됨 :Mage_Catalog_Model_Product 메소드를 추가하도록 재정의 하십시오 getProductArticles(). 맞아 . 도우미에서 추가getProductArticles(Mage_Catalog_Model_Product $product)
  • 다음을 사용하여 레이아웃을보다 유연하게 만듭니다. <action method="someMethod"><var helper="module/method" /></action>

Data.php각 모듈에서 호출되는 도우미를 만들고 비워 둘 수 있습니다.

PHPUnit을 사용할 때 한 줄을 추가해야합니다 :protected $_moduleName = 'My_Module';

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