Foros del Web » Programando para Internet » PHP » Zend »

Ayuda con Modulos en Zend Framework

Estas en el tema de Ayuda con Modulos en Zend Framework en el foro de Zend en Foros del Web. Hola buenas...estoy intentando separar mi aplicacion por modulos pero parece ser que hay algo de mala configuracion con los path, creo, me sale el siguiente ...
  #1 (permalink)  
Antiguo 30/05/2010, 12:37
 
Fecha de Ingreso: agosto-2009
Mensajes: 138
Antigüedad: 14 años, 8 meses
Puntos: 0
Ayuda con Modulos en Zend Framework

Hola buenas...estoy intentando separar mi aplicacion por modulos pero parece ser que hay algo de mala configuracion con los path, creo, me sale el siguiente error.
Resource 'default:default' not found
La estructua es la siguiente.

1 . Default
1.1 Control,
1.1.1 Auth. Aqui es donde hago el login.
Código PHP:
class Default_AuthController extends Zend_Controller_Action
{
    public function 
loginAction()
    {
        
                if(
Zend_Auth::getInstance()->hasIdentity())
                {
                    
$this->_redirect('auth/login');
                }
                
                
$request $this->getRequest();
        
               
$form = new Form_Login();

               if(
$request->isPost())
               {
                    if(
$form->isValid($this->_request->getPost()))
                    {
        
                        
$authAdapter $this->getAuthAdapter();
                        
$username    $form->getValue('username');
                        
$password    $form->getValue('password');
                        
$authAdapter->setTableName('usuarios')
                                    ->
setIdentity($username)
                                    ->
setCredential($password);
                        
$auth   Zend_Auth::getInstance();
                      
$result $auth->authenticate($authAdapter);
        
                        if(
$result->isValid())
                        {
        
                            
$identity =  $authAdapter->getResultRowObject(array('user','role'));
                            
$authStorage $auth->getStorage();
                            
$authStorage->write($identity);
                                             
                             if(
$identity->role=='invitado')
                                     
$_redirect $this->_redirect('listados/index');
                             else
                                
$_redirect $this->_redirect('visitas/index');
                
                        }
                        else {
                           
                              
$this->view->errorMessage "User wrong";
        
                        }
        
                    }
                }
                
$this->view->form $form;
    }

 } 
1.2 models
1.2.1 Acl ; Aqui estan mis permisos.

Código PHP:
class Model_Acl extends Zend_Acl
{

    public function  
__construct(Zend_Auth $auth) {

        
$this->addRole(new Zend_Acl_Role('guest'));
        
$this->addRole(new Zend_Acl_Role('invitado'));
        
$this->addRole(new Zend_Acl_Role('usuario','invitado'));
        
$this->addRole(new Zend_Acl_Role('admin'),'usuario');
        
$this->add(new Zend_Acl_Resource('default'));
        
$this->add(new Zend_Acl_Resource('default:auth','login'));
        
$this->add(new Zend_Acl_Resource('default:index','default'));
        
$this->add(new Zend_Acl_Resource('default:error','default'));
        
$this->add(new Zend_Acl_Resource('admin'));
        
$this->add(new Zend_Acl_Resource('admin:visitas','admin'));
         
$this->add(new Zend_Acl_Resource('admin:index','admin'));
        
$this->add(new Zend_Acl_Resource('listado'));
        
$this->add(new Zend_Acl_Resource('listado:listados','listado'));
        
$this->allow('invitado','default:auth','login');
        
$this->allow('invitado','default:auth','login');
        
$this->allow('invitado','default:error','error');
        
$this->deny('usuario','default:auth','login');
        
$this->allow('usuario','default:auth','logout');
        
$this->allow('usuario','default:index','index');
        
$this->allow('usuario','listado:listados',array('index','listado'));
       
$this->allow('usuario','admin:visitas',array('index','add','update'));
        
$this->allow('admin','admin:visitas',array('index','add','update','delete'));
       
    }


2.Admin
3.Listado
En mi Bootstrap. tengo.
Código PHP:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    private 
$_auth;
    private 
$_acl;
   
    protected function 
_initAutoload()
    {

        
$modelLoader = new Zend_Application_Module_Autoloader(array(
                                    
'namespace' => '',
                                    
'basePath'  => APPLICATION_PATH '/modules/default',
                                   
                                   )
                                 );
      
   
     if(
Zend_Auth::getInstance()->hasIdentity())
            
Zend_Registry::set('role',Zend_Auth::getInstance()->getStorage()->read()->role);
        else
            
Zend_Registry::set('role','guest');
    
        
$this->_auth    =   Zend_Auth::getInstance();
        
$this->_acl     =    new Model_Acl($this->_auth);
      
$controller  Zend_Controller_Front::getInstance();
      
$controller->registerPlugin(new My_Plugins_AccessCheck($this->_acl,Zend_Registry::get('role')));       

        return 
$modelLoader;
    }
    protected function 
_initViewHelpers()
    {
     
$this->bootstrap('layout');
        
$layout $this->getResource('layout');
        
$view $layout->getView();

       
$navContainerConfig = new Zend_Config_Xml(APPLICATION_PATH '/configs/navigation.xml','nav');
        
$navContainer = new Zend_Navigation($navContainerConfig); 
$view->navigation($navContainer)->setAcl($this->_acl)->setRole(Zend_Registry::get('role'));
      
    } 
Y tengo una carpeta con mis plugins en Public que es la siguiente estructura.
1 . Library
1.1 MY
1.1.1Plugins
- Accesscheck.php que es el siguiente.

Código PHP:
class My_Plugins_AccessCheck  extends Zend_Controller_Plugin_Abstract
{
    private 
$_acl   null;
    private 
$_auth null;
    public function  
__construct($acl,$auth) {
       
$this->_acl $acl;
       
$this->_auth $auth;
    }

    public function 
preDispatch(Zend_Controller_Request_Abstract $request){
     
     
$module $request->getModuleName();       
     
$resource $request->getControllerName();  
        
$module $request->getModuleName();
     
        if( 
$this->_acl->has$this->getRequest()->getActionName() ) )
            
$resource $this->getRequest()->getActionName();
        elseif( 
$this->_acl->has$this->getRequest()->getControllerName() ) )
            
$resource $this->getRequest()->getControllerName();
        elseif( 
$this->_acl->has$this->getRequest()->getModuleName() ) )
            
$resource $this->getRequest()->getModuleName();

       if ( !
$this->_acl->isAllowed(Zend_Registry::get('role'),$module.':'$resource) && $role == 'guest' )
        {
            
$request->setModuleName('default');
            
$request->setControllerName('auth');
        }
        elseif (!
$this->_acl->isAllowed(Zend_Registry::get('role'),$module.':'$resource) )
        {
            
$request->setModuleName('default');
            
$request->setControllerName('error');
            
$request->setActionName('error');
        }

    }


Y mi menu navigation esta en application, configs. navigation.xml
Código:
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <nav>
        <logout>
            <label>Logout</label>
            <module>default</module>
            <controller>auth</controller>
            <action>logout</action>
            <resource>default:auth</resource>
            <privilege>logout</privilege>
        </logout>
        <login>
            <label>Login</label>
            <module>default</module>
            <controller>auth</controller>
            <action>login</action>
            <resource>default:auth</resource>
             <privilege>login</privilege>
        </login>
       <visitas>
                <label>Visitas</label>
                <uri>#</uri>
                 <resource>admin:visitas</resource>
                 <privilege>index</privilege>
                <pages>
                    <list>
                         <label>Visitantes</label>
                         <module>admin</module>
                        <controller>visitas</controller>
                        <action>index</action>
                    </list>
                    <add>
                         <label>Add</label>
                          <module>admin</module>
                        <controller>visitas</controller>
                        <action>add</action>             
                    </add>
                     <update>
                         <label>Update</label>
                         <module>admin</module>
                        <controller>visitas</controller>
                        <action>update</action>                 
                    </update>
                     <delete>
                         <label>Delete</label>
                         <module>admin</module>
                        <controller>visitas</controller>
                        <action>delete</action>
                    </delete>
                </pages>
        </visitas>
       <listados>
                <label>Listados</label>
                <uri>#</uri>
                <resource>listado:listados</resource>
                 <privilege>index</privilege>
                <pages>
                    <list>
                         <label>Listado</label>
                         <module>listado</module>
                        <controller>listados</controller>
                        <action>listado</action>
                        <!--<resource>listados:listado</resource>-->
                    </list>
                </pages>
        </listados>

    </nav>

</config>
La verdad que llevo probando diferente manera pero se me escapa algo alguien podria decirme que puede ser.
El error sale en el AccesCheck , no se porque sale. Resource 'default:default' not found
Un saludo.
  #2 (permalink)  
Antiguo 30/05/2010, 13:57
Avatar de nohumans  
Fecha de Ingreso: mayo-2010
Ubicación: España
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con Modulos en Zend Framework

Hi!

Ami me gusta mas la siguiente configuracion, modifica le bootstrap
Código PHP:
Ver original
  1. $modelLoader = new Zend_Application_Module_Autoloader(array(
  2.                                     'namespace' => 'Default',
  3.                                     'basePath'  => APPLICATION_PATH . '/modules/default',
  4.                                    
  5.                                    )
  6.                                  );

y pruaba quitar el "Default_" de los controladores del modulo "Default", mira el el plugin si cambia
el $request->getControllerName();, no entiendo porque te devuelve 'Default" cuando debewria ser 'index'.

Suerte
  #3 (permalink)  
Antiguo 30/05/2010, 14:10
 
Fecha de Ingreso: agosto-2009
Mensajes: 138
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ayuda con Modulos en Zend Framework

Hola he hecho los cambios que me has dicho y ahora haciendo un echo del resource devuelve.

Resource:authResource:error
Y suelta este error.

Zend_Controller_Dispatcher_Exception: Invalid controller class ("Default_ErrorController")

Un saludo
  #4 (permalink)  
Antiguo 31/05/2010, 09:07
 
Fecha de Ingreso: abril-2010
Ubicación: Lima-Peru
Mensajes: 94
Antigüedad: 14 años
Puntos: 2
Respuesta: Ayuda con Modulos en Zend Framework

Cita:
Iniciado por niewpendejo Ver Mensaje
Hola he hecho los cambios que me has dicho y ahora haciendo un echo del resource devuelve.

Resource:authResource:error
Y suelta este error.

Zend_Controller_Dispatcher_Exception: Invalid controller class ("Default_ErrorController")

Un saludo
hola:

Tu archivo application.ini como lo tienes? puedes mostrarlo?

revisa ese arvhivo

saludos,
  #5 (permalink)  
Antiguo 31/05/2010, 09:18
Avatar de nohumans  
Fecha de Ingreso: mayo-2010
Ubicación: España
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con Modulos en Zend Framework

Hola!
Acertar con tu problema sin poder "debujearlo" ni tenerlo todo, resulta un poco difícil, sin ser yo ningún guru del ZF, se me antoja tu código algo raro, deberías repasar el proceso "Dispach", el predispach() del plugin se ejecuta antes que el controler con lo cual puedes entrar en un bucle sin fin.
Según veo, lo común es controlar el proceso de privilegios a nivel de Controlador, no a tan bajo nivel de un Plugin yo por ejemplo tengo estas clases :

Código PHP:
Ver original
  1. class Valclip_Controller_Action extends Zend_Controller_Action
  2.          class Valclip_Controller_Admin extends Valclip_Controller_Action
  3.          class Valclip_Controller_Ajax extends Valclip_Controller_Action
  4.                       abstract class Valclip_Controller_Editor extends Valclip_Controller_Admin

Dentro de Action realizo las comprobaciones (en seu do codigo)

Código PHP:
Ver original
  1. class Valclip_Controller_Action extends Zend_Controller_Action
  2. {
  3.   public function init ()
  4.     {
  5.         .......
  6.         $service = Valclip_Service_ServiceAbstract::getService(
  7.             'Default_Service_Users'
  8.         );
  9.         $this->_actualUser = $service->getCurrentUser();
  10.         // Usuario Actual
  11.         if (Zend_Auth::getInstance()->hasIdentity()) {
  12.             $this->view->user = $this->_actualUser;
  13.         }
  14.         $acl = $service->getAcl();
  15.         $this->view->navigation()
  16.             ->setAcl($acl)
  17.             ->setRole($this->_actualUser->getRoleId());
  18.      .....
  19.  
  20.     }
  21.  
  22. }


Posteriormente heredando de una clase u otra todo funciona. Si estas interesado en este sistema, me lo dices y te mando por un privado una URL de un tipo Alemán buenísimo donde puedes bajarte toda su web y tomar ese código como punto de partida de cualquier proyecto con las necesidades básicas resueltas. (parece ser que a los administradores de este foro les sienta mal que se pongan links ...)


Saludos
  #6 (permalink)  
Antiguo 31/05/2010, 09:41
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Ayuda con Modulos en Zend Framework

El primer problema de default:default es porque no tienes ese resource y tu plugin lo que hace es buscar el resource module:controller:action, en ese caso puedes hacer dos cosas:

1.- Si ves default en el module/controller hacer un if y no pasarlo por el isAllowed.
2.- Agregar el resource de default:default.

Saludos.
  #7 (permalink)  
Antiguo 01/06/2010, 06:28
 
Fecha de Ingreso: agosto-2009
Mensajes: 138
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ayuda con Modulos en Zend Framework

Buenos dias
Tengo los siguientes warning y errores:

Warning: include .application\config/production.config.php [function.include]: failed to open stream:

Warning: array_merge_recursive() [function.array-merge-recursive]: Argument #2 is not an array.

Zend_Application_Exception: Invalid configuration file provided;

He cambiado la estructura de mi aplicacion es la siguiente.

application:
-config.php
tengo.
Código PHP:
<?php

return array_merge_recursive(array(
    
'includePaths' => array(
        
'library' => APPLICATION_PATH '/library'
    
),
    
'bootstrap' => array(
        
'path'  => APPLICATION_PATH '/Bootstrap.php',
        
'class' => 'Bootstrap' 
    
),
    
'autoloaderNamespaces' => array(
        
'App_'
    
),
    
'resources'   => array(
        
'frontController' => array(
            
'moduleDirectory' => APPLICATION_PATH '/modules'
        
),
        
'modules' => array(),
        
'router' => array(
            
'routes' => include dirname(__FILE__) . '/routes.config.php' 
        
),
        
    )
), include 
dirname(__FILE__) . '/' APPLICATION_ENV '.config.php');
-development.config.php
-production.config.php
-routes.config

modules
-default

Bootstrap.php
Hay los siguiente.

Código PHP:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function 
_initTimezone()
    {
        
date_default_timezone_set('Europe/Madrid');
    }
    protected function 
_initDefaultResourceLoader()
    {
        
$resourceLoader = new Zend_Application_Module_Autoloader(array(
            
'namespace' => 'Default',
            
'basePath'  => dirname(__FILE__) . '/modules/default',
        ));

        
    }


-public
-index.php
esta.
Código PHP:
<?php
// Define the application path
define('APPLICATION_PATH'realpath(dirname(__FILE__) . '/../application'));

// Define the application environment
if (isset($_SERVER['environment']) && $_SERVER['environment'] === 'development') {
    
define('APPLICATION_ENV''development');
} else {
    
define('APPLICATION_ENV''production');
}

// Set include path to ZF library
set_include_path(implode(PATH_SEPARATOR, array(
    
dirname(APPLICATION_PATH) . '/library',
    
get_include_path()
)));

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

$application = new Zend_Application(
    
APPLICATION_ENV,
    
APPLICATION_PATH '/config/config.php'
);

$application->bootstrap()
            ->
run();
-.htaccess
es:
Código PHP:
RewriteEngine On
RewriteCond 
%{REQUEST_FILENAME} -[OR]
RewriteCond %{REQUEST_FILENAME} -[OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule 
^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L
He probado de varias maneras pero no consigo dar con la configuracion correcta,

Alguna ayuda, un saludo
  #8 (permalink)  
Antiguo 01/06/2010, 08:32
 
Fecha de Ingreso: abril-2010
Ubicación: Lima-Peru
Mensajes: 94
Antigüedad: 14 años
Puntos: 2
Respuesta: Ayuda con Modulos en Zend Framework

Hola, mira yo nos soy un guru y nada de eso en zend de hecho estoy en proceso de aprendizaje pero t recomiendo que dentro de application/configs, pongas tu application.ini. Yo lo tengo algo asi:

Código:
[production]

resources.modules [] = ""
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
includePaths.library = APPLICATION_PATH "/../library"



bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"


resources.layout.layoutpath = APPLICATION_PATH "/layouts"
resources.layout.layout = layout

;Modules config
default.resources.layout.layoutPath = APPLICATION_PATH "/modules/default/layouts"
default.resources.layout.layout = layout
admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts"
admin.resources.layout.layout = layout

resources.db.adapter = PDO_mysql
resources.db.params.host = localhost
resources.db.params.username = user	
resources.db.params.password = passs
resources.db.params.dbname = name_database

[staging : production]

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

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
mi bootstrap.php:
Código PHP:
<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    private 
$_acl null;
    
    protected function 
_initAutoload() {
        
$modelLoader = new Zend_Application_Module_Autoloader(array(
                        
'namespace' => '',
                        
'basePath' => APPLICATION_PATH.'/modules/default'));
        
        if(
Zend_Auth::getInstance()->hasIdentity()) {
            
Zend_Registry::set('level'Zend_Auth::getInstance()->getStorage()->read()->level);
        } else {
            
Zend_Registry::set('level''guests');
        }
        
        
$this->_acl = new Model_ControlAcl;
        
$this->_auth Zend_Auth::getInstance();
        
        
$fc Zend_Controller_Front::getInstance();
        
$fc->registerPlugin(new Plugin_AccessCheck($this->_acl));
        
        return 
$modelLoader;
    }
    
    function 
_initViewHelpers() {
        
$this->bootstrap('layout');
        
$layout $this->getResource('layout');
        
$view $layout->getView();
        
        
$view->setHelperPath(APPLICATION_PATH.'/helpers''');
        
        
$view->doctype('HTML4_STRICT');
        
$view->headMeta()->appendHttpEquiv('Content-type''text/html;charset=utf-8')
                        ->
appendName('description''Using view helpers in Zend_view');
        
        
$view->headTitle()->setSeparator(' - ')
             ->
headTitle('Titulo');
        
        
$navContainerConfig = new Zend_Config_Xml(APPLICATION_PATH '/configs/navigation.xml''nav');
        
$navContainer = new Zend_Navigation($navContainerConfig);
    
        
$view->navigation($navContainer)->setAcl($this->_acl)->setRole(Zend_Registry::get('level'));
        
        
$view = new Zend_View();
        
$view->addHelperPath("ZendX/JQuery/View/Helper""ZendX_JQuery_View_Helper");
        
/*$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
        $viewRenderer->setView($view);
        Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);*/
    
}
    
    protected function 
_initLocale(){

    
$locale = new Zend_Locale();
    
$locale->setLocale('es_ES');
    
Zend_Registry::set('Zend_Locale'$locale); // la registramos para su futuro uso en el resto de la aplicación
}

protected function 
_initPlugins(){
        
$this->bootstrap('frontController');

        
$plugin = new My_LayoutPlugin();
        
$this->frontController->registerPlugin($plugin);
        
//$this->frontController->throwExceptions(true);
    
}
    

}
Trata de ordenar a lo que Zend te recomienda y ya estas a un paso de que logres tu próposito. Sigue adelante.

Saludos,
  #9 (permalink)  
Antiguo 01/06/2010, 11:08
 
Fecha de Ingreso: agosto-2009
Mensajes: 138
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ayuda con Modulos en Zend Framework

Muchas gracias por la respuesta, pero me gustaria seguir probando creando diferentes archivos de configuracion

Alguna ayuda

Etiquetas: framework, modulos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:36.