2016-05-19 33 views
0

Gibt es eine Möglichkeit, ein Modell im AppController agnostisch abzurufen/zu manipulieren, um DRYness in den Controllern der Anwendung zu vermeiden? Zum Beispiel:CakePHP: agnostische Modellmanipulation

//AppController.php 
public function find_all() 
{ 
    return $this->AppModel->find('all'); 
    //I know this does not work but to give you the idea 
} 

Und bei Kindern Controllern der App:

//FoosController.php 
public function some_function() 
{ 
    $data = parent::find_all(); 
    //List of Foo entities 
} 

Oder:

//BarsController.php 
public function some_other_function() 
{ 
    $data = parent::find_all(); 
    //List of Bar entities 
} 

Gibt es eine Lösung CakePHP bieten kann? Oder vielleicht mit Reflektion?

Vielen Dank für Ihre Hilfe!

+0

Sind Sie sicher, dass Sie _problez DRYness wollen, würde ich denken, dass Sie _achieve_ es wollen? Was genau willst du nicht wiederholen? Sind das wirklich nur Aufrufe von 'Model :: find()', oder ist da tatsächlich mehr Komplexität involviert? Wenn letzteres der Fall ist, dann machen Sie bitte weiter, denn das Umschließen eines einfachen 'Model :: find()' -Aufrufs macht nicht viel Sinn. – ndm

+0

In der Tat ist es in der Tat mehr als die nur das Modell: find() -Methode ... Grundsätzlich sind alle CRUD-Operationen, die ich an Modellen durchführe, genau die gleichen, weshalb ich sie gerne umgestalten würde der AppController direkt. Was ich wirklich erreichen will, ist ein abstraktes Modell zu manipulieren. Mit Controller: loadModel ($ this-> modelClass) wird das richtige Modell geladen, aber wie kann ich dann dieses Modell verwenden, um die Methoden Model: save() oder Model: find() aufzurufen? –

+0

Mmmm, ich bin mir immer noch nicht sicher, ob ich dein tatsächliches Problem verstehe ... willst du vielleicht fragen, wie man den Wert von '$ this-> modelClass' benutzt, um auf eine Objekteigenschaft zuzugreifen? – ndm

Antwort

1

dachte ich, um einen Ausweg zu erreichen, was ich gesucht hatte:

//AppController.php 
public function find_all() 
{ 
    return $this->{$this->modelClass}->find('all'); 
} 

HINWEIS: Wenn Sie ohne wirkliche Geschäftslogik oder Genehmigung beteiligt sich wiederholende CRUD-Operationen durchführen (wie ich zur Zeit bin), Sie können diese Codezeilen auch verwenden, um Übereinstimmungen zu erhalten, ohne sich des Modells bewusst zu sein, das in der AppController behandelt wird.

//AppController.php 
if (!$this->{$this->modelClass}->save($this->request->data)) 
{ 
    $validationErrors = $this->{$this->modelClass}->validationErrors; 
    //error logic here 
} 
else 
{ 
    //success logic here 
}