Cách hiện đại để viết lại các tập tin lib


21

Vấn đề đã được biết rõ: libcác lớp được tải độc quyền thông qua trình tải tự động và chúng tôi không thể thay đổi chúng ngoài:

  • Sao chép chúng hoàn toàn vào một mãPool được kiểm tra sớm hơn lib.
  • Cài đặt trình tải tự động PSR-0 , chỉ định sơ đồ lớp tự động tải, sau đó sao chép toàn bộ tệp vào cấu trúc thư mục đó. [giải pháp hiện tại của tôi]

Tôi đang ở một vị trí khó khăn vì tôi muốn có khả năng chạm vào nhiều tệp này - nhưng vì sự tỉnh táo và tính ổn định / khả năng nâng cấp của cửa hàng, tôi không muốn sao chép toàn bộ các lớp thư viện.

Bây giờ rõ ràng có những giải pháp tiềm năng cho vấn đề này, nhưng tất cả chúng đều đi kèm với một loạt vấn đề của riêng họ:

  • Đi theo lộ trình AOP và sử dụng thư viện dựa trên PHP như Go! AOP : Lần cuối tôi kiểm tra điều này sẽ yêu cầu các lớp Magento được tải bởi trình tải tự động của nhà soạn nhạc, không chỉ một lớp có sẵn. Flyingmana đã thực hiện một số công việc trong lĩnh vực này nhưng nó chắc chắn chưa sẵn sàng cho việc sử dụng sản xuất và nhu cầu của tôi ngay lập tức hơn. Tôi cũng muốn gửi như một phần mở rộng, và điều đó sẽ đòi hỏi nhiều thiết lập nhà soạn nhạc hơn.
  • Đi theo lộ trình AOP và sử dụng một phần mở rộng PHP gốc : Có lẽ là thuận lợi nhất vào thời điểm này, nhưng nó sẽ yêu cầu cài đặt một phần mở rộng riêng, chưa kể rằng nó sẽ không hoạt động với HHVM.
  • Sử dụng classkit và / hoặc runkit của PHP: Đó là một phần mở rộng PHP gốc khác nên nó có cùng một vấn đề như trên.
  • Trang web cuộc gọi vá để sử dụng \Danslo\Varien_Xphiên bản tên ( ) của riêng tôi , sau đó mở rộng từ phiên bản gốc ( \Varien_X): Có quá nhiều cuộc gọi để vá và nó sẽ yêu cầu số lượng ghi lại ngớ ngẩn. Không phải là một lựa chọn.
  • Cuộn của riêng tôi: Nó sẽ có thể:

    1. Viết trình tải tự động của riêng tôi.
    2. Sao chép lớp gốc vào một thư mục riêng ( {root_dir}/var/tmp), bọc nó vào namespace \Magento { < original contents > }.
    3. Bao gồm tập tin đó.
    4. Bao gồm lớp sửa đổi của tôi OriginalClass extends Magento\OriginalClass {}

Nhược điểm của điều này là rõ ràng: tạo mã động, regex, một ít chi phí để tải các lớp viết lại. Nhưng tôi gần như chắc chắn rằng tại thời điểm này, nó sẽ đánh bại việc sao chép ~ 5000 dòng mã khi tôi chỉ muốn chạm / thêm ~ 100 dòng.

Tôi biết tôi đang hỏi rất nhiều, nhưng có một cái gì đó hiện đại và tương đối sạch sẽ giúp giải quyết vấn đề này?


1
Bạn đã tìm thấy giải pháp quan sát Alans chưa? stackoverflow.com/a/4636662/158325
B00mer

Câu trả lời:



2

Đi theo lộ trình AOP và sử dụng thư viện dựa trên PHP như Go! AOP: Lần cuối tôi kiểm tra điều này sẽ yêu cầu các lớp Magento được tải bởi trình tải tự động của nhà soạn nhạc, không chỉ một lớp có sẵn. Flyingmana đã thực hiện một số công việc trong lĩnh vực này nhưng nó chắc chắn chưa sẵn sàng cho việc sử dụng sản xuất và nhu cầu của tôi ngay lập tức hơn. Tôi cũng muốn gửi như một phần mở rộng, và điều đó sẽ đòi hỏi nhiều thiết lập nhà soạn nhạc hơn.

Tôi muốn thêm rằng Go! Khung AOP có thể hoạt động mà không cần trình soạn thảo, tôi có thể giúp với cấu hình (chỉ cần tạo một vấn đề trên github cho điều đó). Trình soạn thảo chỉ cần để tích hợp trong suốt với các ứng dụng hiện đại.

Chỉ cần thay thế một include $filenamehoặc require $filenametrong bootstrap của bạn bằng include FilterInjectorTransformer::rewrite($filename)và định cấu hình trình tải tự động cho Go! AOP chính nó.


1
Ồ, thật tuyệt Tôi chắc chắn sẽ thử điều này.
Daniel Sloof

0

Đi với cách tiếp cận tự động tải. Đổi tên / all / class trong lib với tiền tố:

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

Chạy "trình ghi đè" sau đây bất cứ khi nào bạn thêm tệp vào mylib:

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

Dạy cho trình tải tự động trả về mylib/${classname}.phpnếu nó tồn tại và mylib/full/path/to/class.phpnếu nó không và mylib/full/path/to/class.phpkhông.

Đặt phần ghi đè của bạn vào mylib/full/path/to/class.phpvà mở rộng phiên bản Oldlib_.

Nâng cấp chỉ đơn giản là khôi phục tiền tố trong lib / nâng cấp nó, áp dụng lại tiền tố, chạy lại trình sửa lỗi ghi đè. Những gì còn lại là những thứ đã được chuyển đến lib/và trước đó đã bị ghi đè, nhưng điều đó không liên quan đến vấn đề. Vấn đề của bạn có thể là số lượng tệp của thư mục mylib /, nhưng tôi tin rằng bạn có thể giải quyết điều đó :).


Cách tiếp cận này đưa ra rất nhiều rủi ro và những điều cần duy trì đặc biệt là liên quan đến nâng cấp. Nó cũng phá vỡ quy tắc "không chạm vào lõi". Ngoài ra, nó không phải là một lựa chọn khả thi cho các nhà phát triển mở rộng.
bíp

Với tất cả sự tôn trọng ~ mặc dù giải pháp của bạn hoạt động ... nó không thể được coi là a moderncách viết lại các tập tin lib. Lập trình bắt buộc là trường học cũ;)
Eddie B

0

Ngoài ra, bạn có thể xác định Luồng tùy chỉnh và thêm nó vào đầu đường dẫn tự động tải. Nó hoạt động với bất kỳ trình tải tự động và yêu cầu áp dụng tối thiểu. Xem ví dụ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.