답변:
플러그인 만?
예. 추상 클래스를위한 플러그인을 작성할 수 있으며 가능하면 환경 설정보다 항상 플러그인을 선호해야합니다.
환경 설정은 구현 을 바꾸려 는 경우에 유용합니다 . AbstractModel
논리적으로 가능하다면 확장되는 모든 모델의 구현을 대체하는 유스 케이스를 생각할 수 없습니다 . 아마도 당신이 원하는 것은 기능 을 추가하거나 변경 하는 것입니다. 이것이 플러그인을위한 것입니다.
전체 솔루션 : magento가 자동로드하기 전에 교체 된 클래스를 포함하십시오. 단계별로 :
파일에서 app/etc/NonComposerComponentRegistration.php
행 추가
$pathList[] = dirname(__DIR__) . '/etc/ClassReplacer.php';
에서 app/etc
장소 파일 ClassReplacer.php
내용
class ClassReplacer
{
public function includeReplacedFiles($src)
{
try {
$replacedFiles = $this->listDir($src, false, true);
foreach ($replacedFiles as $replacedFile) {
include_once $src . $replacedFile;
}
} catch (Exception $e) {
return;
}
}
protected function listDir($dir, $prependDir = false, $recursive = false, $entityRegexp = null, $currPath = '')
{
if (!is_dir($dir)) {
return array();
}
$currPath = $prependDir ? $dir : $currPath;
$currPath = $currPath !== '' ? rtrim($currPath, '/') . '/' : '';
$files = array();
foreach (scandir($dir) as $file) {
if (in_array($file, array('.', '..'))) {
continue;
}
$entity = $currPath . $file;
if ($recursive && is_dir("$dir/$file")) {
$files = array_merge($files, $this->listDir("$dir/$file", false, true, $entityRegexp, $entity . '/'));
continue;
}
if ($entityRegexp && !preg_match($entityRegexp, $entity)) continue;
$files[] = $entity;
}
return $files;
}
}
$replace = new ClassReplacer();
$replace->includeReplacedFiles(dirname(__DIR__) . '/code/Magento/');
에 배치 app/code/Magento
대체 몇 가지 클래스, 예를 들어,app/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php
abstract 클래스에 재정의하려는 public 또는 protected 메소드가있는 경우 실제로 플러그인을 사용할 수없는 방법이 있습니다.
_processDownload
안에 \Magento\Downloadable\Controller\Download
'if-s'를 추가하여 inside 메소드를 재정의해야했습니다 . (누구든지 플러그인을 사용하여 메소드 내에 이와 같은 것을 추가하는 방법을 알고 있다면 기뻐할 것입니다). 수업은 추상적이므로 선호도가 작동하지 않았습니다. 메소드가 보호되어 있으므로 플러그인도 있습니다. 내가해야 할 일은 Download
환경 설정을 사용하여 에서 확장하는 모든 클래스를 재정의하는 것 입니다. 이 수업은 :
Magento\Downloadable\Controller\Download\Link
Magento\Downloadable\Controller\Download\LinkSample
Magento\Downloadable\Controller\Download\Sample
그리고 내부에서 부모 클래스의 메소드를 다시 작성합니다 (내가 재정의해야했던 클래스). 따라서 실제로 재정의 된 메서드 코드는 세 곳으로 복사되었으며 정확히 동일했습니다.
이상적이지는 않지만 작동합니다.
함수의 범위는 공용이어야하지만 Abstract 클래스의 기존 기능을 향상시키기 위해 Magento 플러그인을 사용해 볼 수 있습니다. 최근에 최근에 본 제품 목록 에서 사용자 지정 속성이 할당 된 제품을 제외해야하는 동일한 문제에 대해 작업했습니다 .
다음 구문을 사용하여 Magento \ Reports \ Block \ Product \ AbstractProduct 라는 클래스에서 getItemsCollection 이라는 함수에 플러그인을 사용했습니다.
파일 : app \ code \ Package \ Module \ etc \ frontend \ di.xml
<type name="Magento\Reports\Block\Product\AbstractProduct">
<plugin name="Package_Module::aroundGetItemsCollection" type="Package\Module\Block\Viewed" sortOrder="20"/>
</type>
파일 : app \ code \ Package \ Module \ Block \ Viewed.php
public function afterGetItemsCollection(
$subject, $result
) {
$result = $result->addAttributeToFilter('skip_hire_product', [['neq' => 1], ['null' => true]], 'left');
return $result;
}
플러그인 이전뿐만 아니라 주변에서도 사용할 수 있습니다. 이 작업이 당신에게 도움이 되길 바랍니다.