Vue intègre la notion de portée (le Scope). Un élément (variable, fonction, composant, etc.) créé dans ton application sera accessible uniquement dans le noeud correspondant ; jamais à l'extérieur.
Tous tes composants ne doivent pas avoir l'id app, uniquement ton application principale.
Ainsi tu pourrais avoir dans une même page, deux applications distinctes selon la structure suivante:
-
app-1
-
composant-1
-
composant-2
-
-
app-2
-
composant-3
-
composant-4
-
TestComposant est un composant, il peut être appelé plusieurs fois, tant qu'il est enfant du noeud #app:
Tu peux modifier le comportement de tes composants en leur injectant des données via des paramètres
Enfin si tu désire faire une application Symfony avec Vue en front, sans que cela ne soit une single app, tu as deux variantes:
La première consiste à rendre vue accessible à toutes les pages en l'ajoutant dans le fichier base.html.twig
Le problème se fera ressentir lorsque tu voudras configurer Vue depuis les fichiers twig (ceux appelés par tes controlleurs) :
Ajouter des composants, définir les données, définir les méthodes, ajouter une librairie externe qui doit être exécuté lorsque l'app est montée (typiquement Moment.js qui doit être instancié lorsque Vue est montée pour fonctionner correctement, non pas depuis l'extérieur de l'application).
La seconde solution (celle que j'ai adoptée pour l'instant) est d'instancier Vue dans chacun des fichiers twig où elle est nécessaire et de lui injecter les données fournies par Symphony:
Attention toutefois !
Transmettre des données de Symfony vers Vue, c'est convertir des données d'une base relationnel en entitée (rôle de Doctrine), puis des entitées en Json.
Symfony NE CONVERTI PAS des entitées en Json, ce travail tu devras l'effectuer par toi même dans chacun des contrôleurs transmettant des données vers Vue.
Pour ce faire, je peux te conseiller la librairie JMS\Serializer qui fait cela vraiment bien et nous facilite grandement le travail.
De plus, lorsque tu effectueras la conversion entitée --> json avec cette librairie (ou même une autre), tu effectueras implicitement du Eager loading, selon ta configuration.
Exemple: Deux entitées liées, Client et Facture où la liaison est Facture.client = Client.id et que tu converties une Facture en Json. Doctrine effectura un appel à ta base de données pour que l'attribut Facture.client soit complet. Pire encore ce problème s'applique en cascade ! Doctrine effectuera encore des appels à ta base de données pour s'assurer que l'entitée Client soit complet si elle même inclue d'autres entitées.
Deux solutions (de mémoire) pour résoudres ces problèmes:
- Changer la stratégie de chargement des tables liées et faire du Lazy Loading. (Plus tout à fait sûr que ça fonctionne)
- Utiliser les annotations de la librairie JMS\Serializer en excluant les attributs inutiles.
Espérant que ça répond à certaines de tes interrogations