최신 lib 파일 재 작성 방법


21

문제는 잘 알려져 있습니다 : lib클래스는 오토로더를 통해 독점적으로로드되며, 다음 이외의 클래스는 변경할 수 없습니다.

  • lib보다 먼저 확인 된 codePool에 완전히 복사합니다.
  • PSR-0 자동 로더 설치, 자동로드 클래스 맵을 지정한 다음 파일을 해당 폴더 구조로 완전히 복사합니다. [내 현재 솔루션]

잠재적으로 이러한 파일 중 많은 부분을 다루고 싶기 때문에 어려운 위치에 있습니다. 그러나 저장소의 안정성 및 업그레이드 가능성을 위해 전체 라이브러리 클래스를 복사하고 싶지 않습니다.

분명히이 문제에 대한 잠재적 인 해결책이 있지만 모두 고유 한 문제 세트가 있습니다.

  • 이동 AOP의 경로와 같은 PHP 기반의 라이브러리를 사용하는 이동! AOP : 마지막으로 Magento 클래스를 작곡가 오토로더가로드 할 수 있어야합니다. Flyingmana는 이 분야에서 몇 가지 작업 을 수행 했지만 프로덕션 사용 준비가되지 않았으며 내 요구가 더 즉각적입니다. 또한 확장으로 제공하고 싶습니다. 더 많은 작곡가 설정이 필요합니다.
  • AOP 경로로 이동하여 기본 PHP 확장을 사용하십시오 . 아마도이 시점에서 가장 유리할 것입니다. 그러나 HHVM에서 작동하지 않는다는 것은 말할 것도없이 별도의 확장을 설치해야합니다.
  • PHP의 classkit 및 / 또는 runkit 사용 : 다른 기본 PHP 확장이므로 위와 동일한 문제가 있습니다.
  • 호출 사이트에 내 네임 스페이스 ( \Danslo\Varien_X) 버전 을 사용하도록 패치 한 다음 원본 ( \Varien_X) 에서 확장하십시오. 패치 할 호출 사이트가 너무 많으므로 재 작성이 거의 필요하지 않습니다. 옵션이 아닙니다.
  • 내 자신의 롤 : 가능해야합니다 :

    1. 내 오토로더를 작성하십시오.
    2. 원본 클래스를 별도의 폴더 ( {root_dir}/var/tmp)에 복사하여 감싸십시오 namespace \Magento { < original contents > }.
    3. 그 파일을 포함 시키십시오.
    4. 수정 된 수업 포함 OriginalClass extends Magento\OriginalClass {}

동적 코드 생성, 정규식, 다시 작성된 클래스를로드하기위한 약간의 오버 헤드가 있습니다. 그러나 나는이 시점에서 ~ 100 줄을 터치 / 추가하려고 할 때 ~ 5000 줄의 코드를 복사하는 것을 능가 할 것이라고 거의 확신합니다.

나는 많이 묻는다는 것을 알고 있지만이 문제를 해결하는 데 도움이되는 현대적이고 비교적 깨끗한 것이 있습니까?


1
Alans 옵저버 솔루션을 아직 찾았습니까? stackoverflow.com/a/4636662/158325
B00MER

답변:



2

AOP 경로로 가서 Go!와 같은 PHP 기반 라이브러리를 사용하십시오. AOP : 마지막으로 확인한 것은 Magento 클래스가 작곡가 오토로더에 의해로드되어야한다는 것입니다. Flyingmana는이 분야에서 몇 가지 작업을 수행했지만 프로덕션 사용 준비가되지 않았으며 내 요구가 더 즉각적입니다. 또한 확장으로 제공하고 싶습니다. 더 많은 작곡가 설정이 필요합니다.

그 Go를 추가하고 싶습니다! AOP 프레임 워크는 작곡가없이 작동 할 수 있습니다. 구성에 도움을 줄 수 있습니다 (github에서 문제를 생성하십시오). Composer는 최신 응용 프로그램과의 투명한 통합에만 필요합니다.

그냥 교체 include $filename또는 require $filename사용하여 부트 스트랩에를 include FilterInjectorTransformer::rewrite($filename)하고 이동을위한 자동 로더를 구성! AOP 자체.


1
좋은 와우. 나는 이것을 시도 할 것이다.
Daniel Sloof

0

오토로더 접근 방식으로 이동하십시오. 접두어로 lib의 / all / 클래스 이름을 바꾸십시오.

find lib -name '*.php' -exec sed -e 's,^class ,class Oldlib_,' {} +

mylib에 파일을 추가 할 때마다 다음 "override fixer"를 실행하십시오.

find lib -name '*.php' -print | while read FILE
do
    classname=$(echo ${FILE}|sed -e 's,^lib/,,' -e 's,\.php$,,' -e 's,/,_,g')
    if [ ! -f mylib/${FILE#lib/} ]; then
        # ensure is_a works by providing a stub with correct classname
        echo "class ${classname} extends Oldlib_${classname} {}" > mylib/${classname}.php
    elif [ -f mylib/${classname}.php ]; then
        # we have a new override, but the old file still exists
        rm mylib/${classname}.php
    fi
done

오토로더가 mylib/${classname}.php존재하고 존재 mylib/full/path/to/class.php하지 않으면 리턴하도록 가르치십시오 mylib/full/path/to/class.php.

재정의를 mylib/full/path/to/class.php넣고 Oldlib_ 버전을 확장하십시오.

업그레이드는 단순히 lib / 접두사에서 접두사를 롤백하고 접두사를 다시 적용한 다음 대체 수정 프로그램을 다시 실행합니다. 남은 것은 lib/이전에 재정의 된 항목이지만 문제와 관련이 없습니다. 문제는 mylib / 디렉토리의 파일 수일 수 있지만 해결할 수 있다고 생각합니다. :)


이 접근법은 특히 업그레이드와 관련하여 유지해야 할 많은 위험과 것들을 소개합니다. 또한 "핵심을 건드리지 마십시오"규칙을 위반합니다. 또한 확장 개발자에게는 실행 가능한 옵션이 아닙니다.
beeplogic

모든면에서 ~ 솔루션은 작동하지만 ... a modernlib 파일을 다시 쓰는 방법 으로 간주 될 수 없습니다 . 명령형 프로그래밍은 오래된 학교입니다.)
Eddie B

0

또한 사용자 정의 스트림을 정의하여 자동로드 경로 위에 추가 할 수 있습니다. 모든 오토로더와 함께 작동하며 최소한의 채택 요구도 있습니다. 예를 참조하십시오

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