我正在尝试创建一个基本的MVC"框架",但在将数据从模型获取到视图时遇到了一些问题。
class Controller
{
public $_database = null;
public $_model = null;
public function __construct()
{
$this->connect();
}
private function connect()
{
$options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING);
$this->_database = new PDO(DB_TYPE . ':host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET, DB_USER, DB_PASS, $options);
}
public function model($model)
{
require_once '../app/models/'. $model .'.php';
return new $model($this->_database);
}
public function view($view)
{
require '../app/views/'. $view .'.php';
}
}
class Contact extends Controller
{
public function index()
{
$name = 'David';
$this->view('contact/index');
}
首先,我的视图函数(在Controller.php中)无法正常工作:
通过"contact/index.php"视图中的echo$name,我得到了以下错误:未定义变量:name
如果我只是调用require'/app/views/contact/index.php'在contact控制器中,index方法工作得很好,但通过从controller调用view方法,我得到了这个错误。
第二个问题是我无法正确地从模型中获取数据
class User
{
public $_database;
public function __construct($database)
{
try
{
$this->_database = $database;
}
catch (PDOException $e)
{
exit('Database connection could not be established.');
}
}
public function select()
{
$stmt = "SELECT * FROM users WHERE ID = :id";
$query = $this->_database->prepare($stmt);
$query->execute(array(':id' => 1));
return $query->fetchAll(PDO::FETCH_OBJ);
}
}
通过调用$name=$this->model("User")->在Contact Controller中选择,并在"Contact/index"视图中调用echo$name->Username,我得到了以下错误:试图获取非objec的属性
我使用PDO::FETCH_OBJ返回一个对象而不是一个数组,但仍然不起作用。
您的选择返回所有用户的数组。您使用查询将结果简化为一个结果,但PDO并不知道这一点。
请改用$query->fetch(PDO::FETCH_OBJ)
。
您的视图是在Controller::view()方法中加载的(必需)。它只能访问变量,此方法本身可以访问。因此无法到达$name
。
你可以这样更改你的查看方法:
public function view($view, array $parameters = [])
{
foreach ($parameters as $varname => $value) {
$$varname = $value;
}
require '../app/views/'. $view .'.php';
}
现在你可以这样使用它:
public function index()
{
$this->view('contact/index', ['name'=>'David']);
}
在Controller
中为视图中要访问的变量创建一个set
函数,例如(取自CakePHP):
public function set($one, $two = null) {
if (is_array($one)) {
if (is_array($two)) {
$data = array_combine($one, $two);
} else {
$data = $one;
}
}
else {
$data = array($one => $two);
}
$this->viewVars = $data + $this->viewVars;
}
现在,如果希望$variable
在视图中可访问(值为value
),则可以使用$this->set('variable', 'value')
。
然后,在渲染视图之前,使用extract($this->viewVars);
,就可以在视图中使用$variable
。