Mir sind Fragen wie diese bekannt , bei denen die Leute dazu neigen, das allgemeine Symfony 2-Konzept des Bundles zu diskutieren.
Die Sache ist, in einer bestimmten Anwendung, wie zum Beispiel einer Twitter-ähnlichen Anwendung, sollte sich wirklich alles in einem generischen Bundle befinden, wie die offiziellen Dokumente sagen?
Der Grund, warum ich dies frage, ist, dass wir bei der Entwicklung von Anwendungen im Allgemeinen unseren Code nicht in hohem Maße an ein Full-Stack-Kleberahmenwerk koppeln möchten.
Wenn ich eine Symfony 2-basierte Anwendung entwickle und irgendwann beschließe, dass Symfony 2 nicht wirklich die beste Wahl ist, um die Entwicklung am Laufen zu halten , ist das ein Problem für mich?
Die allgemeine Frage lautet also: Warum ist alles, was ein Bündel ist, eine gute Sache?
EDIT # 1
Fast ein Jahr, seit ich diese Frage gestellt habe, habe ich einen Artikel geschrieben , um mein Wissen zu diesem Thema zu teilen.
quelle
Antworten:
Ich habe einen ausführlicheren und aktualisierten Blog-Beitrag zu diesem Thema geschrieben: http://elnur.pro/symfony-without-bundles/
Nein, nicht alles muss in einem Bündel sein. Sie könnten eine Struktur wie diese haben:
src/Vendor/Model
- für Modelle,src/Vendor/Controller
- für Steuerungen,src/Vendor/Service
- für Dienstleistungen,src/Vendor/Bundle
- für Bündel, wiesrc/Vendor/Bundle/AppBundle
,Auf diese Weise würden Sie in die setzen
AppBundle
nur das Zeug einfügen, das wirklich Symfony2-spezifisch ist. Wenn Sie später zu einem anderen Framework wechseln, wird derBundle
Namespace entfernt und durch das ausgewählte Framework ersetzt.Bitte beachten Sie, dass ich hier einen app- spezifischen Code vorschlage . Für wiederverwendbare Bundles empfehle ich weiterhin die Verwendung der Best Practices .
Entitäten aus Bündeln heraushalten
Um Entitäten
src/Vendor/Model
außerhalb eines Bundles zu halten, habe ich dendoctrine
Abschnitt inconfig.yml
von geändertzu
Die Namen der Entitäten - für den Zugriff über Doctrine-Repositories - beginnen
Model
in diesem Fall beispielsweise mitModel:User
.Sie können Subnamespaces verwenden, um beispielsweise verwandte Entitäten zu gruppieren
src/Vendor/User/Group.php
. In diesem Fall lautet der Name der EntitätModel:User\Group
.Controller von Bündeln fernhalten
Zunächst müssen Sie JMSDiExtraBundle anweisen , den
src
Ordner nach Diensten zu durchsuchen , indem Sie Folgendes hinzufügenconfig.yml
:Anschließend definieren Sie Controller als Services und fügen sie unter den
Controller
Namespace ein:Beachten Sie, dass ich mein ElnurAbstractControllerBundle verwende , um die Definition von Controllern als Dienste zu vereinfachen.
Als letztes müssen Sie Symfony anweisen, nach Vorlagen ohne Bundles zu suchen. Dazu überschreibe ich den Template Guesser-Dienst. Da sich der Ansatz zwischen Symfony 2.0 und 2.1 unterscheidet, stelle ich Versionen für beide bereit.
Überschreiben des Symfony 2.1+ Template Guesser
Ich habe ein Bundle erstellt , das das für Sie erledigt.
Überschreiben des Symfony 2.0-Vorlagen-Listeners
Definieren Sie zunächst die Klasse:
Und dann weisen Sie Symfony an, es zu verwenden, indem Sie Folgendes hinzufügen
config.yml
:Vorlagen ohne Bundles verwenden
Jetzt können Sie Vorlagen aus Bundles verwenden. Bewahren Sie sie unter dem
app/Resources/views
Ordner auf. Vorlagen für diese beiden Aktionen des obigen Beispielcontrollers befinden sich beispielsweise in:app/Resources/views/User/add.html.twig
app/Resources/views/User/profile.html.twig
Wenn Sie auf eine Vorlage verweisen, lassen Sie einfach den Bundle-Teil weg:
quelle
generate:doctrine:crud
erwartet beispielsweise, dass sich die Entität (= Modell in elnurs Fall) innerhalb eines Bündels befindet, um zu funktionieren.Natürlich können Sie Ihre Bewerbung entkoppeln. Entwickeln Sie es einfach als Bibliothek und integrieren Sie es in den Symfony-
vendor/
Ordner (entweder mitdeps
odercomposer.json
, je nachdem, ob Sie Symfony2.0 oder Symfony2.1 verwenden). Sie benötigen jedoch mindestens ein Bundle, das als "Frontend" Ihrer Bibliothek fungiert, in dem Symfony2 den Controller (und dergleichen) findet.quelle
symfony-2.0
gehe ich davon aus, dass Sie die aktuelle Version 2.0 verwenden. In diesem Fall erstellen Sie ein Git-Repository, wo immer Sie möchten, und fügen Sie alles ein, was Sie unabhängig von Symfony entwickeln möchten. Aktualisieren Sie in Ihrem Symfony-Projekt Ihredeps
-Datei wie hier erwähnt symfony.com/doc/current/cookbook/workflow/…. Erstellen Sie dann einfach ein (oder mehrere) Anwendungspakete (n) (php app/console generate:bundle
) für das symfony-spezifische Material.Eine übliche Symfony-Distribution kann ohne zusätzliches (Anwendungs-) Bundle funktionieren, je nachdem, wie viele Funktionen Sie vom Full-Stack-Framework verwenden möchten.
Zum Beispiel können Ihre Controller beliebig aufrufbar sein, die an einer beliebigen Stelle in Ihrer Projektstruktur platziert werden können, sobald sie automatisch geladen werden.
In einer Routing-Definitionsdatei können Sie Folgendes verwenden:
Es kann jedes einfache alte PHP-Objekt sein, das nur durch die Tatsache an das Framework gebunden ist, dass es a zurückgeben muss
Symfony\Component\HttpFoundation\Response
Objekt zurückgeben muss.Ihre Zweigvorlagen (oder andere) können wie
app/Resources/views/template.html.twig
folgt platziert und mithilfe von gerendert werden::template.html.twig
logischen Namens .Alle DI-Dienste können in app / config / config.yml definiert (oder aus importiert werden) werden
app/config/services.yml
, und alle Dienstklassen können auch einfache alte PHP-Objekte sein, die überhaupt nicht an das Framework gebunden sind.All dies wird standardmäßig vom symfony Full Stack Framework bereitgestellt.
Wo werden Sie Probleme haben, wenn Sie Übersetzungsdateien verwenden wollen (wie XLIFF), weil sie durch Bündel entdeckt werden nur .
Die Symfony-Light- Verteilung zielt darauf ab, diese Art von Problemen zu lösen, indem alles entdeckt wird, was normalerweise nur durch Bündel entdeckt wird.
quelle
Sie könnten KnpRadBundle verwenden , um die Projektstruktur zu vereinfachen.
Ein anderer Ansatz besteht darin, ihn
src/Company/Bundle/FrontendBundle
beispielsweise für die Bundles undsrc/Company/Stuff/Class.php
für Klassen zu verwenden, die symfonieunabhängig sind und außerhalb des Frameworks wiederverwendet werden könntenquelle
Bundle
geht direkt auf das öffentliche Teilen. Wenn ich eine Anwendung schreibe, möchte ich meinen Code nicht freigeben, außer den Teilen, die ich absichtlich als Community-gesteuerte Module erstellt habe. Liege ich falsch?Da bereits 5 Jahre vergangen sind, finden Sie hier einige weitere Artikel zu Symfony Bundles.
TLDR:
TLDR:
quelle
Das Symfony-Framework eignet sich sehr gut, um schnell einen Proof of Concept zu starten, und der gesamte Code kann in die Standard-Bundle-Anwendung in src / eingegeben werden
In diesem Bundle können Sie Ihren Code nach Ihren Wünschen strukturieren.
Wenn Sie andere Technologien für die Entwicklung Ihres POC verwenden möchten, können Sie diese problemlos übersetzen, da Sie nicht den gesamten Code in der Bundle-Konzeption strukturieren.
Bei allem Konzept haben Sie dies nicht extremisiert. Bündel ist gut, aber alles bündeln und der Alltag ist nicht gut.
Möglicherweise können Sie ein Silex (Symfony Micro Framework) verwenden, um Ihren Proof of Concept zu entwickeln und die Auswirkungen von Bundle-Drittanbietern zu verringern.
quelle