Вызов Функции Основного Класса Controller Из Наследуемых Контроллеров

В Controller.php добавил:


// описываем событие onNewComment

	protected function onNewParticipant($event) {

		$this->raiseEvent('onNewParticipant', $event);

	}

которую вызываю во многих контроллерах.

Например в contollers/FunboxController.php


public function actionApprove()

	{

		if(Yii::app()->request->isPostRequest)

		{

			$dancer=$this->loadModel();

			

			$notifier = new Notifier();

			// добавляем обработчик события

			$dancer->onNewParticipant = array($notifier, 'comment'); // ф-ция comment из компонента Notifier

			

			$dancer->approve();

			$this->redirect(array('unapproved'));

		}

		else

			throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

	}

В модели Funbox.php


/**

	 * Approves a comment.

	 */

	public function approve()

	{

		$this->status=Funbox::STATUS_APPROVED;

		$this->update(array('status')); 

		

		//создаём экземпляр потомка CEvent

		$event = new NewParticipantEvent($this);

		$event->dancer = $this;

		// triggering event

		$this->onNewParticipant($event); // перенёс в компонент Controller

	} 

И теперь при вызове funbox/approve возникает ошибка


Не определено свойство "Funbox.onNewParticipant".

С чем это связано? Ведь все функции из Controller наследуют и в FunboxController, которые расширяет его.

4677

CException.png

приходится переносить из общего Controller.php функцию onNewParticipant в каждую из моделей


public function onNewParticipant($event) {

		$this->raiseEvent('onNewParticipant', $event);

	} 

Получается излишний код.

Как всё таки сделать эту функцию общей и прописать только в одном месте, а не повторять в каждой модели?

Сделайте промежуточный класс, наследуйте модели уже от него. По аналогии с Controller’ом, который лежит в папке components, все ваши контроллеры наследуются от него, а не от CController.

Charger, спасибо! Правда надо было общий класс модели сделать и туда вставить общую для всех моделей функцию (и все модели от него наследовать), а я в контроллер пихал. Конечно Yii ругался, что не определён метод - он ждал его в модели, а не в контроллере.