Расширение метода SilverStripe в SS4

Я пытаюсь расширить метод класса, но мне не повезло. Я делаю это как часть обновления с 3.7 до 4.5. В 3.7 он отлично работал без использования трейтов. Читая документацию, я использовал трейт «Расширяемый». Теперь я получаю следующую ошибку. Проверил все уровни доступа к моим методам. Все являются общедоступными, но все еще получают эту ошибку

Неустранимая ошибка: уровень доступа к SilverStripe\Core\Extensible::defineMethods() должен быть общедоступным (как в классе SilverStripe\View\ViewableData)

    class MyOpenController extends Controller {

    use Extensible;

     private static $allowed_actions = array(
        'login',
        'logout'
    );

    public function login($data = array()) {
      //code here
      $this->extend('customFunction');
      //more code      
    }
}

У меня есть класс расширения, в котором есть определение для этого метода.

class MyOpenControllerExtension extends Extension
{

    public function customFunction() {
          //some code here
    }
}

не могу понять, почему у меня эта ошибка. Может кто-нибудь, пожалуйста, помогите мне понять, что здесь не так.

Спасибо ДР


person RDRAO    schedule 22.07.2020    source источник


Ответы (1)


ViewableData в SilverStripe 4 уже реализованы трейты Extensible, Injectable и Configurable, которые составляют общую основу, к которой вы привыкли в SilverStripe 3. Вам нужно только добавить трейт Extensible для пользовательских классов — они уже есть во всех расширениях Controller или DataObject.

Ошибка, которую вы получаете, вызвана двойным применением этой черты в иерархии вашего класса. ViewableData применяет его и существенно переопределяет метод defineMethods() на общедоступном уровне. Когда вы снова применяете трейт ниже по иерархии, он пытается снова определить метод defineMethods() в защищенной видимости, что и вызывает вашу ошибку.

Удаление use Extensible; с вашего контроллера решит вашу проблему.

Кроме того, убедитесь, что вы применили расширение к своему контроллеру в конфигурации YAML:

# File: app/_config/extensions.yml
MyOpenController:
  extensions:
    - MyOpenControllerExtension
person scrowler    schedule 23.07.2020
comment
спасибо, Робби, разобрался. У меня была опечатка в моем пространстве имен в конфигурационном файле yml. Теперь по порядку :-) - person RDRAO; 29.07.2020