Ir para conteúdo

POWERED BY:

Arquivado

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

« Léo »

[Resolvido] Criar módulos no Zend

Recommended Posts

Fala Galera,

 

Estou tentando começar a aprender o Zend Framework. Tentei fazer um teste simples, extendendo a classe Zend_Db_Table_Abstract da seguinte maneira:

class UsuariosModel extends Zend_Db_Table_Abstract {
	protected $_name = 'usuarios';
}

Salvei este código em: application/models/UsuariosModel.php

 

No entanto, quando o instancio no controller, é retornado o erro:

Fatal error: Class 'UsuariosModel' not found in C:\wamp\www\zend\application\controllers\exemploController.php on line 26

Salvei no lugar certo? É preciso utilizar algum tipo de include? O bootstrap não dá conta disso?

 

Desde já, agradeço!

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, desculpa. Não tinha achado a seção do Zend.

 

bootstrap.php

<?php

	# Configura as constantes APPLICATION_PATH e APPLICATION_ENVIRONMENT acaso
	# elas não tenham sido configuradas no index.php. 
	defined('APPLICATION_PATH')
		or define('APPLICATION_PATH', dirname(__FILE__));
	
	defined('APPLICATION_ENVIRONMENT')
		or define('APPLICATION_ENVIRONMENT', 'development');
	   
	set_include_path(
		APPLICATION_PATH . '/../library'
		. PATH_SEPARATOR . get_include_path()
	);
	
	# Configura o autoload do Zend Framework
	/*require_once "Zend/Loader.php";
	Zend_Loader::registerAutoload();*/
	require_once 'Zend/Loader/Autoloader.php';
	Zend_Loader_Autoloader::getInstance();
	   
	# Captura a instância única do Zend_Controller_Front, que implementa o Design Pattern Sigleton.
	$frontController = Zend_Controller_Front::getInstance();
	
	# Configura o diretório dos controllers
	$frontController->setControllerDirectory(APPLICATION_PATH . '/controllers');
	
	# Configura o ambiente de execução do projeto.
	$frontController->setParam('env', APPLICATION_ENVIRONMENT);
	
	# Limpa as variáveis globais. (somente o $frontController)
	unset($frontController);

 

index.php (public)

<?php
	/**
	 * Constante que aponta para o diretório application
	 * também utilizada para incluir o diretório library no include_path do php
	 */
	define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application/'));
	
	/**
	 * Inclui o bootstrap.php. Atquivo responsável pela configuração
	 * do projeto.
	 */
	try {
		require '../application/bootstrap.php';
		/**
		 * Dispacho da controller. Dispara a execução dos controllers e actions.
		 */
		Zend_Controller_Front::getInstance()->dispatch();
	} catch (Exception $exception) {
		echo '<html><body><center>'
		   . 'An exception occured while bootstrapping the application.';
		if (defined('APPLICATION_ENVIRONMENT')
			&& APPLICATION_ENVIRONMENT != 'production'
		) {
			echo '<br /><br />' . $exception->getMessage() . '<br />'
			   . '<div align="left">Stack Trace:'
			   . '<pre>' . $exception->getTraceAsString() . '</pre></div>';
		}
		echo '</center></body></html>';
		exit(1);
	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade está faltando bastante coisa no teu bootstrap. Dá uma olhada nos tutoriais do Fabyo.

 

http://forum.imasters.com.br/index.php?/forum/240-artigos-tutoriais-e-materias-zend-framework/

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Matias,

 

Desculpe, mas fiquei enrolado com os arquivos q tenho que colocar no diretorio application e o q fica no public. Não consegui entender nada. Poderia me explicar o q ponho onde?

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você está instanciando no controller?

 

acho que o que está acontecendo é o seguinte, quando você instancia no controller, como sua classe esta dentro de Application/models você tb tem que incluir o caminho no nome da sua classe, ficando portanto;

class Model_Usuarios extends Zend_Db_Table_Abstract
{

}
isso deve passar para o controller que seu arquivo esta dentro da pasta models...

Compartilhar este post


Link para o post
Compartilhar em outros sites

na pasta models você coloca todos as classes que farao referencia as tabelas do seu banco de dados

para criar um modelo , dentro da pasta models você pode utilizar assim

Usuario.php

class Usuarios extends Zend_Db_Table{
        protected $_name = 'usuarios'; //aqui deve ser o mesno nome da tabela (inclusive obedecendo maiusculas)
}

dai pra você poder utilizar esta classe dentro dos controladores

IndexController.php

class IndexController extends Zend_Controller_Action {
	/**
	 * The default action - show the home page
	 */
	public function init(){
		Zend_Loader::loadClass('Usuarios');
	}
	public function indexAction() {
         //aqui você coloca os comandos
        }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

jpraminelli,

 

que versão do Zend Framework você está usando?

 

se fizer da maneira que eu postei anteriormente, não tem necessidade de chamar o Zend_Loader. vou postar novamente.

 

dentro da pasta models em Application/models. Você cria suas classes.

 

Exemplo da tree.

Application

-configs

-controllers

-forms

-layouts

-models

--Usuarios.php

-modules

 

Usuarios.php

<?php

class Model_Usuarios extends Zend_Db_Table_Abstract
{
   protected $_name = 'users';
   public function getUsers()
   {
      $result = $this->fetchAll();
      return $result->toArray();
   }
}

IndexController.php

<?php

class IndexController extends Zend_Controller_Action
{
   public function indexAction()
   {
      $user = new Model_Usuarios();
      $this->view->user = $user;
   }
}

aqui vai um exemplo de como chamar na view

index.phtml

<?php echo $this->user();?><br/>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala srnetcave,

 

Quanto a sua 1ª resp: "quando você instancia no controller, como sua classe esta dentro de Application/models..."

O Tutorial que havia lido, dizia que todos os nomes de controllers devem terminar com "Controller". Não está certo?

 

Ja na 2ª resp:

você utilizou a classe dentro do IndexController, assim como eu estou tentando utilizar, mas nao funciona. O Matias havia falado q meu bootstrap estava faltando muita coisa e daí deveria vir o erro.

 

Quanto a resp do jpraminelli, já vi que tem ocmo usar classes sem carrega-las manualmente. Gostaria de fzer assim... Estou utilizando a versão 1.91

 

Poderiam me passar exemplos de bootstrap? E o que devo colocar no index do "public" e no do application?

 

Obrigado pela atenção de todos.

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

srnetcave,

 

Fiz exatamente como sugeriu, mas continuo recebendo o erro:

Fatal error: Class 'Model_Usuarios' not found in C:\wamp\www\zend\application\controllers\exemploController.php on line 5

 

Segue como estão meus arquivos agora:

 

Usuarios

 

application/controllers/ExemploController.php (controller p/ testes)

<?php

class ExemploController extends Zend_Controller_Action {
	public function indexAction () {
		$user = new Model_Usuarios();
		$this->view->user = $user;
	}
}

application/models/Usuarios.php

class Model_Usuarios extends Zend_Db_Table_Abstract {
   protected $_name = 'usuarios';
   public function getUsers() {
      $result = $this->fetchAll();
      return $result->toArray();
   }
}

application/views/scripts/exemplo/index.phtml

<?php echo $this->user();?><br/>

Ainda estou fazendo algo errado?

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, o problema está no seu bootstrap. Veja dica do Fabyo neste post.

 

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);

http://forum.imasters.com.br/index.php?/topic/343336-zendframework-1-8-0/

 

Eu não gosto de colocar Model_NomeDaClasse. O que o ZF faz. Ele entende o _ como novo diretório. Então, se você chama a classe Model_Usuarios, o ZF procura no seu include_path a pasta Model e o arquivo Usuarios, contendo a classe Model_Usuarios. Eu utilizo esta lógica somente para forms (que eu crio uma pasta para todos os forms) e para filters.

 

Sugiro que você corrija o seu include_path, seguindo o tutorial do Fabyo também.

 

<?php
if(version_compare(phpversion(), 5) === '-1'){
	die('Versão do PHP não compativel');
}

define('DS', DIRECTORY_SEPARATOR);
define('PS', PATH_SEPARATOR);
define('BASEPATH', getcwd() . DS);

set_include_path('.'
	. PS . BASEPATH . 'library' . DS
	. PS . BASEPATH . 'includes' . DS
	. PS . BASEPATH . 'application' . DS . 'controllers' . DS . 'plugins' . DS	
	. PS . BASEPATH . 'application' . DS . 'models' . DS
	. PS . get_include_path());
		
require 'library/Zend/Loader.php';
Zend_Loader::registerAutoload(); 

Zend_Controller_Front::getInstance()
	->throwExceptions(TRUE)	
	->setControllerDirectory(BASEPATH . 'application' . DS . 'controllers' . DS)
	->dispatch();

http://forum.imasters.com.br/index.php?/topic/284116-zend-framework/

 

Neste tutorial, ele utiliza o autoloader no formato que funcionava antes da versão 1.8. A partir desta, funciona como ele colocou na outra citação.

 

Fazendo desta forma, você cria o arquivo Usuarios e a classe Usuarios dentro da pasta models (que está incluída no seu include_path). Ao tentar instancia-la, o Autoloader vai procurar o arquivo Usuarios dentro do seu include_path, contendo a classe Usuarios.

 

Sugiro também que leia todos os outros tutos do Fabyo, pois eles explicam de uma forma simples e objetiva alguns recursos do ZF.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leo, se você utiliza o Zend Tool para criar seus projetos, ele ja cria o bootstrapper com as configurações basicas para o funcionamento que expliquei acima. mas ai vai um exemplo do bootstrapper.

 

public/index.php bootstrapper - exemplo bem simples

<?php

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

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, testei todas as sugestões dadas e não consigo nenhum resultado. =/ Tentei baixar os arquivos do Fabyo alterando o autoloader e nd tmb...

 

Ainda sendo bem chato (rs), Procurei como utilizar o Zend_tool, mas não consegui. Poderiam me ajudar?

 

Vlw pela atenção

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, testei todas as sugestões dadas e não consigo nenhum resultado. =/ Tentei baixar os arquivos do Fabyo alterando o autoloader e nd tmb...

 

Ainda sendo bem chato (rs), Procurei como utilizar o Zend_tool, mas não consegui. Poderiam me ajudar?

 

Vlw pela atenção

Abs

 

Leo, você está utilizando eclipse com pdt? se estiver. veja se quando você for instanciar a classe no Controller se o auto insert localiza a classe.

 

outra coisa normalment seu ZF funciona?e quanto ao Zend Tool?

 

você precisa adicionar o ZFTool Path no seu Enviroment_Path se você estiver utilizando windows.

 

utilização basica do ZF Tool.

navegue até a pasta do servidor ex. c:\wamp\www\

depois use;

zf create project teste
isso criara um projeto teste dentro da pasta c:\wamp\www\teste

se você utiliza eclipse apenas crie um novo projeto de mesmo nome (ex. teste), o eclipse dira que ja existe um projeto com nome de teste, apenas de ok e o eclipse importa seu projeto. você ainda tem que copiar a Zend Library para dentro da pasta library no seu projeto, eu prefiro assim, mas se você preferir tb pode adicionar a library no include_path do seu php, da uma olhada no manual do ZF.

 

outra coisa, não sei se você tem problema em qualquer projeto no zf ou se o problema apenas acontece neste projeto, mas verifique a configuração do seu apache, mais precisamente descomente a linha abaixo

LoadModule rewrite_module modules/mod_rewrite.so

 

se o problema insistir, poste seus arquivos (apenas os arquivos, deixe a library de fora), e tambem poste versão do php, apache, OS e software que esta utilizando para programar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, aqui vai um exemplo que criei, substitua os arquivos do seu projeto por estes.

 

Mysql db

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `user` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user` (`user`)
) ENGINE=MyISAM;

depois insira alguns valores para teste

INSERT INTO `users` (`id`, `user`) VALUES
(1, 'admin'),
(2, 'guest'),
(3, 'jack'),
(4, 'daniels'),
(5, 'white'),
(6, 'horse');

Application/configs/application.ini

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

resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = root
resources.db.params.password =
resources.db.params.dbname = test

[staging : production]

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

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

Bootstrap public/index.php

<?php

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

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

Bootstrap Application/Bootstrap.php

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAutoload()
    {
        $moduleLoader = new Zend_Application_Module_Autoloader(array(
                        'namespace'    => '',
                        'basePath'     => APPLICATION_PATH));
        return $moduleLoader;
    }
}

Model Applicaion/models/Usuarios.php

<?php

class Model_Usuarios extends Zend_Db_Table_Abstract
{
    protected $_name = 'users';
    
    public function getUsers()
    {
        $result = $this->fetchAll();
        return $result;
    }   
}

IndexController Application/controllers/IndexController.php

<?php

class IndexController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        $func = new Model_Usuarios();
        $result = $func->getUsers();
        $this->view->result = $result;
    }
}

index.phtml Application/views/scripts/index.phtml

<?php foreach ($this->result as $results):?>

<?php echo $this->escape($results['user']);?><br/>

<?php endforeach;?>

se mesmo assim nao funcionar, da um toque ai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala srnetcave,

 

Consegui utilizar o zend_tool e sobrescrevi os arquivos criados por ele pelos que me orientou e ...... FINALMENTE FUNCIONOOOOU!!! =)

Tive apenas que comentar o trecho:

;resources.layout.layout = "layout"
;resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

Pois nao sei utilizar estes recursos ainda...

Mt obrigado cara.... com crtza voltarei a importuna-los novamente com outras questões. =)

 

Se já tiverem alguma dica para iniciantes, pf me falem!!!

Comprei o livro "Zend Framework" da novatec, mas parece estar meio desatualizado (2008 - v 1.5)

 

Abs a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Léo, bom saber que funcionou.

 

qualquer coisa da um toque ai falou.

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.