2012-08-20 7 views
8

Ich portiere ein Symfony 1.2-Projekt nach Symfony 2.x. Ich führe gerade die neueste Version 2.1.0-dev.Autoloading einer Klasse in Symfony 2.1

Von meinem alten Projekt habe ich eine Klasse namens Tools, die einige einfache Funktionen für Dinge wie Munging Arrays in Strings und Erzeugung von Schnecken aus Strings hat. Ich möchte diese Klasse in meinem neuen Projekt verwenden, aber ich weiß nicht, wie ich diese Klasse außerhalb eines Bündels verwenden soll.

Ich habe mir verschiedene Antworten hier angesehen, die empfehlen, app/autoload.php zu ändern, aber meine autoload.php sieht anders aus als in den Antworten, vielleicht hat sich hier zwischen 2.0 und 2.1 etwas geändert.

Ich möchte meine Klasse in meinen Quellverzeichnissen oder App-Verzeichnissen behalten, da sie unter Quellcodeverwaltung stehen. Mein Vendor-Verzeichnis ist nicht so, wie ich Composer verwende, um sich darum zu kümmern.

Jeder Rat würde hier geschätzt werden.

Antwort

7

Für einen einfachen Fall wie diesen ist die schnellste Lösung, einen Ordner zu erstellen (zum Beispiel Common) direkt unter src und bringen Sie Ihre Klasse hinein.

src 
    -- Common 
    -- Tools.php 

Tools.php enthält die Klasse mit der richtigen Namensraum, zum Beispiel

<?php 

namespace Common; 

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

Bevor Sie Ihre Funktion aufrufen nicht vergessen, die use Aussage

use Common\Tools; 

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

Wenn Sie Ihren Code unter src folgenden setzen die Ordnungsgemäße Ordnerstruktur und Namespace wie oben, es funktioniert ohne Berührung app/autoload.php.

+0

Awesome, ich habe meine Klasse in Lib \ Tools und Symfony automatisch in Ordnung gebracht. Prost! –

+0

Es funktioniert nicht für mich. Ich fragte Grund hier http://stackoverflow.com/questions/19652384/symfony2-custom-class-not-found. Bitte helfen Sie, wenn Sie wissen, warum es nicht funktioniert –

12

Eine andere Möglichkeit ist es, die /app/config/autoload.php zu verwenden:

<?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; 

Gerade YOURNAMESPACE und YOURVENDOR mit Ihren Werten ersetzen. Funktioniert für mich bisher recht gut.

Sie sind richtig, ich stolperte über die Änderungen in Autoload von 2.0 bis 2.1. Der obige Code funktioniert gut mit der neuesten Version, auf die ich mein Projekt aktualisiert habe ;-)

+3

+1 Großartig! Endlich gefunden, wonach ich gesucht habe. Dies sollte im Symfony doc gehen. – Mick

+1

Ist dies immer noch die richtige Methode zum Laden benutzerdefinierter PSR-0-kompatibler Herstellerbibliotheken, die nicht zu Packagist gehören? –

+1

Nein, ist es nicht ... Da das Autoload jetzt über generierten Autoloader von Composer erfolgt, sollten alle Ihre Namespace-Klassen im Vendor verfügbar sein. – maschmann