3

オートローダーを含む小さな MVC フレームワークで PHP ActiveRecord を使用しています。私のコントローラーでは、たとえばモデル Pub::find(64) にアクセスします。

私の問題は、Pub::find(64) がコントローラーの名前空間を継承していて、エラーが発生することです。

Fatal error: Class 'App\Controllers\Pub' not found in /home/i554246/public_html/mvc/App/Controllers/Index.php on line 27

Pub はモジュール名です。ファイルは正常に含まれます。\Pub::find(64) を追加することでこの問題を解決できますが、これはプロジェクトの新しい人にとっては直感的ではありません。

その行を変更せずに、Pub::find(64) の名前空間の追加を停止する方法はありますか?

インデックス コントローラー

namespace App\Controllers;

class Index extends \Core\Controller
{
    protected
        $title = 'Home'
        ;

    /**
     * Default action
     */
    public function index()
    {
        // Pass the data to the view to display it
        $this->view->set('testdb', \Pub::find(64));

    }
}

App.php

/**
 * Class autoloader
 * @param $className
 * @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
 */
public function autoload($className)
{
    preg_match('/(^.+\\\)?([^\\\]+)$/', ltrim($className, '\\'), $match);

    //Build namespace Autoloading
    $file = str_replace('\\', '/', $match[1]) . str_replace('_', '/', $match[2]) . '.php';

    //Build Model path
    $model = 'App/Models/' . $match[2] . '.php';

    if ( is_file($file) ) {
        require $file;
    }elseif ( is_file($model) ) {
        require $model;
    }

}

モデル/Pub.php

class Pub extends ActiveRecord\Model
{
}
4

1 に答える 1

1

名前空間を理解していないようです。

namespace を使用しているためApp\Controllers、グローバル名前空間は で示され\ます。したがって、完全修飾名を使用したくない場合は\Pub、use 宣言を名前空間の下に配置する必要があります。

namespace App\Controllers;
use Pub;

PS: モデルも名前空間に配置することをお勧めします。

于 2012-07-04T23:16:01.997 に答える