أساس SPA كبير وحدات على Laravel + Vue + ElementUI مع مولد CRUD

صورة

في السنوات الأخيرة ، تمكنت من العمل على العديد من المشاريع الكبيرة وليس بالحد الأدنى باستخدام أطر عمل خلفية وواجهة مختلفة. تواجه العديد من المشاكل التي نشأت مع نمو التطبيق.

الآن يمكنني أن أستنتج من أي الحلول كانت ناجحة والتي لم تكن ناجحة للغاية.
باستخدام الخبرة المتراكمة ، شرعت في جمع أفضل الحلول ، في رأيي ، وإنشاء مؤسستي الخاصة لـ SPA.

كيفية إنشاء موقع على Laravel أو ما هو SPA ، لن أقول. هناك ما يكفي من هذه المعلومات على الإنترنت. هذه المقالة مخصصة للمطورين الأكثر أو الأقل خبرة ، لذا سأفتقد بعض التفاصيل.

من لا يستطيع الانتظار ، في نهاية المقال هو رابط إلى مستودع github الخاص بي.

تم اختيار التقنيات الرئيسية من قبل Laravel و Vue.js + Vuex لأن هذا هو مجموعتي الرئيسية.

للتطوير السريع ، أخذت مجموعة أدوات واجهة المستخدم - ElementUI .

الهدف الرئيسي


إنشاء أساس لمشروع متوسط ​​وكبير:

  • سوف يساعد على تجنب التماسك الصلب للوحدات
  • مفهومة لمبرمج لديه خبرة قليلة
  • تساعد على تجنب تكرار التعليمات البرمجية
  • سيكون من السهل توسيعها
  • تقليل وقت بدء المشروع
  • تقليل وقت دعم المشروع والملاحة البرمجية

لجعل الحياة سهلة قدر الإمكان ، وعدم الخلط في المشروع ، تحتاج إلى بناء نفسك بشكل صحيح. في البداية ، يجب تقسيم التطبيق إلى مستويات المسؤولية ، مثل واجهة المستخدم وقاعدة البيانات ومنطق الأعمال.

علاوة على ذلك ، يجب تقسيم كل طبقة أولاً حسب الوظيفة ، ثم يجب تقسيم كل وحدة وظيفية وفقًا للنمط المحدد.

مستوحاة من فلسفة DDD ، قررت تقسيم الواجهة الأمامية والخلفية إلى وحدات دلالية. لكن هذه ليست المجالات الكلاسيكية التي يصفها إيفانز. نموذجه ليس مثاليًا أيضًا. في أي تطبيق ، بمرور الوقت ، تظهر العلاقات بين المكونات دائمًا - نفس العلاقات بين النماذج.

ترك النماذج كطبقة منفصلة ، لأنها بدت وكأنها تكرر قاعدة البيانات ، مع جميع اتصالاتها.

إنشاء دليل في المقدمةالموارد / شبيبة / وحدات ، حيث سيتم وضع وحدات مختلفة. سيكون لكل منها واجهة برمجة تطبيقات - طرق للعمل مع النهاية الخلفية والمكونات - جميع المكونات والصفحات والمخزن - التخزين والمسارات .

{moduleName}/
├── routes.js
├── api/
│   └── index.js
├── components/
│   ├── {ModuleName}List.vue
│   ├── {ModuleName}View.vue
│   └── {ModuleName}Form.vue
└── store/
    ├── store.js
    ├── types.js
    └── actions.js

في الموارد / شبيبة ، يتم إنشاء المجلد الأساسي ، حيث توجد المكونات الرئيسية للنظام.
هناك أيضًا bootstrap ويتضمن مجلدات لتكوين مكتبات وأدوات إضافية ، على التوالي.

يستخدم المشروع التحميل الديناميكي للنماذج. وبالتحديد ، في الأساسية / المسارات وفي الحالات الأساسية / ، نقوم بتحميل المسار المقابل وملفات التخزين تلقائيًا (لا يلزم تسجيل أي شيء).

فيما يلي مثال لكيفية تحميل store.js من وحدات مختلفة تلقائيًا.

// Load store modules dynamically.
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
})
 

على الواجهة الخلفية في دليل التطبيق سيكون هناك وحدات مماثلة. ستحتوي كل وحدة على مجلدات تحكم ، طلبات ، موارد . تم أيضًا نقل الملف الذي يحتوي على مسارات هنا --ways_api.php .

{ModuleName}/
├── routes_api.php
├── Controllers/
│   └──{ModuleName}Controller.php
├── Requests/
│   └──{ModuleName}Request.php
└── Resources/
    └── {ModuleName}Resource.php
 

أنماط التصميم الأخرى مثل الأحداث ، الوظائف ، السياسات ، إلخ. لن يتم تضمينها في الوحدات ، حيث يتم استخدامها بشكل أقل ، ومن المنطقي الاحتفاظ بها في طبقة منفصلة.

يتم تنفيذ جميع التلاعبات في التحميل الديناميكي للوحدات بحيث يتفوق الحد الأدنى على التفاعل فيما بينها. هذا يسمح لك بإضافة وإزالة الوحدات النمطية دون عواقب. الآن يمكنك جعل الأمر الحرفي يقوم بإنشاء مثل هذه الوحدة. بمساعدتها ، يمكننا ملء المشروع بسرعة بالكيانات اللازمة إلى جانب وظيفة CRUD.

بعد تنفيذ الأمر php artisan make:module {ModuleName}، سيكون لدينا جميع الملفات الضرورية ، بما في ذلك النموذج وعمليات الترحيل ، لكي يعمل CRUD الكامل. عليك فقط إكمال الترحيلphp artisan migrateوسيعمل كل شيء. على الأرجح ستحتاج إلى إضافة حقول إضافية ، لذلك قبل الترحيل ، لا تنس أن تضيفها إلى النموذج ، والترحيل ، وأيضًا للإخراج.



في هذا النموذج ، تم استخدام تقنية JWT-Auth للمصادقة ، ولكنها قد تكون زائدة عن الحاجة ويجب إعادة تشكيلها من أجل Laravel Sanctum. في المقابل ، يتم استخدام vue-auth في الواجهة الأمامية ، مما يسهل إدارة تفويض المستخدم وأدواره.

في المستقبل ، أود تحسين النظام. إضافة ناقل حدث عالمي ، قم بتوصيل websockets. أضف الاختبارات. من الممكن إنشاء خيار إدارة الأدوار في الفروع المنفصلة أو إنشاء الفروع باستخدام أدوات واجهة المستخدم الأخرى. سيكون من الجيد سماع التوصيات والتعليقات.

في البداية ، تم تطوير هذا النموذج لاحتياجاتك ، ولكن آمل الآن أن يكون مفيدًا للمستخدمين الآخرين.

يمكن عرض جميع التعليمات البرمجية في مستودع بلدي جيثب .

All Articles