Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Created by PhpStorm.
- * User: hlogeon
- * Date: 13.08.14
- * Time: 12:33
- *
- * @author Degtyaruk Andrey <hlogeon1@gmail.com>
- *
- * На своей основной работе я занимаюсь разработкой на Zend Framework\Zend Framework 2,
- * но я не очень люблю Zend из-за его "академичности", описание множества вещей занимает куда
- * больше времени и строк кода, чем в других фреймворках. Однако, его академичность является для меня и плюсом,
- * ведь сам фреймворк, при правильном к нему подходе подталкивает использовать лучшие практики. При том,
- * как показывает опыт, довольно большая часть программистов на других фреймворках мало знакома даже с
- * базовыми концепциями инструментов, с которыми они работают и иногда не способны принимать, казалось бы очевидные,
- * но качественные архитектурные решения из-за привычки к тому, что фреймворк все делает за них.
- * Здесь я хочу привести пример, с которым я сталкивался, работая в довольно крупной компании.
- * Есть замечательный, на мой взгляд фреймворк - Yii Framework, который не только берет на
- * себя намного больше ответственности "из коробки", чем Zend, но и предоставляет довольно качественные и
- * гибкие интерфейсы для более тонкой настройки. А язык PHP, являясь очень гибким дополняет эту замечательную картину.
- * К сожалению, даже в крупных компаниях, где, казалось бы слова абстракция, принципы ООП, архитектура не должны являться пустым звуком, не используют эти возможности.
- * Для того, чтобы отобразить то, что делаю я и как это работает во многих других приложениях потребуется описать несколько
- * файлов, но для удобства я объединю каждое решение в 1 файл и добавлю дополнительные комментарии
- * на русском языке(в коде не пишу на русском, так будет видно, где пояснительные комментарии, а где те, которые были написаны при разработке)
- *
- * Этот файл описывает "стандартное" решение
- *
- *
- * Да, на первый взгляд оно намного проще и короче. А теперь представим, что у нас есть еще:
- * действия отображения
- * действия редактирования\созданий
- * действия вывода загрузки изображений(например в пользоваетеле, альбоме, компании и так даллее)
- * действие добавления отзыва
- * и так далее, реализуемые снова и снова в каждом из контроллеров из раза в раз. Да, на помощь может придходит стандартное наследование,
- * или, что по моему больше подходит в данной ситуации - трейты. Но это не избавит от необходимости писать код.
- * В случае с решением, которое я представил такая необходимость возникает только единожды, даже ничего расширять и переопределять не надо.
- *
- */
- class CompanyController extends Controller{
- public function actionIndex()
- {
- // Первым делом создадим фильтр и установим параметры фильтрации из входных данных
- /** @var $filter EMongoDocument */
- $filter = new Company('search');
- $filter->unsetAttributes();
- if($data = $this->getFilterData($filter))
- $filter->setAttributes($data);
- $filter->search(); // Этот метод для того, чтобы критерия модели фильтра стала выбирать по установленным в модели атрибутам
- $criteria = new EMongoCriteria(); // описываем все критерии, которые нам нужны
- // Теперь установим критерию фильтра
- $filter->setDbCriteria($criteria);
- // Теперь создадим дата провайдер. Дата провайдер из расширения yiimongodbsuite может брать критерию из
- // переданной ему модели (в нашем случае - фильтра)
- $dataProviderConfig = array(
- //Здесь описывем нужную конфигурацию провайдера
- );
- /** @var $dataProvider EMongoDocumentDataProvider */
- $dataProvider = new EMongoDocumentDataProvider($filter, $dataProviderConfig);
- // Теперь установим сценарии для моделей. Этот метод я опущу, он просто обходит модели и ставит каждой сценарий
- $this->setScenario($dataProvider->getData(), 'list');
- // И выводим
- $this->render('list', array(
- 'dataProvider' => $dataProvider,
- 'filter' => $filter,
- ));
- }
- protected function getFilterData()
- {
- //Фильтрация
- }
- protected function setScenario()
- {
- //Установка сценариев
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement