Como funciona os config/main e config/main-local

Galera boa noite. Estou com uma P. dúvida nesses arquivos de configurações que ficam na pasta config. Fiz alguns testes que basicamente não me levaram a nada. Vou descrever os testes que fiz.

Alguém poderia dar uma luz? Só não mande eu ler o guia, pq ele e nada para esse asunto é a msm coisa. E esse "-local" tb não diz PN de ser realmente local.

O Primeiro teste que fiz estava usando o ENV padrão, ou seja, desenvolvimento. Tb criei um usuário no banco diferente que só tem acesso a um schema (que é diferente do schema do desenvolvimento) da aplicação e mais nenhum. Tipo usuário prod, senha prod que vê o schema yii2. Isso para simular um ambiente de produção. (acho que até aqui ta fácil).

common/config/main-local.php


return [

    'language' => 'it',

    'name' => 'Advanced App Dev',

    'components' => [

        'db' => [

            'class' => 'yii\db\Connection',

            'dsn' => 'mysql:host=localhost;dbname=bancoDev',

            'username' => 'master',

            'password' => '#m@th3rfuck69',

            'charset' => 'utf8',

        ],

        'mailer' => [

            'class' => 'yii\swiftmailer\Mailer',

            'viewPath' => '@common/mail',

        ],

    ],

];

common/onfig/main.php


return [

	'language' => 'pt-br',

	'name' => 'Advanced App',

    'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',

    'components' => [

        'db' => [

            'class' => 'yii\db\Connection',

            'dsn' => 'mysql:host=localhost;dbname=yii2',

            'username' => 'prod',

            'password' => 'prod',

            'charset' => 'utf8',

        ],

        'cache' => [

            'class' => 'yii\caching\FileCache',

        ],

    ],

];

Pela lógica descrita no guia o main-local.php deveria funcioar no ambiente DEV, após rodar o comando php /path/to/yii-application/init --env=Production --overwrite=All para virar PROD, ele deveria ler o arquivo main.php.

Qnd estava em DEV pareceu que ele respeitou as configurações, mas não estou lembrando. Removendo qq um dos 2 arquivos a app para de rodar.

Afinal para que servem esses 2 infelizes se um depende do outro e não posso configurá-los para ambientes diferentes?????

Olá Cara!

Viu, não entendi muito bem sua idéia da troca entre ENV e PROD e o uso do main-local.php e main.php.

Mas olhando o arquivo init entendi que se quiser fazer a troca entre tipos de ambiente (ENV e PROD) usando o comando php /path/to/yii-application/init você vai precisar editar os arquivos main-local.php diretamente nas pastas :

  • path/to/yii-application/environments/prod/*
  • path/to/yii-application/environments/dev/*

Pois toda vez que rodar o comando init, basicamente ele "copia e cola" os arquivos localizados nestas pastas acima sobreescrevendo sua próprias configurações (caso existam) na pasta /path/to/yii-application/frontend|backend/config/main-local.php

Outra coisa, o main.php e main-local.php são usados sempre em conjunto, independente se está em ENV ou PROD. Olhando os arquivos:

  • path/to/yii-application/environments/prod/app/web/index.php
  • path/to/yii-application/environments/dev/app/web/index.php

Você vai ver a sequinte porção de código:





$config = yii\helpers\ArrayHelper::merge(

	require(__DIR__ . '/../../common/config/main.php'),

	require(__DIR__ . '/../../common/config/main-local.php'),

	require(__DIR__ . '/../config/main.php'),

	require(__DIR__ . '/../config/main-local.php')

);






Veja que o main-local.php é colocado depois do main.php em todos os casos, fazendo com que as configurações do main-local.php tenham preferência sobre as configurações do main.php.

Ou seja, se você definir as configurações da conexão db tanto em main.php quanto em main-local.php, irá prevalecer apenas as informações no arquivo main-local.php!

Será que esclareci sua dúvida?

Então esse é o problema. Os nomes escolhidos levam ao erro.

Ou seja vc está criando algo na sua máquina e vai por padrão como o Env DEV, quer fazer um deploy, ftp ou qq coisa vc precisa rodar o comando para transformar o Env em Prod aí ele apaga tudo e cria de novo. Aí faz o deploy, roda o comando para voltar o Env para DEV e de novo perde tudo.

O main-local é um arquivo local que ajuda a você a manter suas próprias configurações. Por exemplo, isso evita de você ficar mudando as configurações do db no caso de um update.

Os arquivos *-local nunca serão comitados e não são usados em produção.

Se você ver o arquivo .gitignore na sua aplicação, verá os arquivos main-local.php e params-local.php