【问题标题】:Php Symfony 3.1 exception by using Doctrine DBAL使用 Doctrine DBAL 的 Php Symfony 3.1 异常
【发布时间】:2016-06-25 17:06:33
【问题描述】:

我正在尝试在我的 Symfony Web 项目中使用 Doctrine DBAL。

我做了什么:

Config.yml

# Doctrine Configuration
doctrine:
    dbal:
        driver:   pdo_pgsql
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8

parameters.yml

parameters:
    database_host: 127.0.0.1
    database_port: 5432
    database_name: my_project_db
    database_user: postgres
    database_password: my_password

我的公司资料控制人

/**
 * @Route("/profile/{userId}/{sessionKey}", name="profile")
 */

public function profileAction($userId=null, $sessionKey=null)
{
    $securityController = new SecurityController();
    $securityController->userId = $userId;
    $securityController->sessionKey = $sessionKey;
    if ($securityController->sessionKeyIsValid())
    {
        return new Response('Profile');
    }
    else
    {
        return $this->redirectToRoute('login');
    }
}

还有我试图连接到我的 Postresql 的 securityController

class SecurityController extends Controller
{
    public $userId;
    public $sessionKey;

    public function sessionKeyIsValid()
    {
        $conn = $this->get('database_connection');
        //$conn->fetchAll('select * from main.users;');
        return false;
    }
}

异常(Error: Call to a member function get() on null)出现在这串代码$conn = $this->get('database_connection'); 我做错了什么?看来我是按照 Symfony cookBook http://symfony.com/doc/current/cookbook/doctrine/dbal.html 中的建议一步一步进行的

【问题讨论】:

    标签: php symfony doctrine


    【解决方案1】:

    在 Symfony 项目中,您从不实例化自己的控制器。如果您想将逻辑与控制器分离,create a service 并注入您需要的依赖项。

    例如,您的服务可能如下所示:

    namespace AppBundle\Service;
    
    use Doctrine\DBAL\Connection;
    
    class SecurityService 
    {
        protected $db;
        public $userId;
        public $sessionKey;
    
        public function __construct(Connection $db)
        {
            $this->db = $db;
        }
    
        public function sessionKeyIsValid()
        {
            // $this->db->fetchAll('select * from main.users;');
        }
    }
    

    然后你在services.yml 中声明它是这样的:

    services:
        app_security:
           class:        AppBundle\Service\SecurityService
           arguments:   [ "@database_connection" ]
    

    然后,在任何控制器中,您都可以访问SecurityService 的共享实例:

    public function profileAction($userId=null, $sessionKey=null)
    {
        $security = $this->get('app_security');
    
        // ...
    }
    

    但我必须警告您,直接访问数据库层可能不是正确的方法。您应该先阅读文档中的Databases and Doctrine 部分。

    【讨论】:

    • 感谢您的详细回答,但到目前为止我还没有了解如何将服务参数(参数:[“@database_connection”])与我的 parameters.yml 文件中描述的数据库连接参数链接起来。如果我“按原样”使用您的示例,则会出现错误(无法在第 15 行解析(靠近“参数:[“@database_connection”]”)。)
    • 我之前的回复中有一个不需要的空间,我已修复它。语法"@database_connection" 表示通过构造函数注入名为database_connection 的服务。它已经被实例化了,查看doctrine 附近的config.yml 部分,您会发现您的数据库参数已经注册。您真的应该阅读您感兴趣的文档部分。Symfony 是一个非常强大的工具,但如果使用不当,显然会适得其反。
    • 谢谢,通过删除您提到的额外空间解决了问题。我不知道 yml 配置所以取决于格式。
    【解决方案2】:

    容器没有设置,所以你不能调用它的方法。

    $securityController = new SecurityController();
    $securityController->userId = $userId;
    $securityController->sessionKey = $sessionKey
    $securityController->setContainer($this->container);
    

    我认为使用SecurityController作为控制器不是一个好主意,它是一个服务。

    【讨论】:

      猜你喜欢
      • 2018-12-18
      • 2015-09-13
      • 2011-07-15
      • 2017-06-13
      • 2021-12-03
      • 2011-10-07
      • 1970-01-01
      • 2020-07-29
      • 2014-07-21
      相关资源
      最近更新 更多