我是Slim Framework的新手,我正在尝试构建一个与PDO连接的简单webapp到MySQL数据库(以及Twig / Bootstrap UI)。
我尝试从名为" PagesController"的控制器访问数据库。 :
#include <shlobj.h>
TCHAR szFolderPath[MAX_PATH];
if (SHGetSpecialFolderPath(NULL, szFolderPath, CSIDL_LOCAL_APPDATA, FALSE))
{
cout << szFolderPath << endl;
}
但我只能从index.php调用我的PDO对象,或者从名为&#34的父抽象类中调用;控制器&#34; :
class PagesController extends Controller {
public function getLieu(RequestInterface $request, ResponseInterface $response) {
// this two lines crash :
$lieux = $this->$database->query('SELECT * FROM Lieu');
var_dump($lieux);
$this->render($response, 'pages/lieu.twig');
}
}
这里有人可以帮助我吗?
谢谢!
答案 0 :(得分:0)
使database
属性受保护。
另外:$this->$database
错了。正确是$this->database
。
请注意,您的课程设计基于服务定位器反模式。例如。您将整个容器传递给控制器,以便从中获取数据库对象。不要这样做!仅注入类所需的资源。例如。您的控制器应该只接收数据库实例作为依赖项。请查看this,this,this,尤其是this。
您实际上并不想要注入数据库实例。你应该把它注入适当的data mappers。并且数据映射器应该注入控制器。原则上,从持久层访问数据的过程是更多MVC组件的责任。阅读this和this。此系列涉及域对象,数据库适配器,数据映射器,存储库和服务的代码示例:Part 1,Part 2,Part 3和Part 4。
注意:在Slim中你可以使用Eloquent ORM。请参阅this。
建议:您应该在开始(使用)MVC之前学习OOP并熟悉SOLID principles。
class Controller {
private $container;
protected $database;
public function __construct($container) {
$this->container = $container;
$this->database = $this->container->get('db');
$lieux = $this->database->query('SELECT * FROM Lieu');
var_dump($lieux);
}
public function render(ResponseInterface $response, $file) {
$this->container->view->render($response, $file);
}
}
class PagesController extends Controller {
public function getLieu(RequestInterface $request, ResponseInterface $response) {
$lieux = $this->database->query('SELECT * FROM Lieu');
var_dump($lieux);
$this->render($response, 'pages/lieu.twig');
}
}