Как наследовать поведение базового контроллера в дочернем контроллере, потому что базовое поведение имеет приоритет по дочернему поведению?

#yii2

#yii2

Вопрос:

Например? У меня есть два BaseController и ChildController. Я хочу присоединить поведение от BaseController, но приоритет имеет поведение (базовое), когда поведение (дочернее).

База:

 public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'matchCallback' => function ($rule, $action) { 
                            return ...(true or false)...;
                        }
                    ],
                ],
            ],
        ];
    }
  

Дочерний:

                     [
                    'allow' => true,
                    'roles' => ['admin'],
                    'matchCallback' => function($rule, $action) {
                        return ... can...
                    }
                ],
  

и логика:

если родительский возврат false, то доступ запрещен

если родительский возвращает true, то что возвращает дочерний

как?

Ответ №1:

Это должно вам помочь

   public function behaviors()
  {
    $behaviors = parent::behaviors();
    $behaviors['access'] = [
      'class' => AccessControl::className(),
      'rules' => [
        [
          'allow' => true,
          'matchCallback' => function ($rule, $action) {
            return ... can ...;
          },
        ],
      ],
    ];
    return $behaviors;
  }
  

другой способ может быть:

 public function behaviors()
  {
    $behaviors = parent::behaviors();
    $behaviors['access']['rules'][] = [
      'allow' => true,
      'matchCallback' => function ($rule, $action) {
        return ... can ...;
      },
    ];
    return $behaviors;
  }