Ir para conteúdo

POWERED BY:

Arquivado

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

Fernando Nazario

Problema com Controller do Zend 1.6

Recommended Posts

Boa tarde a tdos,

 

Estou desesperado, estou a uma semana com um problema nos modulos da minha aplicação.

Sou iniciante com o Zend Framework, ja procurei sobre o problema no google e no livro do Flavio tbm, mas não encontrei nada...

 

É o seguinte:

 

Tenho uma aplicação com a seguinte estrutura

 

Imagem Postada

 

 

quando eu executo com a URL meusite.com.br/public/login ele aparece a tela de login. Mas quando eu executo meusite.com.br/public/login/acessar ele da o seguinte erro:

 

The following error occurred:

exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (acessar)' in /home/meusite/public_html/sistema2/library/Zend/Controller/Dispatcher/Standard.php:241 Stack trace: #0 /home/meusite/public_html/sistema2/library/Zend/Controller/Front.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 /home/meusite/public_html/sistema2/application/bootstrap.php(58): Zend_Controller_Front->dispatch() #2 /home/meusite/public_html/sistema2/public/index.php(8): require('/home/meusite/...') #3 {main}

 

Não sei nem por onde começar a procurar, pois ja olhei da documentação no site da Zend e não encontro um motivo. Se alguem puder me ajudar estarei mto grato!

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

dentro do controller login você tem que ter o metodo acessar

 

public function acessarAction()
{

}

 

e se você nao for usar view você precisa fazer isso senao vai dar outro erro, ja que você nao tem o acessar.phtml

 

 

public function acessarAction()
{
$this->_helper->removeHelper('viewRenderer');
}

 

e se tiver usando layout e nao for usar no acessar, mesma coisa tem que desativar:

 

$this->_helper->layout->disableLayout();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta Fabyo.

 

Então, eu já tenho esse metodo acessar e já havia setado que ele não tera um view, mas o erro persiste.

 

Esse é meu

 

bootstrap.php

<?php
/**
 * Zend Framework project
 * 
 * @author  Fernando Nazario
 * @version 2.0
 */
set_include_path('.' . PATH_SEPARATOR . '../library' .
					   PATH_SEPARATOR . 'default/models/' .
					   PATH_SEPARATOR . 'login/models/' .
					   PATH_SEPARATOR . get_include_path());
					   
require_once 'Initializer.php';
require_once "Zend/Loader.php"; 

// Set up autoload.
Zend_Loader::registerAutoload(); 

Zend_Loader::loadClass('Zend_Registry');
Zend_Loader::loadClass('Zend_Config_Ini');
Zend_Loader::loadClass('Zend_Db');
Zend_Loader::loadClass('Zend_Db_Table');
Zend_Loader::loadClass('Zend_Filter_Input');
Zend_Loader::loadClass('Zend_Session');
Zend_Loader::loadClass('Zend_Session_Namespace');
Zend_Loader::loadClass('Zend_Controller_Request_Http');
Zend_Loader::loadClass('Zend_Mail_Storage_Pop3');
Zend_Loader::loadClass('Zend_Controller_Router_Route');

$view = new Zend_View();
$view->setEncoding('UTF-8');
/** registra na memoria a variavel que indica a view */
Zend_Registry::set("view", $view);

/** Registra os objetos na memoria */
Zend_Registry::set("requestHttp", new Zend_Controller_Request_Http());
Zend_Registry::set("post", new Zend_Filter_Input(NULL, NULL, $_POST));
Zend_Registry::set("get", new Zend_Filter_Input(NULL, NULL, $_GET));

/** Inicia a sessao global */
Zend_Session::start();
Zend_Registry::set("session", new Zend_Session_Namespace());

// prepara o front controller. 
$frontController = Zend_Controller_Front::getInstance(); 
$frontController->registerPlugin(new Initializer('development'));

$config = new Zend_Config_Ini('../application/config.ini', 'database');
Zend_Registry::set('config', $config);

$db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
Zend_Db_Table_Abstract::setDefaultAdapter($db);
Zend_Registry::set('db', $db);

// Dispatch the request using the front controller. 
$frontController->dispatch();

 

O meu IndexController.php esta assim:

<?php

require_once "Zend/Controller/Action.php";

class Login_IndexController extends Zend_Controller_Action {

	public function indexAction() {
		
	}
	public function acessarAction(){
		$this->_helper->layout->disableLayout(); 
	}

}

Se puder me ajudar mto obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putz Fabyo, eu consegui com a sua dica, mas a url ficou assim:

 

http://intranet/sistema_dev/public/login/

 

Essa URL acima redireciona para a tela de login. Mas para chamar o metodo acessar eu tenho que digitar isso:

 

http://intranet/sistema_dev/public/login/index/acessar

 

Duas perguntas:

 

Por que eu tenho que colocar o index?

E tem como eu tirar esse index?

 

 

Mto Obrigado pela ajuda!

 

Abra!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de focar no problema vou te dar umas dicas

 

quando você usa

 

Zend_Loader::registerAutoload();

 

é exatamente para nao ter que usar manualmente:

 

Zend_Loader::loadClass(...)

 

nao precisa usar isso no bootstrap.php

 

$view = new Zend_View();

$view->setEncoding('UTF-8');

/** registra na memoria a variavel que indica a view */

Zend_Registry::set("view", $view);

 

/** Registra os objetos na memoria */

Zend_Registry::set("requestHttp", new Zend_Controller_Request_Http());

Zend_Registry::set("post", new Zend_Filter_Input(NULL, NULL, $_POST));

Zend_Registry::set("get", new Zend_Filter_Input(NULL, NULL, $_GET));

 

/** Inicia a sessao global */

Zend_Session::start();

Zend_Registry::set("session", new Zend_Session_Namespace());

 

nao precisa usar isso no IndexController.php

 

require_once "Zend/Controller/Action.php";

 

outra coisa arrume o nome do arquivo

 

Class = LoginController

arquivo = LoginController.php

 

sempre deixe o mesmo nome na classe e no arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de focar no problema vou te dar umas dicas

 

quando você usa

 

Zend_Loader::registerAutoload();

 

é exatamente para nao ter que usar manualmente:

 

Zend_Loader::loadClass(...)

 

nao precisa usar isso no bootstrap.php

 

$view = new Zend_View();

$view->setEncoding('UTF-8');

/** registra na memoria a variavel que indica a view */

Zend_Registry::set("view", $view);

 

/** Registra os objetos na memoria */

Zend_Registry::set("requestHttp", new Zend_Controller_Request_Http());

Zend_Registry::set("post", new Zend_Filter_Input(NULL, NULL, $_POST));

Zend_Registry::set("get", new Zend_Filter_Input(NULL, NULL, $_GET));

 

/** Inicia a sessao global */

Zend_Session::start();

Zend_Registry::set("session", new Zend_Session_Namespace());

 

nao precisa usar isso no IndexController.php

 

require_once "Zend/Controller/Action.php";

 

outra coisa arrume o nome do arquivo

 

Class = LoginController

arquivo = LoginController.php

 

sempre deixe o mesmo nome na classe e no arquivo.

 

OBS: Baixe o Zend 1.7.1

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza Fabyo, fiz as alterações que você falou.

 

Mas quando eu nomeio o arquivo para LoginController.php da e acesso http://intranet/sistema_dev/public/login/index/acessar da o seguinte erro:

 

 

 

The following error occurred:

exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (index)' in /home/gtemailm/public_html/sistema2/library/Zend/Controller/Dispatcher/Standard.php:241 Stack trace: #0 /home/gtemailm/public_html/sistema2/library/Zend/Controller/Front.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 /home/gtemailm/public_html/sistema2/application/bootstrap.php(56): Zend_Controller_Front->dispatch() #2 /home/gtemailm/public_html/sistema2/public/index.php(8): require('/home/gtemailm/...') #3 {main}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora eu consegui fazer funcionar, mas ainda restam as questoes..

 

Eu tenho estrutura mostrada no topo da pagina, dentro da pasta application eu tenho as pastas com o nome dos modulos do sistema, e dentro de cada pasta eu tenho as pastas controller, models e views de cada modulo do sistema.

 

Dentro da pasta controller de cada modulo eu tenho um arquivo chamado IndexController.php e uma classe chamada Modulo1_IndexController extends Zend_Controller_Action

 

Eu vi em varios lugares, e o proprio Fabyo citou acima, para eu renomear o arquivo e a classe para o nome do modulo como segue

 

Modulo1Controller.php contendo a classe Modulo1Controller extends Zend_Controller_Action

 

Mas quando eu faço isso da o seguinte erro:

 

The following error occurred:

exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (index)' in /home/gtemailm/public_html/sistema2/library/Zend/Controller/Dispatcher/Standard.php:241 Stack trace: #0 /home/gtemailm/public_html/sistema2/library/Zend/Controller/Front.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 /home/gtemailm/public_html/sistema2/application/bootstrap.php(36): Zend_Controller_Front->dispatch() #2 /home/gtemailm/public_html/sistema2/public/index.php(8): require('/home/gtemailm/...') #3 {main}

 

Ele fala que não encontrou um controller...

 

O que eu faço?????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas ele tem:

 

<?php

class LoginController extends Zend_Controller_Action {

	public function indexAction() {
		//$this->_helper->removeHelper('viewRenderer');
	}
	public function acessarAction(){
		$this->_helper->removeHelper('viewRenderer');
		$this->_helper->layout->disableLayout(); 
		echo "alert('Agora sim!');"; 
	}

}

acessa ai: http://www.gtemailmarketing.com.br/sistema2/public/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se quiser me mande seu projeto zipado para meu email que eu corrigo e te mando de volta

 

como você ta aprendendo deve ter alguns detalhes que você deixou passar, e outras coisas que pode ser melhorada.

 

assim ja testo direito e debug, fica mais facil achar o problema

 

fabyo.php@gmail.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabyão,

 

Já enviei o e-mail.

 

Se der pra você fazer um "relatorio" pra mim. Do que estava errado, o que é melhor e tal... Até pra colocar aqui no forum, pois eu pesquisei mto antes de postar aqui no imasters e não achei nada!

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao olhando seu sistema eu percebi uns erros e outros detalhes

 

bom começando do jeito que você faz nao ta errado, mas eu acho desnecessario essa volta toda, pra mim besteira.

 

index.php:

 

require '../application/bootstrap.php';

 

no index você chama o bootstrap.php

 

no bootstrap.php

 

você registra isso desnecessariamente

Zend_Registry::set("requestHttp", new Zend_Controller_Request_Http());

 

você chama o Initializer.php

 

tem um monte de requires inuteis e desnecessarios.

 

você estancia o Zend_Controller_Front::getInstance(); 2 vezes uma no bootstrap e outra no Initializer

 

você deixa os metodos de conexao no bootstrap, apesar da conexao do Zend ser inteligente ao ponto de conectar só na hora do uso, mas prefiro de ter ela proximo as chamadas de uso, e outra coisa conexao com o banco é trabalho pra model

 

você criou e usa o Zend_View_Helper_BaseUrl sem necessidade nenhuma

 

 

eu recomendo você baixar meu exemplo de login só pra você começar a entender melhor e ver como funciona os plugins

 

outra coisa vi tbm que você esta programando na View, e a ideia do MVC é exatamente o contrario, é tudo separado

a view nao tem que ter programação só saida de dados, nao tem que estanciar nada na view.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre a view eu só estou deixando assim pra conseguir fazer a estrutura, depois disso eu vou mudar.

 

Agora sobre a estrutura do bootstrap, estou usando da forma que o Zend Studio usa.

 

E fiz algumas configurações do livro Zend Framework Desenvolvendo em PHP5 orientado a objetos com MVC do Flavio Gomes Lisboa

 

 

Enviei outro email pra você Fabyo!

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.