Интегрируйте doctrine в slim 4, используя php -di - PullRequest
0 голосов
/ 18 апреля 2020

Попытка использовать doctrine с slim 4 и php -di Я не запускаю его с автопроводом. Следуя моей настройке:

index. php

$definitions = [
    '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',
            ]
        ]
    ],
    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);
    },
    UserRepositoryInterface::class => get(UserRepository::class)

, затем мой репозиторий:

class UserRepository extends \Doctrine\ORM\EntityRepository implements UserRepositoryInterface {
    public function get($id){
        $user = $this->_em->find($id);
       ...
    }
}

В настоящее время я получаю следующее сообщение об ошибке:

"Doctrine\ORM\Mapping\ClassMetadata" cannot be resolved: Parameter $entityName of __construct() has no
                value defined or guessable
                Full definition:
                Object (
                class = Doctrine\ORM\Mapping\ClassMetadata
                lazy = false
    ...

Может кто-нибудь сказать мне, как решить эту проблему, соответственно, есть ли другой, возможно, более чистый / простой способ интеграции doctrine с использованием php -di?

Обновление

Ссылаясь на намек на то, что ClassMetadata не может быть подключен автоматически, я изменил структуру следующим образом:

index. php

$definitions = [
   EntityManager::class => DI\factory([EntityManager::class, 'create'])
        ->parameter('connection', DI\get('db.params'))
        ->parameter('config', DI\get('doctrine.config')),

    'db.params' => [
        'driver'   => 'pdo_mysql',
        'user'     => 'root',
        'password' => '',
        'dbname'   => 'foo',
    ],
    'doctrine.config' => Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src/core/models/User"), true),
    ...

userservice / core / models / User. php:

namespace userservice\core\models;

use userservice\core\exceptions\ValidationException;
use \DateTime;
use ORM\Entity;

/**
 * @Entity(repositoryClass="userservice\infrastructure\repositories\UserRepository")
 */
class User extends Model{
    /**
     * @Column(type="string", length="50")
     * @var string
     */
    private $name;
    ...

И пользовательская служба / инфраструктура / UserRepository. php:

namespace userservice\infrastructure\repositories;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\ORMException;
use Doctrine\ORM\ORMInvalidArgumentException;
use userservice\core\models\User;
use userservice\core\repositories\UserRepositoryInterface;
use userservice\infrastructure\repositories\Repository;

class UserRepository extends Repository implements UserRepositoryInterface {
    private $_repository;

    /**
     * 
     * @param EntityManager $entityManager
     */
    public function __construct(EntityManager $entityManager) {
        parent::__construct($entityManager);
        $this->_repository = $entityManager->getRepository('User'); // OR $this->entityManager->find('User', 1);
    }

Теперь я получаю следующую ошибку в конструкции UserRepository (getRepository):

Uncaught Doctrine\Persistence\Mapping\MappingException: Class 'User' does not exist in C:\projects\microservices\user-service\vendor\doctrine\persistence\lib\Doctrine\Persistence\Mapping\MappingException.php

Как мне получить doctrine найти сущности?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...