Как подключить 2бд к сайту yii2 адвансед
Перейти к содержимому

Как подключить 2бд к сайту yii2 адвансед

  • автор:

Yii Framework

Как правильно настроить хосты для yii2 advanced?

Говорим о серверах, развёртывании, нагрузках, выборе и использовании разных технологий и продуктов
6 сообщений • Страница 1 из 1
ZaurK Сообщения: 19 Зарегистрирован: 2015.01.21, 10:15

Как правильно настроить хосты для yii2 advanced?

Сообщение ZaurK » 2018.07.19, 19:03

Здравствуйте!
Надеюсь я пишу в правильную ветку. Долгое время разворачивал yii2 на OpenServer, но теперь решил перейти на ubuntu + docker. В принципе развернул приложение, но есть некоторые трудности с хостами, в файле vhost.conf прописываю такие настройки, как указано в доках:

 ServerName frontend.test DocumentRoot /app/frontend/web/ . ServerName backend.test DocumentRoot /app/backend/web/ . 

При переходе на localhost:8000 я получаю страницу фронтенда, причем frontend.test не работает. Как сделать так, чтобы сайт открывался по указанным именам серверов, отдельно фронтенд и бэкенд? Подскажите, что я делаю не так?

ElisDN Сообщения: 5839 Зарегистрирован: 2012.10.07, 10:24 Контактная информация:

Re: Как правильно настроить хосты для yii2 advanced?

Сообщение ElisDN » 2018.07.19, 22:27

Не используйте в Docker свои домены. Сделайте два хоста с портами 80 и 81 или два отдельных контейнера frontend и backend с портом 80. И пробросьте их на localhost:8080 и localhost:8081.

И советую перейти на Nginx вместо Apache.

Последний раз редактировалось ElisDN 2018.07.20, 16:58, всего редактировалось 1 раз.
ZaurK Сообщения: 19 Зарегистрирован: 2015.01.21, 10:15

Re: Как правильно настроить хосты для yii2 advanced?

Сообщение ZaurK » 2018.07.19, 22:52

Спасибо за ответ, Дмитрий! То есть, если я правильно понял, бэкенд и фронтенд рассматривать как два разных сайта и для каждого свой контейнер создавать. я надеялся, что можно на одном контейнере. А какой image посоветуете для yii2 с nginx? Или лучше самому попробовать собрать?

anton_z Сообщения: 483 Зарегистрирован: 2017.01.15, 15:01

Re: Как правильно настроить хосты для yii2 advanced?

Сообщение anton_z » 2018.07.20, 04:20

ZaurK писал(а): ↑ 2018.07.19, 22:52 Спасибо за ответ, Дмитрий! То есть, если я правильно понял, бэкенд и фронтенд рассматривать как два разных сайта и для каждого свой контейнер создавать. я надеялся, что можно на одном контейнере. А какой image посоветуете для yii2 с nginx? Или лучше самому попробовать собрать?

Мне вот тоже не очень понятно, зачем два разных контейнера, тем более что тут речь идет об окружении для разработки. Используйте port-based virtual host https://httpd.apache.org/docs/2.4/vhosts/examples.html пример Running different sites on different ports.
Откройте в контейнере два порта, 80 и 8001, например, на один поставьте в конфиге апача фронтенд, на другой бэкенд.

ZaurK Сообщения: 19 Зарегистрирован: 2015.01.21, 10:15

Re: Как правильно настроить хосты для yii2 advanced?

Сообщение ZaurK » 2018.07.20, 10:12

anton_z писал(а): ↑ 2018.07.20, 04:20 Мне вот тоже не очень понятно, зачем два разных контейнера, тем более что тут речь идет об окружении для разработки. Используйте port-based virtual host https://httpd.apache.org/docs/2.4/vhosts/examples.html пример Running different sites on different ports.
Откройте в контейнере два порта, 80 и 8001, например, на один поставьте в конфиге апача фронтенд, на другой бэкенд.

Спасибо за ответ, но, к сожалению, у меня так не получилось. Сделал по-другому, переписал пути к папкам:

 ServerName project.loc DocumentRoot /app 

Yii2-advanced: альтернативное размещение папок для нескольких приложений

Хочу поделиться альтернативным рецептом файловой структуры для нескольких приложений в Yii2-advanced, не прибегая к модулям. Внешние отличия, к которым мы придем, выглядят следующим образом:

Конечная файловая архитектура

Вступление

Я видел на Хабре статью, как разные окружения превратить в модули и сложить их аккуратно внутри проекта. Мне кажется идея, которую мне показал коллега — намного круче и удобнее!

  • Идея такова, что мы не пишем в коде /site/site/index: мы пишем /site/index!
  • Мы не мучаемся с настройкой виртуальных хостов, сим-линков и реврайтов: мы все кидаем в один и тот же файл!
  • Мы можем иметь на бюджетном хостинге (теоретически) любое количество доменов, оплатив опцию «1 сайт»!

PS: Да, и кстати, к радости начинающих: вы можете решить проблему «как сделать общий upload для front&back».
PPS: Я рассчитываю, что вы уже установили и опробовали YII2 Advanced, и понимаете, зачем вам именно этот вариант.

Интересно? Тогда — вперед! Для примера беру последнюю, на текущий момент версию: 2.0.10.

Переходим к рефакторингу: первые шаги

    Если вы в предвкушении революции на работающем проекте, срочно жмем в папке своего проекта «tar -cf saveAndProtect.tar ./» Или выражаясь проще: предохраняемся, путем бекапа последней работающей версии. У меня чистая версия всего с одной вьюхой.

Шаг второй: немного доработать напильником (с)

    Правим первые три инклуда (include) в index.php, где подключается autoload, Yii и common/ bootstrap: просто убрать один уровень соответственно. Последний инклуд мы подключить пока не можем, т.к. это уже bootstrap, который относится к конкретному приложению из папки apps.

// определяем запрошенный APP switch ($_SERVER['HTTP_HOST']) < case 'frontend.dev': case 'site.ru': define('YII_APP', 'frontend'); break; case 'backend.dev': case 'admin.site.ru': define('YII_APP', 'backend'); break; default: // лично у меня тут 301й редирект на главную exit("domain not defined"); >// определяем папку приложения и подключаем его конфиг define('YII_APP_DIR', Yii::getAlias('@apps') . '/' . YII_APP); require(YII_APP_DIR . '/config/bootstrap.php'); 
$config = yii\helpers\ArrayHelper::merge( require(__DIR__ . '/../common/config/main.php'), require(__DIR__ . '/../common/config/main-local.php'), require(YII_APP_DIR . '/config/main.php'), require(YII_APP_DIR . '/config/main-local.php') ); 

Добавляем алиас: Yii::setAlias(‘@apps’, dirname(dirname(__DIR__)). ‘/apps’);
Наши приложения правим по принципу: Yii::setAlias(‘@console’, Yii::getAlias(‘@apps’). ‘/console’);.

Настройка консольной части Yii2
./yii.php

#!/usr/bin/env php run(); exit($exitCode); 

apps\console\config\main.php правим участок с merge

$params = array_merge( require(__DIR__ . '/../../../common/config/params.php'), require(__DIR__ . '/../../../common/config/params-local.php'), require(__DIR__ . '/params.php'), require(__DIR__ . '/params-local.php') ); 

Работающий сайт после смены архитектуры

Работающая консоль после смены архитектуры

Резюме

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

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

В: У меня, на шаге Х просто белый экран!
О: Вы допустили опечатку до инициализации Yii. Временно добавьте в самое начало index.php строку: ini_set(«display_errors»,«1»); ini_set(«error_reporting», E_ALL);

В: Скомпиленные Ассеты могут смешаться?
О: Вряд ли. Почти за год работы проекта не отмечено ни одного случая

В: Robots и favico не для каждого домена, а смешаны в кучу?
О: Всегда можно разрулить реврайтами апача по RewriteCond %

В: А как можно получить ссылку из другого приложения? На примере «модулей», это было бы элементарно.
О: Создайте дополнительную компоненту и Yii::$app->urlManagerFrontend->createUrl(. );

  • yii2 advanced
  • yii2 multi-application

Работа со сторонним кодом ¶

Иногда необходимо использовать сторонний код в приложениях Yii. Или же есть потребность использовать Yii в качестве библиотеки в сторонних системах. В этом разделе мы рассмотрим, как это происходит.

Использование сторонних библиотек в Yii ¶

Перед тем, как использовать стороннюю библиотеку в приложении Yii, в первую очередь следует убедиться, что в ней либо явно настроена загрузка классов, либо классы могут загружаться автоматически.

Использование пакетов Composer ¶

Многие сторонние библиотеки поставляются в виде пакетов Composer. Для установки таких библиотек достаточно проделать два простых шага:

  1. Изменить файл composer.json своего приложения и указать, какие пакеты Composer нужно устанавливать.
  2. Выполнить команду composer install , чтобы установить указанные пакеты.

Классы установленных пакетов Composer поддерживают автозагрузку с помощью автозагрузчика Composer. Убедитесь, что во входном скрипте приложения присутствуют следующие строки, подключающие автозагрузчик Composer:

// подключение автозагрузчика Composer require __DIR__ . '/../vendor/autoload.php'; // подключение файла класса Yii require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; 

Использование отдельных библиотек ¶

Если библиотека не поставляется в виде пакета Composer, необходимо установить ее согласно ее руководству по установке. В большинстве случаев потребуется вручную скачать файл с релизом и распаковать его в директорию BasePath/vendor , где BasePath соответствует базовому пути приложения.

Если библиотека использует собственный автозагрузчик классов, его можно подключить во входном скрипте приложения. Желательно подключить его до того, как подключается файл Yii.php , чтобы при автоматической загрузке классов у автозагрузчика классов Yii был приоритет.

Если библиотека не поставляется с автозагрузчиком классов, но конвенция именования ее классов соответствует PSR-4, для загрузки ее классов можно использовать автозагрузчик Yii. Для этого достаточно для каждого корневого пространства имен, которые используются в ее классах, объявить корневой псевдоним. Предположим, что библиотека установлена в директорию vendor/foo/bar , а ее классы объявлены в корневом пространстве имен xyz . В конфигурации приложения можно использовать следующий код:

[ 'aliases' => [ '@xyz' => '@vendor/foo/bar', ], ] 

Если ни один из предыдущих вариантов не подходит, скорее всего для использования библиотеки нужно настроить в конфигурации PHP директиву include_path . Настройте ее, следуя инструкциям, которые поставляются с библиотекой.

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

  • Определить, какие классы входят в состав библиотеки.
  • Перечислить классы и пути к соответствующим файлам в Yii::$classMap во входном скрипте приложения. Например,

Yii::$classMap['Class1'] = 'path/to/Class1.php'; Yii::$classMap['Class2'] = 'path/to/Class2.php'; 

Использование Yii в сторонних системах ¶

Поскольку в Yii реализована масса полезных функций, они могут пригодиться при разработке или расширении сторонних систем, таких как WordPress и Joomla, или приложений, разработанных с помощью других PHP-фреймворков. Например, в сторонней системе можно задействовать класс yii\helpers\ArrayHelper или использовать функционал Active Record. Для этого обычно нужно сделать две вещи: установить Yii и подключить Yii.

Если сторонняя система использует для управления зависимостями Composer, Yii можно просто установить с помощью следующей команды:

composer require yiisoft/yii2 

Если вам интересны возможности Yii, например, по работе с базами данных, но вы не планируете использование ресурсов, вы можете установить специальный пакет, который предотвращает загрузку Bower и NPM пакетов. Смотрите cebe/assetfree-yii2 для деталей.

Первая команда устанавливает composer asset plugin, который позволяет управлять зависимостями пакетов bower и npm через Composer. Даже если вы хотите воспользоваться слоем абстракции баз данных или другими элементами Yii, не связанными с ресурсами, этот плагин все равно придется установить, так как без него не установится пакет Yii. В разделе об установке Yii более подробно описана работа с Composer и даны решения проблем, которые могут возникнуть при установке.

Также можно скачать файл релиза Yii и распаковать его в директорию BasePath/vendor .

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

require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; $yiiConfig = require __DIR__ . '/../config/yii/web.php'; new yii\web\Application($yiiConfig); // НЕ ВЫЗЫВАЙТЕ run() в этом месте 

Как видите, этот код очень похож на код входного скрипта типичного приложения Yii. Единственное отличие заключается в том, что после создания экземпляра приложения не вызывается метод run() . Это связано с тем, что при вызове run() Yii захватывает контроль над процессом обработки запроса, что в данном случае не требуется, так как эту задачу выполняет существующее приложение.

Как и в случае с приложением Yii, нужно настроить экземпляр приложения исходя из окружения запущенной сторонней системы. Например, чтобы воспользоваться функционалом Active Record, нужно передать в компонент приложения db настройки для подключения к базе данных, которую использует сторонняя система.

Это позволит задействовать большинство функционала, который предоставляет Yii. Например, можно будет создавать классы типа Active Record, и с их помощью взаимодействовать с базой данных.

Использование Yii 2 в связке с Yii 1 ¶

Если в прошлом вам приходилось использовать Yii 1, не исключено, что у вас до сих пор где-то используются приложения на этой платформе. Вместо того, чтобы переписывать все приложение под Yii 2, может быть целесообразно расширить его используя отдельные функции, которые появились в Yii 2. Для этого нужно выполнить следующие действия.

Примечание: Yii 2 требует PHP 5.4 или выше. Убедитесь, что и сервер, и существующее приложение поддерживают это.

Во-первых, установите Yii 2 в существующем приложении, выполняя действия, описанные в предыдущем подразделе.

Во-вторых, внесите следующие изменения во входной скрипт приложения:

// подключение модифицированного класса Yii, описанного ниже require __DIR__ . '/../components/Yii.php'; // настройка приложения Yii 2 $yii2Config = require __DIR__ . '/../config/yii2/web.php'; new yii\web\Application($yii2Config); // НЕ ВЫЗЫВАЙТЕ run() // настройка приложения Yii 1 $yii1Config = require __DIR__ . '/../config/yii1/main.php'; Yii::createWebApplication($yii1Config)->run(); 

Так как класс Yii используется и в Yii 1, и в Yii 2, нужно будет создать его модифицированную версию, обслуживающую обе версии фреймворка. В приведенном выше коде подключается модифицированный файл класса Yii со следующим содержимым:

$yii2path = '/path/to/yii2'; require $yii2path . '/BaseYii.php'; // Yii 2.x $yii1path = '/path/to/yii1'; require $yii1path . '/YiiBase.php'; // Yii 1.x class Yii extends \yii\BaseYii < // скопируйте и вставьте код из YiiBase (1.x) > Yii::$classMap = include($yii2path . '/classes.php'); // регистрация автозагрузчика Yii 2 через Yii 1 Yii::registerAutoloader(['Yii', 'autoload']); // создание контейнера внедрения зависимостей Yii::$container = new yii\di\Container; 

Вот и все! Теперь в любом месте кода можно с помощью конструкции Yii::$app получить доступ к экземпляру приложения Yii 2, а с помощью конструкции Yii::app() — к экземпляру приложения Yii 1:

echo get_class(Yii::app()); // выводит 'CWebApplication' echo get_class(Yii::$app); // выводит 'yii\web\Application' 

Как подключить Gii в Yii2 advanced

Я установить его через Composer, прописал настройки в frontend/config/main.php, но по адресу /index.php?r=gii ничего не показывается, то есть показывается стандартная страница. Что я сделал не так? frontend/config/main.php

'bootstrap' => ['gii'], 'modules' => [ 'gii' => 'yii\gii\Module', // . ], 

Отслеживать
задан 7 сен 2016 в 12:56
2,563 1 1 золотой знак 20 20 серебряных знаков 47 47 бронзовых знаков

прописал настройки в frontend/config/main.php . какие? добавьте конфиг в вопрос . и есть ли с common конфиг main-local ?

7 сен 2016 в 13:33
Добавил конфиг в вопрос. в папке common есть конфиг main-local
7 сен 2016 в 13:41

Это какой-то маааааленький конфиг. вы его весь выложите. А в common/main-local есть строки ‘urlManager’ => [ ‘enablePrettyUrl’ => true, ], ? . а во frontend и backend есть main-local? там же уже gii должен быть прописан

7 сен 2016 в 13:43

в common/main-local такого нету, такое есть в frontend/config/main . и да, в frontend/config/main-local gii уже прописан

7 сен 2016 в 13:50

В этом наверное и проблема. это позволяет писать красивые урлы. Т.е. можно писать mysite.ru/gii . правда при наличии опции ‘request’=>[ ‘baseUrl’=>», ], . А если поставить ‘enablePrettyUrl’ => false, то можно писать index.php?r=gii и раз в main-local подключен gii, то в main писать ‘modules’ => [ ‘gii’ => ‘yii\gii\Module’, // . ], вроде и не обязательно

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *