Как правильно в контроллере писать свои функции чтобы их можно было вызвать из любого экшена?
В принципе я нашел решение, но что-то мне подсказывает что от него попахивает быдлокодингом :)
Делаю так. Моя функция внутри контроллера:
public static function myFunction(){
//тело функции
}
Вызвать её потом можно из любого экшена так: MyController::myFunction();
На сколько это решение верное? И как правильнее делать?
P.S. Yii первой версии
Что-то мне подсказывает, что свои методы лучше (правильнее) реализовать в МОДЕЛИ. Это не будет противоречить MVC. А уже из контроллера вызывать методы модели.
Также можно вынести в компонент.
MyModel.php
<?php
class MyModel
{
public static function myStaticMethod(){
//тело СТАТИЧЕСКОГО метода
}
public function myMethod(){
//тело метода
}
}
MyController.php
<?php
class MyController extends Controller
{
public function actionContact()
{
MyModel::myStaticMethod(); // вызов статического метода
$model=new MyModel;
$model->myMethod(); //вызов метода
}
}
Если ничего не напутал, то как-то так. Давно это было, мог забыть уже
@pt1c: Спасибо! Все работает. Читал что по принципам MVC должны быть толстые модели и тонкие контроллеры. Не мог понять как этого добиться. Теперь вроде понял. Все функции по максимуму выносить в модель. Так?
Скорее получается, что модель в себе содержит бизнес правило, логику, а контроллер только это все дергает для вызова. Например если вы пишите функционал расчета суммы и НДС (18%) для какой то абстрактной суммы с включенным НДС, то формулу расчета
value_sum = sum_with_nds / 1.18;
value_nds = sum_with_nds - value_sum;
вы должны запихать в модель.
Лучше использовать модель для хранения своих функций.
А контроллеры должны быть худыми.
Например для получения пользователя по id модели User можно реализовать статически:
<?php
class User extends CActiveRecord {
...
static function get($id){
return self::model()->findByPk($id);
}
...
Можно будет вызвать как <?php print_r(User::get(нужный ид)) ?>
Только не путать static с public