0

まったく同じタイプの問題がここに何度も投稿されていることを私は知っています。しかし、私の問題を解決した人は1人もいませんでした。本当にイライラし、2日以上グーグルで解決策を見つけましたが、まだ成功していません。私はここで立ち往生しており、プロジェクトを進めることができません。最後にグーグルで見つけた解決策を述べましたが、私の問題は解決しませんでした。

私の仕様は次のとおりです。wampサーバー/ php 5.4.3 / apache 2.2.22でdoctrineORMModuleを使用してZend Framework 2.1.5を使用します。

Application/config/module.config.php の教義構成は次のとおりです。

    // Doctrine Configurations
'doctrine' => array(
        'driver' => array(
                // defines an annotation driver with two paths, and names it `my_annotation_driver`
                'my_annotation_driver' => array(
                        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                        'cache' => 'array',
                        'paths' => array(
                                __DIR__ . '/../src/Application/Model',
                        ),
                ),

                // default metadata driver, aggregates all other drivers into a single one.
                // Override `orm_default` only if you know what you're doing
                'orm_default' => array(
                        'drivers' => array(
                                // register `my_annotation_driver` for any entity under namespace `My\Namespace`
                                'Application\Model' => 'my_annotation_driver'
                        )
                )
        )
),
// End doctrine configurations

Application/src/Application/Model/User.php の User Entity クラス

namespace Application\Model;
/*
* @Entity
* @Table(name="user")
*/
class User
   {
/*
 * @Id 
 * @Column(type="integer")
 * @GeneratedValue(strategy="AUTO")
 */
private $id;

/*
 * @Column(type="string")
*/
private $username;

/*
 * @Column(type="string")
*/
private $password;

/*
 * @Column(type="string")
*/
private $email;

/*
 * @Column(type="string")
*/
private $name;

/*
 * @Column(type="string")
*/
private $profile_pic;

/*
 * @Column(type="string")
*/
private $cover_pic;

/*
 * @Column(type="integer")
*/
private $status;

/*
 * @Column(type="datetime")
*/
private $created_at;


public function getUsername()
{
    return $this->username;
}
}

Application/src/Application/Controller/UserController.php の UserController

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class UserController extends AbstractActionController
{
public function IndexAction()
{
    $em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');

    $user = $em->find('Application\Model\User', 1);
    var_dump($user);

    exit;
}
}

Url - public/application/user -> throws exception, 以下は stak トレースとエラーです

Doctrine\ORM\Mapping\MappingException
File:
C:\wamp\library\Doctrine\ORM\Mapping\MappingException.php:216
Message:
Class "Application\Model\User" is not a valid entity or mapped super class.
Stack trace:
0 C:\wamp\library\Doctrine\ORM\Mapping\Driver\AnnotationDriver.php(87):                Doctrine\ORM\Mapping\MappingException::classIsNotAValidEntityOrMappedSuperClass('Application\Mod...')
1     C:\wamp\library\Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain.php(104):     Doctrine\ORM\Mapping\Driver\AnnotationDriver->loadMetadataForClass('Application\Mod...',     Object(Doctrine\ORM\Mapping\ClassMetadata))
2 C:\wamp\library\Doctrine\ORM\Mapping\ClassMetadataFactory.php(113):     Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain-    >loadMetadataForClass('Application\Mod...', Object(Doctrine\ORM\Mapping\ClassMetadata))
3     C:\wamp\library\Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory.php(302):     Doctrine\ORM\Mapping\ClassMetadataFactory-    >doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
4     C:\wamp\library\Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory.php(205):     Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory-    >loadMetadata('Application\Mod...')
5 C:\wamp\library\Doctrine\ORM\EntityManager.php(268): Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor('Application\Mod...')
6 C:\wamp\library\Doctrine\ORM\EntityManager.php(682): Doctrine\ORM\EntityManager->getClassMetadata('Application\Mod...')
7 C:\wamp\www\indians\module\Application\src\Application\Controller\UserController.php(23): Doctrine\ORM\EntityManager->getRepository('Application\Mod...')
8 C:\wamp\library\Zend\Mvc\Controller\AbstractActionController.php(83): Application\Controller\UserController->IndexAction()
9 [internal function]: Zend\Mvc\Controller\AbstractActionController->onDispatch(Object(Zend\Mvc\MvcEvent))
10 C:\wamp\library\Zend\EventManager\EventManager.php(472): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
11 C:\wamp\library\Zend\EventManager\EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
12 C:\wamp\library\Zend\Mvc\Controller\AbstractController.php(117): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
13 C:\wamp\library\Zend\Mvc\DispatchListener.php(114): Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Http\PhpEnvironment\Request), Object(Zend\Http\PhpEnvironment\Response))
14 [internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
15 C:\wamp\library\Zend\EventManager\EventManager.php(472): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
16 C:\wamp\library\Zend\EventManager\EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
17 C:\wamp\library\Zend\Mvc\Application.php(294): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
18 C:\wamp\www\indians\public\index.php(12): Zend\Mvc\Application->run()
19 {main}

私が見つけた解決策:

  • eaccelerator をオフにします (私の wamp サーバーには eaccelerator がインストールされていないため、これは問題ではありません)
  • 注釈マッピング @Entity を @ORM\Entity に変更します (両方を使用してチェックしましたが、私の問題は解決しませんでした-2 番目のパラメーターが true に設定されているよう$config->newDefaultAnnotationDriver($path, true)ですsimpleannotationreader。したがって、単純な注釈 ex.@Entityを使用してチェックして@ORM\Entityもまだ機能しません)
  • これが解決策である場合に呼び出す必要があることがわかったいくつかの場所annotationRegistry::somemethod()、次にクラスから呼び出すメソッドと、annotationRegistry呼び出す正確な場所はどこですか。

cmd コマンド:

  • ./vendor/bin/doctrine-module orm:validate-schemaエラーは表示されません '[Mapping] OK - マッピング ファイルは正しいです。[データベース] OK - データベース スキーマはマッピング ファイルと同期しています。
  • ただし、このコマンドを実行する`./vendor/bin/doctrine-module orm:infoと、次のように例外がスローされます。エンティティまたはマッピング ファイルがある場合は、マッピング構成のエラーを確認する必要があります。

それだけです.今、私にできることは、希望と忍耐を維持することだけです. 私の問題をチェックしていただきありがとうございます。

4

2 に答える 2

3

私はあなたの問題を見つけました: 無効なコメント。Doctrine 2 ORM エンティティを説明するには、注釈を付ける必要があります:

たとえば、次の代わりに:

/*
 * @Id 
 * @Column(type="integer")
 * @GeneratedValue(strategy="AUTO")
 */
private $id;

あなたが使用する必要があります:

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

前に述べたように、次のように Doctrine 2 ORM の注釈を使用する必要があります (先頭に @ORM\ を付けます):

/**
 * @ORM\Column(type="string", length=31)
 */
private $username;

次のルールを使用することをお勧めします。すべてのエンティティはサブディレクトリ Entity に格納され、そのエンティティで動作する関数はサブディレクトリ Model ( getUsers()、getUser(id) など) に格納されます。

User/src/User/Entity/User.php の完全な User Entity クラス (私の場合):

namespace User\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Users table
 *
 * @ORM\Entity
 * @ORM\Table(name="users")
 * @property int $id
 * @property string $username
 * @property string $password
 * @property string $email
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=31)
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=32)
     */
    private $password;

    /**
     * @ORM\Column(type="string", length=63)
     */
    private $email;

    /**
     * @ORM\Column(type="string", length=63)
     */
    private $name;

    /**
     * @ORM\Column(type="string", length=127)
     */
    private $profile_pic;

    /**
     * @ORM\Column(type="string", length=127)
     */
    private $cover_pic;

    /**
     * @ORM\Column(type="integer")
     */
    private $status;

    /**
     * @ORM\Column(type="datetime")
     */
    private $created_at;


    public function __construct() {
    }


    /**
     * Magic getter to expose protected properties.
     *
     * @param string $property
     * @return mixed
     */
    public function __get($property)
    {
        return $this->$property;
    }

    /**
     * Magic setter to save protected properties.
     *
     * @param string $property
     * @param mixed $value
     */
    public function __set($property, $value)
    {
        $this->$property = $value;
        return $this;
    }
}

テーブルを呼びたいときも複数形を使います。

例:ユーザー記事投稿

エンティティ名の単数形 (単一レコード)

例:ユーザー記事投稿

しかし、これは私が使用しているパターンの 1 つにすぎません。

ところで。Doctrine 2 ORM コンソール ツールの使用に関する情報をありがとう。./doctrine-module orm:infoを使用したことはありませんが、./doctrine-module orm:schema-tool:create --dump-sql > database.sqlのみを使用しました

于 2013-05-07T20:53:24.540 に答える
0

あなたの問題はDocblockアノテーションの「開始」文字に関連しています:

Docblock 注釈は、スラッシュ (/) と2 つのアスタリスク (*)で始まる C++ スタイルのコメントです。この「スターター」文字は必須です。 そうしないと、Doctrine は注釈を認識しません

すべてのコメントを a で始まるように変更すると、/**機能します。

于 2016-11-28T13:12:42.733 に答える