2011-05-30 8 views
13

Estoy experimentando con la creación de una extensión con el Silex php micro framework para la autenticación del usuario, pero parece que no puedo hacer que el autocargador funcione. ¿Alguien puede arrojar algo de luz?Cómo registrar un espacio de nombres con el autocargador Silex

I tienen una estructura de directorio como esto (truncada)

usertest 
|_lib 
| |_silex.phar 
| |_MyNamespace 
| |_UserExtension.php 
| |_User.php 
|_www 
    |_index.php 

Los bits pertinentes de index.php, que sirve como el bootstrap y la mirada controlador frontal como esto:

require '../lib/silex.phar'; 

use Silex\Application; 
use MyNamespace\UserExtension; 

$app = new Application(); 
$app['autoloader']->registerNamespace('MyNamespace', '../lib'); 
$app->register(new UserExtension()); 

El la clase que estoy tratando de carga es similar esto:

namespace MyNamespace; 

use Silex\Application; 
use Silex\ExtensionInterface; 

class UserExtension implements ExtensionInterface { 
    public function register(Application $app) { 
     $app['user'] = $app->share(function() use($app) { 
      return new User(); 
     }); 
    } 
} 

Todo bastante sencillo excep t se lanza este error:

Fatal error: Class 'MyNamespace\UserExtension' not found in /home/meouw/Projects/php/usertest/www/index.php on line 8 

he incursionado con Symfony2 y han seguido con éxito el instructions for setting up the universal class loader, pero en este caso estoy perplejo. ¿Me estoy perdiendo de algo? Cualquier ayuda sería apreciada.

+0

No se pudo reproducirse. Lo intenté exactamente con el código que me proporcionó y lo logré. Deberá verificar sus nombres o compartir su código real. – igorw

Respuesta

11

que haría uso de

$app['autoloader']->registerNamespace('MyNamespace', __DIR__.'/../lib'); 
+0

Eso es lo que usé al final y funcionó bien. Gracias – meouw

+9

El cargador automático está en desuso en las versiones recientes de Silex, consulte [mi respuesta] (http://stackoverflow.com/a/11339189/187018) para obtener una actualización. – ChrisR

+0

@ChrisR su respuesta también está en desuso ahora verifique mi respuesta para la solución más novedosa – Robert

3

Para registrar espacios de nombres, simplemente llame registerNamespaces() así:

$app = new Silex\Application(); 

$app['autoloader']->registerNamespaces(array(
    'Symfony'   => __DIR__.'/../vendor/', 
    'Panda'   => __DIR__.'/../vendor/SilexDiscountServiceProvider/src', 
    'Knp'    => __DIR__.'/../vendor/KnpSilexExtensions/', 
    // ... 
)); 
59

En versiones recientes de Silex el cargador automático es obsoleto y debería registrar todos los espacios de nombres a través de la composer.json archivo que imo es una solución más agradable porque está centralizando sus definiciones de carga automática.

Ejemplo:

{ 
    "require": { 
     "silex/silex": "1.0.*@dev" 
    }, 
    "autoload": { 
     "psr-0": { 
      "MyNameSpace": "src/" 
     } 
    } 
} 

De hecho, cuando se intenta acceder al cargador automático en cualquier versión reciente de Silex la siguiente RuntimeException es lanzada:

You tried to access the autoloader service. The autoloader has been removed from Silex. It is recommended that you use Composer to manage your dependencies and handle your autoloading. See http://getcomposer.org for more information.

+0

Por lo que tengo entendido, ¿se requiere que Composer se instale en mi estación de trabajo? – Fractaliste

+0

Puede instalar el compositor localmente en su proyecto PHP, consulte https://getcomposer.org/doc/00-intro.md#locally – ChrisR

+0

No puedo instalarlo, necesita derechos de administrador. ¿Pdsr-4 puede evitar ejecutar el compositor? – Fractaliste

3

Tanto la adición de declaración apropiada a la sección autoload de composer.json y el registro de espacios de nombres directamente llamando a registerNamespace no funcionaba para mí, hasta que ejecuté composer update en la pr carpeta de proyectos.

+0

es porque la instalación del compositor necesita el archivo composer.lock – Robert

11
Deprecated - As of 2014-10-21 PSR-0 has been marked as deprecated. 
PSR-4 is now recommended as an alternative 

Es por ello que se debe utilizar la sintaxis PSR-4 en composer.json

{ 
    "require": { 
     "silex/silex": "1.0.*@dev", 
    }, 
    "autoload": { 
     "psr-4": { 
      "Vendor\\Namespace\\": "/path" 
     } 
    } 
} 
+0

no funciona para mí = ('Class" Controllers \ MyController "no existe.' – holms

+0

Necesita tener una estructura de directorios adecuada :) y por supuesto cambiar "\ Vendor \" \ namespace ": and"/path " – Robert

+0

¡Funcionó como un amuleto! Y +1 en PSR-4 vs PSR-0. –

Cuestiones relacionadas