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 <hlogeon1@gmail.com> | |
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 | } |