构建模型结构 - Fat Free Framework

build model structure - Fat Free Framework

我正在使用 f3 创建模型结构,但最后我卡住了。 我无法在另一个页面访问我的功能。

这是错误:

Fatal error: Call to a member function load() on null [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);
    }
}

您可以扩展框架映射器,而不是从 __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);
    }

}