Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, estou estudando Zend Framework a uns 2 meses, e utilizo a ferramenta Zend Studio for Eclipse. Desde o início, tive algumas dificuldades sobre o comportamento das aplicações rodando no servidor web de minha máquina e rodando nos servidores web externos.
Ao criar um projeto no Zend Studio, por padrão ele já cria toda a estrutura de diretórios para que o Framework possa funcionar corretamente, alguns ajustes nos diretórios devem ser feitos, mas é pouca coisa. Ele cria a pasta do projeto e dentro dela cria mais 4 pastas: application, library, puclic e test.
Na pasta application estão localizados todos os principais arquivos da aplicação, é onde ficam os Models, as Views e os Controllers ( MVC ), além de possuir também configurações do banco de dados, entre outros.
Na pasta library localiza-se o Zend Framework, que são as classes responsáveis por fazer o projeto funcionar e que auxiliam o usuário no desenvolvimento dos sistemas.
A pasta public é onde será feita todas as requisições das páginas, qualquer url chamada irá ser atendida pelo arquivo index.php da pasta public, e este por sua vez, irá chamar o arquivos bootstrap localizado na pasta application e este irá carregar o controller invocado pelo usuário através da url.
A pasta test é somente para fazer testes de uso da aplicação, você pode criar classes de teste para validar toda a aplicação antes de colocar em produção.
Na documentação da Zend, recomenda-se que o diretório www ou htdocs do servidor seja a pasta public criada no projeto zend, ou seja, a pasta application e library deve ficar no mesmo nível da pasta root do servidor web, evitando assim que os arquivos existentes nelas não possam ser acessados pelo browser, mantendo assim a aplicação mais segura. Mas quando você cria um projeto em sua máquina, não vai estar toda hora configurando o diretório htdocs, e vai acaba trabalhando ( em localhost ) com a estrutura padão criada, não preocumando-se se as pastas application e library estão dentro ou no mesmo nível que root.
Mas quando estes arquivos vão para o servidor externo, estas regras devem ser aplicadas para não quebrar esta "regra" do Zend Framework, e aí que vinha a minha dor de cabeça, sempre que eu tinha que testar um projeto na web eu tinha que renomear alguns diretórios para que o projeto Zend pudesse funcionar sem problemas.
Conforme o tempo foi passando fui adquirindo um pouco mais de habilidade e então criei uma classe para centralizar toda a criação dos diretórios do arquivos bootstrap, fazendo com que o projeto funcione em minha máquina e no servidor web sem que alterações no código fonte sejam efetuadas.
A hierarquia de diretórios que eu proponho é quase a mesma, possui apenas algumas modificações:
Primeiro o arquivo responsável por centralizar a criação dos diretórios:
DirWeb.class.php
<?php
final class DirWeb {
private $dir_principal;
private $dir_lib;
private $projeto;
private $local;
private $dir_web;
public function __construct( $projeto = null ){
$this -> dir_web = $_SERVER['DOCUMENT_ROOT'] . '/';
$this -> dir_web = str_replace("//", "/", $this -> dir_web);
$this -> dir_web = substr($this -> dir_web, 0, -1);
$this -> projeto = $projeto;
$this -> VerificaLocal();
$this -> CriaStrDir();
}
private function CriaStrDir(){
$dir_split = split("/", $this -> dir_web);
$diretorio = null;
for ($i=0; $i < count($dir_split) - 1; $i++){
$diretorio .= $dir_split[$i] . '/';
}
$this -> dir_lib = $diretorio;
if ($this -> local == true){
$diretorio .= 'htdocs/' . $this -> projeto . '/';
}
$this -> dir_principal = $diretorio;
}
private function VerificaLocal(){
if (stristr($this -> dir_web, 'htdocs')){
$this -> local = true;
} else {
$this -> local = false;
}
}
public function __get($atributo){
if ($atributo == "dir_principal" || $atributo == "dir_lib"){
return $this -> $atributo;
}
}
}
?>
Para utilizá-lo deve-se instanciar passando o nome do projeto criado na máquina:
$class_dir = new DirWeb('nome_do_projeto_zend');
existem 2 urls, a principal e a do diretório library, elas podem ser acessadas desta maneira:
$dir_principal = $class_dir -> dir_principal;
$dir_lib = $class_dir -> dir_lib;
O método contrutor obtem o diretório root do servidor e em seguida chama os métodos VerificaLocal e CriaStrDir.
O método VerificaLocal verifica se a aplicação está rodando local, na função stristr verifica se na variavel root existe o htdocs ( caso você use xampp ).
O método CriaStrDir cria a string do diretório, o grande segredo está na linha 34, onde se você está rodando local a url do diretório principal é incrementada com o htdocs + o nome do projeto passado no construtor, caso contrário a url irá referenciar a pasta localizada no mesmo nível da pasta www.
Abaixo o arquivo index.php da pasta public
index.php
<?php
/**
* My new Zend Framework Project
*
* @author
* @version
*/
$dir_web = $_SERVER['DOCUMENT_ROOT'] . '/';
$dir_web = str_replace("//", "/", $dir_web);
$dir_web = substr($dir_web, 0, -1);
$dir_split = split("/", $dir_web);
$diretorio = null;
for ($i=0; $i < count($dir_split) - 1; $i++){
$diretorio .= $dir_split[$i] . '/';
}
require_once $diretorio . 'DirWeb.class.php';
$class_dir = new DirWeb('testedir');
$dir_principal = $class_dir -> dir_principal;
$controller_name = 'default';
require $dir_principal . 'application/bootstrap.php';Na varíável $controller_name você põe o nome do seu controller existente dentro da pasta application, você pode alterar o nome da pasta padrão e para que o projeto funcione corretamente, você irá alterar o nome dela apenas nessa variável.
Agora o arquivo bootstrap.php
bootstrap.php
<?php
/**
* My new Zend Framework project
*
* @author
* @version
*/
$dir_web = $_SERVER['DOCUMENT_ROOT'] . '/';
$dir_web = str_replace("//", "/", $dir_web);
$dir_web = substr($dir_web, 0, -1);
$dir_split = split("/", $dir_web);
$diretorio = null;
for ($i=0; $i < count($dir_split) - 1; $i++){
$diretorio .= $dir_split[$i] . '/';
}
require_once $diretorio . 'DirWeb.class.php';
$class_dir = new DirWeb('testedir');
$dir_principal = $class_dir -> dir_principal;
$dir_lib = $class_dir -> dir_lib;
set_include_path('.' . PATH_SEPARATOR . $dir_lib . 'library'
. PATH_SEPARATOR . $dir_principal . 'application/' . $controller_name . '/models/'
. PATH_SEPARATOR . get_include_path());
require_once $controller_name . '/init/Initializer.php';
require_once "Zend/Loader.php";
// Set up autoload.
Zend_Loader::registerAutoload();
// Prepare the front controller.
$frontController = Zend_Controller_Front::getInstance();
// Change to 'production' parameter under production environemtn
$frontController->registerPlugin(new Initializer('development', $controller_name));
// Dispatch the request using the front controller.
$frontController->dispatch();
?>Agora a classe Initializer, localizado na pasta init dentro da pasta default ( o controller model )
Initializer.php
<?php
/**
* My new Zend Framework project
*
* @author
* @version
*/
$dir_web = $_SERVER['DOCUMENT_ROOT'] . '/';
$dir_web = str_replace("//", "/", $dir_web);
$dir_web = substr($dir_web, 0, -1);
$dir_split = split("/", $dir_web);
$diretorio = null;
for ($i=0; $i < count($dir_split) - 1; $i++){
$diretorio .= $dir_split[$i] . '/';
}
require_once $diretorio . 'DirWeb.class.php';
require_once 'Zend/Controller/Plugin/Abstract.php';
require_once 'Zend/Controller/Front.php';
require_once 'Zend/Controller/Request/Abstract.php';
require_once 'Zend/Controller/Action/HelperBroker.php';
/**
*
* Initializes configuration depndeing on the type of environment
* (test, development, production, etc.)
*
* This can be used to configure environment variables, databases,
* layouts, routers, helpers and more
*
*/
class Initializer extends Zend_Controller_Plugin_Abstract
{
/**
* @var Zend_Config
*/
protected static $_config;
/**
* @var string Current environment
*/
protected $_env;
/**
* @var Zend_Controller_Front
*/
protected $_front;
/**
* @var string Path to application root
*/
protected $_root;
/**
* @var string nome do projeto na pasta application
*/
protected $_proj_app;
/**
* Constructor
*
* Initialize environment, root path, and configuration.
*
* @param string $env
* @param string|null $root
* @return void
*/
public function __construct($env, $proj_app, $root = null)
{
$this -> _proj_app = $proj_app;
$this->_setEnv($env);
if (null === $root) {
$root = realpath(dirname(__FILE__) . '/../');
}
$this->_root = $root;
$this->initPhpConfig();
$this->_front = Zend_Controller_Front::getInstance();
// set the test environment parameters
if ($env == 'test') {
// Enable all errors so we'll know when something goes wrong.
error_reporting(E_ALL | E_STRICT);
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
$this->_front->throwExceptions(true);
}
}
/**
* Initialize environment
*
* @param string $env
* @return void
*/
protected function _setEnv($env)
{
$this->_env = $env;
}
/**
* Initialize Data bases
*
* @return void
*/
public function initPhpConfig()
{
}
/**
* Route startup
*
* @return void
*/
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$this->initDirWeb();
$this->initDb();
$this->initHelpers();
$this->initView();
$this->initPlugins();
$this->initRoutes();
$this->initControllers();
}
public function initDirWeb(){
$class_dir = new DirWeb('testedir');
$this -> dir_principal = $class_dir -> dir_principal;
}
/**
* Initialize data bases
*
* @return void
*/
public function initDb()
{
}
/**
* Initialize action helpers
*
* @return void
*/
public function initHelpers()
{
// register the default action helpers
Zend_Controller_Action_HelperBroker::addPath( $this -> dir_principal . 'application/' . $this -> _proj_app . '/helpers', 'Zend_Controller_Action_Helper');
}
/**
* Initialize view
*
* @return void
*/
public function initView()
{
// Bootstrap layouts
Zend_Layout::startMvc(array(
'layoutPath' => $this -> dir_principal . 'application/' . $this -> _proj_app . '/layouts',
'layout' => 'main'
));
}
/**
* Initialize plugins
*
* @return void
*/
public function initPlugins()
{
}
/**
* Initialize routes
*
* @return void
*/
public function initRoutes()
{
}
/**
* Initialize Controller paths
*
* @return void
*/
public function initControllers()
{
$this->_front->addControllerDirectory($this -> dir_principal . 'application/' . $this -> _proj_app . '/controllers', 'default');
}
}
?>É isso pessoal espero que tenha ficado bem claro, está ai a minha ajuda, acredito que seja a dificuldade de muitas pessoas que estão começando também.
Dêem uma olhada e comentem aqui depois, sugestões e dicas serão muito bem vindas, agora preciso almoçar.. flw ai galera..
abraço!!
Att,
Junior
Carregando comentários...