Wo stelle ich allgemeinen Bibliothekscode in Symfony 2 ein?

9

Schnelle Frage: Wo sollte ich Code einfügen, der ähnliche Eigenschaften wie die Controller Utilities Service Class hat, wie hier in diesem Blogbeitrag von Benjamin Eberlei ( Ссылка )?

In der Zwischenzeit habe ich es eingefügt: src / ProjectName / Library

Kontext

Ich habe folgendes bemerkt:

  • Diese Logik gehört nicht zu einem bestimmten Paket , sondern gilt für alle Pakete, die erstellt werden sollen.
  • Diese Logik gehört normalerweise zu einer anwendungsspezifischen Bibliothek und ist nicht Teil eines Bundles, da Controller innerhalb von Bundles diesen Bibliothekscode entweder erweitern oder verwenden.

Ich habe einige Antworten auf Fragen gefunden, die thematisch ähnlich sind, aber nicht genau das, wonach ich gesucht habe

Nach meinen Recherchen hier auf SO allein scheint diese Frage etwas zu Tode getreten zu sein, aber ich denke, die Fragen, die zuvor gestellt wurden, gehen um, worum es eigentlich geht. Unabhängig davon scheint es, dass ich die folgenden Optionen habe:

  • Diese Typen von Erweiterungen in ein Bundle einfügen - nicht anwendbar, da die Art der Funktionalität, die ich entwickle, im Wesentlichen den Framework-Code erweitert.
  • Erstellen eines Lieferantenverzeichnisses für das Projekt, in das der gesamte Bibliothekscode gehen würde - wenn dies tatsächlich die beste Vorgehensweise ist, würde es im Wesentlichen bedeuten, dass ich die Bibliothek über private Repos im Composer verfügbar machen müsste , aber das bedeutet, dass ich eine separate Codebasis pflegen müsste.
  • Erstellen Sie eine Art Pseudo-Connector-Paket , das in der src / Company / SomeNamespace existiert - ich weiß nicht einmal, ob dies überhaupt der richtige Weg ist, aber wenn es mit SF best practice übereinstimmt Ich werde mich weiter damit beschäftigen.

Noch einmal kurz die Frage: Wo gebe ich Klassen an, die generische, globale Funktionalität in Symfony 2 bieten?

Mein Dank im Voraus.

    
rvdavid 11.11.2013, 17:00
quelle

2 Antworten

2

Diese Dokumentation über Composer-Repositories ist eine großartige Referenz und der Dokumentation zu Paketen, die Composer nicht unterstützen sollte das sein, wonach Sie suchen.

Ich möchte auch die Dokumentation zu VCS zur Kenntnis nehmen, die oft bei Bedarf verwendet wird fork a Bundle und überschreibe das Original (ich habe es einige Male benutzt).

Sie können Folgendes tun - Sie brauchen kein Verpackungssystem oder was auch immer. Sie müssen das Paket nur als Zip-Datei bereitstellen, auf die Ihr Computer über eine URL zugreifen kann.

%Vor%

Wenn Ihr Paket PSR-0 nicht unterstützt, müssen Sie die Option "classmap" Wenn Ihr Paket PSR-0 unterstützt, müssen Sie die Option bsr-0 verwenden.

    
Thomas Potaire 12.11.2013, 05:42
quelle
1

Nach einigem Herumalbern, während die akzeptierte Antwort hier einen Verdienst hat, habe ich beschlossen, ein "Core" -Bündel zu erstellen, in dem alle meine Projekte übergreifende / anwendungsweite Abhängigkeiten und Ressourcen enthalten.

Dies ermöglicht es mir, einen zentralen Platz für alle Assets, verbundene Entitäten und projektspezifischen Bibliothekscode zu haben.

Zum Refactoring positioniert

Ich habe innerlich mit mir selbst begründet, dass dies eine glückliche mittelfristige (vielleicht temporäre) Lösung ist, die es mir erlaubt, mit der Entwicklung fortzufahren und nicht mit der Analyseparalyse, in der ich mich gerade befinde.

Wenn ich die Dinge auf diese Weise mache, kann ich die Flex-Punkte später in die Händlerverzeichnis-Lösung umwandeln.

Wenn Sie an einem Projekt arbeiten und durch das etwas unnatürliche Gefühl verärgert sind, dass Ihre Entitäten und Ihr Bibliothekscode in verschiedenen Bündeln verstreut sind wie ich, wäre dies eine gute Lösung.

Es ändert nicht das Standardverhalten von SF2 und Doctrine 2

Ich habe zuvor eine Modifikation der Konfiguration von Symfony 2 Doctrine 2 implementiert, die es mir erlaubte (zu Recht) Entitäten aus dem Bundle und in einen separaten, zentralen Namespace zu entfernen.

Ich mochte diese Idee. Ich habe es eine Weile benutzt. Der Nachteil bei diesem Ansatz besteht darin, dass Sie die Befehlszeilenschnittstelle nicht mehr verwenden können, wenn Sie schnell eine Doktrinentität als Bundle-Namespace erstellen möchten.

Ich dachte, es wäre in Ordnung, weil ich die Dinge sowieso ändern müsste, aber dann dachte ich:

  • "Wie wäre es mit den Form-Objekten? Wo stelle ich diese her? In ihrem eigenen Verzeichnis unter / src wie Entity is?
  • Was ist mit der Serviceschicht? (nicht DI, sondern die eigentliche Service-Schicht - wo die Anwendungslogik lebt) "

Auf halbem Wege schreibe ich noch eine weitere Frage "wo soll ich XXXX in Symfony 2 setzen" (ich bin sicher, dass die Leute, die den PHP- und Symfony2-Tags folgen, nicht sehen können), ich habe aufgehört und sie in ein Bündel gelegt Ich habe das Assets-Paket aufgerufen und es in Core-Paket umbenannt.

Das Core-Paket Auf diese Weise ist es in einem Bundle gemäß der CLI-Anforderung, es ist viel einfacher zu folgen und ich kann den Inhalt dieses Bundles semantisch teilen, da es Core-Code enthält, der für die Anwendung spezifisch ist:

  • Entitäten.
  • Generische Formulare.
  • Generische HTML-, CSS- und JavaScript-Assets.
  • Projektspezifischer Bibliothekscode.
  • Meine Twig-Erweiterungen leben auch hier.
  • Schließlich gehen die Service-Layer-Klassen und ihre zugehörigen Fabriken auch hierhin.
  • Wenn ich weitere Erweiterungen für Symfony für dieses Projekt habe, füge ich sie hier hinzu.

Am wichtigsten ist, wenn ich Zeit habe, mich hinzusetzen und mit Composer et al zu arbeiten, kann ich das leicht umschreiben, weil alles an einem Ort existiert.

Also. In einer Nussschale. Um meine eigene Frage zu beantworten: Wo füge ich generischen Bibliothekscode in Symfony 2 ein?

Ich würde es in ein Paket einfügen, das speziell zum Speichern von Assets, Ressourcen und Bibliothekscode erstellt wurde, auf das mehrere Pakete mithilfe der folgenden Empfehlungen zugreifen können:

  • Erstellen Sie ein Core-Paket.
  • Geben Sie hier den allgemeinen Bibliothekscode ein.
  • Platziere alle Entitäten hier.
  • Legen Sie hier generische Assets (main.css, reset.css usw.) ab.
  • Legen Sie hier allgemeine Formulare an.
  • Fügen Sie alle Service-Layer-Klassen hier ein.

Packen und installieren Sie über Composer

Recherchieren Sie, wie Sie Ihre Dateistruktur so formatieren, dass sie PSR-0-konform ist, wenn Sie anfangen, composer zu verwenden:

  • Formatieren Sie es als PSR-0-konform.
  • Packe es in eine Zip-Datei und installiere es via Composer (gemäß @Thomas Potaires editted Anweisungen)

Die Anwendung / das Projekt - Bundles, die die Anwendung erstellen, sich aber auf das Core Bundle verlassen.

Core Bundle - Erweitert SF2 an wichtigen Punkten, enthält gemeinsame Ressourcen und Bibliothekscode. Da ich die Funktionsweise des Frameworks nicht geändert habe, sind die Dateien dort, wo SF2 sie erwartet. Das bedeutet, dass ich immer noch seine Generatoren für Entitäten verwenden kann.

Ich werde kein Problem damit haben, dass hier Scaffolding / CRUD-Bildschirme erzeugt werden, da diese als Prototypen betrachtet werden und keine echten Anwendungsfunktionen.

SF2 Layer. - bleibt unverändert unverändert. Erweitert.

rvdavid 13.11.2013 21:13
quelle

Tags und Links