如何在没有Symfony 4中的DoctrineBundle的情况下将DBAL Doctrine连接注册为服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在没有Symfony 4中的DoctrineBundle的情况下将DBAL Doctrine连接注册为服务相关的知识,希望对你有一定的参考价值。

我正在尝试仅将Doctrine DBAL Connection组件注册为Symfony4中的服务。 我不需要完整的DoctrineBundle symfony产品,而只需要提供基本数据库抽象级别的部分。 现在我一直在努力弄清楚如何实现作曲家作为服务下载的原始库。 这是应该如何创建Connection类,如官方文档:

<?php
$config = new DoctrineDBALConfiguration();
//..
$connectionParams = array(
    'dbname' => 'mydb',
    'user' => 'user',
    'password' => 'secret',
    'host' => 'localhost',
    'driver' => 'pdo_mysql',
);
$conn = DoctrineDBALDriverManager::getConnection($connectionParams, $config);

如果可能,如何在service.yml配置中配置此类服务? 如果不是,我该怎么办?

答案

您可能最好只使用doctrine包并从配置文件中删除orm部分。实际上并没有增加太多开销,而且更容易自己做。

话虽如此,这里是最小dbal设置的细节

composer create symfony/skeleton s40dbal
cd s40dbal
composer require server
composer require doctrine/dbal

# .env
DB_URL=mysql://user:password@localhost/dbname

# config/services.yaml
DoctrineDBALConfiguration:

DoctrineDBALConnection:
    factory: 'DoctrineDBALDriverManager::getConnection'
    arguments:
        -
            url : '%env(DB_URL)%'
            driverOptions: {20: false} # emulate prepared statements
        - '@DoctrineDBALConfiguration'

# DefaultController.php
use DoctrineDBALConnection;
class DefaultController
{
    public function index(Connection $conn)
    {
        $stmt = $conn->prepare('SELECT id,name FROM users WHERE username = ?');
        $stmt->execute(['someuser']);
        $row = $stmt->fetch();
        var_dump($row);

        return new Response('dbal');
    }
}

请享用

另一答案

只需2美分。

composer create symfony/skeleton super-project

cd super-project

composer require doctrine/dbal
.env

DATABASE_URL = MySQL的://用户:密码@本地/ DBNAME

config/services.yaml
    AppServiceConexion:
    arguments:
            -
                url : '%env(DATABASE_URL)%'
in AppService folder -> Conexion.php
Use DoctrineDBALConfiguration;
class Conexion
{

    var $url = '';

    public function __construct($url)
    {
        $this->url = $url['url'];
    }

    public function getConexion(){

        // configuration parameters
        $config =  new Configuration();

        $connectionParams = array(
             'url' => $this->url,
         );
        $conn = DoctrineDBALDriverManager::getConnection($connectionParams, $config);
         return $conn;
    }
in AppEntity folder -> BaseService.php
class BaseService
{
    protected $db;
    public function __construct($db)
    {
        $this->db = $db->getConexion();
    }
}
socios Entity in AppEntity -> Socios.php
namespace AppEntity;

class Socios extends BaseService
{
    public function veo(){
        return $this->db->fetchAll("select * from socios order by id;");
    }
}
Finally in AppController -> SociosController.php
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentRoutingAnnotationRoute;
use AppServiceConexion;
use AppEntitySocios;

class SociosController extends Controller
{
    public function Socios(Conexion $conn)
    {
        $socios = (new Socios($conn))->getAll();
        return $this->render('Socios/index.html.twig', array(
        'socios' => $socios,
         ));
    }
}

以上是关于如何在没有Symfony 4中的DoctrineBundle的情况下将DBAL Doctrine连接注册为服务的主要内容,如果未能解决你的问题,请参考以下文章

命名空间没有注册路径 [Symfony 4.3]

如何使用 symfony 4 创建登录验证表单

如何将令牌存储作为参数传递给 Symfony 3.4 中的事件监听器

在 Symfony 4.4 中覆盖复选框表单字段产生重复标签且没有字段

如何使用 admin-bundle 处理 Symfony 4 中的 perPageOptions 弃用?

如何在 Symfony 4 上配置 Doctrine 以使用 yaml 映射