답변:
이론적으로 도우미를 사용해서는 안됩니다.
헬퍼는 관련이없는 메소드의 모음 일 뿐이며 항상 싱글 톤으로 인스턴스화됩니다.
기본적으로 일부 네임 스페이스 (이 경우 클래스 이름)로 그룹화 된 함수를 사용한 절차 적 프로그래밍입니다. 그러나 Magento에는 핵심 헬퍼가 있으므로 메소드를 어디에 넣을지 모를 때나 메소드를 여러 위치 (모델, 컨트롤러, 템플릿)에서 호출해야 하는지를 알 수 있습니다.
최후의 수단으로 사용하십시오.
또한 Magento에는 번역상의 이유로 각 모듈에 대한 도우미가 필요합니다. 각 모듈에서
호출되는 도우미를 만들고 Data.php
비워 둘 수 있습니다.
이 질문에는 두 가지 측면이 있습니다.
일반적으로 클래스라는 이름의 한 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, 모듈 도우미는 종종 그런 것들에 충분 합니다.
핵심 도우미를 소비 하는 것은 자주 할 일입니다.
__()
번역 방법 : 특정 모듈의 번역을 얻으려면을 사용해야합니다 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 :
Reader
과 Writer
모델 입니다. 예를 들어 CSV 파일에서 주문 상태 데이터를 읽으려면 sth가 필요합니다. 리카 모델이 사용하는 모델. 이 방법으로 나는 또한 "파일에서 데이터 읽기"와 " OrderStatusCsvReader
OrderStatusUpdater
마리우스가 옳습니다. 나는 도우미가 말도 안된다고 생각합니다.
그러나 마 젠토 이론에서는 객체의 상태를 변경하지 않는 모든 것을 도우미에 넣어야합니다.
그러나 도우미에 넣을 수있는 모든 것, 모델에 넣을 수도 있습니다. 또한 모델의 다른 인스턴스를 얻을 수있어 테스트에 도움이됩니다.
도움말은 모델, 템플릿 등에서 중복 된 코드를 방지하고 때로는 필요할 때 유용합니다.
Mage::getStoreConfigFlag('my/module/enabled')
되어 있는지 확인하기 위해이를 확인하려는 모든 파일에 다음과 같은 것을 배치 하거나Mage::helper('my_module')->isEnabled()
이점과 함께 사용할 수 있습니다 .
isEnabled()
메서드 를 다시 작성할 수 있으며 여러 파일을 다시 쓰는 대신 해당 메서드를 사용하는 모든 클래스에 영향을 미칩니다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';
foreach
루프 및 모든 종류의 광기 에서 컬렉션을로드하는 교육 레거시 코드를 작성했습니다 . 나는이 무서운 논리를 도우미로 리팩터링하고 그것을 유용한 객체 캐시로 사용하는 것을 발견했으며, 모델에 배치하는getModel
대신 실수로 호출했을 수있는 미래 개발자의 오류에 대한 여지를 거의 남지 않았습니다getSingleton
.