Управление на множество източници на данни в CakePHP

Планирам да разработя уеб приложение в CakePHP, което показва информация в графики и карти. Избрах CakePHP, защото информацията, която трябва да покажем, е много структурирана, така че моделният подход улеснява управлението на данни; също така имам известен опит с MVC от ASP.NET и ми харесва колко лесно е да се използва маршрутизирането.

И така, проблемът ми е, че множеството организации, които биха могли да използват приложението, ще имат своя собствена база данни с различна схема от тази, от която се нуждаем. Не мога просто да задам връзката им с низ във файла app.php, защото тяхната база данни няма да съответства на моя модел. По принцип това, което се случва, е това

И източникът на данни на организацията не може да пасне на моя модел по много причини: таблиците нямат едно и също име, схемата е различна, полетата на моя обект са в отделни таблици, може би имат информация в различни бази данни или също и в различни СУБД!

Искам да знам дали има начин да се направи интерфейс, който постига това въведете описание на изображението тук

По такъв начин, че cakephp Model/Entity може да използва данни независимо от източника. Имате ли предложения как да стане това? CakePHP има ли опция да направи това възможно? Трябва ли да използвам PHP с някакъв език за маркиране като JSON или XML? Може би MySQL има помощна програма за трансформиране на данни от различни източници в изглед и мога да накарам CakePHP да използва изгледа вместо таблицата? В случай, че имате отговор, бъдете възможно най-подробен.

Тези други опции са възможни, ако е невъзможно да се направи интерфейсът: - Usw друга рамка, която може да се справи с това по-лесно и има функциите, които споменах по-горе. - Накарайте организацията да промени своята база данни, така че да съответства на моя модел (този не ми харесва и вероятно няма да го направят). - Прехвърляне на данните в собствената база данни на приложението.

Допълнителна информация: Данните, показани в графиките, са от студенти в университета. Всеки университет има своя собствена база данни със собствена структура и приложения, използващи db, ето защо не е толкова лесно да се промени структурата. Просто искам да направя възможно най-лесно всяко училище да конфигурира своя собствена база данни.

РЕДАКТИРАНЕ: Версията е CakePHP 3.2. Важно уточнение е, че не се нуждае от всички CRUD операции, а само от „четене“. Надяваме се, че това прави решението по-лесно.


person Juan De la Cruz    schedule 12.05.2016    source източник
comment
Моля, погледнете тук github.com/waldemarnt/cake-multi-tenant е компилация използвайки CakePHP 2.x, но мисля, че това може да ви помогне :)   -  person Waldemar Neto    schedule 12.05.2016
comment
Моля, винаги споменавайте точната версия на CakePHP, която използвате (слоят модел/източник на данни се е променил драстично с CakePHP 3) и маркирайте въпроса си по съответния начин - благодаря!   -  person ndm    schedule 12.05.2016
comment
@ndm добавих информацията, благодаря ти :)   -  person Juan De la Cruz    schedule 12.05.2016


Отговори (2)


Не мисля, че на вашия "въпрос" може да се отговори правилно, той не съдържа достатъчно информация, достатъчно подробности. Предполагам, че има нещо, което ще остане същото за всички организации, но техните данни и бизнес логика ще бъдат различни. Но ще го пробвам.

И източникът на данни на организацията не може да пасне на моя модел по много причини: таблиците нямат едно и също име, схемата е различна, полетата на моя обект са в отделни таблици, може би имат информация в различни бази данни или също и в различни СУБД!

Моделът е цял слой, така че ако имате напълно различни схеми на таблици, вашата бизнес логика, която е част от този слой, също ще бъде различна. Простата промяна на връзката към базата данни сама по себе си няма да ви помогне тогава. Данните трябва да се показват и в изгледите и тогава изгледите също трябва да са различни.

Така че това, което можете да опитате да направите и това, което показва второто ви изображение, е, че внедрявате слой, който съдържа интерфейси и базови класове. След това създайте Cake плъгин за всяка от организациите, които използват тези интерфейси и базови класове и напишете някакъв код, който условно ще използва плъгина в зависимост от критериите (предполагаем домейн или поддомейн), които се проверяват. Ще трябва да дефинирате междинните интерфейси по начин, по който да имате достъп до всяка организация по същия начин на ниво API.

И едно техническо нещо: можете да дефинирате връзката на обект таблица в слоя модел. Всеки обект знае за своя произход, но не трябва да прилагате бизнес логика вътре в обект, нито да променяте връзката чрез обект.

РЕДАКТИРАНЕ: Версията е CakePHP 3.2. Важно уточнение е, че не се нуждае от всички CRUD операции, а само от „четене“. Надяваме се, че това прави решението по-лесно.

Ако това е вярно, използвайте приставката CRUD (да, можете да използвате само R частта от нея) или напишете някакъв код, като клас, който описва организацията и ще се използва за създаване на вашите обекти на таблици и изгледи в движение.

Като цяло това е доста интересен проблем, но IMHO е твърде широк за прост отговор или решение, което може да бъде дадено тук. Мисля, че това ще изисква известно обсъждане и анализ, за ​​да се намери най-доброто решение. Ако се интересувате от консултация, можете да се свържете с мен, разгледайте профила ми.

person floriank    schedule 12.05.2016

Намерих начин без кодиране на интерфейс. Всъщност той използва някои функции, които вече са включени в СУБД и CakePHP.

В случай, че схемата не отговаря на модела, можете да създадете изгледи, които да съответстват на имената на таблиците и имената на колоните от модела. По дефиниция изгледите работят като таблица, така че CakePHP търси същото име на таблица и колони и СУБД върши работата. Направих тест с изгледи в MySQL и той работи добре. Можете също така да комбинирате данните от различни таблици.

Изгледи на MySQL

Изгледи на SQL Server.

Ако потребителят използва друга СУБД, вие просто променяте източника на данни в app.php и направете изгледите, ако е необходимо

Ако данните се разпространяват в различни СУБД, CakePHP ви позволява да зададете източник на данни за всяка таблица, просто го добавяте към app.php и го извиквате в таблицата, ако е необходимо.

И накрая, в случай че просто се нуждаете от опцията "четене", създайте потребител с ограничен достъп до изгледите и само с SELECT привилегии.

ИЗПОЛЗВАНЕ: CakePHP 3.2 SQL SERVER 2016 MySQL5.7

person Juan De la Cruz    schedule 14.05.2016