How do I configure Bisna for use with Doctrine 2.1

2019-04-27 07:09发布

问题:

I had the previous version of Bisna (before July 22nd), with Doctrine 2.0 working good, according to the instructions in http://www.zendcasts.com/unit-testing-doctrine-2-entities/2011/02/.

Yesterday I decided to upgrade to Doctrine 2.1, and had to upgrade Bisna as well, as it was incompatible with Doctrine 2.1.
So I deleted the entire Doctrine and Bisna directories from my library directory, brought in the new version of each of them, added the autoload init method to the bootstrap, and updated my application.ini file with the relevant changes.

However, when I try to access the application (which worked before fine with Doctrine 2.0 and the previous version of Bisna), I get the following exception:

Notice: Undefined index: annotationRegistry in /home/doron/workspace/myapp/library/Bisna/Doctrine/Container.php on line 569

Advanced information:
That line (#569) is:

$this->startAnnotationRegistry($config['annotationRegistry']);

When I print the contents of $config, I get the following:

array
  0 => 
    array
      'annotationRegistry' => 
    array
      'annotationFiles' => 
        array
          0 => string '/home/doron/workspace/myapp/application/../library/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php' (length=103)
      'adapterClass' => string 'Doctrine\ORM\Mapping\Driver\AnnotationDriver' (length=44)
      'mappingNamespace' => string 'MyApp\Entity' (length=13)
      'mappingDirs' => 
    array
      0 => string '/home/doron/workspace/myapp/application/../library/MyApp/Entity' (length=65)
      'annotationReaderClass' => string 'Doctrine\Common\Annotations\AnnotationReader' (length=44)
      'annotationReaderCache' => string 'default' (length=7)

So I can see that the annotationRegistry property is inside an array, where the code expects it to not be inside an array.

But this is not the end, as I get the following exception as well (below the previous exception):

Notice: Undefined index: drivers in /home/doron/workspace/myapp/library/Bisna/Doctrine/Container.php on line 571

So I guess something is not configured properly, or there's a bug with Bisna.

This is my application.ini:

[production]

; --------------------------
; PHP Specific Configuration
; --------------------------
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
phpSettings.date.timezone = "EST"

includePaths.library = APPLICATION_PATH "/../library"
includePaths.resource = APPLICATION "/../library/Bisna/Application/Resource"

; ----------------------------------------
; Zend Framework Application Configuration
; ----------------------------------------
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

appnamespace = "Application"

autoloaderNamespaces[] = "MyApp"
autoloaderNamespaces[] = "Bisna"
autoloaderNamespaces[] = "Symfony"
autoloaderNamespaces[] = "Doctrine"

pluginPaths.Bisna\Application\Resource\ = "Bisna/Application/Resource"

; ------------------------------
; Front Controller Configuration
; ------------------------------
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.view[] =
resources.view.encoding = "UTF-8"
resources.view.doctype = "XHTML1_STRICT"
resources.view.contentType = "text/html; charset=UTF-8"

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

; ------------------------------------------------------------------------------
; Doctrine Class Loader Configuration
; ------------------------------------------------------------------------------

resources.doctrine.classLoader.loaderClass = "Doctrine\Common\ClassLoader"
resources.doctrine.classLoader.loaderFile  = APPLICATION_PATH "/../library/Doctrine/Common/ClassLoader.php"

resources.doctrine.classLoader.loaders.doctrine_common.namespace   = "Doctrine\Common"
resources.doctrine.classLoader.loaders.doctrine_common.includePath = APPLICATION_PATH "/../library"

resources.doctrine.classLoader.loaders.doctrine_dbal.namespace   = "Doctrine\DBAL"
resources.doctrine.classLoader.loaders.doctrine_dbal.includePath = APPLICATION_PATH "/../library"

resources.doctrine.classLoader.loaders.doctrine_orm.namespace   = "Doctrine\ORM"
resources.doctrine.classLoader.loaders.doctrine_orm.includePath = APPLICATION_PATH "/../library"

resources.doctrine.classLoader.loaders.symfony_console.namespace   = "Symfony\Component\Console"
resources.doctrine.classLoader.loaders.symfony_console.includePath = APPLICATION_PATH "/../library"

resources.doctrine.classLoader.loaders.symfony_yaml.namespace   = "Symfony\Component\Yaml"
resources.doctrine.classLoader.loaders.symfony_yaml.includePath = APPLICATION_PATH "/../library"


; ------------------------------------------------------------------------------
; Doctrine Cache Configuration
; ------------------------------------------------------------------------------

; Points to default cache instance to be used. Optional is only one cache is defined
resources.doctrine.cache.defaultCacheInstance = default

; Cache Instance configuration for "default" cache
resources.doctrine.cache.instances.default.adapterClass = "Doctrine\Common\Cache\MemcacheCache"
resources.doctrine.cache.instances.default.namespace    = "Application_"
resources.doctrine.cache.instances.default.options.servers.0.host = localhost
resources.doctrine.cache.instances.default.options.servers.0.port = 11211

; ------------------------------------------------------------------------------
; Doctrine DBAL Configuration
; ------------------------------------------------------------------------------

; Points to default connection to be used. Optional if only one connection is defined
resources.doctrine.dbal.defaultConnection = default

; Database configuration
;resources.doctrine.dbal.connections.default.parameters.wrapperClass = ""
resources.doctrine.dbal.connections.default.parameters.driver   = "pdo_mysql"
resources.doctrine.dbal.connections.default.parameters.dbname   = "myapp"
resources.doctrine.dbal.connections.default.parameters.host = "localhost"
resources.doctrine.dbal.connections.default.parameters.port = 3306
resources.doctrine.dbal.connections.default.parameters.user = "myapp"
resources.doctrine.dbal.connections.default.parameters.password = "myapp"
resources.doctrine.dbal.connections.default.parameters.charset = "utf-8"
resources.doctrine.dbal.connections.default.parameters.driverOptions.1002 = "SET NAMES 'UTF8'"


; ------------------------------------------------------------------------------
; Doctrine ORM Configuration
; ------------------------------------------------------------------------------

; Points to default EntityManager to be used. Optional if only one EntityManager is defined
resources.doctrine.orm.defaultEntityManager = default

; EntityManager configuration for "default" manager
resources.doctrine.orm.entityManagers.default.connection     = default
resources.doctrine.orm.entityManagers.default.proxy.autoGenerateClasses = false
resources.doctrine.orm.entityManagers.default.proxy.namespace           = "MyApp\Entity\Proxy"
resources.doctrine.orm.entityManagers.default.proxy.dir                 = APPLICATION_PATH "/../library/MyApp/Entity/Proxy"

resources.doctrine.orm.entityManagers.default.metadataDrivers.annotationRegistry.annotationFiles[]     = APPLICATION_PATH "/../library/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php"

resources.doctrine.orm.entityManagers.default.metadataDrivers.0.adapterClass          = "Doctrine\ORM\Mapping\Driver\AnnotationDriver"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.mappingNamespace      = "MyApp\Entity"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.mappingDirs[]         = APPLICATION_PATH "/../library/MyApp/Entity"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.annotationReaderClass = "Doctrine\Common\Annotations\AnnotationReader"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.annotationReaderCache = default


[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
phpSettings.error_reporting = E_ALL | E_STRICT
resources.frontController.params.displayExceptions = 1

resources.doctrine.cache.instances.default.adapterClass = "Doctrine\Common\Cache\ArrayCache"
resources.doctrine.cache.instances.default.namespace    = "Application_"

回答1:

This is my mistake, I haven't noticed that the following lines:

resources.doctrine.orm.entityManagers.default.metadataDrivers.0.adapterClass          = "Doctrine\ORM\Mapping\Driver\AnnotationDriver"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.mappingNamespace      = "MyApp\Entity"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.mappingDirs[]         = APPLICATION_PATH "/../library/MyApp/Entity"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.annotationReaderClass = "Doctrine\Common\Annotations\AnnotationReader"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.annotationReaderCache = default

were renamed to

resources.doctrine.orm.entityManagers.default.metadataDrivers.drivers.0.adapterClass          = "Doctrine\ORM\Mapping\Driver\AnnotationDriver"
resources.doctrine.orm.entityManagers.default.metadataDrivers.drivers.0.mappingNamespace      = "MyApp\Entity"
resources.doctrine.orm.entityManagers.default.metadataDrivers.drivers.0.mappingDirs[]         = APPLICATION_PATH "/../library/MyApp/Entity"
resources.doctrine.orm.entityManagers.default.metadataDrivers.drivers.0.annotationReaderClass = "Doctrine\Common\Annotations\AnnotationReader"
resources.doctrine.orm.entityManagers.default.metadataDrivers.drivers.0.annotationReaderCache = default

(notice the drivers added before the0).



回答2:

FYI, Guilherme Blanco has updated Bisna. It now works with Doctrine 2.1.0 and 2.2.0 Source: http://phphints.wordpress.com/2011/07/10/getting-bisna-to-work-with-doctrinecommon-2-1-0/