Tại sao việc thêm các tham số hàm tạo yêu cầu tôi xóa / tạo


7

Tôi đang sử dụng Magento 2.2 trong chế độ phát triển.

Tôi có một lớp điều khiển

class MyController
{
   public function __construct(
      \Magento\Framework\App\Action\Context $context,
      \Magento\Framework\Message\ManagerInterface $messageManager)
   {
      // stuff
   }
}

Điều đó hoạt động chính xác. Tuy nhiên, nếu tôi thêm một tham số hàm tạo bổ sung như thế này:

class MyController
{
   public function __construct(
      \Magento\Framework\App\Action\Context $context,
      \Magento\Framework\View\Result\PageFactory $resultPageFactory,
      \Magento\Framework\Message\ManagerInterface $messageManager)
   {
      // stuff
   }
}

Tôi nhận được lỗi

PHP Fatal error: Uncaught TypeError: Argument 2 passed to
Ben\Testing\Controller\Test::__construct() must be an instance of 
Magento\Framework\View\Result\PageFactory, instance of 
Magento\Framework\Message\ManagerInterface given, called in 
/magento-dev/magento2/generated/code/Ben/Testing/Controller/Test/Interceptor.php
on line 7 and defined in /magento-dev/magento2/app/code/Ben/Testing/Controller/Test.php:7
...

Nếu tôi xóa /generatedthư mục và làm mới trang, nó sẽ hoạt động.

Câu hỏi của tôi là về cách Magento xử lý bộ đệm và mã được tạo. Tôi có thể thêm mã bổ sung cho các hàm không xây dựng mà không cần phải xóa /generated, và nó hoạt động. Tại sao nó hoạt động, nhưng việc thêm các tham số hàm tạo bổ sung yêu cầu tôi xóa /generatedthư mục?

Câu trả lời:


7

Câu trả lời ngắn: Bởi vì Magento không sử dụng lớp mà bạn nghĩ nó sử dụng.
Câu trả lời dài:
Đó là vì các plugin / đánh chặn.
Vì vậy, đối với mỗi lớp có các phương thức có bổ trợ, magento tạo ra một lớp có cùng tên với lớp gốc và thêm \Interceptorvào cuối.
Bạn có thể thấy rằng trong thông báo lỗi của bạn.
Thiết bị chặn này mở rộng các lớp gốc

use \Magento\Framework\Interception\Interceptor;

public function __construct(list of main  class parameters in here)
{
    $this->___init();
    parent::__construct(list of main class parameters in here); //THIS LINE IS IMPORTANT FOR YOUR PROBLEM.  
}

/**
 * {@inheritdoc}
 * This is added for every interceptable method in the main class and it's named exactly like the method
 */
public function interceptableMethod(parameters of interceptable method)
{
    $pluginInfo = $this->pluginList->getNext($this->subjectType, 'interceptableMethod');
    if (!$pluginInfo) {
        return parent::interceptableMethod(parameters of interceptable method);
    } else {
        return $this->___callPlugins('interceptableMethod', func_get_args(), $pluginInfo);
    }
}

Điều thứ hai cần tính đến là một lớp đánh chặn như vậy chỉ được tạo ra nếu nó chưa tồn tại.

Vì vậy, khi bạn thay đổi chữ ký hàm tạo của lớp và lớp chặn sẽ được tạo, điều này xảy ra.

Trình xây dựng lớp mới của bạn sẽ yêu cầu 3 tham số.
Thiết bị chặn được tạo vẫn có hàm tạo cũ với 2 tham số.
Đây không phải là một vấn đề đối với chính lớp đánh chặn vì nó sẽ được khởi tạo với 2 phụ thuộc.
Nhưng sau đó, nó gọi parent::__construct(dòng tôi đã đánh dấu trong ví dụ trên) với cùng 2 tham số. và parentlà lớp của riêng bạn mà bây giờ yêu cầu 3 tham số.
Vì vậy, điều này sẽ gây ra một lỗi.
Việc loại bỏ lớp chặn khỏi generatedthư mục sẽ khiến magento tái tạo nó trong cuộc gọi tiếp theo và lần này nó sẽ có chữ ký của hàm tạo thích hợp.


Giải thích tuyệt vời. Cảm ơn sự giúp đỡ của bạn.
Ben Rubin
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.