1

DB からユーザーをロードするための Symfony2 クックブック チュートリアルに従おうとしています。

このチュートリアルでは、ACME/UserBundle があり、私のインストールには含まれていないことを前提としていますが、自分で作成できると想定しているだけです (プラグイン パッケージとは異なり、どこかにダウンロードする必要がありますか?)。

バンドル UserBundle を作成し、チュートリアルのエンティティ User からコードをコピーして貼り付けました (ここの最初のコード ボックス)。

この行は私にとって物事を壊しているようです:

  @ORM\Entity(repositoryClass="Mycompany\UserBundle\Entity\UserRepository")

私が得るエラーメッセージは次のとおりです。

Fatal error: Class 'mycompany\UserBundle\Entity\UserRepository' not
found in /var/www/mycompany/vendor/doctrine/lib/Doctrine/ORM/EntityManager.php
on line 578

したがって、私は自分の UserBundle を作成することはできなかったと思います (これはそれを行うプラグインをインストールする方法ではなく、それを行う方法に関するチュートリアルだと思っていたので奇妙です)、または登録する必要があることを知っていると仮定しました。どういうわけかentityRepositoriesの中のエンティティ?

symfony の上級者がこれについて教えてくれたら、とてもありがたいです。これまでに Symfony2 について学んだことはすべて本当に気に入っていますが、ここで学ぶのは少し遅いです。

4

2 に答える 2

1

ユーザーリポジトリクラスを持っていないようです。これはユーザーエンティティクラスとは別のものです。これはエンティティ フォルダーに入りますが、UserRepository.php になり、次のようになります。

namespace Mycompany\UserBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\NoResultException;

// Implements userproviderinterface so we can use the user entity for authentication
// Extends entityrepository so that it gets methods definded there
class UserRepository extends EntityRepository implements UserProviderInterface {

  //  This function is called when a user tries to login, the below lets the user use their username or email for username
  public function loadUserByUsername($username) {
    $user = $this->createQueryBuilder('u')
            ->select('u, r')
            ->leftJoin('u.roles', 'r')
            ->where('u.username = :username OR u.email = :username')
            ->setParameter('username', $username)
            ->getQuery();
    try {
      $user = $user->getSingleResult();
    } catch (NoResultException $exc) {
      throw new UsernameNotFoundException(sprintf('Unable to find an active UserBundle:User object identified by %s', $username));
    }
    return $user;
  }
  // 
  public function refreshUser(UserInterface $user) {
    $class = get_class($user);
    if (!$this->supportsClass($class))
      throw new UnsupportedUserException(sprintf('instances of class %s are not supported', $class));
    return $this->loadUserByUsername($user->getUsername());
  }

  public function supportsClass($class) {
    return $this->getEntityName() === $class || is_subclass_of($class, $this->getEntityName());
  }

}

このクラスは、あなたがやっているチュートリアルのさらに下にありますhttp://symfony.com/doc/current/cookbook/security/entity_provider.html

于 2012-06-11T11:11:07.577 に答える
0

doctrine:generate:entitiesコマンドを使用して正しいクラスを生成できるはずです。(本に記載されています。)

あなたのコマンドは次のようになるはずです:

php app/console doctrine:generate:entities User
于 2012-06-11T11:00:53.397 に答える