1

わかりました、これは私を夢中にさせています!

次のようなディレクトリ構造があります。

application
- modules
-- default
--- controllers
--- models
---- DbTable
---- Cachmapper.php
--- views

私の設定ファイルは次のようになります

[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.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules[] =

アプリケーションは動作しているようです。localhost に移動すると、正しくインデックス コントローラーに移動します。しかし、何らかの理由でモデルのロードを拒否します。

致命的なエラー: クラス 'Model_Cachmapper' が ................./application/modules/default/controllers/ に見つかりません26 行目の IndexController.php

アイデア?

ありがとう

4

4 に答える 4

3

これは、ZF 1.10.x およびおそらくそれ以前の動作バージョン (少なくともそのうちの 1 つ) です。

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(),
)));
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
/** 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();

application.ini - 関連部分

autoloadernamespaces[] = Zend_
includePaths.library = APPLICATION_PATH "/../library"

; Where will Zend_Application find the Bootstrap file
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

; Where are all the modules
resources.frontcontroller.moduledirectory = APPLICATION_PATH"/modules"
resources.modules[] = ""
; And which is the default module
resources.frontcontroller.defaultmodule = "default"

および application/Bootstrap.php で

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

/**
 * Autoloader for the "public" module
 * 
 * @return Zend_Application_Module_Autoloader
 */
public function _initPublicAutoload()
{
    $moduleLoader = new Zend_Application_Module_Autoloader(
                            array(
                                'namespace' => '',
                                'basePath' => APPLICATION_PATH . '/modules/default'
                            )
                        );

    return $moduleLoader;
}
}
于 2010-06-04T22:04:30.457 に答える
3

私は初心者の ZF ユーザーなので、これは「正しくない」かもしれませんが、この方法で DB モデルを使用しても問題はありませんでした。私のディレクトリ構造は次のようになります。

/
--/application
----/configs
----/controllers
----/forms
----/layouts
----/models
------/DbTable

私の application/public/index.php には、次のコードがあります。

...
require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Application_');

require_once 'Zend/Loader/Autoloader/Resource.php';
$resources = new Zend_Loader_Autoloader_Resource(array(
    'namespace' => 'Application',
    'basePath' => APPLICATION_PATH
));

$resources->addResourceType('form','forms','Form');
$resources->addResourceType('model','models','Model');
$resources->addResourceType('dbtable','models/DbTable','Model_DbTable');
...

私のアプリケーションの名前空間は Application です (わからない場合)。私のデータベースモデルは次のようになります (application/models/DbTable にあります:

class Application_Model_DbTable_User extends Zend_Db_Table_Abstract
{

    protected $_name = 'User';
    protected $_primary = 'username';
}

class Application_Model_DbTable_WinLossTieScore extends Zend_Db_Table_Abstract
{

    protected $_name = 'WinLossTieScore';
    protected $_primary = 'id';
...
}

また、application/configs/application.ini の関連部分:

appnamespace = "Application"

includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
于 2010-06-04T19:17:37.683 に答える
1

モデルディレクトリをincludePathsに追加します

私は持っています:

includePaths.models = APPLICATION_PATH "/models"

私はあなたのモデルがあなたのモジュールの下にあることを知っています、しかし何とかすることが可能であるはずです。たぶん、application.iniの代わりにブートストラップにあります

Att.:ロブ

こんにちはロブ、

まあ私は混乱しています。私は実際にあなたの本「ZendFrameworkInAction」を購入したからです。

また、ソースコードの「Places」アプリのブートストラップには、次のものがあります。

    set_include_path(get_include_path()
        . PATH_SEPARATOR . ROOT_DIR . '/library/'
        . PATH_SEPARATOR . ROOT_DIR . '/application/models/'
        . PATH_SEPARATOR . ROOT_DIR . '/application/forms/'
    );

    include 'Zend/Loader.php';
    Zend_Loader::registerAutoload();

ソースが古いZFバージョン用に作成されていることを知っています。現在作業しているアプリはZend_Applicationに基づいており、includePathsからmodelsフォルダーを削除すると、ローダーがモデルを見つけることができません。

Warning: include_once(Users.php) [function.include-once]: failed to open stream: No such file or directory in C:\Programmer\wamp\include\Zend\Loader.php on line 146
于 2010-06-04T19:28:08.253 に答える
1

モジュールにブートストラップクラスを追加します。そうしないと、モジュールローダーはそれを認識しません。

class Default_Bootstrap extens Zend_Application_Module_Bootstrap
{
}

そして、applications / default/Bootstrap.phpに保存します

http://akrabat.com/modulesにいくつかの詳細情報があります。

于 2010-06-05T08:00:47.227 に答える