Використання PHP фреймворків при розробці сайтів


Використання PHP фреймворків при розробці сайтів

При виборі PHP фреймворку, можна трохи заплутатися з тим, що він повинен робити, і з тим для чого призначений фреймворк і що він виконує.  Не кожен фреймворк підтримує ORM-шар для роботи з базами даних, має якісне співтовариство і хорошу документацію.  Це може не перешкодити якщо потрібен простий фреймворк.  Однак, якщо необхідний фреймворк який би зручний і простий в освоєнні, то необхідно ретельно підійти до питання вибору фреймворку і зважити всі «за» і «проти».

Головні фактори вибору оптимального фреймворку для розробки сайту:

  1. Підтримка баз даних
    Питання підтримки баз даних в PHP фреймворку дуже важливе.  Наприклад, CodeIgniter підтримує MySQL, Oracle і SQLite, а фреймворк Kohana не підтримує Oracle і SQLite.  Частина фреймворків мають вбудований ORM-шар, частина - ні.  Залежно від використовуваної бази даних для розробки проекту доводиться вибирати той чи інший PHP фреймворк.
  2. Підтримка спільноти
    Для комфортного вирішення проблем повинен мати хороше співтовариство, не тільки з точки зору розміру, але і в якості і в готовності допомогти. Навіть якщо це маленьке співтовариство, але є зворотний зв'язок від спільноти, це можна вважати плюсом.
  3. Документація
    Частина фреймворк мають слаборозвинених, застарілу документацію.  Частина не мають російської документації.  Тому перед вибором фреймворку необхідно переконатися в тому що документація актуальна, вчасно оновлюється і доповнюється, і що інструкція із застосування проста в розумінні.
  4. Продуктивність
    Ключовим фактором при виборі так само може бути продуктивність фреймворку, наприклад, частина фреймворків підтримує кешування на достатньому рівні, частина - ні.
  5. Безпека
    Не всі фреймворки стійкі до різного роду атакам, тому перед вибором фреймворку необхідно ретельно проаналізувати активність розвитку, розмір спільноти, а так само наявність вбудованих засобів для захисту від атак.
  6. Поріг входження
    Не всі фреймворки прості в освоєнні, це дуже важливо враховувати при виборі, так як на освоєння одного фреймворку може не вистачити і року, а на освоєння іншого - вистачить всього тижня.
  7. Швидкість розробки
    Так само слід врахувати той факт, що на одному фреймворку проект розробляється швидше, на іншому - ні.  Наприклад, розробки із застосуванням фреймворку zend триває більше ніж із застосуванням yii.
  8. Model View Controller аріхтектура
    Фреймворк також повинен використовувати MVC архітектуру.  Якщо цього у вас немає, то швиденько, ще раз погляньте в попередній розділ, для того щоб зрозуміти для чого він потрібен.  Більшість хороших PHP фреймворків мають бібліотеки, плагіни, модулі та розширення.  Це дуже добре для того щоб реалізувати велике коло функціоналу та вдосконалити і прискорити процес розробки.
  9. Швидкість розвидку фреймворку
    Цей пункт так само дуже важливий, так як деякі фреймворки оновлюються кожні два роки, а деякі раз в пару місяців.  Це дозволяє уникнути використання старого, недопрацьованого коду при розробці.
  10. Зворотна сумісність
    Не всі фреймворки назад сумісні, тобто, при оновленні фреймворку в проекті може виникнути необхідність в повній переробці проекту.  Частина фреймворків умовно зворотно сумісна, наприклад, при оновленні молодшої частини версії (minor) все сумісно, ​​а при старшій - немає.  Так само великим плюсом є керівництво по переходу на нову версію фреймворку.
  11. Наявність вбудованих javascript бібліотек
    Для прикладу, yii-фреймворк включає в себе jquery і jquery ui, а так само має вбудовані засоби для контролю підключених скриптів і черговості їх виконання, а codeigniter - немає.

Найбільш розповсюджені помилки при виборі фреймворку

Будь-яка людина може помилитися при виборі PHP фреймворку, однак можна захиститися від такого роду помилок.  Тому необхідно переконатися, що обраний фреймворк має достатню функціональність і гарну підтримку, тому що  зазвичай невеликі фреймворки створюються особами, знання PHP і навіть дещо обмежені.  Це може викликати різні помилки і питання, які в кінцевому рахунку заважають і уповільнюють процес розробки.
Вибираючи PHP фреймворк необхідно звертати увагу на те, наскільки він легкий в освоєнні і розумінні.  Це має дуже важливе значення для малодосвідченого PHP програміста.  Також необхідно переконатися, що база даних і веб-сервер сумісні з архітектурою обраного фреймворку.
Якщо не притримувати вищевказаних вимог, то можливі падіння в продуктивності розробки проекту, продуктивності коду і легкості супроводу.  Іншою поширеною помилкою є неправильна установка фреймворку.  При установці необхідно слідувати інструкції, щоб уникнути помилок.

Розробка проєкту

В якості проекту, для ознайомлення з можливостями фреймворків, була обрана розробка сайту-каталогу одягу і взуття, який буде володіти такими особливостями:

  1. Товари розділені за категоріями, з можливістю створення підкатегорій;
  2. Зручна адміністративна панель;
  3. Багатомовність, підтримка англійської, української та польської мов;
  4. Підтримка високих навантажень (кешування).


Для розробки такого проекту був обраний MVC-фреймворк yii, який володіє відносно низьким «порогом входження» і великим російськомовним спільнотою.

Роботу над створенням будь-якого сайту можна розділити на наступні етапи:

  1. вибір і установка необхідних інструментів;
  2. розробка дизайну проекту та верстки;
  3. проектування і створення бази даних;
  4. створення основи програми та конфігурація;
  5. генерація каркаса коду за допомогою кодогенератор Gii;
  6. установка верстки та доопрацювання каркаса;
  7. настройка кешування, багатомовності та «гарних» посилань.

Розробка дизайну сайту 

Хороший дизайн може принести власникові сайту багато переваг перед конкурентами і матеріальну вигоду.  Залежно від того, які цілі ставить перед собою компанія при створенні сайту, дизайн може підтвердити або підкреслити статус компанії - власника, створити додаткову рекламу компанії або послуг, уявити впізнаваний бренд і т.п.
Дизайн сайту виконаний в сріблясто-пурпурових тонах.  Сріблястий колір символізує строгість, стиль, силу.  Пурпурний підкреслює стиль і доповнює його смаком.  Дизайн помірно консервативний, традиційний і говорить про чоловічому стилі.  Шапка сайту з логотипом і банером відображає назва і вигідне комерційну пропозицію.

Проєктування та створення бази даних

Під час проектування база даних були виділені наступні таблиці:


Крім перерахованих вище полів кожна таблиця має первинним ключем id для зв'язку з іншими таблицями і зручності управління записами.

Створення основи додатку та конфігурація

Для створення програми на основі фреймворку yii, необхідно завантажити останню версію з офіційного сайту www.yiiframework.com, розпакувати і скопіювати теку framework в z: \ home \ magazin.local \ www.  Так як для установки під denwer, інструкція відрізняється від офіційної, то, перед установкою, необхідно відредагувати файл z: \ home \ magazin.local \ www \ framework \ yiic.bat, вказавши в ньому замість php.exe повний шлях до php: z  : \ usr \ local \ php5 \ php.exe.  Після цього необхідно запустити командний інтерпретатор і ввести наступні команди:
C: \ Users \ root> z:
Z: \> cd \ home \ magazin.local \ www
Z: \ home \ magazin.local \ www> framework \ yiic.bat webapp magazin
При появі питання «Create a Web application under 'Z: \ home \ magazin.local \ www \ magazin'?  [Yes | no] »необхідно натиснути y, після чого буде створено каркас додатка і виведений список створених файлів

Створена основа має низку базових функцій, такими як вбудована авторизація, висновок статичних сторінок і т.д.
Для зручності перенесення на інший web-сервер або хостинг, після створення, каркас додатка був винесений з теки magazin на один рівень вище, а в index.php і index-test.php виправлений шлях до фреймворку.

Файл конфігурації програми розташований за наступним шляхом: protected / config / main.php.  Файл описує налаштування програми у вигляді асоціативного php-масиву. Для настройки підключення до бд був налаштований компонент додатка db в секції components:

 'Db' ​​=> array (
 // рядок у форматі dsn для підключення до БД
 'ConnectionString' => 'mysql: host = localhost; dbname = magazin',
 // Ім'я користувача
 'Username' => 'root',
 'Password' => '',
 'Charset' => 'utf8',
 ),

Генерація каркасу коду за допомогою генератора GII

Після того як основа додатка створена і налаштована, можна приступити до розробки контролерів і моделей.  Починаючи з версії 1.1.2, фреймворк доступний разом з вбудованим генератором коду Gii.  Gii дозволяє генерувати моделі на основі таблиць в базі даних, а так само CRUD-контролери для основних дій з управління записами, такими як додавання запису (Create), побачити список записів, перегляд запису (Read), редагування записи (Update) і видалення (  Delete).  Для активації Gii в файл конфігурації програми було додано опис підключення модуля gii:

'Gii' => array (
 'Class' => 'system.gii.GiiModule',
 // Пароль для входу в кодогенератор
 'Password' => 'generate',
 // Дозволені ip-адреси
 'IpFilters' => array ( '127.0.0.1', ':: 1'),
 ),

Після цього, для того щоб зайти в Gii необхідно перейти за наступним посиланням в браузері: http: //magazin.local/index.php? R = gii /.  Після авторизації буде доступний простий, зручний інтерфейс для генерації коду.

Так як модель використовується для управління записами в одній таблиці, то були згенеровані 4 моделі: Price, Category, Photo, Text.  Для цього використовувався розділ Model Generator, в якому в якості імені таблиці була вказана *.
Для генерації CRUD-контролерів, в Gii є розділ Crud Generator.  Так як таблиця Photo є допоміжною, то для управління записами в ній не потрібен окремий контролер, тому були згенеровані 3 контролера: PriceController, MenuController (для Category), TextController.

Встановлення верстки та доопрацювання каркасу

Подання в фреймворку yii - це спеціальний php-скрипт, що складається з простих виразів, що відповідає за відображення елементів призначеного для користувача інтерфейсу.  У кожного уявлення є ім'я, яке використовується для пошуку скрипта уявлення.  Якщо ім'я уявлення test, то ім'я скрипта уявлення test.php.
Для відображення уявлення використовується метод CController :: render, якому передається ім'я уявлення і масив значень, який перетворюється в локальні змінні всередині уявлення.  Наприклад, якщо всередині дії update контролера ItemController викликається:

 $ This-> render ( 'update', array (
 'Model' => $ model,
 'Language' => Yii :: app () -> language,
 ));

то, скрипт уявлення буде розташований за наступним шляхом: protected / views / item / update.php, а всередині нього будуть доступні дві локальні змінні: $ model і $ language.
Всередині скрипта уявлення так само доступний екземпляр контролера, до якого можна звернутися за допомогою $ this.  Це дозволяє використовувати всередині уявлення властивості і методи контролера, наприклад, для відображення віджета, кешування, виведення заголовка сторінки і т. Д.
Так само, при обробці скрипта уявлення неявно використовується спеціальне подання - макет, який декорує призначений для користувача інтерфейс і може містити такі елементи як шапка сайту і підвал.  Усередині макета доступна локальна змінна $ content, в якій зберігається висновок скрипта уявлення.  Макет, по-замовчуванню, розташований за наступним шляхом: protected / views / layouts / main.php.
Віджет - це компонент, вбудований в уявлення, з метою відображення складної, самостійної частини інтерфейсу.  Наприклад, віджет може використовуватися для виведення меню, таблиці і т. п.
Крім віджетів, в фреймворку присутній клас CHtml, статичні методи якого дозволяють виводити посилання на основі заданих маршрутів (route), форми і її елементів введення і т. п. Найбільш часто використовуваний метод це Chtml :: link (<заголовок>, <маршрут в  вигляді масиву або рядки>), який дозволяє вивести посилання на основі правил маршрутизації.
Всі дії по встановленню верстки та доопрацюванні каркаси можна розділити на наступні пункти:

При розробці проекту основною мовою була англійська, всі інші мови були додані за допомогою файлів перекладів і будуть описані пізніше в роботі.

Налаштування макета

Установка верстки була розпочата з макета.  Основні елементи, які присутні в макеті це шапка сайту, включаючи меню, меню категорій праворуч і підвал.
Для відображення меню сайту використовувався віджет zii.widgets.CMenu, який дуже просто підключається і настроюється:

 <? Php $ this-> widget ( 'zii.widgets.CMenu', array (
 // Список пунктів
 'Items' => array (
array ( 'label' => Yii :: t ( 'menu', 'Home'), 'url' => array ( '/ price / index')),
array ( 'label' => Yii :: t ( 'menu', 'New'), 'url' => array ( '/ price / new')),
array ( 'label' => Yii :: t ( 'menu', 'Help'), 'url' => array ( 'text / index', 'page' => 'help')),
array ( 'label' => Yii :: t ( 'menu', 'Price'), 'url' => array ( '/ price / get')),
array ( 'label' => Yii :: t ( 'menu', 'Contact'), 'url' => array ( '/ text / index', 'page' => 'contact')),
array ( 'label' => Yii :: t ( 'menu', 'Logout'), 'url' => array ( '/ admin / logout'), 'visible' =>! Yii :: app () ->  user-> isGuest),
 ),
 ));  ?>

де label - назва пункту меню, url - маршрут (route) до контролера і дії, а visible - статус видимості пункту.  Для відображення меню категорій товарів використовувався віджет CTreeView, настройка якого повністю аналогічна, за винятком формування списку вкладених категорій, який був винесений в окремий віджет-адаптер - LeftMenu, який спочатку розроблявся для виведення меню зліва, але в зв'язку з незручністю інтерфейсу винесено в праву частину  .
Так само, для відображення заголовка сторінки використовувалося св-во контролера $ this-> pageTitle.

Настройка представлень видимих ​​для відвідувачів

Для відображення головної сторінки з товарами, а так само сторінки новинок використовувався віджет zii.widgets.CListView:

 <? Php $ this-> widget ( 'zii.widgets.CListView', array (
 'DataProvider' => $ dataProvider,
 'ItemView' => '_ item',
 'Template' => '{sorter} {items} {pager}',
 'SortableAttributes' => array (
 'Title'.ucfirst (Yii :: app () -> language),
 'Time',
 'Cost'
 ),
 'PagerCssClass' => 'pager clear',
 ));?>

де dataProvider - провайдер даних, itemView - спеціальний файл уявлення відображає одну модель у вигляді локальної змінної $ data, template - шаблон виводу, sortableAttributes відповідають за сортування даних по полях, а pagerCssClass використовувався для настройки положення перемикача сторінок.  Провайдер даних - спеціальний компонент-адаптер, який відповідає за вибірку моделей (записів) за певним умові, їх сортування, а також за розбиття по сторінках, буде розглянуто пізніше в роботі.  Js-скрипт HighSlide був підключений відповідно до опису на оф.  сторінці.
Відображення прайс-листа і інших сторінок було виконано без застосування віджетів у вигляді стандартного php-коду.

Доопрацювання правил валідації моделей та провайдерів даних

Так як модель відповідає за вибірку і валідацію (перевірку) даних, то в ній описуються умови вибірки та перевірки даних.
Правила валідації описуються в методі rules моделі.  Цей метод повинен повернути масив з описом правил валідації, наприклад:

public function rules ()
 {
return array (
array ( 'titleRu, titleEn, titleRo', 'length', 'max' => 255, 'min' => 4),
array ( 'titleRu, titleEn, titleRo', 'required'),
array ( 'parent', 'numerical', 'integerOnly' => true, 'allowEmpty' => false),
 );
 }


Формат опису правила виглядає наступним чином:
array (<ім'я св-ва / св-в моделі (полів в таблиці) »,« псевдонім валідатора>, <ім'я доп. параметра валідатора 1> => <значення параметра 1>, ...)
Кожне ім'я валідатора є псевдонімом класу.  Це дозволяє створювати і використовувати свої класи валідації.  Основні валідатори:

  1. default (CDefaultValueValidator) - присвоює значення за замовчуванням обраним атрибутам;
  2. in (CRangeValidator) - перевіряє, чи міститься значення атрибута в зазначеному наборі значень;
  3. length (CStringValidator) - перевіряє, чи знаходиться довжина строкового значення атрибута в в зазначеному інтервалі;
  4. numerical (CNumberValidator) - перевіряє, чи є значення атрибута числом;
  5. required (CRequiredValidator) - перевіряє, чи не є значення атрибута порожнім;
  6. match: псевдонім класу CRegularExpressionValidator, котрий перевіряє значення атрибута на відповідність регулярному виразу;
  7. unique: псевдонім класу CUniqueValidator, який перевіряє, чи є значення атрибута унікальними в межах шпальти таблиці бази даних;

Розширені можливості пошуку кожного з валідаторів докладно описані в керівництві по yii.
Після того як правила валідації були налаштовані, в модель були додані статичні методи для вибірки списку товарів.  Кожній такій метод використовує провайдер даних і виглядає приблизно так:

public static function searchByCategory ($ category, $ pageSize)
 {
 // створення умови вибірки
 $ Criteria = new CDbCriteria ();
 $ Criteria-> select = 'Id, title'.ucfirst (Yii :: app () -> language).'  as title, cost ';
 $ Criteria-> addInCondition ( 'idCategory', Category :: getAllChildren ($ category));
 // створення провайдера даних
return new CActiveDataProvider (__ CLASS __, array (
 // умова вибірки
 'Criteria' => $ criteria,
 // настройка посторінкового виведення
 'Pagination' => array (
 'PageSize' => $ pageSize
 ),
 // підтримка сортування
 'Sort' => array (
 'DefaultOrder' => 'title'.ucfirst (Yii :: app () -> language),
 'Attributes' => array (
 'Title'.ucfirst (Yii :: app () -> language),
 'Time',
 'Cost'
 )
 )
 ));
 }


Як видно з наведеного вище коду провайдер даних є екземпляром класу CActiveDataProvider (а так само нащадком CDataProvider) і дуже гнучкий в налаштуванні.

Налаштування представлень адміністратора

Для виведення посилань для адміністраторських дій необхідно перевірка чи є користувач адміністратором.  Так як адміністратор всього один в системі і поділ прав не використовується, то достатньо лише перевірки на авторизовані користувача: if (Yii :: app () -> user-> isGuest).
Після того як були виведені всі посилання, були доопрацьовані подання форм з урахуванням специфіки моделей і правил валідації.  Для цього використовувалися статичні методи CHtml, відповідальні за виведення полів введення форми.  Найбільш часто використовувані методи CHtml для форм:

  1. CHtml :: activeLabelEx (<модель »,« ім'я вл>) - виводить заголовок поля введення, де заголовок береться з методу attributeLabels моделі, а так само позначає його червоною *, якщо воно обов'язкове (має валідатор required).
  2. CHtml :: activeTextField (<модель »,« ім'я вл>) - виводить текстове поле введення.
  3. CHtml :: activeTextArea (<модель »,« ім'я вл>) - виводить textarea-поле введення.
  4. CHtml :: submitButton (<ім'я кнопки>) - виводить кнопку для відправки форми на сервер.

Для додавання фотографій використовувалося розширення SwfUpload, використання якого докладно описано на сторінці керівництва.

Кешування, мультимовність та гарні посилання

Після того як всі основні дії з доопрацювання каркаса виконані, залишилося додати підтримку великих навантажень (кешування), налаштувати багатомовність і красиві посилання.
Для активації кешування в файлі конфігурації було додано опис компонента додатка cache з класом CFileCache, що відповідає за зберігання кешу в локальних файлах.
Для настройки кешування в контролерах використовувався компонент COutputCache, описаний в методі filters контролера:

array (
 // Компонент відключений для адміністраторських дій
 'COutputCache -create, update, upload',
 // Термін придатності
 'Duration' => 24 * 3600 * 365,
 // залежності
 'Dependency' => array (
 'Class' => 'CChainedCacheDependency',
 'Dependencies' => array (
 // по глобальній зміні pm_time
new CGlobalStateCacheDependency ( 'pm_time'),
 // по глобальній зміні cu_time
new CGlobalStateCacheDependency ( 'cu_time'),
 ),
 ),
 // дані в кеші відрізняються по категорії, сортування, сторінок, мови
 'VaryByParam' => array ( 'category', 'sort', 'page', 'lang'),
 // і по статусу авторизованого користувача
 'VaryByExpression' => 'Yii :: app () -> user-> isGuest',
 // кеш використовується тільки для GET-запитів
 'RequestTypes' => array ( 'GET'),
 ),


де cu_time - Останнім часом поновлення категорій, а pu_time - товарів і змінюються за подією збереження моделі.
Так як, по-замовчуванню, додаток вже підтримує багатомовність за допомогою класу CPhpMessageSource, який зберігає перекази в php-файлах перекладу, то в проекті використовувався саме цей спосіб зберігання.
Кожне повідомлення перекладу відноситься до будь-якої категорії.  Повідомлення перекладів зберігаються за наступним шляхом: protected / messages / <код мови> / <ім'я категорії> .php.  Файли переклади містять в собі асоціативний масив, де ключем є фраза на вихідному (англійська) мовою, а значення - перекладене для даного коду (українська, наприклад).
Для перекладу повідомлення, фреймфорк yii надає статичний метод Yii :: t (<ім'я категорії »,« повідомлення »), а для зберігання поточної мови на засланні в файл конфігурації було підключено стороннє розширення як компонент додатка urlManager: LangUrlManager.
Для активації «красивих», человекопонятний посилань компонент додатка urlManager був налаштований таким чином:

 'UrlManager' => array (
 'Class' => 'application.extensions.urlManager.CLangUrlManager',
 // формувати посилання в форматі / route / p1 / v1 / p2 / v2 / ...
 'UrlFormat' => 'path',
 'Rules' => array (
 // код мови завжди розташований попереду посилання
 '<Lang: (en | ua |pl)>' => '/ price',
 '<Lang: (en | ua | pl)> / <_ c>' => '<_ c>',
 '<Lang: (en | ua | pl)> / <_ c> / <_ a>' => '<_ c> / <_ a>',
 '<Lang: (en | ua | pl)> / text / index / <page:. *>' => 'Text / index',
 ),
 // не виводити index.php на засланні
 'ShowScriptName' => false,
 ),

а в кореневій папці сайту (www) був доданий файл .htaccess з активацією і налаштуванням mod_rewrite в web-сервері apache:

Options + FollowSymLinks
IndexIgnore * / *
RewriteEngine on
RewriteCond% {REQUEST_FILENAME}! -F
RewriteCond% {REQUEST_FILENAME}! -D
RewriteRule.  index.php

Виснвок

Ми розробили багатофункціоанальний, мультимовний сайт каталог одягу на основі фреймворку Yii2. В Yii вкладено багато можливостей які виділяють цей фреймворк на тлі інших і роблять розробку з його допомогою дуже швидкою і приємною.