构建模型结构 - 无脂肪框架

时间:2017-11-19 20:55:18

标签: php fat-free-framework

我正在用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);
    }
}

1 个答案:

答案 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);
    }

}