Php DBAL连接作为服务抛出错误
我随后建立了DBAL连接作为服务 我有以下配置: 在我的服务类文件“doctor.php”中,我有 在我的CompanyController.php中,我有以下代码Php DBAL连接作为服务抛出错误,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我随后建立了DBAL连接作为服务 我有以下配置: 在我的服务类文件“doctor.php”中,我有 在我的CompanyController.php中,我有以下代码 <?php use Acme\BookBundle\Services\Doctrine; class CompanyController extends Controller { public function createAction() { $con = $this->get('do
<?php
use Acme\BookBundle\Services\Doctrine;
class CompanyController extends Controller
{
public function createAction()
{
$con = $this->get('doctrine');
$sqlQuery = "CREATE TABLE book_info (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, label TEXT, created_on DATETIME) ENGINE = INNODB";
$stmt = $con->prepare($sqlQuery);
$stmt->execute();
}
}
您链接的问题的OP不是使用Symfony2框架,他在问如何使用Symfony配置组件设置条令服务
当您使用Symfony2时,您不需要执行任何操作,只需执行以下操作:
<?php
use Acme\BookBundle\Services\Doctrine;
class CompanyController extends Controller
{
public function createAction()
{
$con = $this->get('doctrine.dbal.default_connection');
$sqlQuery = "CREATE TABLE book_info (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, label TEXT, created_on DATETIME) ENGINE = INNODB";
$stmt = $con->prepare($sqlQuery);
$stmt->execute();
}
}
您链接的问题的OP不是使用Symfony2框架,他在问如何使用Symfony配置组件设置条令服务
当您使用Symfony2时,您不需要执行任何操作,只需执行以下操作:
<?php
use Acme\BookBundle\Services\Doctrine;
class CompanyController extends Controller
{
public function createAction()
{
$con = $this->get('doctrine.dbal.default_connection');
$sqlQuery = "CREATE TABLE book_info (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, label TEXT, created_on DATETIME) ENGINE = INNODB";
$stmt = $con->prepare($sqlQuery);
$stmt->execute();
}
}
您不必在Symfony中将条令配置为服务。它已作为服务提供,并且可以从控制器内的服务容器中检索:$this->getdoctor()
或$this->get('some-service-id')
。通过运行以下控制台命令,可以查看可用的服务及其对应的ID:
php app/console container:debug
您还可以将--show private
选项添加到该命令中,以查看专用服务。一般来说,我认为最常见的条令服务将是条令实体管理器(doctor.orm.Entity\u Manager
),您可以使用它来存储/检索/删除数据库中的对象,以及用于查询数据的实体存储库,您可以将其单独设置为服务,以便注入其他服务
如果您只是试图为应用程序构造表(又名实体),则不需要/不应该在控制器中运行直接SQL查询。你应该做的是:
1) 在捆绑包的实体目录中创建条令实体
类。例如:
// src/Acme/BookBundle/Entity/BookInfo.php
namespace Acme\BookBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="book_info")
*/
class BookInfo
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
...
}
2) 运行php应用程序/控制台命令:schema:update--force
console命令。这将指示Dority在为项目设置的数据库中创建实体表(连接信息应位于app/config/parameters.yml
)
例如,在数据库中存储BookInfo对象$myBookInfo与在控制器中执行此操作一样简单:
...
$em = $this->getDoctrine()->getManager();
$em->persist($myBookInfo);
$em->flush;
...
当然,这是一个非常基本的例子,只是为了帮助您理解
阅读了解更多细节。您不必在Symfony中将条令配置为服务。它已作为服务提供,并且可以从控制器内的服务容器中检索:$this->getdoctor()
或$this->get('some-service-id')
。通过运行以下控制台命令,可以查看可用的服务及其对应的ID:
php app/console container:debug
您还可以将--show private
选项添加到该命令中,以查看专用服务。一般来说,我认为最常见的条令服务将是条令实体管理器(doctor.orm.Entity\u Manager
),您可以使用它来存储/检索/删除数据库中的对象,以及用于查询数据的实体存储库,您可以将其单独设置为服务,以便注入其他服务
如果您只是试图为应用程序构造表(又名实体),则不需要/不应该在控制器中运行直接SQL查询。你应该做的是:
1) 在捆绑包的实体目录中创建条令实体
类。例如:
// src/Acme/BookBundle/Entity/BookInfo.php
namespace Acme\BookBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="book_info")
*/
class BookInfo
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
...
}
2) 运行php应用程序/控制台命令:schema:update--force
console命令。这将指示Dority在为项目设置的数据库中创建实体表(连接信息应位于app/config/parameters.yml
)
例如,在数据库中存储BookInfo对象$myBookInfo与在控制器中执行此操作一样简单:
...
$em = $this->getDoctrine()->getManager();
$em->persist($myBookInfo);
$em->flush;
...
当然,这是一个非常基本的例子,只是为了帮助您理解
阅读更多细节。最后,我非常仔细地阅读了symfony doc中的service container,并使用了其他帖子中的某个人给出的答案,并获得了以下配置:
在myservices.yml中
parameters:
dbal_connection: book_enterprise_hub
bookservice.class: Acme\BookBundle\Services\BookService
services:
bookservice:
class: %bookservice.class%
<?php
namespace Acme\BookBundle\Services;
//1st method (not working)
//use Doctrine\DBAL\Connection;
//second method
use Doctrine\Common\ClassLoader;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DriverManager;
class BookService
{
private $connection;
//1st method (not working)
// public function __construct(Connection $connection) {
// $this->connection = $connection;
// }
//second method
public function __construct() {
$doctrineLoader = new ClassLoader('BookService');
$doctrineLoader->register();
$doctrineConfig = new Configuration();
$doctrineParams = array(
'driver' => 'pdo_mysql',
'dbname' => 'book_enterprise_hub',
'host' => 'localhost',
'user' => 'root',
'password' => '',
);
$this->connection = DriverManager::getConnection($doctrineParams, $doctrineConfig);
}
public function createTable($tableName){
$sqlQuery = "CREATE TABLE ".$tableName." (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, label TEXT, created_on DATETIME) ENGINE = INNODB";
$stmt = $this->connection->prepare($sqlQuery);
if($stmt->execute())
{
return true;
}
}
}
**注意,我没有在这里传递参数,因为当传递参数时,它抛出了这个错误“您已经请求了一个不存在的服务”doctrine.dbal.book\u enterprise\u hub”,因此,我在bookservice\u构造方法中传递了这个DB信息。”
在我的服务文件BookService.php中
parameters:
dbal_connection: book_enterprise_hub
bookservice.class: Acme\BookBundle\Services\BookService
services:
bookservice:
class: %bookservice.class%
<?php
namespace Acme\BookBundle\Services;
//1st method (not working)
//use Doctrine\DBAL\Connection;
//second method
use Doctrine\Common\ClassLoader;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DriverManager;
class BookService
{
private $connection;
//1st method (not working)
// public function __construct(Connection $connection) {
// $this->connection = $connection;
// }
//second method
public function __construct() {
$doctrineLoader = new ClassLoader('BookService');
$doctrineLoader->register();
$doctrineConfig = new Configuration();
$doctrineParams = array(
'driver' => 'pdo_mysql',
'dbname' => 'book_enterprise_hub',
'host' => 'localhost',
'user' => 'root',
'password' => '',
);
$this->connection = DriverManager::getConnection($doctrineParams, $doctrineConfig);
}
public function createTable($tableName){
$sqlQuery = "CREATE TABLE ".$tableName." (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, label TEXT, created_on DATETIME) ENGINE = INNODB";
$stmt = $this->connection->prepare($sqlQuery);
if($stmt->execute())
{
return true;
}
}
}
最后,我非常仔细地阅读了symfony doc中的服务容器,并使用了另一篇文章中的某个人给出的答案,并获得了以下配置:
在myservices.yml中
parameters:
dbal_connection: book_enterprise_hub
bookservice.class: Acme\BookBundle\Services\BookService
services:
bookservice:
class: %bookservice.class%
<?php
namespace Acme\BookBundle\Services;
//1st method (not working)
//use Doctrine\DBAL\Connection;
//second method
use Doctrine\Common\ClassLoader;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DriverManager;
class BookService
{
private $connection;
//1st method (not working)
// public function __construct(Connection $connection) {
// $this->connection = $connection;
// }
//second method
public function __construct() {
$doctrineLoader = new ClassLoader('BookService');
$doctrineLoader->register();
$doctrineConfig = new Configuration();
$doctrineParams = array(
'driver' => 'pdo_mysql',
'dbname' => 'book_enterprise_hub',
'host' => 'localhost',
'user' => 'root',
'password' => '',
);
$this->connection = DriverManager::getConnection($doctrineParams, $doctrineConfig);
}
public function createTable($tableName){
$sqlQuery = "CREATE TABLE ".$tableName." (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, label TEXT, created_on DATETIME) ENGINE = INNODB";
$stmt = $this->connection->prepare($sqlQuery);
if($stmt->execute())
{
return true;
}
}
}
**注意,我没有在这里传递参数,因为当传递参数时,它抛出了这个错误“您已经请求了一个不存在的服务”doctrine.dbal.book\u enterprise\u hub”,因此,我在bookservice\u构造方法中传递了这个DB信息。”
在我的服务文件BookService.php中
parameters:
dbal_connection: book_enterprise_hub
bookservice.class: Acme\BookBundle\Services\BookService
services:
bookservice:
class: %bookservice.class%
<?php
namespace Acme\BookBundle\Services;
//1st method (not working)
//use Doctrine\DBAL\Connection;
//second method
use Doctrine\Common\ClassLoader;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DriverManager;
class BookService
{
private $connection;
//1st method (not working)
// public function __construct(Connection $connection) {
// $this->connection = $connection;
// }
//second method
public function __construct() {
$doctrineLoader = new ClassLoader('BookService');
$doctrineLoader->register();
$doctrineConfig = new Configuration();
$doctrineParams = array(
'driver' => 'pdo_mysql',
'dbname' => 'book_enterprise_hub',
'host' => 'localhost',
'user' => 'root',
'password' => '',
);
$this->connection = DriverManager::getConnection($doctrineParams, $doctrineConfig);
}
public function createTable($tableName){
$sqlQuery = "CREATE TABLE ".$tableName." (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, label TEXT, created_on DATETIME) ENGINE = INNODB";
$stmt = $this->connection->prepare($sqlQuery);
if($stmt->execute())
{
return true;
}
}
}
你好,伊戈尔,谢谢你的建议。我完全糊涂了,无法设置简单的DBAL连接。正如您所说,我尝试过,我得到了这个错误,您请求了一个不存在的服务“doctrine.dbal.book\u enterprise\u hub”。您的意思是:“doctrine.dbal.book\u enterprise\u connection;500内部服务器错误-ServiceNotFoundException我得到了这个异常。在这个错误中,这是什么意思“一个不存在的服务”doctrine.dbal.book\u enterprise\u hub?我应该把它注册为服务吗?嗨,伊戈尔,谢谢你的建议。我完全糊涂了,无法设置简单的DBAL连接。正如您所说,我尝试过,我得到了这个错误,您请求了一个不存在的服务“doctrine.dbal.book\u enterprise\u hub”。您的意思是:“doctrine.dbal.book_enterprise_connection;500内部服务器错误-ServiceNotFoundException我得到这个exc