我正在尝试在Symfony网络项目中使用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');
}
}
我的securityController,我正在尝试连接到Postresql
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
答案 0 :(得分:3)
未设置容器,因此您无法调用其方法。
$securityController = new SecurityController();
$securityController->userId = $userId;
$securityController->sessionKey = $sessionKey
$securityController->setContainer($this->container);
我认为使用SecurityController
作为控制器不是一个好主意,它是一种服务。
答案 1 :(得分:3)
在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部分。