SHOW:
|
|
- or go back to the newest paste.
| 1 | <?php | |
| 2 | /** | |
| 3 | * Created by PhpStorm. | |
| 4 | * User: hlogeon | |
| 5 | * Date: 13.08.14 | |
| 6 | * Time: 12:33 | |
| 7 | * | |
| 8 | * @author Degtyaruk Andrey <[email protected]> | |
| 9 | * | |
| 10 | - | * На своей основной работе я занимаюсь разработкой на Zend Framework\Zend Framework 2, |
| 10 | + | * The way most developers do even in huge projects! |
| 11 | - | * но я не очень люблю Zend из-за его "академичности", описание множества вещей занимает куда |
| 11 | + | |
| 12 | - | * больше времени и строк кода, чем в других фреймворках. Однако, его академичность является для меня и плюсом, |
| 12 | + | |
| 13 | - | * ведь сам фреймворк, при правильном к нему подходе подталкивает использовать лучшие практики. При том, |
| 13 | + | |
| 14 | - | * как показывает опыт, довольно большая часть программистов на других фреймворках мало знакома даже с |
| 14 | + | |
| 15 | - | * базовыми концепциями инструментов, с которыми они работают и иногда не способны принимать, казалось бы очевидные, |
| 15 | + | |
| 16 | - | * но качественные архитектурные решения из-за привычки к тому, что фреймворк все делает за них. |
| 16 | + | |
| 17 | - | * Здесь я хочу привести пример, с которым я сталкивался, работая в довольно крупной компании. |
| 17 | + | |
| 18 | - | * Есть замечательный, на мой взгляд фреймворк - Yii Framework, который не только берет на |
| 18 | + | |
| 19 | - | * себя намного больше ответственности "из коробки", чем Zend, но и предоставляет довольно качественные и |
| 19 | + | |
| 20 | - | * гибкие интерфейсы для более тонкой настройки. А язык PHP, являясь очень гибким дополняет эту замечательную картину. |
| 20 | + | |
| 21 | - | * К сожалению, даже в крупных компаниях, где, казалось бы слова абстракция, принципы ООП, архитектура не должны являться пустым звуком, не используют эти возможности. |
| 21 | + | // At first create filter from input data |
| 22 | - | * Для того, чтобы отобразить то, что делаю я и как это работает во многих других приложениях потребуется описать несколько |
| 22 | + | |
| 23 | - | * файлов, но для удобства я объединю каждое решение в 1 файл и добавлю дополнительные комментарии |
| 23 | + | |
| 24 | - | * на русском языке(в коде не пишу на русском, так будет видно, где пояснительные комментарии, а где те, которые были написаны при разработке) |
| 24 | + | |
| 25 | if($data = $this->getFilterData($filter)) | |
| 26 | - | * Этот файл описывает "стандартное" решение |
| 26 | + | |
| 27 | $filter->search(); // Search | |
| 28 | ||
| 29 | - | * Да, на первый взгляд оно намного проще и короче. А теперь представим, что у нас есть еще: |
| 29 | + | $criteria = new EMongoCriteria(); // describe all criteria we need |
| 30 | - | * действия отображения |
| 30 | + | // Now set criteria |
| 31 | - | * действия редактирования\созданий |
| 31 | + | |
| 32 | - | * действия вывода загрузки изображений(например в пользоваетеле, альбоме, компании и так даллее) |
| 32 | + | // Create data provider |
| 33 | - | * действие добавления отзыва |
| 33 | + | |
| 34 | - | * и так далее, реализуемые снова и снова в каждом из контроллеров из раза в раз. Да, на помощь может придходит стандартное наследование, |
| 34 | + | //describe data provider config |
| 35 | - | * или, что по моему больше подходит в данной ситуации - трейты. Но это не избавит от необходимости писать код. |
| 35 | + | |
| 36 | - | * В случае с решением, которое я представил такая необходимость возникает только единожды, даже ничего расширять и переопределять не надо. |
| 36 | + | |
| 37 | $dataProvider = new EMongoDocumentDataProvider($filter, $dataProviderConfig); | |
| 38 | ||
| 39 | // Set scenario for models | |
| 40 | $this->setScenario($dataProvider->getData(), 'list'); | |
| 41 | ||
| 42 | // And finally render | |
| 43 | $this->render('list', array(
| |
| 44 | 'dataProvider' => $dataProvider, | |
| 45 | 'filter' => $filter, | |
| 46 | )); | |
| 47 | - | // Первым делом создадим фильтр и установим параметры фильтрации из входных данных |
| 47 | + | |
| 48 | } | |
| 49 | ||
| 50 | ||
| 51 | protected function getFilterData() | |
| 52 | {
| |
| 53 | - | $filter->search(); // Этот метод для того, чтобы критерия модели фильтра стала выбирать по установленным в модели атрибутам |
| 53 | + | //filtration |
| 54 | } | |
| 55 | - | $criteria = new EMongoCriteria(); // описываем все критерии, которые нам нужны |
| 55 | + | |
| 56 | - | // Теперь установим критерию фильтра |
| 56 | + | |
| 57 | {
| |
| 58 | - | // Теперь создадим дата провайдер. Дата провайдер из расширения yiimongodbsuite может брать критерию из |
| 58 | + | //Setting scenarios |
| 59 | - | // переданной ему модели (в нашем случае - фильтра) |
| 59 | + | |
| 60 | ||
| 61 | - | //Здесь описывем нужную конфигурацию провайдера |
| 61 | + | |
| 62 | } |