Я изучаю Yii. У меня есть тестовая разработка, которая содержит несколько таблиц (employee, personalDetails, address). Мое понимание MVC заставляет меня видеть их почти как отдельные планеты, где каждый (MVC) компонент играет четко определенную роль в этом мире.
У меня есть вопрос, который начинает меня бигать, потому что теперь я хочу передавать запросы на данные и вычисления между этими мирами. Я столкнулся с несколькими сообщениями о том, как это сделать, но они больше похожи на «хаки», чем «предписанные» практики. Я, очевидно, стараюсь не забирать вредные привычки. Этот процесс, очевидно, является корневым требованием любого развития, поэтому хотелось бы попросить дать некоторые рекомендации по этому вопросу.
В качестве примера можно привести мнение сотрудников, которые забирают домашние зарплаты> 100 000 долларов США, включая бонусы (например, диспетчер сотрудников запрашивает персональный контроллер для расчета {goss зарплата + бонусы – налог) и возвращает все соответствующие экземпляры, затем он просматривает и возвращает соответствующие сотрудники).
Итак, я создаю функцию в personalDetails и вызываю ее из внутреннего контроллера сотрудника, или если это происходит в расширении … или есть другой подход?
Буду признателен за
Для инкапсулированных частей, управляемых просмотром, используются виджеты . Для вышеприведенного случая вы можете создать виджет с настраиваемой трэшхолдом.
Если вам нужно спросить другого контроллера, чтобы вычислить что-то, это плохая практика. Поместите такие вычисления в модель вместо этого. Модель очень многоразовая, представление можно повторно использовать, однако контроллер должен реагировать только на действие и привязывать данные для просмотра.
Жирная модель , тонкий контроллер , мудрый вид.
Вот код проекта:
Сначала создайте модель с любыми необходимыми расчетами:
class Employee extends CActiveRecord { public function getTotalSalary() { // Do any calculations here // ... return $salary; } }
Затем вы можете повторно использовать его в контроллерах:
class FirstController extends CController { public function actionPersonDetails() { $model = $this->_loadModel(); // By assigning this you will have getTotalSalary() available in view $this->render('personDetails', ['model' => $model]); } } class SecondController extends CController { public function actionViewSallary() { $model = $this->_loadModel(); // Also here you will have getTotalSalary() available in view $this->render('viewSallary', ['model' => $model]); } }
И для более сложных сценариев, где вам нужно что-то автономное создание виджета:
class EmployeesWidget extends CWidget { public $minSalary = 0; private $_data = null; public function init() { $this->_data = new CActiveDataProvider(/* Criteria here with $this->minSalary as param */); } public function run() { $this->render('employeesWidget', ['data' => $this->_data]); } }
Тогда вы можете легко использовать его в любом представлении, даже в других виджетах:
$this->widget('path.to.EmployeesWidget', [ 'minSallary' => 10000 ]);