【问题标题】:Access database from the parent class从父类访问数据库
【发布时间】:2018-08-24 21:19:36
【问题描述】:

我是 Slim 框架的新手,我正在尝试构建一个简单的 web 应用程序,通过 PDO 连接到 MySQL 数据库(以及 Twig/Bootstrap UI)。

我尝试从名为“PagesController”的控制器访问数据库:

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');
    }
}

但我只能从 index.php 或 从名为“Controller”的父抽象类中调用我的 PDO 对象

class Controller {
    private $container;

    public function __construct($container) {
        $this->container = $container;
        // those 3 lines works well :
        $database = $this->container->get('db');
        $lieux = $database->query('SELECT * FROM Lieu');
        var_dump($lieux);
    }

    public function render(ResponseInterface $response, $file) {
        $this->container->view->render($response, $file);
    }
}

这里有人可以帮助我吗?

谢谢!

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    使database 属性受保护

    另外:$this->$database 是错误的。正确的是$this->database

    请注意,您的类设计基于 服务定位器 反模式。例如。您将整个容器传递给您的控制器,以便从中获取数据库对象。不要这样做!只注入一个类需要的资源。例如。您的控制器应该只接收数据库实例作为依赖项。看看thisthisthis,尤其是this

    您实际上也不想注入数据库实例。您应该将其注入正确的data mappers。并且数据映射器应该被注入到控制器中。原则上,从持久层访问数据的过程是更多 MVC 组件的责任。阅读thisthis。本系列的代码示例涉及域对象、数据库适配器、数据映射器、存储库和服务:Part 1Part 2Part 3Part 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');
        }
    
    }
    

    【讨论】:

    • 非常感谢您的回复!你让我度过了一个晚上。主要问题是数据库后面的“$”。是的,我觉得将数据库对象提供给每个控制器可能不是一个好主意。我将观看并阅读您的链接,以了解更多如何构建出色的 MVC 应用程序。谢谢!
    • 不客气。我重新编辑了更多链接(带有代码示例的系列)和建议。
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多