Au cours des derniÚres années, j'ai réussi à travailler sur plusieurs projets de grande envergure et peu nombreux utilisant différents frameworks back-end et front-end. Face à divers problÚmes qui se sont posés au fur et à mesure de la croissance de l'application.Je peux maintenant conclure à partir de quelles solutions ont réussi et lesquelles n'ont pas été trÚs réussies.En utilisant l'expérience accumulée, je me suis mis à collecter toutes les meilleures solutions, à mon avis, et à créer ma propre fondation pour SPA.Comment créer un site sur Laravel ou ce qu'est le SPA, je ne le dirai pas. Il y a suffisamment de telles informations sur Internet. Cet article est destiné aux développeurs plus ou moins expérimentés, donc je vais manquer quelques détails.Qui ne peut pas attendre, à la fin de l'article est un lien vers mon référentiel github.Les principales technologies ont été sélectionnées par Laravel et Vue.js + Vuex car c'est ma pile principale.Pour un développement rapide, j'ai pris le Kit UI - ElementUI .L'objectif principal
Pour créer les bases d'un projet de moyenne et grande envergure qui:- aidera à éviter la cohésion rigide des modules
- compréhensible pour un programmeur avec peu d'expérience
- aider à éviter la duplication de code
- sera facile à étendre
- réduire l'heure de début du projet
- réduire le temps de prise en charge du projet et de navigation dans le code
Pour rendre la vie aussi simple que possible, Ă ne pas confondre avec le projet, vous devez bien structurer votre ego. Initialement, l'application doit ĂȘtre divisĂ©e en niveaux de responsabilitĂ©, tels que l'interface utilisateur, la base de donnĂ©es, la logique mĂ©tier.De plus, chaque couche doit d'abord ĂȘtre divisĂ©e par fonctionnalitĂ©, puis chaque module fonctionnel doit ĂȘtre divisĂ© en fonction du modĂšle sĂ©lectionnĂ©.InspirĂ© par la philosophie DDD, j'ai dĂ©cidĂ© de diviser le front-end et le back-end en modules sĂ©mantiques. Mais ce ne sont pas les domaines classiques dĂ©crits par Evans. Son modĂšle n'est pas non plus parfait. Dans toute application, au fil du temps, les relations entre les composants apparaissent toujours - les mĂȘmes relations entre les modĂšles.Il a laissĂ© les modĂšles comme une couche distincte, car ils semblaient dupliquer la base de donnĂ©es, avec toutes ses connexions.CrĂ©ation d'un rĂ©pertoire Ă l'avantressources / js / modules , dans lesquels se trouvent diffĂ©rents modules. Chacun aura des API - des mĂ©thodes pour travailler avec le back-end, des composants - tous les composants et les pages, le stockage - le stockage et les itinĂ©raires .{moduleName}/
â
âââ routes.js
â
âââ api/
â âââ index.js
â
âââ components/
â âââ {ModuleName}List.vue
â âââ {ModuleName}View.vue
â âââ {ModuleName}Form.vue
â
âââ store/
âââ store.js
âââ types.js
âââ actions.js
Dans resources / js , le dossier principal est créé , oĂč se trouvent les principaux composants du systĂšme.Il existe Ă©galement des programmes d'amorçage et comprend des dossiers pour configurer des bibliothĂšques et des utilitaires supplĂ©mentaires, respectivement.Le projet utilise le chargement dynamique des modĂšles. A savoir, dans core / routes et dans core / states, nous chargeons automatiquement les fichiers de routage et de stockage correspondants (rien n'a besoin d'ĂȘtre enregistrĂ©).Voici un exemple de chargement automatique de store.js Ă partir de diffĂ©rents modules.
const requireContext = require.context('../../modules', true, /store\.js$/)
let modules = requireContext.keys()
.map(file =>
[file.replace(/(^.\/)|(\.js$)/g, ''), requireContext(file)]
)
.reduce((modules, [path, module]) => {
let name = path.split('/')[0]
return { ...modules, [name]: module.store }
}, {})
modules = {...modules, core}
export default new Vuex.Store({
modules
})
Sur le backend dans le répertoire de l'application, il y aura des modules similaires. Chaque module contiendra des dossiers ContrÎleurs, Demandes, Ressources . Le fichier avec les routes a également été déplacé ici - routes_api.php .{ModuleName}/
â
âââ routes_api.php
â
âââ Controllers/
â âââ{ModuleName}Controller.php
â
âââ Requests/
â âââ{ModuleName}Request.php
â
âââ Resources/
âââ {ModuleName}Resource.php
Autres modÚles de conception tels que les événements, les emplois, les politiques, etc. ne seront pas inclus dans les modules, car ils sont moins utilisés et il est plus logique de les conserver dans une couche distincte.Toutes les manipulations avec le chargement dynamique des modules sont effectuées de sorte qu'un engagement minimal bat entre eux. Cela vous permet d'ajouter et de supprimer des modules sans conséquences. Vous pouvez maintenant faire la commande artisan make pour créer un tel module. Avec son aide, nous pouvons rapidement remplir le projet avec les entités nécessaires ainsi que la fonctionnalité CRUD.AprÚs avoir exécuté la commande php artisan make:module {ModuleName}
, nous aurons tous les fichiers nécessaires, y compris le modÚle et les migrations, pour que le CRUD complet fonctionne. Il vous suffit de terminer la migrationphp artisan migrate
et tout fonctionnera. TrĂšs probablement, vous devrez ajouter des champs supplĂ©mentaires, donc avant de migrer, n'oubliez pas de les ajouter au modĂšle, Ă la migration et Ă©galement Ă la sortie vers vue.Dans ce modĂšle, la technologie JWT-Auth a Ă©tĂ© utilisĂ©e pour l'authentification , mais elle peut ĂȘtre redondante et doit ĂȘtre refaite pour Laravel Sanctum. Ă son tour, vue-auth est utilisĂ© sur le front-end , il facilite la gestion des autorisations et des rĂŽles des utilisateurs.Ă l'avenir, j'aimerais amĂ©liorer le systĂšme. Ajoutez un bus d'Ă©vĂ©nements global, connectez des websockets. Ajoutez des tests. Il est possible de crĂ©er une option de gestion des rĂŽles dans des branches distinctes ou de crĂ©er des branches avec un autre kit d'interface utilisateur. Ce serait bien d'entendre des recommandations, des commentaires.Initialement, ce modĂšle a Ă©tĂ© dĂ©veloppĂ© pour vos besoins, mais maintenant j'espĂšre qu'il sera utile pour d'autres utilisateurs.Tout le code peut ĂȘtre consultĂ© dans mon rĂ©fĂ©rentiel github .