wake-up-neo.net

Verwenden des automatischen Ladens von Composer

Ich habe mich im Internet umgesehen und hatte in dieser Angelegenheit kein Glück. Ich verwende das automatische Laden des Komponisten mit diesem Code in meinem composer.json:

"autoload": {
    "psr-0": {"AppName": "src/"}
}

Aber ich muss auf einer höheren Ebene als der Herstellerordner automatisch laden.

So etwas funktioniert nicht:

"autoload": {
    "psr-0": {"AppName": "../src/"}
}

Kennt jemand einen Fix oder wie ich das machen kann?

65
Chris R

Jedes Paket sollte für das Autoloading selbst verantwortlich sein. Was möchten Sie mit Autoloading-Klassen erreichen, die nicht in dem von Ihnen definierten Paket enthalten sind?

Eine Problemumgehung für Ihre Anwendung besteht darin, der Loader-Instanz einen Namespace hinzuzufügen.

<?php

$loader = require 'vendor/autoload.php';
$loader->add('AppName', __DIR__.'/../src/');
69
Seldaek

Die Komponistendokumentation besagt, dass:

Nachdem Sie das Autoload-Feld hinzugefügt haben, müssen Sie install erneut ausführen, um die Datei vendor/autoload.php erneut zu generieren.

Angenommen, Ihr "src" -Verzeichnis befindet sich auf derselben Ebene wie das "vendor" -Verzeichnis:

  • src
    • App Name
  • verkäufer
  • composer.json

die folgende Konfiguration ist absolut korrekt:

{
    "autoload": {
        "psr-0": {"AppName": "src/"}
    }
}

sie müssen jedoch die Abhängigkeiten erneut aktualisieren/installieren, damit sie für Sie funktionieren.

php composer.phar update

Dieser Befehl ruft die neuesten Versionen der Abhängigkeiten ab und aktualisiert die Datei "vendor/composer/autoload_namespaces.php" entsprechend Ihrer Konfiguration.

Wie von @Dom angegeben, können Sie auch composer dump-autoload, um den Autoloader zu aktualisieren, ohne ein Update durchführen zu müssen.

55

Es gibt auch andere Möglichkeiten, die Autoload-Funktionen von composer=) zu verwenden. Möglichkeiten, die zum Laden von Paketen ohne Namespaces oder von Paketen mit einer benutzerdefinierten Autoload-Funktion nützlich sein können.

Wenn Sie beispielsweise eine einzelne Datei einfügen möchten, die auch eine Autoload-Funktion enthält, können Sie die Direktive "files" wie folgt verwenden:

"autoload": {
    "psr-0": {
        "": "src/",
        "SymfonyStandard": "app/"
    },
    "files": ["vendor/wordnik/wordnik-php/wordnik/Swagger.php"]
},

Und in der Swagger.php Datei haben wir:

function swagger_autoloader($className) {
    $currentDir = dirname(__FILE__);
    if (file_exists($currentDir . '/' . $className . '.php')) {
        include $currentDir . '/' . $className . '.php';
    } elseif (file_exists($currentDir . '/models/' . $className . '.php')) {
        include $currentDir . '/models/' . $className . '.php';
    }
}
spl_autoload_register('swagger_autoloader');

https://getcomposer.org/doc/04-schema.md#files

Andernfalls möchten Sie möglicherweise eine Klassenzuordnungsreferenz verwenden:

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

https://getcomposer.org/doc/04-schema.md#classmap

Hinweis: Denken Sie während Ihrer Tests daran, den composer dump-autoload Befehl oder Sie werden keine Änderung sehen!

./composer.phar dump-autoload

Viel Spaß beim Autoloaden =)

22

Meiner Meinung nach sollte Sergiy's answer die ausgewählte Antwort für die gegebene Frage sein. Ich teile mein Verständnis.

Ich habe versucht, meine Paketdateien mit composer, das ich unter der unten angegebenen Verzeichnisstruktur habe, automatisch zu laden.

<web-root>
    |--------src/
    |           |--------App/
    |           |
    |           |--------Test/
    |
    |---------library/
    |
    |---------vendor/
    |           |
    |           |---------composer/
    |           |           |---------autoload_psr4.php
    |           |           
    |           |----------autoload.php
    |
    |-----------composer.json
    |

Ich verwende psr-4 Autoloading-Spezifikation.

Musste unten stehende Zeilen zur composer.json des Projekts hinzufügen. Ich beabsichtige, meine Klassendateien im Verzeichnis src/App, src/Test und library abzulegen.

"autoload": {
        "psr-4": {
            "OrgName\\AppType\\AppName\\": ["src/App", "src/Test", "library/"]
        }
    } 

Das ist so ziemlich selbsterklärend. OrgName\AppType\AppName ist mein beabsichtigtes Namespace-Präfix. z. B. für die Klasse User in src/App/Controller/Provider/User.php -

namespace OrgName\AppType\AppName\Controller\Provider; // namespace declaration

use OrgName\AppType\AppName\Controller\Provider\User; // when using the class

Beachten Sie auch, dass "src/App", "src/Test" ... aus Ihrem Webstamm stammen, in dem sich Ihre composer.json befindet. Nix mit dem Herstellerverzeichnis zu tun. Schauen Sie sich vendor/autoload.php an

Wenn composer richtig installiert ist, ist nur # composer update erforderlich

Nach dem composer Update wurden meine Klassen erfolgreich geladen. Ich habe festgestellt, dass composer eine Zeile in der Datei vendor/composer/autoload_psr4.php hinzufügt

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
    'OrgName\\AppType\\AppName\\' => array($baseDir . '/src/App', $baseDir . '/src/Test', $baseDir . '/library'),
);

Dies ist, wie composer maps. Für PSR-0-Mapping ist in vendor/composer/autoload_classmap.php

12
nayak

Erstellen Sie einfach in Ihrem src-Ordner einen Symlink für den Namespace, der auf den Ordner mit Ihren Klassen verweist ...

ln -s ../src/AppName ./src/AppName

Ihr Autoload in composer sieht genauso aus ...

"autoload": {
    "psr-0": {"AppName": "src/"}
}

Und Ihre Klassen mit AppName-Namespace starten jetzt ein Verzeichnis aus Ihrem aktuellen Arbeitsverzeichnis in einem src -Ordner, das funktionieren sollte.

3
JamesHalsall

Die Autoload-Konfiguration startet unterhalb des Herstellerverzeichnisses. Möglicherweise möchten Sie also das Herstellerverzeichnis ändern, z.

{
    "config": {
        "vendor-dir": "../vendor/"
    },
    "autoload": {
        "psr-0": {"AppName": "src/"}
    }
}

Oder ist das in Ihrem Projekt nicht möglich?

3
acme