0

他のすべてのコントローラーを拡張する抽象ベースコントローラーを構築しようとしています。これまでのところ、私は次のようなものを持っています:

    abstract class BaseController {

     protected $view;
     protected $user;

     public function __construct() {
       $this->view = new View; //So a view is accessible to subclasses via $this->view->set();
       $this->user = new User; //So I can check $this->user->hasPermission('is_admin');
     }
     abstract function index();

    }

class UserController extends BaseController {

  public function index() {}

  public function login() {

  if($this->user->isLoggedin()) {
   redirect to my account
  }
  else {
      $this->view->set('page_title', "User Login");
      $this->view->set('sidebar', $sidebar); //contains sidebar HTML
      $this->view->set('content', $content); //build main page HTML
      $this->view->render();

}
}
}

私が得る問題は、次のようなエラーが発生することです。

Call to a member function set() on a non-object in C:\xampp\htdocs\program\core\controllers\admin.controller.php on line 44

$userプロパティと$viewsプロパティをメインコントローラー(つまりUserController)に配置すると、すべてが正常に機能します。ただし、これらのオブジェクトを(ベースコントローラーで)一度だけセットアップしたいので$this->view = new View;、すべてのコントローラーを追加する必要はありません。

修正済み:コンストラクターをオーバーライドし、抽象クラスでparent :: __construct()を呼び出せないと思った。

4

2 に答える 2

0

あなたがやろうとしていることはうまくいくはずです。でコンストラクターを隠していないことを確認してくださいUserController。(つまり、コンストラクターがある場合は、その親コン​​ストラクターを呼び出す必要があります。)

それ以外の場合は、デバッグを行って、どこ$this->viewがリセットされているかを確認します。

于 2012-04-28T17:22:38.947 に答える
0

あなたのコードは私のために働きます。__construct()でメソッドをオーバーライドしているか、オブジェクト以外のものでフィールドをUserControllerオーバーライドしています。viewView

このフォームにあるものは機能します。

于 2012-04-28T17:29:03.610 に答える