Je suis au courant de questions comme celle-ci , où les gens ont tendance à discuter du concept général de bundle Symfony 2.
Le problème est que, dans une application spécifique, comme, par exemple, une application de type Twitter, tout devrait-il vraiment être à l'intérieur d'un bundle générique, comme le disent les documents officiels ?
La raison pour laquelle je pose cette question est que, lorsque nous développons des applications, en général, nous ne voulons pas coupler fortement notre code à un cadre de collage à pile complète.
Si je développe une application basée sur Symfony 2 et, à un moment donné, je décide que Symfony 2 n'est pas vraiment le meilleur choix pour continuer le développement , est-ce que ce sera un problème pour moi?
La question générale est donc: pourquoi tout ce qui est groupé est-il une bonne chose?
EDIT # 1
Presque un an maintenant, depuis que j'ai posé cette question, j'ai écrit un article pour partager mes connaissances sur ce sujet.
la source
Réponses:
J'ai écrit un article de blog plus approfondi et mis à jour sur ce sujet: http://elnur.pro/symfony-without-bundles/
Non, tout ne doit pas nécessairement être regroupé. Vous pourriez avoir une structure comme celle-ci:
src/Vendor/Model
- pour les modèles,src/Vendor/Controller
- pour les contrôleurs,src/Vendor/Service
- pour les services,src/Vendor/Bundle
- pour les paquets, commesrc/Vendor/Bundle/AppBundle
,De cette façon, vous
AppBundle
mettriez le seul truc qui est vraiment spécifique à Symfony2. Si vous décidez de passer à un autre framework plus tard, vous vous débarrasserez de l'Bundle
espace de noms et le remplacerez par le framework choisi.Veuillez noter que ce que je suggère ici concerne le code spécifique à l' application . Pour les bundles réutilisables, je suggère toujours d'utiliser les meilleures pratiques .
Garder les entités hors des bundles
Pour conserver les entités en
src/Vendor/Model
dehors de tout ensemble, j'ai changé ladoctrine
sectionconfig.yml
depuisà
Les noms des entités - pour accéder à partir des référentiels Doctrine - commencent
Model
dans ce cas, par exemple,Model:User
,.Vous pouvez utiliser subnamespaces à des entités liées au groupe ainsi que , par exemple,
src/Vendor/User/Group.php
. Dans ce cas, le nom de l'entité estModel:User\Group
.Garder les contrôleurs hors des bundles
Tout d'abord, vous devez dire à JMSDiExtraBundle d'analyser le
src
dossier pour les services en l'ajoutant àconfig.yml
:Ensuite, vous définissez les contrôleurs comme des services et les placez sous l'
Controller
espace de noms:Notez que j'utilise mon ElnurAbstractControllerBundle pour simplifier la définition des contrôleurs en tant que services.
La dernière chose qui reste est de dire à Symfony de rechercher des modèles sans bundles. Je le fais en remplaçant le service de devinette de modèle, mais comme l'approche est différente entre Symfony 2.0 et 2.1, je fournis des versions pour les deux.
Remplacer le devineur de modèles Symfony 2.1+
J'ai créé un bundle qui fait ça pour vous.
Substitution de l'écouteur de modèles Symfony 2.0
Définissez d'abord la classe:
Et puis dites à Symfony de l'utiliser en l'ajoutant à
config.yml
:Utilisation de modèles sans bundles
Maintenant, vous pouvez utiliser des modèles hors des bundles. Gardez-les sous le
app/Resources/views
dossier. Par exemple, les modèles de ces deux actions de l'exemple de contrôleur ci-dessus se trouvent dans:app/Resources/views/User/add.html.twig
app/Resources/views/User/profile.html.twig
Lorsque vous faites référence à un modèle, omettez simplement la partie de l'ensemble:
la source
generate:doctrine:crud
par exemple s'attend à ce que l'entité (= modèle dans le cas d'elnur) soit à l'intérieur d'un bundle pour fonctionner.Bien sûr, vous pouvez découpler votre application. Développez-le simplement en tant que bibliothèque et
vendor/
intégrez-le dans le dossier symfony (en utilisant ledeps
oucomposer.json
, selon que vous utilisez Symfony2.0 ou Symfony2.1). Cependant, vous avez besoin d'au moins un bundle, qui agit comme le "frontend" de votre bibliothèque, où Symfony2 trouve le contrôleur (et autres).la source
symfony-2.0
je suppose que vous utilisez la version 2.0 actuelle. Dans ce cas, créez un référentiel git où vous voulez et mettez-y tout, ce que vous voulez développer indépendamment de symfony. Dans votre projet symfony, mettez à jour votredeps
-fichier comme mentionné ici symfony.com/doc/current/cookbook/workflow/… Ensuite, créez simplement un (ou plusieurs) paquet (s) d'application (php app/console generate:bundle
) pour les éléments spécifiques à symfony.Une distribution symfony habituelle peut fonctionner sans bundle (d'application) supplémentaire, selon le nombre de fonctionnalités que vous souhaitez utiliser à partir du framework de pile complet.
Par exemple, vos contrôleurs peuvent être n'importe quel appelable qui peut être placé n'importe où dans la structure de votre projet, dès qu'ils sont chargés automatiquement.
Dans un fichier de définition de routage, vous pouvez utiliser:
Il peut s'agir de n'importe quel objet php ancien, uniquement lié au framework par le fait qu'il doit renvoyer un
Symfony\Component\HttpFoundation\Response
objet.Vos modèles de brindilles (ou autres) peuvent être mis comme
app/Resources/views/template.html.twig
et peuvent être rendus en utilisant le::template.html.twig
nom logique.Tous les services DI peuvent être définis dans app / config / config.yml (ou importés
app/config/services.yml
par exemple, et toutes les classes de service peuvent également être de vieux objets PHP simples. Pas du tout liés au framework.Tout cela est fourni par défaut par le framework symfony full stack.
Où vous aurez des problèmes est quand vous voulez utiliser des fichiers de traduction (comme xliff), parce qu'ils sont découverts par des faisceaux seulement .
La distribution symfony-light vise à résoudre ce genre de problèmes en découvrant tout ce qui ne serait généralement découvert qu'à travers des bundles.
la source
Vous pouvez utiliser KnpRadBundle , qui essaie de simplifier la structure du projet.
Une autre approche consiste à utiliser
src/Company/Bundle/FrontendBundle
par exemple pour les bundles etsrc/Company/Stuff/Class.php
pour les classes qui sont indépendantes de symfony et qui pourraient être réutilisées en dehors du frameworkla source
Bundle
va directement sur le partage public. Lorsque j'écris une application, je ne veux pas partager mon code, sauf pour les parties que j'ai intentionnellement construites en tant que modules communautaires. Ai-je tort?Comme cela fait déjà 5 ans, voici quelques autres articles sur les bundles Symfony.
TLDR:
TLDR:
la source
Le framework Symfony est très bon pour lancer rapidement une preuve de concept et tout le code peut entrer dans l'application de bundle par défaut dans src /
Dans ce bundle, vous pouvez structurer votre code comme vous le souhaitez.
Après, si vous souhaitez utiliser une autre technologie pour développer votre POC, vous pouvez facilement le traduire car vous ne structurez pas tout votre code dans la conception de bundle.
Pour tout le concept, vous n'avez pas extrémisé cela. Bundle est bon, mais tout et tous les jours ne sont pas bons.
Vous pouvez peut-être utiliser un Silex (micro framework Symfony) pour développer votre Proof of Concept afin de réduire l'impact des bundles tiers.
la source