他のすべてのコントローラーを拡張する抽象ベースコントローラーを構築しようとしています。これまでのところ、私は次のようなものを持っています:
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()を呼び出せないと思った。