Sincronizzazione delle operazioni CRUD client e server utilizzando json e php

1

Sto lavorando su un codice per sincronizzare lo stato dei modelli tra client (essendo un'applicazione javascript) e server. Spesso finisco per scrivere codice ridondante per tracciare gli oggetti client e server in modo da poter mappare i dati forniti dal client ai modelli del server.

Di seguito è riportato un codice che sto pensando di implementare per aiutare. Quello che non mi piace del codice seguente è che questo metodo non gestirà molto bene le relazioni annidate, dovrei creare più tracker di oggetti.

Una soluzione è per ogni modello di server dopo la creazione o il caricamento, basta fare $model->clientId = $clientId; IMO questo è un brutto scherzo e voglio evitarlo. Aggiungere un metodo setClientId a tutti gli oggetti del mio modello sarebbe un altro modo per renderlo meno hacky, ma questo mi sembra eccessivo. In realtà, i client sono utili solo per inserire / aggiornare i dati in alcuni scenari. Potrei andare con un modello decoratore, ma la generazione automatica di una classe proxy sembra un po 'coinvolta. Potrei usare una classe proxy generica che usa una funzione __call per consentire l'accesso ai dati dell'oggetto originale, ma anche questo sembra sbagliato. Qualche idea o commento?

$clientData = '[{name: "Bob", action: "update", id: 1, clientId: 200}, {name:"Susan", action:"create", clientId: 131} ]';
$jsonObjs = json_decode($clientData);


$objectTracker = new ObjectTracker();
$objectTracker->trackClientObjs($jsonObjs);


$query = $this->em->createQuery("SELECT x FROM Application_Model_User x WHERE x.id IN (:ids)");
$query->setParameters("ids",$objectTracker->getClientSpecifiedServerIds());
$models = $query->getResults();

//Apply client data to server model
foreach ($models as $model) {
    $clientModel = $objectTracker->getClientJsonObj($model->getId());


    ... 
}


//Create new models and persist
foreach($objectTracker->getNewClientObjs() as $newClientObj) {
    $model = new Application_Model_User();
    ....
    $em->persist($model);
    $objectTracker->trackNewServerObj($newClientObj['clientId'],$model);
}
$em->flush();

$resourceResponse = $objectTracker->createResourceResponse();

//Id mappings will be an associtave array representing server id resources with client side
// id.
//This method Dosen't seem to flexible if we want to return additional data with each resource...
//Would have to modify the returned data structure, seems like tight coupling...
//Ex return value:
//[{clientId: 200, id:1} , {clientId: 131, id: 33}];
    
posta Justin 24.10.2013 - 16:01
fonte

0 risposte

Leggi altre domande sui tag