Ir para conteúdo

POWERED BY:

Arquivado

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

Junior_Cassapava

[Resolvido] Para que usa Zend Studio for Eclipse

Recommended Posts

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';

É feito um tratamente muito parecido (praticamente idêntico) ao da classe DirWeb.class.php para saber onde está o arquivo DirWeb ( localizado no mesmo nível de www ).

 

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(); 
?>

A unica diferença é que criei mais uma variável no método construtor da classe Initializer, o $controller_name, que foi criado no bootstrap.

 

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');
	}
}
?>

o método construtor instancia DirWeb que cria as urls novamente.

 

É 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

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.