Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

[VAZA]

[Resolvido] Ambientes no Zend Framework

Recommended Posts

E ai pessoal...

Eu ainda não entendi como o Zend trabalha com ambientes (Desenvolvimento, testes, homologação e produção)

Eu verifiquei que no arquivo de configuração .ini tem os seguintes estágios acima, porém como eu decido quando trabalhar com um e com outro?

Primeira questão: Se eu estou trabalhando no ambiente de desenvolvimento, eu apenas tenho que setar o arquivo public/index.php para:

// Define application environment

defined('APPLICATION_ENV')

|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development : production')); ????

 

Segunda questão: E no lado servidor? eu tenho que criar um diretorio virtual para cada ambiente? algo como http://myapplication.development, http://myapplucation.test, http://myapplication.production?

Compartilhar este post


Link para o post
Compartilhar em outros sites

E com relação a estrutura para esses ambientes?

Fica tudo em um mesmo diretorio, dai quando eu quiser passar para a produção eu só altero o index.php e envio os novos arquivos ao servidor?

ou posso criar um diretorio para cada ambiente onde eu posso verificar a aplicação rodando em todos os ambientes para que eu possa fazer uma comparação entre elas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A unica coisa que muda é no index.php aonde no local que tu preferir, tu coloca ou development ou production...

 

tipo, se está no ar, a conexão com o banco tu coloca em production, mas se está localmente, coloque os dados no development

Compartilhar este post


Link para o post
Compartilhar em outros sites

Localmente (no seu PC) você sempre deve usar ambiente de desenvolvimento, para que os erros sejam exibidos corretamente e você possa corrigí-los.

 

No servidor você sempre vai trabalhar com ambiente de produção, pois é lá que os usuários terão acesso a sua aplicação.

 

Você não precisa setar essa constante aí no arquivo index.php, pois se você fizer isso você terá que editá-lo cada vez que mandar pro servidor ou então criar uma condição pra verificar se está localmente ou no servidor.

 

No exemplo de virtual host do ZF você pode notar que essa constante já é definida lá para ambiente de desenvolvimento:

 

<VirtualHost *:80>
ServerName quickstart.local
DocumentRoot /path/to/quickstart/public

SetEnv APPLICATION_ENV "development"

<Directory /path/to/quickstart/public>
	DirectoryIndex index.php
	AllowOverride All
	Order allow,deny
	Allow from all
</Directory>
</VirtualHost>

 

Veja que ele possui isso 'SetEnv APPLICATION_ENV "development"'. Portanto, esqueça essa de definir dentro do arquivo index.php.

 

Já no servidor você não precisa definir nada, assim automaticamente o ZF vai seguir o padrão que é produção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No servidor você sempre vai trabalhar com ambiente de produção, pois é lá que os usuários terão acesso a sua aplicação.

 

Uhn... nem sempre. Se você olhar no application.ini padrão do ZF tem um ambiente que se chama testing. Eu utilizo este ambiente no servidor de produção enquanto não coloco o site no ar, principalmente para exibir erros e exceções.

 

Outra forma de definir o ambiente é no arquivo .htaccess (quando utilizado). Assim:

SetEnv APPLICATION_ENV development
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi como você faz Carlos.

 

Não faz muito tempo que eu trabalho com o ZF, mas até agora sempre usei somente ambiente de produção no servidor.

 

Eu imaginava que este ambiente específico de teste servia exclusicamente para realizar testes com o PHPUnit por exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... Eu gostei da ideia que surgiu no post e fiz 2 artigos sobre o assunto.

 

Trabalhando com ambientes no application.ini do Zend Framework

 

e

 

Colocando o site/aplicação em manutenção com o Zend Framework

 

Ali eu mostro uma utilidade para estas seções do application.ini, como colocar o site em modo de manutenção de forma simples, além de mostrar algumas informações sobre o application.ini.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Matias, é exatamente isso que eu penso.

Eu posso ter o ambiente de teste, homologação e produção no servidor.

Já tive problema em uma aplicação que na minha maquina, tudo pegava certo, porém quando subi os arquivos, eu estava tendo problema em minha classe.

Como você sugere fazer isso Matias?

Como consigo trabalhar com os 3 ambientes em um mesmo servidor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode por exemplo fazer da seguinte forma em seu servidor:

 

/

/public_html

----/development

----/test

/apps

----/development

----/production

----/test

 

Dentro de public_html tera os arquivos normalmente que serão acessados via endereço principal da sua aplicação.

Dentro de cada pasta referente ao ambiente você coloca o conteudo da pasta public de cada aplicação, ou seja, index.php, diretorios, etc.

Depois em cada index.php você altera o caminho do APPLICATION_PATH.

 

Com isso você consegue ter varias aplicações Zend no mesmo servidor.

Eles serão acessados da seguinte forma

 

http://www.suaapp.com.br -> acessará a aplicação production

http://www.suaapp.com.br/development -> acessará a aplicação development

http://www.suaapp.com.br/test-> acessará a aplicação test

 

Espero ter sido claro.

Compartilhar este post


Link para o post
Compartilhar em outros sites
' timestamp='1319149441' post='1767976']

Clarissimo Ghean..obrigadão. Era exatamente isso que eu estava pensando em fazer.

 

Que bom, depois nos informa de deu certo. ^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ghean, Acho que não estou sabendo configurar os diretorios/application.ini/index.phpFicaria assim a estrutura de pastas?

 

ESTRUTURA DE DIRETORIOS

MINHAAPLICACAO

/apps

CONFIGURAÇÕES DO SISTEMA

---/configs

---/---/application.ini

AMBIENTE DE DESENVOLVIMENTO

---/development

---/---/controllers

---/---/models

---/---/views

---/---/---/scripts

AMBIENTE DE TESTES

---/tests

---/---/controllers

---/---/models

---/---/views

---/---/---/scripts

AMBIENTE DE PRODUÇÃO

---/production

---/---/controllers

---/---/models

---/---/views

---/---/---/scripts

 

/docs

/library

/public

---/development

---/tests

---/production

 

INDEX.PHP

<?php

// Define path to application directory
defined('APPLICATION_PATH')
   || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../apps'));

// Define application environment
defined('APPLICATION_ENV')
   || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
   realpath(APPLICATION_PATH . '/../library'),
   get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
   APPLICATION_ENV,
   APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
           ->run();

 

 

APPLICATION.INI

[production]
resources.view[] =
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Apps"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.frontController.params.displayExceptions = 0

autoloaderNamespaces[] = "ZendX"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1


[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Matias, vou sim.

O sistema terá varios modulos e eu também gostaria de separar por diretorios

 

Eu até consegui modificar o ambiente, separando da seguinte forma:

app

--/configs

--/--/application.ini

--/development

--/--/controllers

--/--/models

--/--/views

--/--/Bootstrap.php

 

--/production

--/--/controllers

--/--/models

--/--/views

--/--/Bootstrap.php

 

--/public

 

e no meu application.ini:

[production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/production/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/production/controllers"
resources.frontController.params.displayExceptions = 1

[development : production]
resources.frontController.controllerDirectory = APPLICATION_PATH "/development/controllers"
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

 

e no meu index.php do diretorio public, eu altero a linha de:

// Define application environment
defined('APPLICATION_ENV')
   || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

para:

// Define application environment
defined('APPLICATION_ENV')
   || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development'));

 

 

Só que quando eu quiser mudar o ambiente, terei que mudar o index.php e eu fazendo isso, não só eu mas como todos os usuários terão a visão do ambiente para o qual eu mudar, ou seja, fica sem noção essa troca de ambientes.

To pensando em colocar cada ambiente em um subdominio do meu dominio, exemplo:

produção: http://www.meusite.com.br

desenvolvimento: http://development.meusite.com.br

testes: http://testing.meusite.com.br

Compartilhar este post


Link para o post
Compartilhar em outros sites

VAZA, seguinte...

Você criaria suas aplicações individualmente.

 

Nesse caso seriam 3 aplicações diferentes.

No index.php de cada aplicação você vai alterar o APLICATION_PATH da seguinte forma para o diretorio em apps:

 

Desenvolvimento (public_html/desenvolvimento/index.php)

// Define path to application directory
defined('APPLICATION_PATH')
   || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../apps/desenvolvimento'));

 

Teste (public_html/teste/index.php)

// Define path to application directory
defined('APPLICATION_PATH')
   || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../apps/teste'));

 

Produção (public_html/index.php)

// Define path to application directory
defined('APPLICATION_PATH')
   || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../apps/producao'));

 

Dessa forma você consegue trabalhar de forma quem nenhum ambiente conflite com outro, cada ambiente nesse caso seria uma aplicação.

 

você criar a plicação desenvolvimento, faz o que precisa, copia para teste, faz os teste e depois copia para produção, compreende?

Compartilhar este post


Link para o post
Compartilhar em outros sites
' timestamp='1319205231' post='1768233']

To pensando em colocar cada ambiente em um subdominio do meu dominio, exemplo:

produção: http://www.meusite.com.br

desenvolvimento: http://development.meusite.com.br

testes: http://testing.meusite.com.br

Eu estava pensando em fazer exatamente a mesma coisa. Até montei aqui a lógica, só faltou postar.

 

VAZA, seguinte...

Você criaria suas aplicações individualmente.

 

Nesse caso seriam 3 aplicações diferentes.

Até é uma ideia. Depende muito do que você vai precisar fazer neste caso. Você vai precisar acessar os 3 ambientes ao mesmo tempo? Se sim, acho difícil de funcionar como o Ghean está sugerindo. Acho que a melhor forma é trabalhar com os subdomínios mesmo.

 

--------------------------

 

Para funcionar com o subdomínio, deixa o código todo normal, sem modificar nada. Aí você pega só o application.ini e modifica o seguinte:

// deste
resources.frontController.moduleDirectory   = APPLICATION_PATH "/modules/"
// para este
resources.frontController.moduleDirectory   = APPLICATION_PATH "/modules/" APPLICATION_ENV

A estrutura de diretórios ficará assim:

 

/apps
---/modules
------/development
----------/controllers
----------/models
----------/views
------/testing
----------/controllers
----------/models
----------/views
------/production
----------/controllers
----------/models
----------/views

 

O restante não muda nada.

 

Você tem acesso a criação de Virtual Host neste servidor? Se tiver, você direciona todos para o mesmo caminho e define o APPLICATION_ENV dentro da criação de cada VHost (development e testing), como eu expliquei aqui. Se não tiver acesso, tem como criar os subdomínios direcionando todos para o mesmo endereço?

 

Fiz os testes aqui e funcionou normalmente. Veja se consegue compreender a lógica utilizada.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Matias, Fiz desta forma e deu certo, porém eu não estou conseguindo acessar os controllers/actions

exemplo, se eu acessar minha pagina principal:

http://meusite.localhost , ele entra na minha indexAction, porém se eu passar o controller e a action por parametro: http://meusite.localhost/default/index , ele diz que a página não pode ser encontrada:

 

Not Found

The requested URL /default/index was not found on this server.

Creio que eu adicionar o diretorio development e production no router do Zend, estou correto? Eu tentei adicionar mas nao consegui

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade provavelmente o problema foi a questão do URL rewrite. Coloque http://meusite.localhost/index.php/default/index e veja se funciona. Se funcionar é porque o rewrite não funcionou direito, seja porque você não habilitou o AllowOverride via .htaccess dentro do vhost ou outro motivo qualquer.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pela dica. Meu .htaccess estava correto, porém eu tinha que configurar meu diretório virtual no apache.

Valeu. Não sei o que seria de mim sem vocês...hehehehe

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.