zend framework model inclusion path configured per

2019-09-15 17:19发布

问题:

        Warning: include_once(Application/Model/Hiring.php): failed to open stream: 
No such file or directory in /var/www/hiring/library/Zend/Loader.php on line 146

in the inclusion path

Warning: include_once(): Failed opening 'Application/Model/Hiring.php' for inclusion 
(include_path='/var/www/hiring/application/../library:/var/www/hiring/library:./application
/models/:./application/controllers/:./application/views/scripts/:.:/usr/share/php:/usr/local
/ZendFramework/library') in /var/www/hiring/library/Zend/Loader.php on line 146

and my index file is

<?php

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

// define root path
defined('ROOT_PATH') || define('ROOT_PATH', realpath(dirname(__FILE__) . '/'));

// 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(realpath(dirname(__FILE__) . '/library')
. PATH_SEPARATOR . './application/models/'
. PATH_SEPARATOR . './application/controllers/'
. PATH_SEPARATOR . './application/views/scripts/'
. PATH_SEPARATOR . get_include_path());

require_once 'Zend/Application.php';
require_once 'Zend/Loader/Autoloader.php';
/** Zend_Application */


$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('hiring');
$loader->setFallbackAutoloader(true);

Zend_Loader::loadClass('Zend_Controller_Front');
Zend_Loader::loadClass('Zend_Config_Ini');
Zend_Loader::loadClass('Zend_Registry');
Zend_Loader::loadClass('Zend_Db');
Zend_Loader::loadClass('Zend_Db_Table');
Zend_Loader::loadClass('Zend_Db_Statement');
//Zend_Loader::loadClass('Zend_Mail_Transport_Smtp');
//Zend_Loader::loadClass('Zend_Mail_Transport_Sendmail');
//Zend_Loader::loadClass('Zend_Mail');
Zend_Loader::loadClass('Zend_Session_Namespace');
Zend_Loader::loadClass('Zend_Db_Adapter_Pdo_Pgsql');
//Zend_Loader::loadClass('Zend_Date');
Zend_Loader::loadClass('Zend_Log');


// setup controller
$frontController = Zend_Controller_Front::getInstance();
$frontController->throwExceptions(false);
$frontController->setBaseUrl('http://hiring.local');
$frontController->setControllerDirectory('/application/controllers');

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);


$application->bootstrap()->run();

why iam getting this error i looked into loader.php at line 146 at that line there is

include_once($filename) so the error is originating from there

回答1:

There are quite a few problems here:

  • application/models, application/controllers and application/views/scripts should not be on the include path.
  • $loader->registerNamespace('hiring'); should probably be $loader->registerNamespace('Hiring_'); (although there's no sign in the code sample you've included that you are using this namespace).
  • $loader->setFallbackAutoloader(true); is probably not needed (there's no sign in the code sample you've included that you need this).
  • All of the Zend_Loader::loadClass lines should be removed. The whole point of an autoloader is that you don't need to then require in or load classes yourself
  • At least the front controller configuration should be moved to your bootstrap class

But none of these things will affect the problem you are reporting. The standard autoloader setup will only load classes whose name can be mapped directly to the file system (by converting underscores to slashes in the path, e.g. the class Zend_Db_Table would live at library/Zend/Db/Table.php). The class Application_Model_Hiring does not fit this model, if you want to use this naming scheme as well you need to also setup a resource autoloader, which maps just the last part of the class name to some pre-defined sub-folders within application/.

Add the following method to your bootstrap class:

protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->registerNamespace('Hiring_');

    $applicationResourceAutoloader = new Zend_Loader_Autoloader_Resource(array(
        'basePath' => APPLICATION_PATH,
        'namespace' => 'Application'
    ));
    $autoloader->pushAutoloader($applicationResourceAutoloader);

    return $autoloader;
}

This setups up the standard autoloader ($autoloader = Zend_Loader_Autoloader::getInstance();), which will autoload the Zend Framework classes. It then registers a namespace 'Hiring', which you only need if you are including classes that start with this name in your library folder.

It then creates a separate resource autoloader with the namespace 'Application', which will load classes from the application folder, including models. Assuming the class Application_Model_Hiring is defined at application/models/Hiring.php it should then work.

More info at http://framework.zend.com/manual/1.12/en/zend.loader.autoloader-resource.html