Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php DBAL连接作为服务抛出错误_Php_Symfony_Doctrine Orm - Fatal编程技术网

Php DBAL连接作为服务抛出错误

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

我随后建立了DBAL连接作为服务

我有以下配置:

在我的服务类文件“doctor.php”中,我有

在我的CompanyController.php中,我有以下代码

<?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