Кэш Symfony передает имя класса (строку) в конструктор вместо экземпляра (Doctrine ODM) - PullRequest
0 голосов
/ 06 декабря 2018

Symfony Cache пытается создать экземпляр Doctrine\ODM\MongoDB\Repository\DocumentRepository, передав аргумент 1 в виде строки.Это полное имя класса.Но DocumentReposity ожидает экземпляр DocumentManager в качестве первого аргумента.

Ниже кода.UserRepository расширяется Doctrine\ODM\MongoDB\Repository\DocumentRepository.И это ожидает экземпляр, а не строку в конструкторе.

Это проблема Doctrine ODM или проблема Symfony и как я могу ее решить?

Спасибо!

Ошибка:

Неустранимая ошибка: Uncaught Symfony \ Component \ Debug \ Exception \ FatalThrowableError: Аргумент 1 передан в Doctrine \ ODM \ MongoDB \ Repository \ DocumentRepository :: __ construct () должен быть экземпляром Doctrine \ODM \ MongoDB \ DocumentManager, строка с указанием , вызывается в /var/www/html/var/cache/dev/ContainerPtWsxJ7/getPlatform_User_ProviderService.php в строке 9 в / var / www / html / vendor / doctrine / mongodb-odm/lib/Doctrine/ODM/MongoDB/Repository/DocumentRepository.php:52 Трассировка стека: # 0 /var/www/html/var/cache/dev/ContainerPtWsxJ7/getPlatform_User_ProviderService.php(9): Doctrine \ ODM \ Mongory\ DocumentRepository -> __ construct ('Foo \ ApiB ...') 1 /var/www/html/var/cache/dev/ContainerPtWsxJ7/appAppKernelDevContainer.php(157): require ('/ var / www / html / v... ') # 2 / var / www / html / var / cache / dev / ContainerPtWsxJ7/getFosOauthServer_ServerService.php(9): ContainerPtWsxJ7 \ appAppKernelDevContainer-> load ('getPlatform_Use ...') 3 /var/www/html/var/cache/dev/ContainerPtWsxJ7/appAppContain.service ()/ www / html / v ... ') # 4 / var / www / html в /var/www/html/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Repository/DocumentRepository.php онлайн52

Кэшированный класс getPlatform_User_ProviderService.php:

use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;

// This file has been auto-generated by the Symfony Dependency Injection Component for internal use.
// Returns the private 'platform.user.provider' shared service.

return $this->privates['platform.user.provider'] = 
    new \Foo\ApiBundle\Provider\UserProvider(
        ($this->privates['platform.user.repository'] ?? $this->privates['platform.user.repository'] 
        = new \Foo\ApiBundle\Document\Repository\UserRepository('Foo\\ApiBundle\\Document\\User'))
    );

UserRepository:

namespace Foo\ApiBundle\Document\Repository;

use Doctrine\ODM\MongoDB\DocumentRepository;
use Foo\ApiBundle\Document\Company;

class UserRepository extends DocumentRepository {

    public function findByCompany(Company $company, $limit = 5, $skip = 0) {
        $qb = $this->createQueryBuilder();

        return $qb->field('company.$id')->equals(new \MongoId($company->getId()))
                        ->field('disabled')->equals(false)
                        ->limit($limit)
                         ->skip($skip)
                        ->getQuery()->execute();
    }

    public function findOneByActivationHash($hash) {
        return $this->findOneBy(array('activationHash' => $hash));
    }  
...removed the rest of the methods...   
}

Пользовательский документ и аннотация:

/**
 * @MongoDB\Document(collection="users",repositoryClass="Foo\ApiBundle\Document\Repository\UserRepository")
 * @MongoDB\InheritanceType("SINGLE_COLLECTION")
 * @MongoDB\Indexes({
 *  @MongoDB\Index(keys={"username"="asc"},unique=true)
 * })
 * @MongoDB\HasLifecycleCallbacks
 * @JMS\ExclusionPolicy("all")
 * ...removed the rest of the annotations...
 */

 abstract class User extends LegacyUser implements 
 \Symfony\Component\Security\Core\User\UserInterface {

services.xml, здесь все идет не так !!

1 Ответ

0 голосов
/ 11 декабря 2018

Кажется, что службы работают иначе, чем в старом Symfony.Я не знаю точно, как и почему.

В моем UserProvider я использовал экземпляр UserRepository в качестве аргумента.Но это не работает.Теперь я использую DocumentManager в качестве аргумента amd, а затем получаю из него UserRepository.Насколько я знаю, создание экземпляра хранилища вручную невозможно.

Я также внес некоторые изменения в services.xml.Я добавил autowire = "true", чтобы он обрабатывал разрешение DocumentManager.

UserProvider:

// public function __construct(ObjectRepository $userRepository) {
//     $this->userRepository = $userRepository;
// }

public function __construct(\Doctrine\ODM\MongoDB\DocumentManager $documentManager) {
    $this->userRepository = $documentManager->getRepository(\Foo\ApiBundle\Document\User::class);
}

services.xml:

<!--<service id="platform.user.repository" class="%user.repository.class%">
        <argument>%platform.entity.user.class%</argument>
    </service>-->
    <service id="platform.user.provider" class="%platform.user.provider.class%" autowire="true">
        <!--<argument type="service" id="doctrine.mongodb.manager" />-->
    </service>
...