Сервис на 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.

Если что-то не очень понятно в статье, то напишите в комментариях. И до встречи в следующих частях:

Часть 2: Настройки IDE и модули

Комментарии

 

samdark – rmcreative.ru

Для Windows лучше msysgit + ConEmu.

> после установки PHP она пустая и вываливаются ошибки при использовании любой функции, связанной с датой и временем

В Yii не вываливается, а ставится в UTC.

Ответить

 

Дмитрий Елисеев

Да, в Yii2 выставляется по умолчанию, но в других скриптах будут ошибки.

И, кстати, дополню, что свою зону можно также в config/common.php параметром timeZone указать.

Ответить

 

Akulenok

Наконец-то, большое спасибо за статью. Жду продолжения.

Ответить

 

Akulenok

хотелось бы еще про git подробнее, как этот проект создать на гитхабе и тд.

Ответить

 

Дмитрий Елисеев

Git – весьма обширная тема. Уже думаю, как это лучше приподнести.

Ответить

 

Igor

На codeschool есть класный фришный курс – для старта самое оно.

Ответить

 

Alex

Спасибо ждем продолжения

Ответить

 

Сергей Доровский

Круто! Жду продолжения! Спасибо.

Ответить

 

YoYo

Дмитрий, добрый день! Спасибо за статью!

Не могли бы Вы пояснить, почему в .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:

public $allowedIPs = ['127.0.0.1', '::1'];
Ответить

 

Дмитрий Елисеев

Добавил в репозиторий команду init из yii2-app-advanced, которую можно запустить для восстановления заготовок этих файлов из папки environments.

Ответить

 

bob

Большое спасибо!

Ответить

 

Стас

Всем привет!
Все говорят..жду продолжения ...
хочется спросить какого??? или вы о чем то договорились - без меня?! :)
если серьезно, с вашей подачи и неизменным стилем я бы хотел увидеть это самое продолжение yii2, но в лице некой задачи...
а именно. Для всех кто использовал старые версии. И посему, достаточно сайтов и наработок, которые нужно переводить на 2 версию ввиду их развития.
Например раньше мы использовали такие запросы, а теперь такие-то. Раньше мы использовали поведения так, а теперь нет и.т.д.
т.е - суть простых-примеров (было-есть)
По мне так интересный обзор бы получился (получился), хоть понять что ждать от переделок.
По себе скажу, нового очень много, пока даже страшно лезть, туда.
Статья или серия - была бы кстати.. как подготовка к новой битве. :)
И что бы данный пост был НЕ рассчитан на новичков (это важно)
Им все равно от 2+ плясать. А вам придется много пояснять.. Вода тут не уместна.
Спасибо.

Ответить

 

Akulenok

Любая информация по yii2 будет полезна, это наверно первый блог где что-то разжевывается по второй версии. Респект и уважуха автору. Лишь бы почаще статьи выходили

Ответить

 

Дмитрий Елисеев

За неделю уже два чувствительных изменения. Вот такой нюанс написания статей и компонентов ко второй версии :)

Ответить

 

Papin

I got this error

yii\web\Request::cookieValidationKey must be configured with a secret key.

I have fixed it by adding

'request' => [
    'enableCookieValidation' => true,
    'enableCsrfValidation' => true,
    'cookieValidationKey' => 'hjkbTG776',
],

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!

Ответить

 

Papin

Ещё одно изменение в ядре.
table_prefix изменился на tablePrefix

Ответить

 

Дмитрий Елисеев

Исправил.

Ответить

 

maleks

Раз статья про СЕО, то хотел спросить про yii пагинатор.
Сделал как по умолчанию для ListView.
При переходе на любую вкладку ссылка на первую вкладку обрастает параметром ?page=1&per-page=4 Это yii2. Хотя по идее ссылка на первую вкладку должна быть чистенькой, без всякого указания что это за вкладка, пример - так как у вас работает на странице /blog.
Это решается в настройках listview или как то еще дополнительно надо это фиксить?

Ответить

 

Дмитрий Елисеев

Да, это особенность Yii2. Установите у Pagination параметр forcePageParam в false:

$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'pagination' => [
        'forcePageParam' => false,
    ],
]);
Ответить

 

maleks

Спасибо.
Добавил еще и это:

'pageSizeParam' => false,
Ответить

 

rtwent

Еще не забыть 'validatePage'=>false

Ответить

 

minority

Отличная статья, хотелось бы продолжение!
И поставленой интересной задачи которая будет решатся.

Ответить

 

Роман – tehsmart.ru

А в какой папке инициировать git? В корне проекта или в web?

Ответить

 

Дмитрий Елисеев

В корне. Чтобы он все папки охватил.

Ответить

 

CalvinKlein

Спасибо за качественные статьи!

Хотелось бы почитать ваше объяснение по поводу пространств имен, а то я смотрю на это в контроллере SiteController, и нижняя челюсть опускается.

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;

Как выбирать пространство имен (создавать собственные или использовать общие), как узнавать какие файлы добавлять в use, в каких случаях можно просто указывать имя класса, а в каких надо писать полный путь к нему и т.д. вот это все.

Ответить

 

Дмитрий Елисеев

Как выбирать: в Yii2 корневая папка приложения обозначена как app. Соответственно, пространства namespace всех ваших классов должны начинаться с app и совпадать с именем папки. Иначе стандартный автозагрузчик нужный файл в вашем приложении для операции include не найдёт.

Как узнавать: Если работать в IDE вроде PhpStorm или NetBeans, то там это всё подставляется само. Пишем имя Controller и сразу появляется выпадающий список:

yii/base/Controller
yii/console/Controller
yii/web/Controller

и по щелчку по нужной строке всё само добавляется в use.

А по использованию use всё почти как с файлами: если класс в том же пространстве имён (файл класса лежит в этой же папке), то use не указываем. А если в другой папке, то указываем. Только все пути надо указывать абсолютными, так как относительной адресации почти нет.

Можно просто прописывать каждый раз полный путь:

namespase app\modules\user\controllers;

$model = new \app\modules\user\models\User();
$model = \app\modules\user\models\User::findOne($id);

Но выглядит некрасиво. А можно прописать один раз в use и потом спокойно обращаться по одному имени:

namespase app\modules\user\controllers;
use app\modules\user\models\User;

$model = new User();
$model = User::findOne($id);

Прелесть пространств имён в том, что можно использовать одноимённые классы в разных местах:

$commonUser = new \app\modules\user\models\User();
$adminUser = \app\modules\admin\models\User::findOne($id);

Просто так их в use не добавишь. Один или оба нужно переименовать:

use app\modules\user\models\User;
use app\modules\admin\models\User as AdminUser;

$commonUser = new User();
$adminUser = AdminUser::findOne($id);

А модель в админке будет наследоваться от общей модели по полному пути:

namespace app\modules\admin\models;

class User extends app\modules\user\models\User {
    ....
}

или по псевдониму:

namespace app\modules\admin\models;
use app\modules\user\models\User as BaseUser;

class User extends BaseUser {
    ....
}

Все «обычные» классы из глобального пространства имён (и класс Yii) просто «лежат» на самом верху. То есть можно просто указать его имя со слешем:

$url = \Yii::$app->request->url;
$date = new \DateTime();

либо просто добавить в use и использовать как обычно:

use Yii;
use DateTime;

$url = Yii::$app->request->url;
$date = new DateTime();

Ничего особо сложного нет.

Ответить

 

CalvinKlein

Спасибо! многое прояснилось
Ждем продолжения цикла статей

Ответить

 

Spirit Absolute

Привет!
У меня возникла проблема с .gitignore. В папке config я прописал в файле .gitignore *-local.php
1 строчка в первой строке. Файлы params-local.php и common-local.php не попали в коммит. Потом после создания новых файлов console-local.php и web-local.php был сделан еще 1 коммит и отправка. И эти последние файлы залились в репозиторий. .gitignore не сработал.

Ответить

 

Дмитрий Елисеев

Странно. Явно что-то не так.

Ответить

 

Дмитрий Елисеев

А как Вы делали добавление git add?

Ответить

 

Spirit Absolute

git add .
commit -m "name"

Ответить

 

Дмитрий Елисеев

А ваша IDE при создании файлов случайно сама их в индекс не добавляет? Для проверки создайте ещё один файл test-local.php и посмотрите git status.

Ответить

 

Spirit Absolute

Хорошо, посмотрю вечером, спасибо. У меня Netbeans!

Ответить

 

Spirit Absolute

Только как мне теперь их убрать из git?

Ответить

 

Дмитрий Елисеев

Удаляем оба файла из индекса:

git rm --cached config/\*-local.php

и перезаписываем последний коммит:

git commit --amend -m 'Extended config'

После этого насильно перебиваем GitHub:

git push origin master --force
Ответить

 

Spirit Absolute

Спасибо!

Ответить

 

Дмитрий Елисеев

Обновил комментарий с инструкцией.

Ответить

 

CalvinKlein

А можно узнать зачем в разных папках создавать разные файлы .gitignore?
Разве не удобнее все исключаемые файлы прописать в одной сущности в корне?

/yii

/config/db.php
/config/params.php

/web/.htaccess
/web/index.php
Ответить

 

Дмитрий Елисеев

На самом деле без разницы.

Ответить

 

Den

Дмитрий, поставил Yii2-app-advanced.

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
...

поместил в файл /frontend/config/main.php,

При открытии сайта, ссылки стали красивыми, но не работают (404) и в подвале тоже 404 ошибка (Object not found).
Если

'urlManager' => [
            'enablePrettyUrl' => false,
            'showScriptName' => true,
...


то ссылки работают, но красота пропадает.

Что я упустил?
Спасибо.

Ответить

 

Den

Вот это http://www.yiiframework.com/doc/guide/1.1/ru/topics.url#sec-7 работает в сочетании с

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
...


Снижения производительности я не заметил, по сравнению с НЕ ЧПУ дефолтным вариантом.
Однако, SEO через .htaccess как-то не очень красиво.

Может, все-таки можно без этого обойтись?

Ответить

 

Дмитрий Елисеев

Весь мир так делает через .htaccess или nginx. Не переживайте.

Ответить

 

Andrey

.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, где этого метода нет.

Просто выполните один раз команду:

php composer.phar global require "fxp/composer-asset-plugin:1.0.*@dev"

и после неё как обычно:

php composer.phar update
Ответить

 

Антон

Пробовал так, но после обновления просит на каждой команде с использованием композера какого-то пользователя и пароль. Вообще с этим композером разобраться не могу.

Ответить

 

Дмитрий Елисеев

Это превышение лимитов. Зарегистрируйтесь на GitHub и вводите этот пароль.

Ответить

 

Антон

Спасибо за подсказки! Все установилось и заработало с первого раза!

Ответить

 

Andrey

Благодарю за замечательный урок, почему на:

php composer.phar global require "fxp/composer-asset-plugin:1.0.*@dev"

Выпадает:

[B]Этому файле не сопоставлена программа для выполнения этого действия. Установите программу или, если она уже установлена, создайте сопоставление с помощью компонента панели управления "Программы по умолчанию" [/B]

У меня Windows7

Ответить

 

Дмитрий Елисеев

Потому, что Вы не добавили путь до php.exe в системную переменную PATH.

Ответить

 

Andrey

Вот как у меня в Path оное прописано:

S:\DEVELOPER\openserver\OpenServer\modules\php\PHP-5.6\;

В этом каталоге есть php.exe

Ответить

 

Дмитрий Елисеев

Тогда не знаю.

Ответить

 

Andrey

Исправил на

S:\DEVELOPER\openserver\OpenServer\modules\php\PHP-5.6\php.exe; при установке.

Попробовал обновить.:

php composer.phar self-update

Вышло:

The "getcomposer.org/version" file could not be downloaded: failed to open stream: ???

Проверил:

php composer.phar diagnose

Выходит:

Checking platform settings: OK
Checking git settings: OK
Checking http connectivity to packagist: FAIL
Checking https connectivity to packagist: FAIL
Checking github.com rate limit:

У меня прокси стоит, может дело в нем? Как выставить proxy порт и ip для composer?

Наблюдал такую конструкцию в сетях:

set http_proxy=http://my-corp-proxy.llc

Но не понял как туда вписать ip и порт

Ответить

 

Andrey

Разобрался, тут прокси виноват.

Ответить

 

Andrew

А что делает эта строчка?

php composer.phar global require "fxp/composer-asset-plugin:1.0.*@dev"
Ответить

 

Дмитрий Елисеев

Устанавливает адаптер, позволяющий работать с JavaScript-репозиториями менеджера Bower. Теперь именно оттуда загружаются JQuery и Bootstrap.

Ответить

 

Nik M

Дмитрий здравствуйте!


У меня, так же как и у Den возникла неприятность с использованием enablePrettyUrl в urlManager

'urlManager' => [ 
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,

также перестали работать ссылки, а на главной странице (единственной рабочей) в подвале тоже 404 ошибка (Object not found).

Использование .htaccess не дало желаемых результатов.

Прошу Вашей помощи в решении этой пустяковой проблемы.

Ответить

 

Дмитрий Елисеев

Более вероятно, что дело всё-таки в сервере и .htaccess.

Ответить

 

Nik M

Спасибо, найду ошибку - отпишусь

Ответить

 

Nik M

Привожу код моего .htaccess.

RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

где может быть проблема??? уже всю голову сломал
вот так работаю с enablePrettyUrl

'urlManager' => [ 
    'class' => 'yii\web\UrlManager',
    'enablePrettyUrl' => true, 
    'showScriptName' => false,
    'rules' => [
        '' => 'main/default/index',
        'about' => 'main/default/about',
        'contact' => 'contact/default/index',
        '<_a:(about|error)>' => 'main/default/<_a>',
        '<_a:(login|logout|signup|confirm-email|request-password-reset|reset-password)>' => 'user/default/<_a>',							
        '<_m:[\w\-]+>/<_c:[\w\-]+>/<_a:[\w\-]+>/<id:\d+>' => '<_m>/<_c>/<_a>',
        '<_m:[\w\-]+>/<_c:[\w\-]+>/<id:\d+>' => '<_m>/<_c>/view',
        '<_m:[\w\-]+>' => '<_m>/default/index',
        '<_m:[\w\-]+>/<_c:[\w\-]+>' => '<_m>/<_c>/index',],
    ],
],
Ответить

 

Дмитрий Елисеев

А другие сайты с htaccess на этом компьютере работают?

Ответить

 

Александр Захаров

... и в настройках виртуального хоста должно стоять

AllowOverride All

Ну и помнить, чтобы настройки вступили в силу, перезапускать Apache
# systemctl reload apache2.service

Ответить

 

Nataly Didenko

спасибо за подсказку)

Ответить

 

a.k.

Дмитрий, добрый день. Подскажите, пожалуйста, можно ли на timeweb сделать символическую ссылку и как это можно реализовать? Ну или как можно использовать папку public_html вместо web. Так-то сайт работает и с public_html. но SEF URL не работают почему-то

Ответить

 

Дмитрий Елисеев

Включить в панели доступ по SSH, зайти в консоли и выполнить:

ln -s public_html web
Ответить

 

Дмитрий

Добрый день! Подскажите в чем может быть проблема:
имеется module/controller/view?param=qwerty
не могу понять почему не работает следующий вариант:
module/controller/view/param/qwerty

в первой версии все было ок...

Ответить

 

Дмитрий Елисеев

Во второй версии нужно для таких случаев добавлять в конце звёздочку:

'<module:[\w\-]+>/<controller:[\w\-]+>/<action:[\w\-]+>/*' => '<module>/<controller>/<action>',
Ответить

 

Сашка – medtab.com.ua

"Если вы используете Denwer в Windows" - таких наверное все меньше становится, т.к. денвер уже долго не обновляют. По сути на денвер из коробки нельзя yii2 поставить, так как в денвере все старое.
Лично использую xampp.
Можно также как портабл использовать установив на внешний носитель.
Переменную path в виндоусе прописывать при использовании xampp не нужно, т.к. имхо при запуске xampp он проверяет есть ли в path путь к php

Спасибо за статью!

Ответить

 

Andrei K.

http://open-server.ru/ неплохая штука... мож кому пригодится. )

Ответить

 

Lola

Здравствуйте! Возникла странная вещь при создании проекта. Сначала композер загружает все нормально, но потом требует логин и пароль для продолжения. Однако логин заводится, а на попытку ввести пароль никакой реакции. Все, процесс встал. Что посоветуете?

Ответить

 

Дмитрий Елисеев

Это у GitHub терпение заканчивается :) После ввода пароля и Enter вообще ничего не делает?

Ответить

 

Lola

Я не могу вообще ввести пароль. Курсор мигает, а пароль не вводится. Нажимаю Enter при пустом пароле, начинается все сначала, снова требует логин и снова не вводится пароль. Очень странная ситуация, при этом папки все создаются, но они почти пустые, а завершить процесс создания проекта не могу,

Ответить

 

gappi92

Lola, у меня была похожая проблема
1) Мигает курсор и не двигается - но пароль на самом делевводится - это своего рода защита от любопытных глаз.
Если ввести пароль - (он не отображается на экране) а потом нажать enter - то все пойдет дальше.
Но есть еще один момент - потом может выдать снова ошибку - тогда надо менять и настраивать версию PHP.
Если есть вопросы - пишите на мейл - (мой ник)+@mail.ru
Сам на парился - помогу чем смогу)

Ответить

 

Дмитрий Елисеев

Добавил настройки компонента assetManager в config/web-local.php.

Ответить

 

Дмитрий

Здравствуйте.

Подскажите пожалуйста ответ на такой философский вопрос.

Предположим я пишу приложение и опираюсь на bootstrap и jquery которые идут в core yii2. Если заглянуть в composer.json, то там можно увидеть "*", т. е. как только обновится bootstrap или jquery (серьезно обновится), то мое приложение может рухнуть.

Вопрос. Как с этим живет человечество? )

Заранее благодарен за ответ.

Ответить

 

Дмитрий Елисеев

Если это очень критично, то можете указать явно нужные версии:

composer require bower-asset/jquery:2.1.1

Так можно переопределять и сами зависимые пакеты вроде bower-asset/bootstrap:3.3.*.

А так я обычно ставлю minimum-stability: stable и оставляю звёздочки. С JQuery у меня за последние годы ни разу не было чего-то ломающего кроме отказа от метода live().

В любом случае обновляюсь не так часто и перепроверяю проект после каждого обновления. Если что-то не работает, то либо в этот же день дорабатываю свой код, либо откатываю проблемные пакеты назад или, если кто-то убежал сильно вперёд, прописываю нужные мне версии явно.

Ответить

 

Дмитрий

А такой вопрос.

Обычно при публикации из git hub (я имею ввиду свой продакшн сервер с git, с hub прослойкой) на продакшн, вешается deploy hook. Как правило этот хук выполняет проверку версий composer update, накатывет миграции и т.д.

Но вот мне пришлось поднять сборку и минификацию пакетов ресурсов с использованием консольной команды asset. Получается такая штука, что в момент публикации проект в плане закомиченных файлов находится в новой версии, а в плане ресурсов в старой, до тех пор, пока не отработается команда asset. В высоконагруженных проэктах это критично. Как вы можете это прокомментировать?

И второй вопрос из этой же оперы. Иногда бывает необходимо сначала накатить миграцию, и только потом файлы проекта. Описанная мной выше процедура публикации подразумевает сначала публикацию файлов, а потом выполнение миграции. На этот счет существуют какието общепринятые решения?

Ответить

 

Дмитрий Елисеев

Могу порекомендовать подход, похожий на использующийся в системе деплоя Capistrano.

Сначала:

  • Создайте три папки: versions, share и local:
  • Переместите всё приложение в versions/1.0 и создайте символическую ссылку с public_html на versions/1.0;
  • Переместите аналогично символьной ссылкой папку upload или подобную ей из versions/1.0/web/upload в share/upload;
  • Скопируйте файлы рабочих незакоммиченных локальных конфигов в папку local;
  • Создайте папку maintenance/web с файлом index.php, который выводит заставку "Извините, сайт обновляется".

Теперь напишите хук, который в фоне полностью поднимает рабочее приложение:

  • Создаёт новую папку вида versions/номер_версии;
  • Разворачивает туда проект по git clone;
  • Создаёт папки runtime и web/assets и расставляет права;
  • Копирует в config локальные конфиги из local;
  • Запускает composer install;
  • Создаёт символическую ссылку с web/upload на share/upload.

А потом скрипту хватит пары секунд, чтобы:

  • Подменить символическую ссылку с public_html на maintenance;
  • Запустить миграции из свежей папки versions/номер_версии;
  • Очистить кеш (при наличии миграций или при другой необходимости);
  • Подменить символическую ссылку с public_html на versions/номер_версии;

В итоге файлы обновляются мгновенным перебросом символической ссылки с папки на папку, а сайт отключается только на время выполнения миграций.

Ответить

 

Дмитрий Елисеев

UPD: Опубликовал репозиторий на GitHub.

Ответить

 

slo_nik

Добрый вечер.
Разъясните, пожалуйста, как сделать полное перенаправление.

Вы привели такой пример и написали, что надо прописать в .htaccess, который лежит в корне сайта.

app/
    controllers/
    models/
    views/
    web/
        assets/
        css/
        index.php
public_html/ -> app/web/

Я попробовал так сделать - ошибка 500 или ничего не меняется. Как правильно сделать, чтобы "web" убрать из адреса?

Ответить

 

Дмитрий Елисеев

Как именно пробовали?

Ответить

 

Lisasveta

Добрый вечер, Дмитрий!
Я yii2 только начинаю осваивать (раньше в фреймворками не работала)
У меня при установке Вашего проекта с https://github.com/ElisDN/seokeys
последние строчки

Generating autoload files
chmod('runtime', 0777)...done.
chmod('web/assets', 0777)...done.
chmod('yii', 0755)...file not found.

Не подскажете - почему в последней строке ...file not found? И как с этим побороться?
Спасибо! :-)

Ответить

 

Дмитрий Елисеев

После этой запустите команду

php init

и выберите нужное окружение. Недостающие локальные файлы станут на место.

Ответить

 

Евгений

Не понимаю, почему из конфигурационного файла param.php невозможно обратиться к константе класса. Например,

use app\modules\comments\models\Comments;

return [
    ...
    'Lookup' => [
        Comments::PENDING => 'Pending',
        ...
    ]
];

Выдает ошибку: Fatal error: Class 'app\modules\comments\models\Comments' not found in ...basic\config\params.php on line 10

Ответить

 

Евгений

Разобрался. Алиасы в params.php не работают. Пришлось установить:

Yii::setAlias('@app', 'W:\domains\yii2...\basic');
Ответить

 

des

Смотрю тема старая а комменты новые. для себя открыл вот такой интересный проект в качестве вводного курса https://github.com/githubjeka/yii2-tutorial

Ответить

 

Alex

Проблема с командой yii, не работает после php init

$ php init

Yii Application Initialization Tool v1.0
Which environment do you want the application to be initialized in?
  [0] Development
  [1] Production
  Your choice [0-1, or "q" to quit] 0
  Initialize the application under 'Development' environment? [yes|no] yes
  Start initialization ...
   generate web/index.php
   generate web/index-test.php
   generate yii
   generate config/console-local.php
   generate config/common-local.php
   generate config/params-local.php
   generate config/web-local.php
   generate cookie validation key in config/web-local.php
      chmod 0777 runtime
      chmod 0777 web/assets
      chmod 0755 yii
      chmod 0755 tests/codeception/bin/yii
  ... initialization completed.

$ php yii migrate
PHP Warning:  require(/public_html/common/config/bootstrap.php): failed to open stream: No such file or directory in /public_html/yii on line 20

PHP Fatal error:  require(): Failed opening required '/public_html/common/config/bootstrap.php' (include_path='.:/usr/share/php:/usr/share/pear') in /public_html/yii on line 20
Ответить

 

Alex

Нужно код из /environments/prod/yii
скопировать и вставить в /environments/dev/yii
т.к. в /environments/dev/yii неверные пути подключения конфиг файлов.

Ответить

 

Art

Доброго. Дмитрий, большое спасибо вам за статьи. Маленький момент - я лично пока чайник совсем, а у вас в коде опущены <?php Скопировал - и хорошо догадался, в чем дело.

Видимо, рано еще в yii лезть, надо какой-нибудь PHP для чайников или можно пробовать работать с фреймворком прямо сразу?

Ответить

 

Дмитрий Елисеев

Чтобы понять как всё устроено и, главное, почему именно так устроено – надо на приличном уровне знать сам PHP, философию ООП и иметь представление о практиках и шаблонах проектирования. А иначе будет полное непонимание не только кода, но и документации.

Ответить

 

Abylaikhan Baidullayev

Добрый день! Спасибо вам за статью! Очень много полезного как раз для таких как Я новичков. Вопрос конечно немного отталкивается от темы. Я вообще новичок по веб программированию. Я делаю проект, но не знаю как все обустроить. Есть примерно 15 таблиц из которых я должен получить данные и обработать потом делать кое-какие вычисления и передать эти данные view. Весь основной кодинг состоит в обработке и вычислении данных полученных из этих таблиц. Вопрос: где мне прописать функций обработки данных в контроллере или в модели? И нужно ли мне для каждой таблицы создавать модели (их у меня 15)? Заранее спасибо!!!

Ответить

 

Дмитрий Елисеев

Смотря какие данные. А так я делаю модели для каждой таблицы. Это позволяет почти все вычисления, сохраниения и выборки делать с ActiveRecord без возни с SQL-запросами.

Ответить

 

Денис

Добрый день, Дмитрий! Возможно вы мне поможете.У меня висит сайт на компе друга, но функция отправки почты не работает. OS WINDOWS. Что нужно проверить/настроит/установит?

Ответить

 

Дмитрий Елисеев

Можно настроить отправку по SMTP с существующей почты. И следите, чтобы в поле From был тот же адрес, с которого посылаете, чтобы не банил mail.ru.

Ответить

 

Алексей

Как переделать Yii2 basic в production (убрать gii и прочие ненужные при загрузке на рабочий сервер вещи)?

Ответить

 

Дмитрий Елисеев

Переключить YII_ENV на prod и YII_DEBUG в false, потом запустить:

composer install --no-dev
Ответить

 

Вячеслав

А если не делать репозиторий на гитхабе то можно не разделять файлы на основные и local !? Или я неверно понял смысл этого разделения?

Ответить

 

Дмитрий Елисеев

Если Git-ом не пользуетесь, то не нужно.

Ответить

 

Вячеслав

То есть ничего из этой статьи? Или это сарказм и ничего вообще, даже сам Yii? Трудности общения в переписке :)

Ответить

 

Дмитрий Елисеев

Не нужно разделение конфигов.

Ответить

 

Лев Кочаков

Добрый день, делал все как написано в статье, но почему то при избавлении от некрасивых url не находит views :

Not Found
The requested URL /site/about was not found on this server.

PS главная страница yii2 basic открывается. В чем может быть проблема?
PSS не включал вывод всех ошибок в файлах web/index.php и web/index-test.php командами:

error_reporting(E_ALL);
ini_set('display_errors', 'on');

PSSS пользуюсь windows7, apache, yii2 ставил через composer

Проблема именно в 'showScriptName' => false, если не ставлю, все работает, но адресная строка имеет вид bapp.local/index.php/site/index.

.htaccess в папке web имеет вид :

Options +FollowSymLinks
IndexIgnore */*

RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

Но даже если не добавлять ничего не меняется.

Ответить

 

Сергей Беловенцев

Спасибо за статью. Единсственное былобы не плохо узнать о rules в urlManager. Вроде я у вас статей не видел.

Ответить

 

Lola

Здравствуйте! С недавнего времени появилась вот такая проблема при установке Yii2 через Composer:

The http://packagist.org/p/yiisoft/yii2%xxxxxxxxxxxxxxxx.json" 
file could not be downloaded: failed to open stream: HTTP request failed!
http://packagist.org could not be fully loaded, package information was loaded from the local cache and may be out of date 

При этом практически не загружается каталог vendor/bower. Не понятно в чем может быть проблема? Может это не только у меня?

Ответить

 

Дмитрий Елисеев

А asset-plugin какой версии установлен?

Ответить

 

Lola

Спасибо! Переустановила до версии 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 и т.п.

Сейчас пришлось делать это.

В итоге сделал всё как описано.
Запустил:

php path/to/yii-application/init

В итоге 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

В итоге такой вид:

<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/../config/common.php'),
    require(__DIR__ . '/../environments/dev/config/common-local.php'),
    require(__DIR__ . '/../config/web.php'),
    require(__DIR__ . '/../environments/dev/config/web-local.php')
);


(new yii\web\Application($config))->run();

Но почему в файле environments/web/index.php указаны неверные пути?
Сравнивал с исходниками кода тоже самое. Пути неверные.
Как такое будет работать?
Или я что-то упустил?

<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.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')
);


(new yii\web\Application($config))->run();
Ответить

 

Дмитрий Елисеев

> Так и сделал.
> Пришлось исправить некоторые пути в web/index.php

Не так сделали. Я просил файлы скопировать, если php init не работает, а Вы вместо копирования файлов пути поменяли.

Ответить

 

Миша

Здравствуйте.
Подскажите а чтобы работало linkAssets = true, у меня апач, в комменте к св-ву сказано что нужно для папки web установить Options FollowSymLinks. В этом нет ничего небезопасного? Может htaccess с этой фишкой кинуть в папку web/assets/ ?

Ответить

 

Дмитрий Елисеев

Всё нормально. Попробуйте.

Ответить

 

Дмитрий Елисеев

Добавил секцию пр подключение Asset Packagist.

Ответить

 

Юрий

Что то я не очень понял следующую штуку:
у нас на сервере в index.php со строкой

$config = require(__DIR__ . '/../config/web.php');

но тогда у нас не мерджится config/common.php
Если его замерджить то на сервере возникает ошибка о том, что param-local.php не найдет.

Или я что-то упустил?

Ответить

 

Дмитрий Елисеев

Выполните php init, чтобы развернуть локальные файлы.

Ответить

 

Юрий

Т.е. я правильно понимаю, на сервере будет такая же структура как и локально, просто файлы из гитигнора не будут там обновляться? У меня rsync синхронизация стоит и gitlab-ci

Ответить

 

Дмитрий Елисеев

Правильно.

Ответить

 

Александр

Обновите, пожалуйста, примечание в статье на счет ArrayHelper::merge и неассоциативных массивов. Теперь можно делать так:

/**
 * Object that represents the replacement of array value while performing [[ArrayHelper::merge()]].
 *
 * Usage example:
 *
 * ```php
 * $array1 = [
 *     'ids' => [
 *         1,
 *     ],
 *     'validDomains' => [
 *         'example.com',
 *         'www.example.com',
 *     ],
 * ];
 *
 * $array2 = [
 *     'ids' => [
 *         2,
 *     ],
 *     'validDomains' => new \yii\helpers\ReplaceArrayValue([
 *         'yiiframework.com',
 *         'www.yiiframework.com',
 *     ]),
 * ];
 *
 * $result = \yii\helpers\ArrayHelper::merge($array1, $array2);
 * ```
 *
 * The result will be
 *
 * ```php
 * [
 *     'ids' => [
 *         1,
 *         2,
 *     ],
 *     'validDomains' => [
 *         'yiiframework.com',
 *         'www.yiiframework.com',
 *     ],
 * ]
 * ```
 *
 * @author Robert Korulczyk <robert@korulczyk.pl>
 * @since 2.0.10
 */
Ответить

 

андрей

эх, жаль для новичков в интернете статей вообще нету(( Все только для профи... как эту гребаную регистрацию сделать, не могу понять......... хоть свой фреемворк пиши блин, с нормальной докой и справочником....жаль только времени на это нету(

Ответить

 

Васька

http://prntscr.com/jfkton

спасибо.............................минус проект..... достал

Ответить

 

Anton Fedonyuk

вместо

[\w\-]+

нужно писать

[-\w]+
Ответить

 

Дмитрий Елисеев

Не "нужно", а "можно".

Ответить

 

Anton Fedonyuk

учитывая что экранирование "-" вообще не требуется, то "нужно", если только Вы не хотели показать читателям хреновые познания в регулярках.

Ответить

 

Дмитрий Елисеев

> экранирование "-" вообще не требуется

Между символами требуется. Иначе будет диапазон.

Ответить

 

Дмитрий Елисеев

Зачем? В диапазонах экранирование обязательно. А не в диапазонах это дело вкуса и консистентности.

Ответить

 

Максим

При включении опции linkasset в труе в файле web.php появляется ошибка.

Ответить

Оставить комментарий

Войти | Завести аккаунт | Войти через


(никто не увидит)





Можно использовать теги <p> <ul> <li> <b> <i> <a> <pre>