如何在Slim Framework 4中使用Doctrine?

4
尝试在Slim Framework 4中使用Doctrine,但没有文档可用。按照链接http://www.slimframework.com/docs/v3/cookbook/database-doctrine.html上的信息会出现错误。

找不到“slim container”类。

<?php

// bootstrap.php

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Cache\FilesystemCache;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
use Doctrine\ORM\Tools\Setup;
use Slim\Container;

require_once __DIR__ . '/vendor/autoload.php';

$container = new Container(require __DIR__ . '/settings.php');

$container[EntityManager::class] = function (Container $container): EntityManager {
    $config = Setup::createAnnotationMetadataConfiguration(
        $container['settings']['doctrine']['metadata_dirs'],
        $container['settings']['doctrine']['dev_mode']
    );

    $config->setMetadataDriverImpl(
        new AnnotationDriver(
            new AnnotationReader,
            $container['settings']['doctrine']['metadata_dirs']
        )
    );

    $config->setMetadataCacheImpl(
        new FilesystemCache(
            $container['settings']['doctrine']['cache_dir']
        )
    );

    return EntityManager::create(
        $container['settings']['doctrine']['connection'],
        $config
    );
};
1个回答

3

Slim 4 hasn't integrated container. You can use for example php-di/php-di (add it by composer). After that you can use it like this:

// bootstrap.php
use DI\ContainerBuilder;

require __DIR__ . '/vendor/autoload.php';

// Instantiate PHP-DI ContainerBuilder
$containerBuilder = new ContainerBuilder();

// Set up settings
$settings = require __DIR__ . '/app/settings.php';
$settings($containerBuilder);

// Set up dependencies
$dependencies = require __DIR__.'/app/dependencies.php';
$dependencies($containerBuilder);

// Build PHP-DI Container instance
$container = $containerBuilder->build();

// Instantiate the app
AppFactory::setContainer($container);
$app = AppFactory::create();

/* .. other code here .. */
?>

<? 
// settings.php

use DI\ContainerBuilder; 

return function (ContainerBuilder $containerBuilder) {
// Global Settings Object
$containerBuilder->addDefinitions([
'settings' => [
   'doctrine' => [
            'dev_mode' => true,
            'cache_dir' => __DIR__.'/../var/cache/doctrine',
            'metadata_dirs' => [__DIR__.'/../src/Domain/'],
            'connection' => [
                'driver' => 'pdo_mysql',
                'host' => 'webdb',
                'port' => 3306,
                'dbname' => 'db',
                'user' => 'user',
                'password' => 'pass',
            ]
  ]
]);
}

?>

<?
//dependencies.php
use DI\ContainerBuilder;

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Cache\FilesystemCache;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;

return function (ContainerBuilder $containerBuilder) {
$containerBuilder->addDefinitions([
         EntityManagerInterface::class => function (ContainerInterface $c): EntityManager {
        $doctrineSettings = $c->get('settings')['doctrine'];

        $config = Setup::createAnnotationMetadataConfiguration(
            $doctrineSettings['metadata_dirs'],
            $doctrineSettings['dev_mode']
        );

        $config->setMetadataDriverImpl(
            new AnnotationDriver(
                new AnnotationReader,
                $doctrineSettings['metadata_dirs']
            )
        );

        $config->setMetadataCacheImpl(
            new FilesystemCache($doctrineSettings['cache_dir'])
        );

        return EntityManager::create($doctrineSettings['connection'], $config);
    }
]);
}       

?>


这给了我以下错误信息期望类型为'Doctrine\Common\Persistence\Mapping\Driver\MappingDriver',但发现了'Doctrine\ORM\Mapping\Driver\AnnotationDriver'。 - Marcus Christiansen
调试信息不足。请查看您在dependencies.php中使用的类的命名空间。您是复制粘贴此代码吗?这只是一个示例,可能在Doctrine中进行了更改。 - Максим Дубинин
这个方法在 Configuration.php 文件中。我想你可能知道 Slim 框架中有什么变化。这是我第一次使用这个框架。看起来这个函数现在需要 MappingDriver $driverImpl 参数。 - Marcus Christiansen
哦,我现在在我的项目中看不到这个文件,你能展示一下你的代码吗? - Максим Дубинин
我已在Github上创建了一个仓库,网址是https://github.com/marcuschristiansen/slim-boilerplate。文件位于slim-boilerplate/app/orm.php - 26-31行。希望这能够帮到您。如果我传递MappingDriver $driverImpl,错误就会消失,但我不确定是否只有这样就可以了。 - Marcus Christiansen
公共函数setMetadataDriverImpl(MappingDriver $driverImpl)使用接口MappingDriver,我们使用扩展Doctrine\Common\Persistence\Mapping\Driver\AnnotationDriver的类AnnotationDriver作为实现。同时,Doctrine\Common\Persistence\Mapping\Driver\AnnotationDriver实现了MappingDriver接口。我认为问题出在类自动加载上,而不是Slim框架本身。请尝试使用composer dump-autoload -o命令。 - Максим Дубинин

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接