Carlos Robles frikiblog

Warning: strpos(): Empty delimiter in \doctrine\common\lib\Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain.php on line 160

| 0 comments

Me vengo encontrando este error en Zend Framework 2 con doctrine, cuando tengo una clase que hereda de otra que no representa una entidad de la base de datos.

Despues de un rato de volverme loco a ver donde se originaba, veo que el error es muy obvio. Lo cuento.

Vemos que en el archivo mencionado en el titulo, tenemos esta función

  public function isTransient($className)
    {
        /* @var $driver MappingDriver */
        foreach ($this->drivers AS $namespace => $driver) {

            if (strpos($className, $namespace) === 0) {
                return $driver->isTransient($className);
            }
        }
        if ($this->defaultDriver !== null) {
            return $this->defaultDriver->isTransient($className);
        }
        return true;
    }

el error lo está dando en

strpos($className, $namespace)

Que al parecer, esta recibiendo un namespace vacion. vemos que estamos recorriendo los drivers, que son un array asociativo, donde la clave es el namespace y el valor es el driver asociado.

Los drivers, habitualmente se configuran en alguno de los archivos normales de configuracion de la aplicacion y del módulo, concretamente de esta forma

'doctrine' => array (
				'driver' => array (
						'mi_driver' => array (
								'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
								'cache' => 'array',
								'paths' => array (
										__DIR__ . '/../src/DBAL/Entity' 
								) 
						),
						
 
						'orm_default' => array (
								'drivers' => array (
										"NAMESPACE"=>"mi_driver", "NAMESPACE2"=>"mi_driver",

								) 
						) 
				) 
		) 
);

basicamente estamos creando configuraciones de drivers en [doctrine][driver], y despues en [orm_default][drivers] asociamos los distintos namespaces a alguno de los drivers configurados.

Pues bien, resulta qe en mi sección de drivers me encuentro:

	'orm_default' => array (
								'drivers' => array (
										'DBAL\Entity' => 'futdin_annotation_driver',
										'' => 'futdin_annotation_driver',
										'FooUser\Entity' => 'zfcuser_entity' 
								) 

y vemos que el error se ha introducido a mano, porque uno de los namespaces está vacio.
Recuerdo que cuando empecé esté proyecto, y había leido en algun lugar que se puede configurar un namespace vacio que representará el driver por defecto para cualquier namespace no explicitamente configurado, pero sencillamente esto no es verdad!.
Por tanto, tenemos que eliminar esa linea, y todo vuelve a funcionar normalmente.

Facebook Twitter Linkedin Plusone Digg Delicious Reddit Email

Leave a Reply

Required fields are marked *.