我正在用f3创建模型结构,但最终我陷入困境。 我无法访问我的功能另一页。
这是错误:
致命错误:在null上调用成员函数load() [C:/UwAmp/www/test/app/models/User.php:12]
哪里错了?这样好还是不好?
-models
----Model.php
----User.php
-controllers
----Controller.php
----UserController.php
UserController.php
class UserController extends Controller {
private $_usermodal;
public function __construct(){
parent::__construct();
}
function Register(){
$this->_usermodal = new User();
$this->_usermodal->getAll();
}
}
Model.php
class Model {
private $db;
public function __construct($table){
$this->db=new DB\SQL(
'mysql:host=localhost;port=3306;dbname=database',
'root',
'root'
);
return new DB\SQL\Mapper($this->db,$table);
}
}
User.php(模特)
class User extends Model {
public function __construct(){
parent::__construct('users');
}
public function getAll(){
$x = $this->db->load('id = 1');
print_r($x);
}
}
答案 0 :(得分:1)
您可以扩展框架映射器,而不是从__constructor
(在PHP中不可能)返回映射器实例:
Model.php:
class Model extends DB\SQL\Mapper {
protected $db;
public function __construct($table) {
$this->db=new DB\SQL(
'mysql:host=localhost;port=3306;dbname=database',
'root',
'root'
);
parent::__construct($this->db,$table);
}
}
user.php的:
class User extends Model {
public function __construct() {
parent::__construct('users');
}
public function getAll() {
return $this->find('',['order'=>'id']);
}
}
现在,您可以使用常用的映射器方法访问数据库记录:
$user = new User;
$user->load(['id=?',1]);
// or
foreach ($user->find(['name LIKE ?','%John%']) as $u)
echo $u->name;
或使用您的自定义方法:
foreach ($user->getAll() as $u)
echo $u->name;
这个结构仍然可以改进,因为它为每个读取的记录创建一个新的DB\SQL
实例。您可以创建一个核心DB
服务,默认情况下会在Model
中使用它:
的index.php:
$f3->DB = function() {
if (!Registry::exists('DB')) {
$db=new DB\SQL(
'mysql:host=localhost;port=3306;dbname=database',
'root','root');
Registry::set('DB',$db);
}
return Registry::get('DB');
};
Model.php:
class Model extends DB\SQL\Mapper {
public function __construct($table,$db=NULL) {
if (!isset($db)) {
$f3=\Base::instance();
$db=$f3->DB();
}
parent::__construct($db,$table);
}
}