2016-08-15 3 views
0

Wie speichere ich alle $ Daten aller speichern ($ Daten) mit CakePHP 3.3?

Ich habe einen kleinen Protokollcode (Umwandlung die $ Daten zu json und es auf VARCHAR, Benutzername und Datetime-Speicherung) zu implementieren, in dem AppModel :: before ($ data) (Kuchen 1,2)

Update:

ich habe Nutzung EventListenerInterface versucht:

namespace App\Model\Event; 
use Cake\Event\EventListenerInterface; 
use Cake\ORM\TableRegistry; 


class LogModel implements EventListenerInterface 
{ 

    public function implementedEvents() 
    { 
     return [ 
      'Model.beforeSave' => 'logSave' 
     ]; 
    } 

    public function logSave($event, $data = null, $options = null) 
    { 

     $eventTable = TableRegistry::get('Event'); 
     $eventEntity = $eventTable->newEntity(); 

     $eventEntity->event = json_encode($event); 
     $eventEntity->data = json_encode($data); 
     $eventEntity->className = get_class($event->__get('subject')); 

     //var_dump($eventEntity->className);exit(); 

     $eventTable->save($eventEntity); 
    } 
} 

bootstrap.php:

//event global 
use Cake\Event\EventManager; 
use App\Model\Event\LogModel; 
$logModel = new LogModel(); 
EventManager::instance()->on($logModel); 

Aber dies führte zu einer unendlichen rekursiven Anrufe, weil ich die Daten aller speichert speichern (log) muss. Gibt es eine Möglichkeit, das zu vermeiden?

+1

Und was genau ist das Problem mit in CakePHP 3 ähnlich zu tun? Momentan enthält Ihre Frage keine aktuelle Frage. – ndm

+0

Wo ist das "BeforeSave-Äquivalent" in Cake3 für alle Tabellen (oder Entitäten)? – celsowm

Antwort

1

CakePHP 3 hat nicht das Konzept einer Supermodellklasse. Es wäre angemessen, es zu einem Verhalten zu machen und es dort zu verwenden, wo es gebraucht wird.

Siehe diesen Abschnitt: Creating a Behavior

namespace App\Model\Behavior; 

use Cake\Datasource\EntityInterface; 
use Cake\Event\Event; 
use Cake\ORM\Behavior; 
use Cake\ORM\Entity; 
use Cake\ORM\Query; 
use Cake\Utility\Inflector; 

class JsonifyBehavior extends Behavior 
{ 
    public function jsonify(Entity $entity) 
    { 
     /* Your logic */ 
    } 

    public function beforeSave(Event $event, EntityInterface $entity) 
    { 
     $this->jsonify($entity); 
    } 
} 

Und in Ihrem jeweiligen Tabelle, um das Verhalten in der initialize Methode aufrufen:

public function initialize(array $config) 
{ 
    $this->addBehavior('Jsonify'); 
} 
+0

Danke für die Antwort! Gibt es jedoch eine implizite Möglichkeit, addBehavior ('Jsonify') auf allen Tabellen hinzuzufügen, anstatt sie bei jeder Initialisierung zu schreiben? – celsowm

Verwandte Themen