Advertisement
Guest User

Yii framework Action standart

a guest
Aug 13th, 2014
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.43 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: hlogeon
  5.  * Date: 13.08.14
  6.  * Time: 12:33
  7.  *
  8.  * @author Degtyaruk Andrey <hlogeon1@gmail.com>
  9.  *
  10.  * На своей основной работе я занимаюсь разработкой на Zend Framework\Zend Framework 2,
  11.  * но я не очень  люблю Zend из-за его "академичности", описание множества вещей занимает куда
  12.  * больше времени и строк кода, чем в других фреймворках. Однако, его академичность является для меня и плюсом,
  13.  * ведь сам фреймворк, при правильном к нему подходе подталкивает использовать лучшие практики. При том,
  14.  * как показывает опыт, довольно большая часть программистов на других фреймворках мало знакома даже с
  15.  * базовыми концепциями инструментов, с которыми они работают и иногда не способны принимать, казалось бы очевидные,
  16.  * но качественные архитектурные решения из-за привычки к тому, что фреймворк все делает за них.
  17.  * Здесь я хочу привести пример, с которым я сталкивался, работая в довольно крупной компании.
  18.  * Есть замечательный, на мой взгляд фреймворк - Yii Framework, который не только берет на
  19.  * себя намного больше ответственности "из коробки", чем Zend, но и предоставляет довольно качественные и
  20.  * гибкие интерфейсы для более тонкой настройки. А язык PHP, являясь очень гибким дополняет эту замечательную картину.
  21.  * К сожалению, даже в крупных компаниях, где, казалось бы слова абстракция, принципы ООП, архитектура не должны являться пустым звуком, не используют эти возможности.
  22.  * Для того, чтобы отобразить то, что делаю я и как это работает во многих других приложениях потребуется описать несколько
  23.  * файлов, но для удобства я объединю каждое решение в 1 файл и добавлю дополнительные комментарии
  24.  * на русском языке(в коде не пишу на русском, так будет видно, где пояснительные комментарии, а где те, которые были написаны при разработке)
  25.  *
  26.  * Этот файл описывает "стандартное" решение
  27.  *
  28.  *
  29.  * Да, на первый взгляд оно намного проще и короче. А теперь представим, что у нас есть еще:
  30.  * действия отображения
  31.  * действия редактирования\созданий
  32.  * действия вывода загрузки изображений(например в пользоваетеле, альбоме, компании и так даллее)
  33.  * действие добавления отзыва
  34.  * и так далее, реализуемые снова и снова в каждом из контроллеров из раза в раз. Да, на помощь может придходит стандартное наследование,
  35.  * или, что по моему больше подходит в данной ситуации - трейты. Но это не избавит от необходимости писать код.
  36.  * В случае с решением, которое я представил такая необходимость возникает только единожды, даже ничего расширять и переопределять не надо.
  37.  *
  38.  */
  39.  
  40. class CompanyController extends Controller{
  41.  
  42.  
  43.  
  44.  
  45.     public function actionIndex()
  46.     {
  47.         // Первым делом создадим фильтр и установим параметры фильтрации из входных данных
  48.         /** @var $filter EMongoDocument */
  49.         $filter = new Company('search');
  50.         $filter->unsetAttributes();
  51.         if($data = $this->getFilterData($filter))
  52.             $filter->setAttributes($data);
  53.         $filter->search(); // Этот метод для того, чтобы критерия модели фильтра стала выбирать по установленным в модели атрибутам
  54.  
  55.         $criteria = new EMongoCriteria(); // описываем все критерии, которые нам нужны
  56.         // Теперь установим критерию фильтра
  57.         $filter->setDbCriteria($criteria);
  58.         // Теперь создадим дата провайдер. Дата провайдер из расширения yiimongodbsuite может брать критерию из
  59.         // переданной ему модели (в нашем случае - фильтра)
  60.         $dataProviderConfig = array(
  61.             //Здесь описывем нужную конфигурацию провайдера
  62.         );
  63.         /** @var $dataProvider EMongoDocumentDataProvider */
  64.         $dataProvider = new EMongoDocumentDataProvider($filter, $dataProviderConfig);
  65.  
  66.         // Теперь установим сценарии для моделей. Этот метод я опущу, он просто обходит модели и ставит каждой сценарий
  67.         $this->setScenario($dataProvider->getData(), 'list');
  68.  
  69.         // И выводим
  70.         $this->render('list', array(
  71.             'dataProvider' => $dataProvider,
  72.             'filter' => $filter,
  73.         ));
  74.  
  75.     }
  76.  
  77.  
  78.     protected function getFilterData()
  79.     {
  80.         //Фильтрация
  81.     }
  82.  
  83.     protected function setScenario()
  84.     {
  85.         //Установка сценариев
  86.     }
  87.  
  88.  
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement