Frage Autoloading einer Klasse in Symfony 2.1


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

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 hier verschiedene Antworten angesehen, die empfehlen, app / autoload.php zu ändern, aber meine autoload.php sieht anders aus als die in den Antworten, vielleicht hat sich hier etwas zwischen 2.0 und 2.1 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.


7
2017-08-20 21:36


Ursprung


Antworten:


Für einen einfachen Fall wie diesen ist die schnellste Lösung die Erstellung eines Ordners (z. B. Common) direkt unter src und lege deine Klasse hinein.

src
  -- Common
    -- Tools.php

Tools.php enthält beispielsweise Ihre Klasse mit dem richtigen Namespace

<?php

namespace Common;

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

Bevor Sie Ihre Funktion aufrufen, vergessen Sie nicht die use Erklärung

use Common\Tools;

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

Wenn Sie Ihren Code unter setzen src Wenn Sie der Ordnerstruktur und dem Namespace wie oben folgen, funktioniert es ohne zu berühren app/autoload.php.


7
2017-08-21 09:33



Ein anderer Weg ist die Verwendung von /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;

Ersetzen Sie YOURNAMESPACE und YOURVENDOR durch Ihre Werte. Funktioniert für mich bisher recht gut.

Du hast recht, ich bin auf die Änderungen beim Autoload von 2.0 auf 2.1 gestoßen. Der obige Code funktioniert gut mit der neuesten Version, auf die ich mein Projekt aktualisiert habe ;-)


12
2017-10-05 12:36