Сервис на Yii2: Установка и настройка приложения
В комментариях к предыдущей статье появилось предложение пошагово разобрать процесс разработки целого приложения на Yii2. Инструкция по созданию блога выложена в официальном руководстве. Пока для первой части, но это, думаю, ненадолго. Конечно же, там не было раскрыто специфических моментов, но, тем не менее, руководство имелось. Оно открыто для изменений: каждый знакомый с системами контроля версий может это руководство и блог доработать.
Мне приходили мысли об описании разработке интернет-магазина, но это такая обширная тема, что хватит на целую книгу. Кстати, а не написать ли мне книгу? Может быть. Но пока не об этом.
Каждый попавший в интернет программист в душе немного SEO-шник. У многих помимо своего блога имеются какие-либо проекты для заработка на контекстной рекламе. И некоторые даже участвуют во всевозможных марафонах и открывают новые.
Вспоминается то странное чувство, когда несколько дней собираешь, просеиваешь и разгруппировываешь по предполагаемым статьям семантическое ядро из тысяч поисковых фраз... В итоге рисуешь сайт, скидываешь группы запросов в Excel-файл «Новые».
Потом последовательно составляешь задания для копирайтеров и заказываешь тексты на бирже. Перекидываешь эти запросы в «Заказанные». По написанным статьям перемещаешь в «Размещённые». Потом для размещённых указываешь адрес страницы и приписываешь входящие ссылки с других сайтов. Не забываешь при этом считать внутренние ссылки для перелинковки...
Но, как я и говорил при написании генератора твитов, программиста хлебом не корми – дай над чем нибудь заморочиться. И для себя я решил оставить в прошлом мучения с Excel и написать сервис для управления ключевыми фразами ядра. В качестве фреймворка, соответственно, выбрал новый Yii2.
Создание проекта
Yii2 доступен для быстрой установки из репозитория. Мы уже немного познакомились с ним в соответствующей статье о Composer. Там хорошие видео-доклады. Ещё мы прикольно провели время на практикуме по Git и Composer. Так что тоже приобрести запись новичкам советую :)
Файловую структуру можно выбрать из стандартных шаблонов yiisoft/yii2-app-basic
и yiisoft/yii2-app-advanced
. Первый сделан по типу Yii1 для простых конфигураций с одним доменом. Второй, напротив, устроен для полного разделения приложения на пользовательскую часть и модуль администрирования.
Эти шаблоны тоже доступны для установки из репозиториев. Перед установкой нам нужно зайти в терминал и проверить работу PHP в консольном режиме, выполнив:
php -v
Если вы используете Denwer в Windows и этот вызов не сработает, то нужно зайти в Свойства компьютера
→ Дополнительные параметры системы
→ Переменные среды
, найти системную переменную Path
и через точку с запятой добавить туда ваш путь Z:\usr\local\php5
, после чего для применения параметров перезагрузить систему и запустить сервер.
Теперь нужно любым удобным способом загрузить файл composer.phar
. Это ни что иное, как комплект PHP-скриптов, распространяемый в виде PHAR-архива. Запустить его можно в консоли как любой скрипт.
Простое скачивание файла composer.phar в папку подойдёт, например, если вы работаете в консоли на хостинге. Это удобно, если хостинг предоставляет доступ по SSH как, например, этот.
А вообще, в Linux я предпочитаю устанавливать Composer прямо в папку /bin
:
php -r "readfile('https://getcomposer.org/installer');" | php -- --filename=composer --install-dir=/bin
Теперь зайдём в терминал и выполним:
php composer.phar create-project --prefer-dist yiisoft/yii2-app-basic project
или в Linux с установленным в систему скриптом:
composer create-project --prefer-dist yiisoft/yii2-app-basic project
Здесь мы попросили менеджера зависимостей Composer сначала установить себе плагин для работы с менеджером Bower, а потом добавить папку project
и создать в ней новый проект по шаблону yiisoft/yii2-app-basic
. Мы здесь не стали указывать флаг --stability=dev
, так как не хотим скачивать нестабильные версии пакетов.
При этом сам шаблон будет развёрнут в корне, а все нужные зависимости скачаны в поддиректорию vendor
. На экране мы увидим весь этот процесс:
Installing yiisoft/yii2-app-basic (2.0.3) - Installing yiisoft/yii2-app-basic (2.0.3) Downloading: 100% Created project in project Loading composer repositories with package information Installing dependencies (including require-dev) - Installing ezyang/htmlpurifier (v4.6.0) Downloading: 100% - Installing swiftmailer/swiftmailer (v5.3.1) Downloading: 100% - Installing yiisoft/yii2-debug (2.0.3) Downloading: 100% ... - Installing yiisoft/yii2-gii (2.0.3) Downloading: 100% - Installing fzaninotto/faker (v1.4.0) Downloading: 100% - Installing yiisoft/yii2-faker (2.0.3) Downloading: 100% Writing lock file Generating autoload files chmod('runtime', 0777)...done. chmod('web/assets', 0777)...done. chmod('yii', 0755)...done.
Чтобы наблюдать эту красоту в Windows и использовать команды Linux, советую установить эмулятор Cygwin и работать в нём вместо стандартного интерпретатора командной строки. Заодно прямо в нём можно установить Git и SSH-клиент.
Проект мы создали. Теперь приступим к разработке приложения.
Конфигурирование сервера
Теперь можно добавить папку для нового проекта в своём Apache или Nginx сервере и поместить файлы туда. Это уже зависит от вашего сервера.
Первым делом посмотрим, подходит ли наш сервер. Запустите в консоли:
php requirements.php
или скопируйте этот файл в папку по умолчанию вашего сервера и откройте в браузере адрес http://localhost/requirements.php
. Yii2 требует PHP 5.4 и несколько подключенных расширений.
Если Вы используете Windows, то в файле php.ini
нужно указать правильные пути:
include_path = ".;Z:\usr\local\php5\includes" extension_dir = "Z:\usr\local\php5\ext"
и раскоментировать строки подключения необходимых расширений. Например, для работы только с MySQL-базами можно помимо Intl, MBString и MCrypt подключить только связанные с MySQL расширения:
extension=php_intl.dll extension=php_mbstring.dll extension=php_mcrypt.dll extension=php_mysql.dll extension=php_mysqli.dll extension=php_pdo_mysql.dll
а PDO PostgreSQL
не трогать.
Далее на любой системе полезно выставить временную зону:
date.timezone = "Europe/Moscow"
так как по умолчанию после установки PHP она пустая и вываливаются ошибки при использовании любой функции, связанной с датой и временем.
В первой версии Yii файл
index.php
располагался прямо в корне, а само PHP-приложение лежало там же в папкеprotected
. Это было не очень удобно, так как приходилось закрывать папкуprotected
от прямого доступа в.htaccess
или переносить выше. В Yii2 всё сделано наоборот по примеру других фреймворков: в корне теперь находится само приложение, аindex.php
и все доступные для пользователя файлы помещены в папкуweb
.controllers/ models/ views/ web/ assets/ css/ index.phpВ связи с этим нужно сконфигурировать хост на сервере так, чтобы сайт работал не из корня приложения, а из папки
web
. Это если вы не хотите настраиватьbaseUrl
и видеть папкуweb
в адресной строке вродеhttp://localhost/web/index.php
. На своём компьютере это не критично, но на хостинге тогда будут доступны для открытия все файлы из корня.
Если же вы на своём компьютере или хостинге не имеете возможности настроить рабочую папку хоста персонально (например, если вам доступна только папка public_html
или www
), то можно либо «поднять» все файлы вверх так, чтобы использовать свою папку вместо web
:
controllers/ models/ views/ public_html/ assets/ css/ index.php
либо (если есть доступ по SSH или на хостинге хороший файловый менеджер) поместить приложение в отдельную папку и создать символическую ссылку с public_html
на папку web
или настроить полное перенаправление в файле public_html/.htaccess
:
app/ controllers/ models/ views/ web/ assets/ css/ index.php public_html/ -> app/web/
Первый вариант менее предпочтителен тем, что приходится переименовывать папку. Это не очень удобно в случае использования систем контроля версий.
Итак, после этих нехитрых манипуляций с сервером по адресу http://localhost
вас должен встретить приветственный экран нового приложения. Если вместо этого покажутся ошибки о невозможности записи в папки web/assets
и runtime
, то установите им нужные права.
Кстати о системах контроля версий. Если вы собираетесь использовать Git в своём проекте, то уже можно создать репозиторий:
cd project git init git commit --allow-empty -m 'Initial commit'
Теперь самое важное. Нужно сделать так, чтобы лишние файлы не попали в индекс.
Как напишешь
.gitignore
, так проект и поплывёт...
Например, константы YII_DEBUG
и YII_ENV
задаются в файлах yii
, web/index.php
и web/index-test.php
. В них же при желании можно включить вывод всех ошибок:
error_reporting(-1); ini_set('display_errors', 'on');
если нет возможности сделать это в php.ini
.
Аналогично на компьютере каждого разработчика может быть (или вообще не быть) свой файл web/.htaccess
с личными настройками.
Позволим каждому разработчику изменять эти файлы самостоятельно. Добавим их в список игнорируемых.
Открываем .gitignore
в корне и добавляем строку:
/yii
Создаём файл config/.gitignore
и указываем не индексировать личные настройки:
/db.php /params.php
Создаём файл web/.gitignore
и вписываем исключаемые файлы конкретно в этой папке:
/.htaccess /index.php /index-test.php
Теперь, собственно, создаём файл web/.htaccess
, если не используем Nginx + PHP-FPM:
Order Allow,Deny Allow from all AddDefaultCharset utf-8 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php
Если же у вас сервер Nginx, то его можно настроить по примеру листинга в руководстве.
Теперь после настройки сервера нужно от некрасивых адресов http://localhost/index.php?r=site%2Flogin
перейти к удобным вроде http://localhost/site/login
. Добавим в файлы config/console.php
и config/web.php
секцию компонента urlManager
:
'components' => [ ... 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ '<_c:[\w\-]+>/<id:\d+>' => '<_c>/view', '<_c:[\w\-]+>' => '<_c>/index', '<_c:[\w\-]+>/<_a:[\w\-]+>/<id:\d+>' => '<_c>/<_a>', ], ], ... ],
Ненужные файлы уже исключены из индексирования, поэтому можно добавить всё остальное в репозиторий и зафиксировать текущее состояние:
git add . git commit -m 'Created project'
Теперь нам нужно разобраться с настройками самого приложения.
Конфигурация приложения
Мы настроили сервер и увидели страницу приветствия нашего будущего сайта.
Но есть пара нюансов. Первый состоит в том, что в файле config/params.php
сейчас указан только адрес электронной почты по умолчанию, а настроек может быть много. При этом часть параметров будет общей (например, число статей на страницу в ленте блога), а часть будет персональной (пароли доступа к различным сервисам). Логично было бы общие и личные параметры держать в разных файлах.
В файлах config/web.php
и config/console.php
параметры включаются из одного файла:
$params = require(__DIR__ . '/params.php'); return [ ... 'params' => $params, ];
Удалим адрес из config/params.php
и добавим параметр supportEmail
:
return [ 'adminEmail' => '', 'supportEmail' => '', ];
и перенесём его в новый файл config/params-local.php
:
return [ 'adminEmail' => 'admin@example.com', 'supportEmail' => 'info@example.com', ];
Второй параметр нам пригодится для указания в поле From
для отправляемых с сайта писем. В коде контактной формы по умолчанию туда подставляется адрес отправителя, пишущего сообщение:
class ContactForm extends Model { ... public function contact($email) { if ($this->validate()) { Yii::$app->mailer->compose() ->setTo($email) ->setFrom([$this->email => $this->name]) ->setSubject($this->subject) ->setTextBody($this->body) ->send(); return true; } else { return false; } } }
Но привередливые почтовые системы вроде MailRu никак не принимают письма с подменённым именем отправителя. Соответственно лучше в поле From
подставлять фиксированный адрес, а Email отправителя подставлять в поле ReplyTo
:
class ContactForm extends Model { ... public function contact($email) { if ($this->validate()) { Yii::$app->mailer->compose() ->setTo($email) ->setFrom([Yii::$app->params['supportEmail'] => Yii::$app->name]) ->setReplyTo([$this->email => $this->name]) ->setSubject($this->subject) ->setTextBody($this->body) ->send(); return true; } else { return false; } } }
Теперь если администратор нажмёт «Ответить» в письме, то в поле Кому
подставится именно оригинальный адрес отправителя.
Откроем cofig/.gitignore
и заменим его содержимое на:
/db.php *-local.php
Файл params.php
теперь проиндексируется и попадёт в общий репозиторий, а params-local.php
останется только на вашем компьютере. Каждый разработчик может добавить свой файл params-local.php
с личными параметрами и не переживать за свои пароли.
Теперь в config/web.php
и config/console.php
добавим механизм склейки файлов:
use yii\helpers\ArrayHelper; ... $params = ArrayHelper::merge( require(__DIR__ . '/params.php'), require(__DIR__ . '/params-local.php') ); ...
Аналогично сделаем возможность переопределять настройки компонентов приложения. Но сначала второй нюанс.
Одинаковую секцию urlManager
мы добавили в оба файла config/console.php
и config/web.php
. Конечно же можно её вынести в urlManager.php
и подключать через require
по аналогии с db.php
. Но что если надо будет одинаково настроить десяток общих компонентов?
Мы уже умеем сливать массивы параметров. Поступим также. На примере более «продвинутого» advanced-шаблона создадим файл config/common.php
с общими настройками:
use yii\helpers\ArrayHelper; $params = ArrayHelper::merge( require(__DIR__ . '/params.php'), require(__DIR__ . '/params-local.php') ); return [ 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'aliases' => [ '@bower' => '@vendor/bower-asset', '@npm' => '@vendor/npm-asset', ], 'components' => [ 'db' => [ 'class' => 'yii\db\Connection', 'charset' => 'utf8', ], 'urlManager' => [ 'class' => 'yii\web\UrlManager', 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ '<_c:[\w\-]+>/<id:\d+>' => '<_c>/view', '<_c:[\w\-]+>' => '<_c>/index', '<_c:[\w\-]+>/<_a:[\w\-]+>/<id:\d+>' => '<_c>/<_a>', ], ], 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', ], 'cache' => [ 'class' => 'yii\caching\DummyCache', ], 'log' => [ 'class' => 'yii\log\Dispatcher', ], ], 'params' => $params, ];
Рядом положим config/common-local.php
с недостающими личными параметрами для соответствующих компонентов:
return [ 'components' => [ 'db' => [ 'dsn' => 'mysql:host=localhost;dbname=seokeys', 'username' => 'root', 'password' => '', 'tablePrefix' => 'keys_', ], 'mailer' => [ 'useFileTransport' => true, ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], ], ];
При слиянии конфигураций наши локальные настройки переопределят общие. Второй файл не попадёт в репозиторий системы контроля версий, так как он тоже назван в виде *-local.php
.
Заменим содержимое config/.gitignore
на:
*-local.php
То есть мы убрали игнорирование файла config/db.php
. Он нам больше не нужен. Удалим его:
rm config/db.php
Теперь из config/console.php
и config/web.php
мы можем убрать все общие настройки. Оставим там только индивидуальные.
Специфические параметры web-приложения config/web.php
:
$config = [ 'id' => 'app', 'components' => [ 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], 'errorHandler' => [ 'errorAction' => 'site/error', ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, ], ], ]; if (YII_ENV_DEV) { $config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [ 'class' => 'yii\debug\Module', ]; $config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
Параметры консольного режима config/console.php
:
$config = [ 'id' => 'app-console', 'controllerNamespace' => 'app\commands', ]; if (YII_ENV_DEV) { $config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
И дополнительно добавим возможность локального переопределения каждого варианта. Например, доработав один из рецептов из Yii Application Development Cookbook для Yii1 сделаем логирование в раздельные файлы:
Личные настройки config/web-local.php
:
return [ 'components' => [ 'request' => [ 'cookieValidationKey' => 'jshd3qjaxp', ], 'assetManager' => [ 'linkAssets' => true, ], 'log' => [ 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error'], 'logFile' => '@app/runtime/logs/web-error.log' ], [ 'class' => 'yii\log\FileTarget', 'levels' => ['warning'], 'logFile' => '@app/runtime/logs/web-warning.log' ], ], ], ], ];
Здесь мы от себя установили параметр
linkAssets
компонентаassetManager
в true, чтобы фреймворк не копировал папки вweb/assets
, а делал символические ссылки. Это и экономит место, и позволяет не удалять и перегенерировать папки при каждом обновлении вендоров.
Личные настройки config/console-local.php
:
return [ 'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error'], 'logFile' => '@app/runtime/logs/console-error.log' ], [ 'class' => 'yii\log\FileTarget', 'levels' => ['warning'], 'logFile' => '@app/runtime/logs/console-warning.log' ], ], ], ], ];
Получилась гибкая система конфигурации.
Обратите внимание, что при слиянии методом
merge
в ассоциативных массивах значения переопределяются, а в неассоциативных – дополняются.Если в двух конфигурационных массивах имеются немного разные настройки:
'log' => [ 'traceLevel' => 0, 'targets' => [ ['class' => 'yii\log\FileTarget'], ], ],
'log' => [ 'traceLevel' => 3, 'targets' => [ ['class' => 'yii\log\WebTarget'], ], ],
То при слиянии параметр с ключом
traceLevel
перезапишется, а значенияtargets
сольются:'log' => [ 'traceLevel' => 3, 'targets' => [ 0 => ['class' => 'yii\log\FileTarget'], 1 => ['class' => 'yii\log\WebTarget'], ], ],
Так что желательно не добавлять значения по умолчанию в виде простых массивов в общие файлы конфигурации.
В результате у нас получился целый набор файлов:
config/ common.php common-local.php console.php console-local.php web.php web-local.php params.php params-local.php
То есть общие параметры подключаются к web
и console
из common
и params
, а все личные настройки можно спокойно переопределять в *-local
файлах.
Осталось только правильно слить все фрагменты.
Откроем файл web/index.php
, найдём строку загрузки конфигурации:
$config = require(__DIR__ . '/../config/web.php');
и заменим её на конструкцию:
$config = yii\helpers\ArrayHelper::merge( require(__DIR__ . '/../config/common.php'), require(__DIR__ . '/../config/common-local.php'), require(__DIR__ . '/../config/web.php'), require(__DIR__ . '/../config/web-local.php') );
Аналогично для консольных команд изменим файл yii
в корне. Вместо:
$config = require(__DIR__ . '/config/console.php');
вставим:
$config = yii\helpers\ArrayHelper::merge( require(__DIR__ . '/config/common.php'), require(__DIR__ . '/config/common-local.php'), require(__DIR__ . '/config/console.php'), require(__DIR__ . '/config/console-local.php') );
Теперь проиндексируем все изменения и сделаем ещё одну отметку в системе контроля версий:
git add . git commit -m 'Extended config system'
На этом установка и первоначальное конфигурирование приложения завершено.
Развёртывание конфигурации
Мы сделали файлы локальной конфигурации config/*-local.php
и оставили изменяемыми файлы web/index.php
и yii
и настроили их игнорирование системой контроля версий.
Локальные файлы указаны в
.gitignore
, поэтому в репозиторий они не попадут. Их придётся каждый раз создавать наугад вручную. Это неудобно.
Можно сделать отдельную папку examples
, в которую скопировать эти файлы для примера:
config ├── common.php ├── console.php ├── params.php └── web.php ... examples ├── config │ ├── common-local.php │ ├── console-local.php │ ├── params-local.php │ └── web-local.php ├── web │ ├── index.php │ └── index-test.php └── yii
Эти заготовки мы уже в .gitignore
не вписываем. Теперь для разворачивания проекта программисту достаточно скопировать эти заготовки из examples
наверх и заполнить их своими настройками.
Но эти файлы немного отличаются для dev
и для prod
режима. Чтобы ещё больше облегчить работу можно приложить к проекту две пачки файлов для разных окружений:
environments ├── dev │ ├── config │ │ ├── common-local.php │ │ ├── console-local.php │ │ ├── params-local.php │ │ └── web-local.php │ ├── web │ │ ├── index.php │ │ └── index-test.php │ └── yii └── prod ├── config │ ├── common-local.php │ ├── console-local.php │ ├── params-local.php │ └── web-local.php ├── web │ └── index.php └── yii
Заодно папку examples
мы переименовали в environments
.
Можно ли теперь как-то автоматизировать процедуру развёртывания локальной конфигурации? Например, написать консольный скрипт, который будет копировать файлы из нужной нам папки в проект.
На самом деле можно. Более того, такой скрипт уже есть. В yii2-app-advanced уже есть такая же папка environments
с конфигурацией environments/index.php
и файлы init
, init.bat
в корне. Нам достаточно скопировать эти файлы:
environments ├── dev │ └── ... ├── prod │ └── ... └── index.php init init.bat
и перенастроить environments/index.php
на работу с yii2-app-basic`:
return [ 'Development' => [ 'path' => 'dev', 'setWritable' => [ 'runtime', 'web/assets', ], 'setExecutable' => [ 'yii', 'tests/codeception/bin/yii', ], 'setCookieValidationKey' => [ 'config/web-local.php', ], ], 'Production' => [ 'path' => 'prod', 'setWritable' => [ 'runtime', 'web/assets', ], 'setExecutable' => [ 'yii', ], 'setCookieValidationKey' => [ 'config/web-local.php', ], ], ];
Теперь в свежем проекте достаточно запустить
php init
и указать ему окружение dev
. Он развернёт локальные файлы и заодно выставит нужные права доступа на папки runtime
и web/assets
.
В стандартном yii2-app-basic расстанвкой прав занимается скрипт yii\\composer\\Installer
. После перехода на команду init
мы можем найти секцию со скриптами установки в composer.json
:
"scripts": { "post-install-cmd": [ "yii\\composer\\Installer::postInstall" ], "post-create-project-cmd": [ "yii\\composer\\Installer::postCreateProject", "yii\\composer\\Installer::postInstall" ] }, "extra": { "yii\\composer\\Installer::postCreateProject": { "setPermission": [ { "runtime": "0777", "web/assets": "0777", "yii": "0755" } ] }, "yii\\composer\\Installer::postInstall": { "generateCookieValidationKey": [ "config/web.php" ] } },
и полностью её удалить.
На этом интегрирование гибкой системы конфигурации из app-advanced в app-basic завершено.
Можно отправить всё в свой репозиторий на GitHub:
P.S. За время написания статьи (и после) произошло несколько изменений в ядре фреймворка. В реальном времени они выкладываются в файле UPGRADE и некоторые обсуждаются в комментариях здесь. Соответственно, эта статья постепенно обновляется.
В своём же проекте время от времени обновляйте содержимое папки
vendor
командой:composer updateи следите за изменениями шаблона yii2-app-basic.
Если что-то не очень понятно в статье, то напишите в комментариях. И до встречи в следующих частях:
Для Windows лучше msysgit + ConEmu.
> после установки PHP она пустая и вываливаются ошибки при использовании любой функции, связанной с датой и временем
В Yii не вываливается, а ставится в UTC.
Да, в Yii2 выставляется по умолчанию, но в других скриптах будут ошибки.
И, кстати, дополню, что свою зону можно также в config/common.php параметром timeZone указать.
Наконец-то, большое спасибо за статью. Жду продолжения.
хотелось бы еще про git подробнее, как этот проект создать на гитхабе и тд.
Git – весьма обширная тема. Уже думаю, как это лучше приподнести.
На codeschool есть класный фришный курс – для старта самое оно.
Спасибо ждем продолжения
Круто! Жду продолжения! Спасибо.
Дмитрий, добрый день! Спасибо за статью!
Не могли бы Вы пояснить, почему в .gitignore помещается файл index.php? И как его восстановить человеку, взявшему проект из репозитория?
Потому что там переключаются значения YII_DEBUG и YII_ENV. Соответственно, на рабочем сервере и на компьютере разработчика будут немного разные файлы index.php.
Можно либо вписать содержимое пропущенных файлов в README, либо создать и проиндексировать образцы index-dist.php и yii-dist, но при этом не забыть закрыть index-dist.php от прямого доступа.
Прошу прощения за возможно глупый вопрос, но как Yii2 определяет где она находится? Перенес проект с сервера (prod) на локальную машину и обнаружил что появилась дебаг-панель, хотя init не запускал в dev не переключал. Объясни пожалуйста.
В yii\debug\Module есть проверка на локальный IP:
Добавил в репозиторий команду init из yii2-app-advanced, которую можно запустить для восстановления заготовок этих файлов из папки environments.
Большое спасибо!
Всем привет!
Все говорят..жду продолжения ...
хочется спросить какого??? или вы о чем то договорились - без меня?! :)
если серьезно, с вашей подачи и неизменным стилем я бы хотел увидеть это самое продолжение yii2, но в лице некой задачи...
а именно. Для всех кто использовал старые версии. И посему, достаточно сайтов и наработок, которые нужно переводить на 2 версию ввиду их развития.
Например раньше мы использовали такие запросы, а теперь такие-то. Раньше мы использовали поведения так, а теперь нет и.т.д.
т.е - суть простых-примеров (было-есть)
По мне так интересный обзор бы получился (получился), хоть понять что ждать от переделок.
По себе скажу, нового очень много, пока даже страшно лезть, туда.
Статья или серия - была бы кстати.. как подготовка к новой битве. :)
И что бы данный пост был НЕ рассчитан на новичков (это важно)
Им все равно от 2+ плясать. А вам придется много пояснять.. Вода тут не уместна.
Спасибо.
Любая информация по yii2 будет полезна, это наверно первый блог где что-то разжевывается по второй версии. Респект и уважуха автору. Лишь бы почаще статьи выходили
За неделю уже два чувствительных изменения. Вот такой нюанс написания статей и компонентов ко второй версии :)
I got this error
I have fixed it by adding
code in /config/web.php
Perhaps, it is a new framework feature. Some amendments already had appeared in a core till I wrote the article.
Thanks!
Ещё одно изменение в ядре.
table_prefix изменился на tablePrefix
Исправил.
Раз статья про СЕО, то хотел спросить про yii пагинатор.
Сделал как по умолчанию для ListView.
При переходе на любую вкладку ссылка на первую вкладку обрастает параметром ?page=1&per-page=4 Это yii2. Хотя по идее ссылка на первую вкладку должна быть чистенькой, без всякого указания что это за вкладка, пример - так как у вас работает на странице /blog.
Это решается в настройках listview или как то еще дополнительно надо это фиксить?
Да, это особенность Yii2. Установите у Pagination параметр forcePageParam в false:
Спасибо.
Добавил еще и это:
Еще не забыть 'validatePage'=>false
Отличная статья, хотелось бы продолжение!
И поставленой интересной задачи которая будет решатся.
А в какой папке инициировать git? В корне проекта или в web?
В корне. Чтобы он все папки охватил.
Спасибо за качественные статьи!
Хотелось бы почитать ваше объяснение по поводу пространств имен, а то я смотрю на это в контроллере SiteController, и нижняя челюсть опускается.
Как выбирать пространство имен (создавать собственные или использовать общие), как узнавать какие файлы добавлять в use, в каких случаях можно просто указывать имя класса, а в каких надо писать полный путь к нему и т.д. вот это все.
Как выбирать: в Yii2 корневая папка приложения обозначена как app. Соответственно, пространства namespace всех ваших классов должны начинаться с app и совпадать с именем папки. Иначе стандартный автозагрузчик нужный файл в вашем приложении для операции include не найдёт.
Как узнавать: Если работать в IDE вроде PhpStorm или NetBeans, то там это всё подставляется само. Пишем имя Controller и сразу появляется выпадающий список:
и по щелчку по нужной строке всё само добавляется в use.
А по использованию use всё почти как с файлами: если класс в том же пространстве имён (файл класса лежит в этой же папке), то use не указываем. А если в другой папке, то указываем. Только все пути надо указывать абсолютными, так как относительной адресации почти нет.
Можно просто прописывать каждый раз полный путь:
Но выглядит некрасиво. А можно прописать один раз в use и потом спокойно обращаться по одному имени:
Прелесть пространств имён в том, что можно использовать одноимённые классы в разных местах:
Просто так их в use не добавишь. Один или оба нужно переименовать:
А модель в админке будет наследоваться от общей модели по полному пути:
или по псевдониму:
Все «обычные» классы из глобального пространства имён (и класс Yii) просто «лежат» на самом верху. То есть можно просто указать его имя со слешем:
либо просто добавить в use и использовать как обычно:
Ничего особо сложного нет.
Спасибо! многое прояснилось
Ждем продолжения цикла статей
Привет!
У меня возникла проблема с .gitignore. В папке config я прописал в файле .gitignore *-local.php
1 строчка в первой строке. Файлы params-local.php и common-local.php не попали в коммит. Потом после создания новых файлов console-local.php и web-local.php был сделан еще 1 коммит и отправка. И эти последние файлы залились в репозиторий. .gitignore не сработал.
Странно. Явно что-то не так.
https://github.com/SpiritAbsolute/yii2_study/blob/master/config/.gitignore
Вот посмотрите в моем хранилище.
А как Вы делали добавление git add?
git add .
commit -m "name"
А ваша IDE при создании файлов случайно сама их в индекс не добавляет? Для проверки создайте ещё один файл test-local.php и посмотрите git status.
Хорошо, посмотрю вечером, спасибо. У меня Netbeans!
Только как мне теперь их убрать из git?
Удаляем оба файла из индекса:
и перезаписываем последний коммит:
После этого насильно перебиваем GitHub:
Спасибо!
Обновил комментарий с инструкцией.
А можно узнать зачем в разных папках создавать разные файлы .gitignore?
Разве не удобнее все исключаемые файлы прописать в одной сущности в корне?
На самом деле без разницы.
Дмитрий, поставил Yii2-app-advanced.
поместил в файл /frontend/config/main.php,
При открытии сайта, ссылки стали красивыми, но не работают (404) и в подвале тоже 404 ошибка (Object not found).
Если
то ссылки работают, но красота пропадает.
Что я упустил?
Спасибо.
Вот это http://www.yiiframework.com/doc/guide/1.1/ru/topics.url#sec-7 работает в сочетании с
Снижения производительности я не заметил, по сравнению с НЕ ЧПУ дефолтным вариантом.
Однако, SEO через .htaccess как-то не очень красиво.
Может, все-таки можно без этого обойтись?
Весь мир так делает через .htaccess или nginx. Не переживайте.
.htaccess в папке web лежит?
Да.
Дмитрий, спасибо за статью!
Для меня вопрос зачем common.php и common-local.php создавать, если все в web.php и web-local можно записать? Для меня как то показалось немного запутанным разбивать еще на common. Или я просто не уловил разницы между common.php или web.php.
Просто одно и то же нужно вписывать в web и console. Вот всё общее я перенёс в common и через require подключаю в оба файла.
А нет такого же, только про advanced? :)
У меня нету.
Привет! Первый раз пытаюсь поставить yii2 и вываливается все время такая ошибка, при переходе в папку web:
Unknown Method – yii\base\UnknownMethodException
Calling unknown method: yii\web\UrlManager::addRules()
С неадвних пор Yii2 перешёл на Bower и из-за конфликта зависимостей Yii стал откатываться далеко назад на версию 2.0 beta, где этого метода нет.
Просто выполните один раз команду:
и после неё как обычно:
Пробовал так, но после обновления просит на каждой команде с использованием композера какого-то пользователя и пароль. Вообще с этим композером разобраться не могу.
Это превышение лимитов. Зарегистрируйтесь на GitHub и вводите этот пароль.
Спасибо за подсказки! Все установилось и заработало с первого раза!
Благодарю за замечательный урок, почему на:
Выпадает:
[B]Этому файле не сопоставлена программа для выполнения этого действия. Установите программу или, если она уже установлена, создайте сопоставление с помощью компонента панели управления "Программы по умолчанию" [/B]
У меня Windows7
Потому, что Вы не добавили путь до php.exe в системную переменную PATH.
Вот как у меня в Path оное прописано:
S:\DEVELOPER\openserver\OpenServer\modules\php\PHP-5.6\;
В этом каталоге есть php.exe
Тогда не знаю.
Исправил на
S:\DEVELOPER\openserver\OpenServer\modules\php\PHP-5.6\php.exe; при установке.
Попробовал обновить.:
Вышло:
The "getcomposer.org/version" file could not be downloaded: failed to open stream: ???
Проверил:
Выходит:
У меня прокси стоит, может дело в нем? Как выставить proxy порт и ip для composer?
Наблюдал такую конструкцию в сетях:
Но не понял как туда вписать ip и порт
Разобрался, тут прокси виноват.
А что делает эта строчка?
Устанавливает адаптер, позволяющий работать с JavaScript-репозиториями менеджера Bower. Теперь именно оттуда загружаются JQuery и Bootstrap.
Дмитрий здравствуйте!
У меня, так же как и у Den возникла неприятность с использованием enablePrettyUrl в urlManager
также перестали работать ссылки, а на главной странице (единственной рабочей) в подвале тоже 404 ошибка (Object not found).
Использование .htaccess не дало желаемых результатов.
Прошу Вашей помощи в решении этой пустяковой проблемы.
Более вероятно, что дело всё-таки в сервере и .htaccess.
Спасибо, найду ошибку - отпишусь
Привожу код моего .htaccess.
где может быть проблема??? уже всю голову сломал
вот так работаю с enablePrettyUrl
А другие сайты с htaccess на этом компьютере работают?
мне в конечном итоге помогло подключение mod_rewrite к Apache
http://forum.ubuntu.ru/index.php?topic=97938.0
... и в настройках виртуального хоста должно стоять
AllowOverride All
Ну и помнить, чтобы настройки вступили в силу, перезапускать Apache
# systemctl reload apache2.service
спасибо за подсказку)
Дмитрий, добрый день. Подскажите, пожалуйста, можно ли на timeweb сделать символическую ссылку и как это можно реализовать? Ну или как можно использовать папку public_html вместо web. Так-то сайт работает и с public_html. но SEF URL не работают почему-то
Включить в панели доступ по SSH, зайти в консоли и выполнить:
Добрый день! Подскажите в чем может быть проблема:
имеется module/controller/view?param=qwerty
не могу понять почему не работает следующий вариант:
module/controller/view/param/qwerty
в первой версии все было ок...
Во второй версии нужно для таких случаев добавлять в конце звёздочку:
"Если вы используете Denwer в Windows" - таких наверное все меньше становится, т.к. денвер уже долго не обновляют. По сути на денвер из коробки нельзя yii2 поставить, так как в денвере все старое.
Лично использую xampp.
Можно также как портабл использовать установив на внешний носитель.
Переменную path в виндоусе прописывать при использовании xampp не нужно, т.к. имхо при запуске xampp он проверяет есть ли в path путь к php
Спасибо за статью!
http://open-server.ru/ неплохая штука... мож кому пригодится. )
Здравствуйте! Возникла странная вещь при создании проекта. Сначала композер загружает все нормально, но потом требует логин и пароль для продолжения. Однако логин заводится, а на попытку ввести пароль никакой реакции. Все, процесс встал. Что посоветуете?
Это у GitHub терпение заканчивается :) После ввода пароля и Enter вообще ничего не делает?
Я не могу вообще ввести пароль. Курсор мигает, а пароль не вводится. Нажимаю Enter при пустом пароле, начинается все сначала, снова требует логин и снова не вводится пароль. Очень странная ситуация, при этом папки все создаются, но они почти пустые, а завершить процесс создания проекта не могу,
Lola, у меня была похожая проблема
1) Мигает курсор и не двигается - но пароль на самом делевводится - это своего рода защита от любопытных глаз.
Если ввести пароль - (он не отображается на экране) а потом нажать enter - то все пойдет дальше.
Но есть еще один момент - потом может выдать снова ошибку - тогда надо менять и настраивать версию PHP.
Если есть вопросы - пишите на мейл - (мой ник)+@mail.ru
Сам на парился - помогу чем смогу)
Добавил настройки компонента assetManager в config/web-local.php.
Здравствуйте.
Подскажите пожалуйста ответ на такой философский вопрос.
Предположим я пишу приложение и опираюсь на bootstrap и jquery которые идут в core yii2. Если заглянуть в composer.json, то там можно увидеть "*", т. е. как только обновится bootstrap или jquery (серьезно обновится), то мое приложение может рухнуть.
Вопрос. Как с этим живет человечество? )
Заранее благодарен за ответ.
Если это очень критично, то можете указать явно нужные версии:
Так можно переопределять и сами зависимые пакеты вроде bower-asset/bootstrap:3.3.*.
А так я обычно ставлю minimum-stability: stable и оставляю звёздочки. С JQuery у меня за последние годы ни разу не было чего-то ломающего кроме отказа от метода live().
В любом случае обновляюсь не так часто и перепроверяю проект после каждого обновления. Если что-то не работает, то либо в этот же день дорабатываю свой код, либо откатываю проблемные пакеты назад или, если кто-то убежал сильно вперёд, прописываю нужные мне версии явно.
А такой вопрос.
Обычно при публикации из git hub (я имею ввиду свой продакшн сервер с git, с hub прослойкой) на продакшн, вешается deploy hook. Как правило этот хук выполняет проверку версий composer update, накатывет миграции и т.д.
Но вот мне пришлось поднять сборку и минификацию пакетов ресурсов с использованием консольной команды asset. Получается такая штука, что в момент публикации проект в плане закомиченных файлов находится в новой версии, а в плане ресурсов в старой, до тех пор, пока не отработается команда asset. В высоконагруженных проэктах это критично. Как вы можете это прокомментировать?
И второй вопрос из этой же оперы. Иногда бывает необходимо сначала накатить миграцию, и только потом файлы проекта. Описанная мной выше процедура публикации подразумевает сначала публикацию файлов, а потом выполнение миграции. На этот счет существуют какието общепринятые решения?
Могу порекомендовать подход, похожий на использующийся в системе деплоя Capistrano.
Сначала:
Теперь напишите хук, который в фоне полностью поднимает рабочее приложение:
А потом скрипту хватит пары секунд, чтобы:
В итоге файлы обновляются мгновенным перебросом символической ссылки с папки на папку, а сайт отключается только на время выполнения миграций.
UPD: Опубликовал репозиторий на GitHub.
Добрый вечер.
Разъясните, пожалуйста, как сделать полное перенаправление.
Вы привели такой пример и написали, что надо прописать в .htaccess, который лежит в корне сайта.
Я попробовал так сделать - ошибка 500 или ничего не меняется. Как правильно сделать, чтобы "web" убрать из адреса?
Как именно пробовали?
Добрый вечер, Дмитрий!
Я yii2 только начинаю осваивать (раньше в фреймворками не работала)
У меня при установке Вашего проекта с https://github.com/ElisDN/seokeys
последние строчки
Не подскажете - почему в последней строке ...file not found? И как с этим побороться?
Спасибо! :-)
После этой запустите команду
и выберите нужное окружение. Недостающие локальные файлы станут на место.
Не понимаю, почему из конфигурационного файла param.php невозможно обратиться к константе класса. Например,
Выдает ошибку: Fatal error: Class 'app\modules\comments\models\Comments' not found in ...basic\config\params.php on line 10
Разобрался. Алиасы в params.php не работают. Пришлось установить:
Смотрю тема старая а комменты новые. для себя открыл вот такой интересный проект в качестве вводного курса https://github.com/githubjeka/yii2-tutorial
Проблема с командой yii, не работает после php init
Нужно код из /environments/prod/yii
скопировать и вставить в /environments/dev/yii
т.к. в /environments/dev/yii неверные пути подключения конфиг файлов.
Доброго. Дмитрий, большое спасибо вам за статьи. Маленький момент - я лично пока чайник совсем, а у вас в коде опущены <?php Скопировал - и хорошо догадался, в чем дело.
Видимо, рано еще в yii лезть, надо какой-нибудь PHP для чайников или можно пробовать работать с фреймворком прямо сразу?
Чтобы понять как всё устроено и, главное, почему именно так устроено – надо на приличном уровне знать сам PHP, философию ООП и иметь представление о практиках и шаблонах проектирования. А иначе будет полное непонимание не только кода, но и документации.
Добрый день! Спасибо вам за статью! Очень много полезного как раз для таких как Я новичков. Вопрос конечно немного отталкивается от темы. Я вообще новичок по веб программированию. Я делаю проект, но не знаю как все обустроить. Есть примерно 15 таблиц из которых я должен получить данные и обработать потом делать кое-какие вычисления и передать эти данные view. Весь основной кодинг состоит в обработке и вычислении данных полученных из этих таблиц. Вопрос: где мне прописать функций обработки данных в контроллере или в модели? И нужно ли мне для каждой таблицы создавать модели (их у меня 15)? Заранее спасибо!!!
Смотря какие данные. А так я делаю модели для каждой таблицы. Это позволяет почти все вычисления, сохраниения и выборки делать с ActiveRecord без возни с SQL-запросами.
Добрый день, Дмитрий! Возможно вы мне поможете.У меня висит сайт на компе друга, но функция отправки почты не работает. OS WINDOWS. Что нужно проверить/настроит/установит?
Можно настроить отправку по SMTP с существующей почты. И следите, чтобы в поле From был тот же адрес, с которого посылаете, чтобы не банил mail.ru.
Как переделать Yii2 basic в production (убрать gii и прочие ненужные при загрузке на рабочий сервер вещи)?
Переключить YII_ENV на prod и YII_DEBUG в false, потом запустить:
А если не делать репозиторий на гитхабе то можно не разделять файлы на основные и local !? Или я неверно понял смысл этого разделения?
Если Git-ом не пользуетесь, то не нужно.
То есть ничего из этой статьи? Или это сарказм и ничего вообще, даже сам Yii? Трудности общения в переписке :)
Не нужно разделение конфигов.
Добрый день, делал все как написано в статье, но почему то при избавлении от некрасивых url не находит views :
PS главная страница yii2 basic открывается. В чем может быть проблема?
PSS не включал вывод всех ошибок в файлах web/index.php и web/index-test.php командами:
PSSS пользуюсь windows7, apache, yii2 ставил через composer
Проблема именно в 'showScriptName' => false, если не ставлю, все работает, но адресная строка имеет вид bapp.local/index.php/site/index.
.htaccess в папке web имеет вид :
Но даже если не добавлять ничего не меняется.
Видимо не включен AllowOverride, из-за чего .htaccess не работает.
Спасибо за статью. Единсственное былобы не плохо узнать о rules в urlManager. Вроде я у вас статей не видел.
Для Yii1 и для Yii2.
Здравствуйте! С недавнего времени появилась вот такая проблема при установке Yii2 через Composer:
При этом практически не загружается каталог vendor/bower. Не понятно в чем может быть проблема? Может это не только у меня?
А asset-plugin какой версии установлен?
Спасибо! Переустановила до версии v1.1.2. После этого проблемы исчезли с загрузкой исчезли. Хотя предупреждение такое все равно есть: The "packagist.org/p/yiisoft/yii2%24xxxxxxxxxxx.json" file could not be downloaded: failed to open stream: HTTP request failed!
packagist.org could not be fully loaded, package information was loaded from the local cache and may be out of date.
Мы сделали изменения в файлах yii.php и index.php, но в гит эти файлы не положили. Получается, что файлы конфигурации не будут работать, так как мы хотим на сервере.
Да, эти файлы правим вручную, как и локальные конфигурационные файлы.
Да ёлки ж палки.
Дошёл до тестирования с Codeception.
Оказалось, что слова в конце этой статьи :"Если вы делаете публичный проект, то для удобства не помешает взять файлы..." оказались, ни как я считал рекомендацией, а утверждением..
Вообщем не скопировал я ранее папку environments и т.п.
Сейчас пришлось делать это.
В итоге сделал всё как описано.
Запустил:
В итоге The requested URL /index.php was not found on this server.
Блин, теперь везде пути неверные.
В папке site/web/ нет индексного файла.
Теперь через Апач вирхост пути к папке environments/web/index.php менять ?
Не надо ничего менять. Скопируйте вручную environments/web/index.php в web/index.php.
Так и сделал.
Пришлось исправить некоторые пути в web/index.php
В итоге такой вид:
Но почему в файле environments/web/index.php указаны неверные пути?
Сравнивал с исходниками кода тоже самое. Пути неверные.
Как такое будет работать?
Или я что-то упустил?
> Так и сделал.
> Пришлось исправить некоторые пути в web/index.php
Не так сделали. Я просил файлы скопировать, если php init не работает, а Вы вместо копирования файлов пути поменяли.
Здравствуйте.
Подскажите а чтобы работало linkAssets = true, у меня апач, в комменте к св-ву сказано что нужно для папки web установить Options FollowSymLinks. В этом нет ничего небезопасного? Может htaccess с этой фишкой кинуть в папку web/assets/ ?
Всё нормально. Попробуйте.
Добавил секцию пр подключение Asset Packagist.
Что то я не очень понял следующую штуку:
у нас на сервере в index.php со строкой
но тогда у нас не мерджится config/common.php
Если его замерджить то на сервере возникает ошибка о том, что param-local.php не найдет.
Или я что-то упустил?
Выполните php init, чтобы развернуть локальные файлы.
Т.е. я правильно понимаю, на сервере будет такая же структура как и локально, просто файлы из гитигнора не будут там обновляться? У меня rsync синхронизация стоит и gitlab-ci
Правильно.
Обновите, пожалуйста, примечание в статье на счет ArrayHelper::merge и неассоциативных массивов. Теперь можно делать так:
эх, жаль для новичков в интернете статей вообще нету(( Все только для профи... как эту гребаную регистрацию сделать, не могу понять......... хоть свой фреемворк пиши блин, с нормальной докой и справочником....жаль только времени на это нету(
http://prntscr.com/jfkton
спасибо.............................минус проект..... достал
вместо
нужно писать
Не "нужно", а "можно".
учитывая что экранирование "-" вообще не требуется, то "нужно", если только Вы не хотели показать читателям хреновые познания в регулярках.
> экранирование "-" вообще не требуется
Между символами требуется. Иначе будет диапазон.
https://www.yiiframework.com/doc/api/2.0/yii-web-urlmanager#$rules-detail тогда можете отправлять PR))
Зачем? В диапазонах экранирование обязательно. А не в диапазонах это дело вкуса и консистентности.
При включении опции linkasset в труе в файле web.php появляется ошибка.