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

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

  • автор:

Как организовать административную часть сайта на Yii2?

1. В шаблоне advanced есть разделы: frontend, backend. Как я понимаю для админки лучше использовать backend часть, или какое-нибудь другое решение?
2. Как обратиться из браузера к контролеру backend/controllers ?

  • Вопрос задан более трёх лет назад
  • 162 просмотра

Комментировать
Решения вопроса 1

Decadal

1. В шаблоне advanced есть разделы: frontend, backend. Как я понимаю для админки лучше использовать backend часть, или какое-нибудь другое решение?

Зависит от масштабов вашего проекта. Не всякую админку стоит пихать в advanced-backend, у вас есть возможность сделать админку отдельным модулем.

2. Как обратиться из браузера к контролеру backend/controllers ?

так же как и к frontend/controllers. Посредством backend/web/index.php. Для шаблона advanced вы делаете две конфигурации сервера, вот и всё отличие.

Подключение dubug на шаблоне advanсed

мне надо подключить dubug на шаблоне advanсed, я видел этот ответ и прочие. ответ заключается в том, что в файлах backend/config/main-local.php и frontend/config/main-local.php перед return $config; вставить код

if (YII_ENV_DEV) < // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug'; $config['modules']['debug']['class'] = 'yii\debug\Module'; $config['modules']['debug']['allowedIPs'] = ['*']; $config['bootstrap'][] = 'gii'; $config['modules']['gii']['class'] = 'yii\gii\Module'; $config['modules']['gii']['allowedIPs'] = ['*']; >

но я не понимаю как такое может быть, если изначально внешний вид файла frontend/config/main-local.php совершенно другой. У меня это так:

 [ 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=etest_com', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ], 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', 'viewPath' => '@common/mail', ], ], ]; 

вот ссылка на гит Куда вставлять то этот код, чтоб работал дебагер?

Как console Yii2 advanced подключить к БД?

Есть подключение к базе данных, и оно работает в frontend и backend. Но в console отказывается запускаться.
Где настраивать подключение к БД в папке console?

5a6fc2bc006e7475733835.png

  • Вопрос задан более трёх лет назад
  • 1604 просмотра

Комментировать
Решения вопроса 1

kimono

Web developer
В main-local.php:

'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=my_db', 'username' => 'db_user', 'password' => 'db_password', // 'enableSchemaCache' => true, // 'schemaCacheDuration' => 3600, // 'tablePrefix' => '', // 'charset' => 'utf8mb4', // 'enableQueryCache' => true, // 'queryCacheDuration' => 600, ],

По-хорошему подключение (если оно общее для backend && frontend && console ) нужно вынести в main-local.php в папке common . А все файлы конфигурации настраивать в папке environments и запускать php init .

Ответ написан более трёх лет назад
Нравится 4 2 комментария
tincap @tincap Автор вопроса

5a70316ac535f904859539.png

Exception ‘yii\base\InvalidCallException’ with message ‘Setting read-only property: yii\console\Application::db’

kimono

return [ 'components' => [ 'db' => [/* . */] ] ];

Ответы на вопрос 0
Ваш ответ на вопрос

Войдите, чтобы написать ответ

yii

  • Yii

Почему не работает skipOnEmpty для required?

  • 1 подписчик
  • 25 апр.
  • 44 просмотра

yii

  • Yii

Можно ли сделать динамическую модель для таблиц в Yii2?

  • 1 подписчик
  • 14 апр.
  • 38 просмотров

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

Я установить его через 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’, // . ], вроде и не обязательно

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 Сообщения: 5837 Зарегистрирован: 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 

Yii Framework

После настройки виртуалки с vagrant и попытки зайти по домену shop.dev браузер пишет, что сайт «Сайт shop.dev не позволяет установить соединение.», но по адресу y2aa показывает страницу сервера nginx.

Vagrantfile
require ‘yaml’
require ‘fileutils’

required_plugins = %w( vagrant-hostmanager vagrant-vbguest )
required_plugins.each do |plugin|
exec «vagrant plugin install #» unless Vagrant.has_plugin? plugin
end

domains = frontend: ‘shop.dev’,
backend: ‘backend.shop.dev’
>

config = local: ‘./vagrant/config/vagrant-local.yml’,
example: ‘./vagrant/config/vagrant-local.example.yml’
>

# copy config from example if local config not exists
FileUtils.cp config[:example], config[:local] unless File.exist?(config[:local])
# read config
options = YAML.load_file config[:local]

# check github token
if options[‘github_token’].nil? || options[‘github_token’].to_s.length != 40
puts «You must place REAL GitHub token into configuration:\n/yii2-app-advanced/vagrant/config/vagrant-local.yml»
exit
end

# vagrant configurate
Vagrant.configure(2) do |config|
# select the box
config.vm.box = ‘bento/ubuntu-16.04’

# should we ask about box updates?
config.vm.box_check_update = options[‘box_check_update’]

config.vm.provider ‘virtualbox’ do |vb|
# machine cpus count
vb.cpus = options[‘cpus’]
# machine memory size
vb.memory = options[‘memory’]
# machine name (for VirtualBox UI)
vb.name = options[‘machine_name’]
end

# machine name (for vagrant console)
config.vm.define options[‘machine_name’]

# machine name (for guest machine console)
config.vm.hostname = options[‘machine_name’]

# network settings
config.vm.network ‘private_network’, ip: options[‘ip’]

# sync: folder ‘yii2-app-advanced’ (host machine) -> folder ‘/app’ (guest machine)
config.vm.synced_folder ‘./’, ‘/app’, owner: ‘vagrant’, group: ‘vagrant’

# disable folder ‘/vagrant’ (guest machine)
config.vm.synced_folder ‘.’, ‘/vagrant’, disabled: true

# hosts settings (host machine)
config.vm.provision :hostmanager
config.hostmanager.enabled = true
config.hostmanager.manage_host = true
config.hostmanager.ignore_private_ip = false
config.hostmanager.include_offline = true
config.hostmanager.aliases = domains.values

# provisioners
config.vm.provision ‘shell’, path: ‘./vagrant/provision/once-as-root.sh’, args: [options[‘timezone’]]
config.vm.provision ‘shell’, path: ‘./vagrant/provision/once-as-vagrant.sh’, args: [options[‘github_token’]], privileged: false
config.vm.provision ‘shell’, path: ‘./vagrant/provision/always-as-root.sh’, run: ‘always’

# post-install message (vagrant console)
config.vm.post_up_message = «Frontend URL: http://#\nBackend URL: http://#»
end

app.conf

server charset utf-8;
client_max_body_size 128M;
sendfile off;

listen 80; ## listen for ipv4
#listen [::]:80 default_server ipv6only=on; ## listen for ipv6

server_name shop.dev;
root /app/frontend/web/;
index index.php;

access_log /app/vagrant/nginx/log/frontend-access.log;
error_log /app/vagrant/nginx/log/frontend-error.log;

location / # Redirect everything that isn’t a real file to index.php
try_files $uri $uri/ /index.php$is_args$args;
>

# uncomment to avoid processing of calls to non-existing static files by Yii
#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ # try_files $uri =404;
#>
#error_page 404 /404.html;

location ~ \.php$ include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
try_files $uri =404;
>

server charset utf-8;
client_max_body_size 128M;
sendfile off;

listen 80; ## listen for ipv4
#listen [::]:80 default_server ipv6only=on; ## listen for ipv6

server_name backend.shop.dev;
root /app/backend/web/;
index index.php;

access_log /app/vagrant/nginx/log/backend-access.log;
error_log /app/vagrant/nginx/log/backend-error.log;

location / # Redirect everything that isn’t a real file to index.php
try_files $uri $uri/ /index.php$is_args$args;
>

# uncomment to avoid processing of calls to non-existing static files by Yii
#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ # try_files $uri =404;
#>
#error_page 404 /404.html;

location ~ \.php$ include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
try_files $uri =404;
>

В консоли пишет : Machine ‘y2aa’ has a post `vagrant up` message. This is a message
==> y2aa: from the creator of the Vagrantfile, and not from Vagrant itself:

samdark Администратор Сообщения: 9479 Зарегистрирован: 2009.04.02, 13:46 Откуда: Воронеж Контактная информация:

Работа с базами данных ¶

Этот раздел расскажет о том, как создать новую страницу, отображающую данные по странам, полученные из таблицы countries базы данных. Для достижения этой цели вам будет необходимо настроить подключение к базе данных, создать класс Active Record, определить action и создать view.

Изучив эту часть, вы научитесь:

  • Настраивать подключение к БД.
  • Определять класс Active Record.
  • Запрашивать данные, используя класс Active Record.
  • Отображать данные во view с использованием пагинации.

Обратите внимание, чтобы усвоить этот раздел, вы должны иметь базовые знания и навыки использования баз данных. В частности, вы должны знать, как создать базу данных и как выполнять SQL запросы, используя клиентские инструменты для работы с БД.

Подготавливаем базу данных ¶

Для начала создайте базу данных под названием yii2basic , из которой вы будете получать данные в вашем приложении. Вы можете создать базу данных SQLite, MySQL, PostgreSQL, MSSQL или Oracle, так как Yii имеет встроенную поддержку для многих баз данных. Для простоты, в дальнейшем описании будет подразумеваться MySQL.

После этого создайте в базе данных таблицу country и добавьте в неё немного демонстрационных данных. Вы можете запустить следующую SQL инструкцию, чтобы сделать это:

CREATE TABLE `country` ( `code` CHAR(2) NOT NULL PRIMARY KEY, `name` CHAR(52) NOT NULL, `population` INT(11) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `country` VALUES ('AU','Australia',24016400); INSERT INTO `country` VALUES ('BR','Brazil',205722000); INSERT INTO `country` VALUES ('CA','Canada',35985751); INSERT INTO `country` VALUES ('CN','China',1375210000); INSERT INTO `country` VALUES ('DE','Germany',81459000); INSERT INTO `country` VALUES ('FR','France',64513242); INSERT INTO `country` VALUES ('GB','United Kingdom',65097000); INSERT INTO `country` VALUES ('IN','India',1285400000); INSERT INTO `country` VALUES ('RU','Russia',146519759); INSERT INTO `country` VALUES ('US','United States',322976000); 

На данный момент у вас есть база данных под названием yii2basic и внутри неё таблица country с тремя столбцами, содержащими десять строк данных.

Настраиваем подключение к БД ¶

Перед продолжением убедитесь, что у вас установлены PHP-расширение PDO и драйвер PDO для используемой вами базы данных (например, pdo_mysql для MySQL). Это базовое требование в случае использования вашим приложением реляционной базы данных. После того, как они установлены, откройте файл config/db.php и измените параметры на верные для вашей базы данных. По умолчанию этот файл содержит следующее:

 return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2basic', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ]; 

Файл config/db.php — типичный конфигурационный инструмент, базирующийся на файлах. Данный конфигурационный файл определяет параметры, необходимые для создания и инициализации экземпляра yii\db\Connection, через который вы можете делать SQL запросы к подразумеваемой базе данных.

Подключение к БД, настроенное выше, доступно в коде приложения через выражение Yii::$app->db .

Информация: файл config/db.php будет подключен главной конфигурацией приложения config/web.php , описывающей то, как экземпляр приложения должен быть инициализирован. Для детальной информации, пожалуйста, обратитесь к разделу Конфигурации.

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

Создаём потомка Active Record ¶

Чтобы представлять и получать данные из таблицы country , создайте класс — потомок Active Record, под названием Country и сохраните его в файле models/Country.php .

 namespace app\models; use yii\db\ActiveRecord; class Country extends ActiveRecord  

Класс Country наследуется от yii\db\ActiveRecord. Вам не нужно писать ни строчки кода внутри него! С кодом, приведённым выше, Yii свяжет имя таблицы с именем класса.

Информация: Если нет возможности задать прямую зависимость между именем таблицы и именем класса, вы можете переопределить метод yii\db\ActiveRecord::tableName(), чтобы явно задать имя связанной таблицы.

Используя класс Country , вы можете легко манипулировать данными в таблице country , как показано в этих фрагментах:

use app\models\Country; // получаем все строки из таблицы "country" и сортируем их по "name" $countries = Country::find()->orderBy('name')->all(); // получаем строку с первичным ключом "US" $country = Country::findOne('US'); // отобразит "United States" echo $country->name; // меняем имя страны на "U.S.A." и сохраняем в базу данных $country->name = 'U.S.A.'; $country->save(); 

Информация: Active Record — мощный способ доступа и манипулирования данными БД в объектно-ориентированном стиле. Вы можете найти подробную информацию в разделе Active Record. В качестве альтернативы, вы также можете взаимодействовать с базой данных, используя более низкоуровневый способ доступа, называемый Data Access Objects.

Создаём Action ¶

Для того, чтобы показать данные по странам конечным пользователям, вам надо создать новый action. Вместо размещения нового action’a в контроллере site , как вы делали в предыдущих разделах, будет иметь больше смысла создать новый контроллер специально для всех действий, относящихся к данным по странам. Назовите новый контроллер CountryController , и создайте action index внутри него, как показано ниже.

 namespace app\controllers; use yii\web\Controller; use yii\data\Pagination; use app\models\Country; class CountryController extends Controller < public function actionIndex() < $query = Country::find(); $pagination = new Pagination([ 'defaultPageSize' => 5, 'totalCount' => $query->count(), ]); $countries = $query->orderBy('name') ->offset($pagination->offset) ->limit($pagination->limit) ->all(); return $this->render('index', [ 'countries' => $countries, 'pagination' => $pagination, ]); > > 

Сохраните код выше в файле controllers/CountryController.php .

Action index вызывает Country::find() . Данный метод Active Record строит запрос к БД и извлекает все данные из таблицы country . Чтобы ограничить количество стран, возвращаемых каждым запросом, запрос разбивается на страницы с помощью объекта yii\data\Pagination. Объект Pagination служит двум целям:

  • Устанавливает пункты offset и limit для SQL инструкции, представленной запросом, чтобы она возвращала только одну страницу данных за раз (в нашем случае максимум 5 строк на страницу).
  • Он используется во view для отображения пагинатора, состоящего из набора кнопок с номерами страниц, это будет разъяснено в следующем подразделе.

В конце кода action index выводит view с именем index , и передаёт в него данные по странам вместе c информацией о пагинации.

Создаём View ¶

Первым делом создайте поддиректорию с именем country внутри директории views . Эта папка будет использоваться для хранения всех view, выводимых контроллером country . Внутри директории views/country создайте файл с именем index.php , содержащий следующий код:

 use yii\helpers\Html; use yii\widgets\LinkPager; ?> h1>Countries h1> ul>  foreach ($countries as $country): ?> li> = Html::encode("code> (name>)") ?>: = $country->population ?> li>  endforeach; ?> ul> = LinkPager::widget(['pagination' => $pagination]) ?> 

View имеет 2 части относительно отображения данных по странам. В первой части предоставленные данные по странам выводятся как неупорядоченный HTML-список. Во второй части выводится виджет yii\widgets\LinkPager, используя информацию о пагинации, переданную из action во view. Виджет LinkPager отображает набор постраничных кнопок. Клик по любой из них обновит данные по странам в соответствующей странице.

Испытываем в действии ¶

Чтобы увидеть, как работает весь вышеприведённый код, перейдите по следующей ссылке в своём браузере:

https://hostname/index.php?r=country%2Findex 

Список Стран

В начале вы увидите страницу, показывающую пять стран. Под странами вы увидите пагинатор с четырьмя кнопками. Если вы кликните по кнопке «2», то увидите страницу, отображающую другие пять стран из базы данных: вторая страница записей. Посмотрев внимательней, вы увидите, что URL в браузере тоже сменилось на

https://hostname/index.php?r=country%2Findex&page=2 

За кадром Pagination предоставляет всю необходимую функциональность для постраничной разбивки набора данных:

  • В начале Pagination показывает первую страницу, которая отражает SELECT запрос стран с параметрами LIMIT 5 OFFSET 0 . Как результат, первые пять стран будут получены и отображены.
  • Виджет LinkPager выводит кнопки страниц используя URL’ы, созданные Pagination. Эти URL’ы будут содержать параметр запроса page , который представляет различные номера страниц.
  • Если вы кликните по кнопке «2», сработает и обработается новый запрос для маршрута country/index . Таким образом новый запрос стран будет иметь параметры LIMIT 5 OFFSET 5 и вернет следующие пять стран для отображения.

Заключение ¶

В этом разделе вы научились работать с базой данных. Также вы научились получать и отображать данные с постраничной разбивкой с помощью yii\data\Pagination и yii\widgets\LinkPager.

В следующем разделе вы научитесь использовать мощный инструмент генерации кода, называемый Gii, чтобы с его помощью быстро осуществлять некоторые часто используемые функции, такие как операции Create-Read-Update-Delete (CRUD) для работы с данными в таблице базы данных. На самом деле код, который вы только что написали, в Yii может быть полностью сгенерирован автоматически с использованием Gii.

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

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