2012-08-20 11 views
8

Estoy trasladando un proyecto de Symfony 1.2 a Symfony 2.x. Actualmente estoy ejecutando la última versión 2.1.0-dev.Carga automática de una clase en Symfony 2.1

De mi antiguo proyecto tengo una clase llamada Tools que tiene algunas funciones simples para cosas como munging arrays en strings y generar slugs de strings. Me gustaría utilizar esta clase en mi nuevo proyecto, pero no tengo claro cómo usar esta clase fuera de un paquete.

He visto aquí varias respuestas que recomiendan cambiar la aplicación/autoload.php pero mi autoload.php parece diferente a las respuestas, tal vez algo haya cambiado aquí entre 2.0 y 2.1.

Me gustaría mantener mi clase en mi src o en los directorios de la aplicación, ya que están bajo control de fuente. El directorio de mi proveedor no es como yo estoy usando el compositor para encargarme de eso.

Cualquier consejo sería apreciado aquí.

Respuesta

7

Para un caso simple como este, la solución más rápida es crear una carpeta (por ejemplo Common) directamente debajo de src y poner su clase en ella.

src 
    -- Common 
    -- Tools.php 

Tools.php contiene su clase con espacio de nombres adecuado, por ejemplo

<?php 

namespace Common; 

class Tools 
{ 
    public static function slugify($string) 
    { 
     // ... 
    } 
} 

Antes de llamar a su función no se olvide la declaración use

use Common\Tools; 

// ... 
Tools::slugify('my test string'); 

Si usted pone su código bajo src después de la la estructura de carpetas y el espacio de nombres correctos como se indica arriba, funcionará sin tocar app/autoload.php.

+0

Impresionante, puse mi clase en Lib \ Tools y Symfony la cargó en la máquina de manera automática. ¡Aclamaciones! –

+0

No funciona para mí. Le pregunté por qué razón aquí http://stackoverflow.com/questions/19652384/symfony2-custom-class-not-found. Por favor, ayuda si sabes por qué no funciona –

12

Otra forma es utilizar el /app/config/autoload.php:

<?php 

use Doctrine\Common\Annotations\AnnotationRegistry; 

$loader = require __DIR__.'/../vendor/autoload.php'; 
$loader->add('YOURNAMESPACE', __DIR__.'/../vendor/YOURVENDOR/src'); 


// intl 
if (!function_exists('intl_get_error_code')) { 
    require_once _DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php'; 

    $loader->add('', __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs'); 
} 

AnnotationRegistry::registerLoader(array($loader, 'loadClass')); 

return $loader; 

basta con sustituir YOURNAMESPACE y YOURVENDOR con sus valores. Funciona bastante bien para mí, hasta ahora.

Tiene razón, me encontré con los cambios en autocarga de 2.0 a 2.1. El código anterior funciona bien con la última versión, a la cual actualicé mi proyecto ;-)

+3

+1 ¡Genial! Finalmente encontré lo que estaba buscando. Esto debería ir en el documento de Symfony. – Mick

+1

¿Sigue siendo esta la forma correcta de cargar bibliotecas de proveedores compatibles con PSR-0 que no forman parte de Packagist? –

+1

No, no es ... Como la carga automática ahora se realiza a través del autocargador generado por el compositor, todas las clases de espacio de nombres en el proveedor deben estar disponibles. – maschmann

Cuestiones relacionadas