Eine Art ActiveRecord-Pattern?

paddya

Well-known member
ID: 296438
L
4 September 2007
529
61
Schönen Tag wünsche ich.

Ich habe gerade folgende Problemstellung und bin mir gerade nicht wirklich schlüssig, wie ich das am geschicktesten angehe.

Ich werde eine Art Activity-Stream bauen. Im System gibt es unterschiedliche Aktivitäten (Gästebucheintrag, Foto gepostet, Shoutboxeintrag und so weiter). Da ich möglichst flexibel sein möchte, sieht meine Datenbankstruktur in etwa so aus:

activity_log
id | user | type | time

activity_data
id | activity | key | value

Weiß auch nicht, ob es evtl. sinnvoller wäre, das zu denormalisieren zwecks Performance und die Daten in die activity_log-Tabelle zu schreiben. Wobei die dann ziemlich "fett" wird.

Nun muss je nach Typ der Aktivität natürlich ein anderes Ergebnis gerendert werden.

Gehen wir davon aus, dass ich eine Klasse Activity_Stream habe. Diese holt die Aktivitäten aus der Datenbank und ist auch für das Rendern der einzelnen Elemente verantwortlich.

Nun gibt es zwei Möglichkeiten: Jeder Aktivitätstyp hat eine eigene Klasse oder es gibt eine große Klasse fürs Rendering.

PHP:
class Activity_GalleryPhoto extends Activity {
    public function render() {}

}

oder

PHP:
class Activity_Renderers {
    public function renderGalleryPhoto() {}

}

und dementsprechend der Aufruf:

PHP:
$activity = get_activity_object($record); //Pseudocode

oder (falls die Syntax überhaupt so funktioniert :ugly:)

PHP:
$activity = Activity_Renderers::render{$record['type']}();

In aller Kürze: Ich suche ein Konzept, eine Liste von Datenbankeinträgen anhand von einer bestimmten Datenbankspalte zu behandeln und auszugeben. Wie würdet ihr das lösen?
 
In aller Kürze: Ich suche ein Konzept, eine Liste von Datenbankeinträgen anhand von einer bestimmten Datenbankspalte zu behandeln und auszugeben. Wie würdet ihr das lösen?

Dein Problem hat doch nichts mit dem ActiveRecord-Pattern zu tun.
Ich würde sagen dein Problem geht in die Richtung des Decorator- oder Command-Patterns:
Es muss zur Laufzeit unterschieden werden wie ein Objekt gerendert wird, ohne aber die Fälle mit einem SwitchCase-Konstrukt zu unterscheiden.

Also fügst du deinem Objekt zentral einige Objekte hinzu, die für das Rendern genau eines Activitätstyps zuständig sind:
PHP:
Activity_Renderers::addRenderer('guestbook', new GuestbookRenderer());
Activity_Renderers::addRenderer('guestbook', new GuestbookRenderer());
Activity_Renderers::addRenderer('foto', new FotoRenderer());
Wenn nun ein Objekt die Daten eines activity_log.type mit dem Wert "guestbook" hat, wird der GuestbookRenderer den Eintrag rendern.
 
Hi,

gibt es dafür nicht das Factory-Pattern?
Je nach Aktivität wird ein anderes Objekt erzeugt.

PHP:
$obj = Factory::get('foto');
 
Active Record und Factory lassen sich aber nicht wirklich vereinen ;)
Denn beim Ändern der Property des ActiveRecors müsste sich sofort das Rendering ändern ohne ein neues Objekt zu erzeugen, von daher gehört das gesuchte Pattern zu den Behavioral-Patterns.
 
Danke, ice-breaker. Genau danach habe ich gesucht. Ich implementiere das gerade und bis jetzt ist es vielversprechend :)