Ein neues Lieblingsfeature von mir!

Wer schon mal mit der AuthComponent zu tun hatte kennt sicherlich den Begriff „scope“, womit man festlegen kann welche Bedienung ein Benutzer erfüllen muss damit er sich einloggen kann. Für all die die es nicht Wissen, hier eine Kurzfassung in Bezug auf das Thema dieses Beitrags: Ein „Scope“ ist eine definierte Eingrenzung von Daten. „Named“ bedeutet, dass wir dieser Eingrenzung einen Namen geben.

Oft haben Daten diverse Eigenschaften welche die Auswahl erleichtern sollen. Nehmen wir zum Beispiel einen Blog-Eintrag. Dieser kann unsichtbar sein, kann ein Entwurf oder veröffentlicht sein.

All dies gilt bei der Anzeige im Frontend zu berücksichtigen, sowie an allen anderen Stellen innerhalb der Applikation. Je nach Anzahl der Eigenschaften kann das schnell zu Chaos führen. Vor allem, wenn man in einem Team arbeitet und nicht jeder unbedingt weiss was es mit den Eigenschaften auf sich hat.

Genau hier helfen NamedScopes, welche es erlauben diese Eigenschaften zu bündeln und so unter einen Hut zu bringen. Und das nicht etwa innerhalb des Controllers, sondern direkt in dessen Model.

Für unseren Blogeintrag gehen wir mal folgende Konstellationen durch:

PHP:
  1. var $actsAs = array(
  2.     'NamedScope' => array(
  3.         'visible' => array( // einfach alle sichtbaren (für z.B. blog-admin liste)
  4.             'Post.is_visible' => 1
  5.         ),
  6.         'public' => array( // sichtbare, veröffentlichte, die kein entwurf sind
  7.             'Post.is_visible' => 1,
  8.             'Post.is_draft' => 0,
  9.             'Post.is_published' => 1
  10.         ),
  11.         'drafts' => array( // alle entwürfe, die für user sichtbar sind
  12.            'Post.is_draft' => 1,
  13.            'Post.is_visible' => 1
  14.         )
  15.     )
  16. );

Die Eigenschaft is_visible ist quasi unsere Admin-Direktive die es uns erlaubt Beiträge komplett von der Seite zu nehmen, deshalb ist die Eigenschaft in „public“ und „drafts“ auch immer vertreten.

Mit diesem Satz an Scopes können wir nun loslegen unsere find() Operationen zu machen. Hier ein paar Beispiel wie man diese einsetzt:

PHP:
  1. // find alle sichtbaren
  2. $this->find('visible');
  3.  
  4. // finde alle öffentlichen Beiträge von User 1
  5. $this->find('public', array('conditions' => array('Post.user_id' => 1));
  6.  
  7. // finde alle Entwürfe von User 2
  8. $this->find('drafts', array('conditions' => array('Post.user_id' => 2));
  9.  
  10. // find den ersten öffentlichen Beitrag von User 3
  11. $this->public('first', array('conditions' => array('Post.user_id' => 3), 'order' => 'Post.id DESC'));

Wie man im letzten Beispiel sieht nutze ich den Namen des Scopes als Methode. Das macht NamedScopes von alleine und erlaubt uns den Scope so zu verwenden als wäre es die find-Methode selbst. Nur eben unter Berücksichtigung unserer Eigenschaften!

Es gibt also auch nach der Definition der Scopes folgende Methoden im Model:
Model::visible(), Model::public(), Model::drafts()

Ein weiterer Vorteil von NamedScopes ist, wenn eine neue Eigenschaft hinzugefügt werden muss. Normalerweise müsste man durch alle Stellen im Code gehen und überall „is_whatever“ einfügen, aber mit NamedScopes braucht man nur innerhalb der Modeldatei die Definitionen im Array anpassen. Also schneller kann man so was nicht hinbekommen und spart somit einen Haufen Arbeit.

Links zum Thema:
- http://developingwithstyle.com/2008/11/20/namedscope-or-cakephp/
- http://github.com/joelmoss/cakephp-namedscope/

Diesen Eintrag kommentieren