Magento 2의 추상 클래스에 새로운 메소드 추가


16

이 스레드가 말했듯이 Magento 1의 Magento 2 에서 추상 클래스를 재정의하십시오 .

나는 완전히 새로운 수업을 만들 수 있습니다. Magento 2에서는 플러그인을 사용해야하지만 플러그인을 사용하면 기존 메소드 만 수정할 수 있습니다. 새로운 방법을 추가하려면 어떻게해야합니까?

예:

이 클래스 vendor/magento/module-ui/Component/AbstractComponent.php에는 구성 $components요소 배열이 있습니다. 해당 배열의 요소를 설정 해제 / 삭제하는 기능이 없습니다. 어떻게 그 함수를 만들 수 있습니까?

답변:


0

수업을 완전히 재정의하지 않고 어떻게 할 수 있는지 모르겠습니다. 예를 들어, XML에서 "disabled"항목을 "data"인수로 설정하여 개별 구성 요소를 비활성화 할 수 있습니다. 예를 들어 :

<?xml version="1.0" encoding="UTF-8"?>

<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="general">
        <field name="title">
            <argument name="data" xsi:type="array">
                <item name="disabled" xsi:type="boolean">true</item>
            </argument>
        </field>
    </fieldset>
</form>

이렇게하면 $components배열 에서 '제목'이 효과적으로 제거 됩니다.

이것은 클래스 의 createChildComponent메소드 때문입니다 Magento\Framework\View\Element\UiComponentFactory.

 protected function createChildComponent(
        array $bundleComponents,
        ContextInterface $renderContext,
        $identifier
    ) {
        list($className, $arguments) = $this->argumentsResolver($identifier, $bundleComponents);
        if (isset($arguments['data']['disabled']) && (int)$arguments['data']['disabled']) {
            return null;
        }
        $components = [];
        foreach ($bundleComponents['children'] as $childrenIdentifier => $childrenData) {
            $children = $this->createChildComponent(
                $childrenData,
                $renderContext,
                $childrenIdentifier
            );
            $components[$childrenIdentifier] = $children;
        }
        $components = array_filter($components);
        $arguments['components'] = $components;
        if (!isset($arguments['context'])) {
            $arguments['context'] = $renderContext;
        }

        return $this->objectManager->create($className, $arguments);
    }

이것은 내가 찾고있는 것이 아닙니다 ... Abstract 클래스에 새로운 메소드를 추가하는 방법을 원합니다 ... 이것은 단지 예입니다 ... 예를 들어 요소를 동적으로 제거하려면 어떻게해야합니까? 귀하의 의견에 "완전 재정의"에 대해 언급하는 방법은 무엇입니까 ??
Matias

그런 다음 추상 클래스를 확장하는 클래스에서 새 메소드를 정의한 다음 클래스에서 상속하고 di.xml에서 환경 설정을 설정하는 추상 클래스의 서브 클래스에 대한 클래스를 작성해야합니다. 이것이 바로 '클래스를 완전히 재정의'한다는 의미입니다. 나는 그것을 피하는 방법의 예를 보여 주려고했습니다.
Aaron Allen

예, 이해합니다 ...하지만 솔루션을 확장 할 수는 없습니다 ... M2가 추상 클래스를 무시할 가능성을 제거했다고 믿을 수는 없습니다 ... 제거하지 않고 개선 할 것이라고 생각했습니다. .
마티아스


0

커뮤니티 또는 로컬 디렉토리를 통해 오토로더의 M1에서 클래스를 오버로드하는 것은 (당신이 연결 한 질문에서 제안한 바와 같이) M1에서 나쁜 습관으로 간주되었습니다.

원래 클래스가 변경되면 Magento 인스턴스를 업그레이드 할 수없는 경우가 많으므로 오버로드 된 클래스는 고려하지 않았습니다.

실제로는 추상 클래스에 메소드를 추가 해야하는 유스 케이스를 생각할 수 없습니다. 항상 자신의 논리를 자체 클래스에 추가하여 플러그인 / 관찰자 / viewModel / xml 구성에 통합 할 수 있기 때문입니다.

가장 좋은 방법은 특정 유스 케이스에 대한 추상 클래스를 확장 한 다음 필요한 경우 클래스를 사용하는 새 클래스를 도입하는 것입니다.

Ui 구성 요소에서 요소를 제거 해야하는 경우 레이아웃 프로세서의 레이아웃 / 플러그인을 통해 요소를 필요로하는 js 파일을 변경하는 것이 더 좋습니다.

따라서 특정 사용 사례를 설명하면 이에 대한 더 나은 대답이있을 수 있습니다.


나는 그것이 나쁜 습관이라는 것을 알고 있지만, 적어도 한 가지 방법이 있습니다. 예를 들어,로드하는 모든 단일 모델에 대해 캐시를 추가하려는 경우를 고려하십시오. 이는 추상 클래스에서 load 메소드를 수정하여 수행 할 수 있으며이 변경 사항은 모든 클래스에 전파됩니다. 이것이 없으면 각 모델을 수정해야하며 전혀 확장 할 수 없습니다.
Matias

두 번째 사용 사례는 티켓에서 내가 말한 것을하고 싶다면 해당 배열에서 요소를 설정 해제 / 삭제하고 (예로 고려하십시오) 다른 것을 생각할 수 있습니다 ... 새로운 기능을 만들어야합니다. 그렇지 않으면 추상 클래스에서 확장하는 각 클래스에서 동일한 함수를 작성해야하며 다시 확장 할 수는 없습니다 ... 마 젠토 코어의 변수는 보호되지 않고 비공개이기 때문에 최악의 경우 그것을하는 유일한 방법은 추상 클래스에 메소드를 추가하는 것입니다.
Matias

첫 번째 예제는 추상 모델에 around plugin을 추가하고 모델 당로드 결과를 캐시함으로써 절대적으로 쉽습니다. 추상 모델이 변경되는 모든 향후 업데이트를 중단하는 추상 클래스를 오버로드하는 것보다 훨씬 낫습니다. 당신은 기본적으로 실제 사용 사례 추상 클래스에 메서드를 추가하는 대신 진술에 대해 정확히 물어 때문에 두 번째 "예"나는 많은 약을 말할 수 없다
데이비드 Verholen

이 업데이트에 문제가 있기 때문에 당신이 작곡가의 자동 로더를 조작하지만, 매우 낙담 할 수 있기 때문에 BTW는 Magento2 여전히 가능 magento.stackexchange.com/questions/164455/...
데이비드 Verholen

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