В конце прошлого года SitePoint опубликовал статью, в которой освещались основные фреймворки PHP. Для пятого места было выбрано Yii (произносится Yee ) Framework. В то время самой последней доступной версией фреймворка была 1.1.14. Недавно появился Yii 2.0, так что вы можете начать использовать его в производстве.
Хотя мы освещали его недавно, когда он все еще находился в статусе RC, он только достиг полного статуса релиза, и мы чувствуем, что пришло время вернуться к этой теме с некоторыми причинами выбора ее среди альтернатив.
1. Простота установки
Для веб-разработчиков время — деньги, и никто не хочет тратить свое драгоценное время на сложный процесс установки и настройки.
Установка выполняется с помощью Composer . Если вам нужно описание процесса установки, Sitepoint недавно опубликовал отличную статью здесь . Я предпочитаю использовать базовый шаблон приложения, даже если на моем сайте есть отдельный фронтальный и внутренний компоненты. Вместо этого я предпочитаю использовать модуль для серверной части моих сайтов. (Модули Yii лучше всего описать как мини-приложения, которые находятся внутри вашего основного приложения).
Примечание . Многие из ссылок на каталоги в последующих примерах используют структуру каталогов из простого шаблона.
2. Использует современные технологии
Yii — это чистый OOP-фреймворк, использующий некоторые из более продвинутых функций PHP, включая позднюю статическую привязку , классы и интерфейсы SPL , а также анонимные функции .
Все классы имеют пространство имен, что позволяет вам воспользоваться их автозагрузчиком, совместимым с PSR-4. Это означает, что включение вспомогательного класса HTML Yii так же просто, как:
use yii\helpers\Html;
Yii также позволяет вам определять псевдонимы, чтобы упростить ваши пространства имен. В приведенном выше примере этот оператор use
загрузит определение класса, которое по умолчанию находится в каталоге /vendor/yiisoft/yii2/helpers
. Этот псевдоним определен в классе BaseYii в строке 79:
public static $aliases = ['@yii' => __DIR__];
Сам фреймворк устанавливается с помощью Composer, как и его расширения. Даже процесс публикации расширений так же прост, как создание собственного composer.json
, размещение кода на Github и размещение вашего расширения на Packagist.
3. Высоко Расширяемый
Yii похож на костюм, который отлично смотрится со стойки, но также очень легко адаптировать под свои нужды. Практически каждый компонент фреймворка является расширяемым. Простой пример — добавление уникального идентификатора тела к вашим представлениям. (Если вам интересно знать, почему вы можете захотеть это сделать, посмотрите эту статью ).
Сначала я бы создал файл в каталоге app\components
с именем View.php
и добавил следующее:
namespace app\components; class View extends yii\web\View { public $bodyId; /* Yii allows you to add magic getter methods by prefacing method names with "get" */ public function getBodyIdAttribute() { return ($this->bodyId != '') ? 'id="' . $this->bodyId . '"' : ''; } }
Затем в моем основном файле макета ( app\views\layouts\main.php
) я добавил бы следующее к тегу body моего HTML:
<body <?=$this->BodyIdAttribute?>>
И, наконец, я бы добавил следующее в мой основной файл конфигурации, чтобы Yii знал, чтобы использовать мой расширенный класс View
вместо его собственного значения по умолчанию:
return [ // ... 'components' => [ // ... 'view' => [ 'class' => 'app\components\View' ] ] ];
4. Поощряет тестирование
Yii тесно интегрирован с Codeception . Codeception — это отличная среда тестирования PHP, которая помогает упростить процесс создания модульных, функциональных и приемочных тестов для вашего приложения. Потому что вы пишете автоматизированные тесты для всех ваших приложений, верно?
Расширение Codeception упрощает настройку приложения во время тестирования. Просто отредактируйте предоставленный файл /tests/_config.php
чтобы настроить тестовое приложение. Например:
return [ 'components' => [ 'mail' => [ 'useFileTransport' => true, ], 'urlManager' => [ 'showScriptName' => true, ], 'db' => [ 'dsn' => 'mysql:host=localhost;dbname=mysqldb_test', ], ], ];
Используя эту конфигурацию, произойдет следующее:
- Любые электронные письма, отправленные во время ваших функциональных и приемочных тестов, будут записаны в файл, а не отправлены.
- URL-адреса в ваших тестах будут иметь формат
index.php/controller/action
а не/controller/action
- Ваши тесты будут использовать вашу тестовую базу данных, а не производственную базу данных.
Специальный модуль для Yii Framework также существует в Codeception. Он добавляет несколько методов в класс TestGuy
, которые помогают вам работать с Active Record (Yii’s ORM) во время функциональных тестов. Например, если вы хотите проверить, успешно ли в вашей регистрационной форме был создан новый User
с именем пользователя «testuser», вы можете сделать следующее:
$I->amOnPage('register'); $I->fillField('username', 'testuser'); $I->fillField('password', 'qwerty'); $I->click('Register'); $I->seeRecord('app\models\User', array('name' => 'testuser'));
5. Упрощает безопасность
Безопасность является важной частью любого веб-приложения, и, к счастью, в Yii есть несколько замечательных функций, которые помогут вам расслабиться.
Yii поставляется с компонентом приложения Security, который предоставляет несколько методов, помогающих создать более безопасное приложение. Некоторые из более полезных методов:
- generatePasswordHash : генерирует безопасный хеш из пароля и случайной соли. Этот метод создает случайную соль для вас, а затем создает хеш из предоставленной строки, используя PHP-функцию crypt .
- validatePassword : это сопутствующая функция для
generatePasswordHash
, которая позволяет вам проверить, соответствует ли введенный пользователем пароль вашему сохраненному хешу. - generateRandomKey : позволяет создать случайную строку любой длины
Yii автоматически проверяет допустимый токен CSRF для всех небезопасных методов HTTP-запросов (PUT, POST, DELETE) и генерирует и выводит токен, когда вы используете метод ActiveForm :: begin () для создания тега открываемой формы. Эту функцию можно отключить, отредактировав ваш основной файл конфигурации, чтобы включить следующее:
return [ 'components' => [ 'request' => [ 'enableCsrfValidation' => false, ] ];
Для защиты от XSS Yii предоставляет еще один вспомогательный класс, называемый HtmlPurifier . Этот класс имеет единственный статический метод с именем process и будет фильтровать ваши выходные данные, используя популярную библиотеку фильтров с тем же именем.
Yii также включает готовые к использованию классы для аутентификации и авторизации пользователей. Авторизация делится на два типа: ACF (фильтры контроля доступа) и RBAC (управление доступом на основе ролей).
Более простым из них является ACF, и он реализуется путем добавления следующего к методу поведения вашего контроллера:
use yii\filters\AccessControl; class DefaultController extends Controller { // ... public function behaviors() { return [ // ... 'class' => AccessControl::className(), 'only' => ['create', 'login', 'view'], 'rules' => [ [ 'allow' => true, 'actions' => ['login', 'view'], 'roles' => ['?'] ], [ 'allow' => true, 'actions' => ['create'], 'roles' => ['@'] ] ] ]; } // ... }
Предыдущий код говорит DefaultController
разрешить гостевым пользователям доступ к login
в login
и view
действия, но не действие create
. ( ?
это псевдоним для анонимных пользователей, а @
относится к аутентифицированным пользователям).
RBAC — это более мощный метод определения того, какие пользователи могут выполнять определенные действия в вашем приложении. Это включает создание ролей для ваших пользователей, определение разрешений для вашего приложения, а затем включение этих разрешений для их предполагаемых ролей. Вы можете использовать этот метод, если хотите создать роль Moderator
и разрешить всем пользователям, назначенным на эту роль, утверждать статьи.
Вы также можете определить правила, используя RBAC, которые позволяют вам при определенных условиях предоставлять доступ к определенным аспектам вашего приложения. Например, вы можете создать правило, которое позволяет пользователям редактировать свои собственные статьи, но не те, которые были созданы другими.
6. Сократить время разработки
Большинство проектов включают в себя определенное количество повторяющихся задач, с которыми никто не хочет тратить время. Yii предоставляет нам несколько инструментов, которые помогут вам тратить меньше времени на выполнение этих задач, а также больше времени на настройку вашего приложения в соответствии с потребностями ваших клиентов.
Один из самых мощных из этих инструментов называется «Gii». Gii — это веб-инструмент для создания кода, который позволяет быстро создавать шаблоны кода для:
- модели
- Контроллеры
- формы
- Модули
- расширения
- Действия и представления CRUD-контроллера
Gii легко настраивается. Вы можете установить его для загрузки только в определенных средах. Просто отредактируйте файл веб-конфигурации следующим образом:
if (YII_ENV_DEV) { // ... $config['modules']['gii'] = [ 'class' => 'yii\gii\Module', 'allowedIPs' => ['127.0.0.1', '::1'] ] }
Это гарантирует, что Gii будет загружаться только тогда, когда для переменной среды Yii задано значение development , и что он будет загружаться только при доступе через localhost.
Теперь давайте посмотрим на модель генератора:
Имя таблицы использует виджет typeahead, чтобы попытаться угадать, с какой таблицей связана ваша модель, и все поля имеют всплывающую подсказку, которая напоминает вам, как их заполнять. Вы можете предварительно просмотреть код, прежде чем попросить Gii его сгенерировать, и все шаблоны кода будут полностью настраиваемыми.
Существует также несколько инструментов командной строки, которые помогают создавать шаблоны кода для переноса базы данных, преобразования сообщений (I18N) и фиксации базы данных для ваших автоматических тестов. Например, вы можете создать новый файл миграции базы данных с помощью этой команды:
yii migrate/create create_user_table
Это создаст новый шаблон миграции в {appdir} / migrations, который выглядит примерно так:
<?php use yii\db\Schema; class m140924_153425_create_user_table extends \yii\db\Migration { public function up() { } public function down() { echo "m140924_153425_create_user_table cannot be reverted.\n"; return false; } }
Допустим, я хотел добавить несколько столбцов в эту таблицу. Я бы просто добавил следующее к методу up
:
public function up() { $this->createTable('user', [ 'id' => Schema::TYPE_PK, 'username' => Schema::TYPE_STRING . ' NOT NULL', 'password_hash' => Schema:: TYPE_STRING . ' NOT NULL' ], null); }
И затем, чтобы убедиться, что я могу отменить миграцию, я бы отредактировал метод down
:
public function down() { $this->dropTable('user'); }
Создание таблицы будет просто включать команду в командной строке:
./yii migrate
и удалить таблицу:
./yii migrate/down
7. Простота настройки для лучшей производительности
Всем известно, что медленный сайт создает недовольных пользователей, поэтому Yii предоставляет вам несколько инструментов, которые помогут вам ускорить работу вашего приложения.
Все компоненты кеша Yii вышли из yii / caching / Cache , что позволяет вам выбрать любую систему кеширования, которую вы хотите, используя общий API. Вы даже можете зарегистрировать несколько компонентов кэша одновременно. В настоящее время Yii поддерживает кэширование базы данных и файловой системы, а также APC, Memcache, Redis, WinCache, XCache и Zend Data Cache.
По умолчанию, если вы используете Active Record, Yii выполняет дополнительный запрос, чтобы определить схему таблиц, участвующих в создании вашей модели. Вы можете настроить приложение на кеширование этих схем, отредактировав основной файл конфигурации следующим образом:
return [ // ... 'components' => [ // ... 'db' => [ // ... 'enableSchemaCache' => true, 'schemaCacheDuration' => 3600, 'schemaCache' => 'cache', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], ], ];
Наконец, в Yii есть инструмент командной строки, облегчающий минимизацию внешних ресурсов. Просто запустите следующую команду для создания шаблона конфигурации:
./yii asset/template config.php
Затем отредактируйте конфигурацию, чтобы указать, какие инструменты вы хотите использовать для минимизации (например, Closure Compiler, YUI Compressor или UglifyJS). Сгенерированный шаблон конфигурации будет выглядеть так:
<?php return [ 'jsCompressor' => 'java -jar compiler.jar --js {from} --js_output_file {to}', 'cssCompressor' => 'java -jar yuicompressor.jar --type css {from} -o {to}', 'bundles' => [ // 'yii\web\YiiAsset', // 'yii\web\JqueryAsset', ], 'targets' => [ 'app\config\AllAsset' => [ 'basePath' => 'path/to/web', 'baseUrl' => '', 'js' => 'js/all-{hash}.js', 'css' => 'css/all-{hash}.css', ], ], 'assetManager' => [ 'basePath' => __DIR__, 'baseUrl' => '', ], ];
Затем выполните эту консольную команду для выполнения сжатия.
yii asset config.php /app/assets_compressed.php
И наконец, отредактируйте файл конфигурации вашего веб-приложения, чтобы использовать сжатые ресурсы.
'components' => [ // ... 'assetManager' => [ 'bundles' => require '/app/assets_compressed.php' ] ]
Примечание: вам придется загрузить и установить эти внешние инструменты вручную.
Вывод
Как и любой хороший фреймворк, Yii помогает быстро создавать современные веб-приложения и следить за их эффективностью. Это подталкивает вас к созданию безопасных и тестируемых сайтов, выполняя за вас большую работу. Вы можете легко использовать большинство его функций в точности так, как они предоставляются, или вы можете изменить каждую из них в соответствии со своими потребностями. Я действительно призываю вас проверить это для вашего следующего веб-проекта!
Вы пробовали Yii 2? Вы будете? Дайте нам знать!