---
title: "Welche Funktion in welche Klasse?"
url: "https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse"
source: "typo3.net"
tags: ["Extensions","Extbase","Frage"]
created: "2011-05-19"
last_reply: "2011-05-24"
replies: 15
solved: false
page: 1
pages: 1
lang: "de"
---

# Welche Funktion in welche Klasse?

Extensions › Extbase · 15 Antworten · gestartet 2011-05-19

## Eröffnungsbeitrag

**Unbekannter Benutzer** · 2011-05-19 · [Beitrag #1](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/1)

Hi,

ich hab noch so meine Schwierigkeiten zu verstehen in welche Klasse welche Funktionen kommen.

Soweit ich das verstanden habe kommen in die Model-Klasse nur Funktionen rein, welche das Model definieren (also hauptsächlich Getter und Setter Funktionen und sonst nichts). Die Controller-Klassen beinhalten Funktionen um Anfragen von Außen zu steuern (aber was genau bedeutet das?) Die Repository-Klassen sind für die Datenhaltung verantwortlich (also nur Datenbankanfragen, oder?)

Konkretes Beispiel:

Ich möchte gern im View (list.html) einen bestimmten Text nur dann ausgeben, wenn ein Datensatz mehr als 4 Wochen alt ist (crdate > 4 Wochen). Der auszugebende Text vom aus dem Datensatz (d.h. aus dem Model). In welche Klasse kommt jetzt die Funktion rein, welche dem Timestamp aus dem Datenbankfeld crdate überprüft und ggf. dem View die nötigen Daten (also den anzuzeigenden Text) überreicht?

Allgemein gefragt: nach welchem Prinzip baut man die einzelnen Klassen auf, welche Klasse ist für was zuständig?

## Antworten

### [#2](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/2) · Eydamos · 2011-05-19

Der Controller steuert Hauptsächlich den Ablauf. Er sagt dem Repository welche Daten er von der Datenbank braucht und wenn er alle Daten hat gibt er diese an die View weiter.

Zu deinem konkreten Problem:
Du hast ein Plugin was du ja dann auf deiner Seite einfügst.
In der ext_localconf.php sagst du welche Actionen dein Plugin ausführen darf (also welche Action vom Controller ausgeführt wird). Wenn du nur die Ausgabe des Textes haben willst würde ich alles bis auf show aus dem Array nehmen.

Wenn die Seite dann im FE aufgerufen wird wird die showAction des Controllers ausgeführt.
Du willst einen Text ausgeben, der in der Datenbank steht und auch das Datum steht dort also muss das Repository arbeiten.
Da dies keine "übliche" Abfrage ist brauchst du eine neue Funktion dafür.

Schritt 1:
im Controller (Funktion showAction) rufst du die neue Funktion auf und speicherst die Rückgabe
$text = $this->myRepository->findOlder();

Schritt 2:
Im repository wird nun die Funktion findOlder aufgerufen diese musst du natürlich schreiben:
public function findOlder()
{
$query = $this->createQuery();
$query->matching($query->lessThan("cdate", time()-2419200));
return $query->execute()->getFirst();
}

Schritt 3:
Der Controller bekommt die Daten vom Repository und diese müssen jetzt an die view übergeben werden:
$this->view->assign('alterText', $text);

Das Model ist im grundegenommen dafür da, um Daten bereitzustellen.
Beispiel:
du hast ein Produkt und speicherst den netto Preis und die Mehrwehrtsteuer.
willst du den Brutto Preis ausgeben kriegst du das nicht direkt aus der Datenbank und fluid soll nur Daten ausgeben nicht berechnen (kann es glaub ich auch nicht ;)
Das Model muss also aus den vorhandenen Daten den Bruttopreis berechnen.
getBrutto()
{
return $this->price * $this->mwst;
}
im Fluid kannst du dann mit {product.getBrutto} (bin mir nicht ganz sicher ob der aufruf so klappt) dann diese Daten vom Model ausgeben.

P.S.
vor mir haben sich bereits 18 Leute diesen Thread angesehen, und obwohl es eine simple Frage ist die wohl fast jeder beantworten kann hat keiner sich die Zeit genommen kurz zurückzuschreiben.

### [#3](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/3) · Unbekannter Benutzer · 2011-05-19

Hi,

vielen Dank für die ausführliche Antwort! Noch hab ichs nicht ganz gecheckt aber so langsam wirds, denke ich ;)

Das Model stellt die Struktur der möglichen Daten eines Objekts dar, hat aber sonst keine weitere Aufgabe. Das Repository kann wiederrum auf das Model zugreifen und von ihm bestimmte Daten anfordern.

Das heißt also, jedes Mal wenn ich auf Daten des Models zugreifen möchte, muss ich über das Repository gehen und mir ggf. eigene Funktionen schreiben un eine oder mehrere Eigenschaften des Models zu erhalten. Hab ich das richtig verstanden?

Der Controller ist so zusagen die Schnittstelle zwischen Datenhaltung (Model) und Ausgabe (View). Alles was ausgegeben werden soll, muss erst Mal im Controller vorhanden sein, um es dann an den View übergeben zu können (mittels view-assign())?

### [#4](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/4) · xandio · 2011-05-19

Die Autoren des Buches "Zukunftssichere TYPO3-Extensions mit Extbase und Fluid" beschreiben die Aufgabenverteilung wie folgt:

"Extbase (und FLOW3) verfolgt den Ansatz eines schlanken Controllers (slim controller). Der Controller ist ausschließlich für die Steuerung des Ablaufs zuständig. Weitere Logik (insbesondere Geschäfts- bzw. Domänenlogik) wird in die Klassen im Unterordner Domain ausgelagert."

### [#5](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/5) · Eydamos · 2011-05-20

Das hast du größtenteils schon richtig verstanden.

Der Controller ist die Schnittstelle zwischen der Datenverarbeitung (Model) und der Ausgabe (View).

Das Repository greift aber nicht auf Daten des Models zu. Das Repository holt selbst direkt die Daten aus der Datenbank. Anschließend legt es, basierend auf der Struktur die das Model vorgibt, Objekte an.
Diese Objekte übergibt der Controller dann an die View wo fluid die Daten basierend auf dem Funktionen des Models die Daten ausgeben kann.

### [#6](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/6) · Unbekannter Benutzer · 2011-05-20

@xandio:
Danke für das Zitat. Das Buch liegt 20 cm links von mir und ganz ehrlich: für jemanden, der mit extbase und fluid bzw. mit Domain Driven Design noch nicht viel am Hut hatte ist das Buch, gelinde gesagt, nicht zu empfehlen. Es wird viel erklärt und vieles nur halb. Ich stand schon einige Male da und dachte: "Und wo gehört das jetzt hin?!". Der rote Faden fehlt einfach.

@Eydamos:
Ok das macht die Sache doch schon klarer. Danke :)

### [#7](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/7) · xandio · 2011-05-20

Mir gefällt das Buch und ich betrachte es als wichtige Informationsquelle für diese (noch) schlecht dokumentierte Technologie. Einige Lösungen habe ich ausschließlich in diesem Buch gefunden.

Mit dem Zitat wollte ich lediglich ausdrücken, dass man nicht sämtliche Geschäftslogik in den Controller packen und das Model lediglich auf Getter- und Setter-Methoden reduzieren sollte. Ist aber natürlich Ansichtssache. :-)

### [#8](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/8) · Unbekannter Benutzer · 2011-05-23

Hi,

ich hab nun mein Fallbeispiel von oben erfolgreich umgesetzt, bin mir aber nicht ganz sicher ob das ne gute Lösung ist. Könntet ihr mir bite sagen ob man das besser machen kann?

Nochmal kurz das Fallbeispiel: ich möchte herausfinden, welche Datensätze in den letzten vier Wochen angelegt wurden und diese dann als "NEU" kennzeichnen.

Also, in meinem **Model (Object.php)** hab ich eine Variable **$new** definiert (mit **getNew()** und **setNew()** Funktion). Diese Variable wird nur zur Laufzeit genutzt (hat also kein Datenbankfeld).

Das **ObjectRepository** habe ich um zwei Funktionen erweitert, die mir die neuen und alten Datensätze getrennt liefern. Hier passiert die Überprüfung des "Alters" der Datensätze:

```php
<?php
class Tx_MyExt_Domain_Repository_ObjectRepository extends Tx_Extbase_Persistence_Repository {
    
    /**
     * Timeframe within a object will be marked as NEW (4 Weeks = 2419200 Seconds)
     * 
     * @var int
     */
    private $timeframe = 2419200;
    
    /**
     * Finds all objects that were created less than 4 weeks ago from now
     * 
     * @return Tx_MyExt_Domain_Model_Object
     */
    public function findNewObjects() {
        $query = $this->createQuery();
        $query->matching($query->greaterThanOrEqual('crdate', time() - $this->timeframe));
        $query->setOrderings(array('crdate' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING));
        return $query->execute();
    }
    
    /**
     * Finds all objects that were created more than 4 weeks ago from now
     * 
     * @return Tx_MyExt_Domain_Model_Object
     */
    public function findOldObjects() {
        $query = $this->createQuery();
        $query->matching($query->lessThan('crdate', time() - $this->timeframe));
        $query->setOrderings(array('crdate' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING));
        return $query->execute();
    }
    
}
?>
```

Im **ObjectController** durchlaufe ich dann beide Arrays und setze **$new** auf "1" bzw. auf "0":

```php
<?php
/**
 * List all objects
 * 
 * @return string The rendered HTML string
 */
public function listAction() {
    // $allObjects = $this->objectRepository->findAll();
    $allObjects = array();
    
    $newObjects = $this->objectRepository->findNewObjects();
    foreach($newObjects as $object) {
        $object->setNew(1);
    }
    
    $oldObjects = $this->objectRepository->findOldObjects();
    foreach($oldObjects as $object) {
        $object->setNew(0);
    }
    
    $allObjects = array_merge($newObjects, $oldObjects);
    
    $this->view->assign('objects', $allObjects);
    
}
?>
```

Im **View (list.html)** prüfe ich den Wert der Variable **$new** und gebe, falls der Wert auf 1 steht, den Text "NEU" aus:

```html
<f:if condition="{object.new}">
    <span>NEU</span>
</f:if>
```

Geht das nicht einfacher? Ich bin diesen Weg gegangen, weil ich nicht weiß wie ich schon im Repository **$new** auf "1" bzw. auf "0" setzen kann. Wenn ich das wüsste könnte ich im Repository alles auf eine Datenbankabfrage reduzieren und der Controller müsste nichts weiter tun als das zurückgegebene Array an den View zu übergeben.

Wie kann ich das bewerkstelligen?

### [#9](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/9) · a.​berl · 2011-05-23

Ich würde das anders lösen:

```php
<?php
/**
 * List all objects
 * 
 * @return string The rendered HTML string
 */
public function listAction() {
    $allObjects = $this->objectRepository->findAll();
    $this->view->assign('objects', $allObjects);

    $this->view->assign('time', time() - 2419200);
}
?>
```

und dann die "Logik" dafür in die View bauen:

```html
<f:if condition="{object.crdate} > {time}">
    <span>NEU</span>
</f:if>
```

Das entspricht zwar nicht ganz einem sauberen MVC Ansatz, macht den Gesamtcode aber übersichtlicher und das ist IMO wichtiger als das Festklammern an Patterns und Paradigmen.

PS: Sollte object.crdate einen Datums-String zurückgeben (bin mir nicht ganz sicher), dann hilft es dafür einfach einen neuen Getter ins Model zu schreiben, dass das crdate als Timestamp zurück gibt.

### [#10](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/10) · Unbekannter Benutzer · 2011-05-23

@a.berl:

vielen Dank für deinen Vorschlag. Ich brauche die Unterscheidung zwischen alten und neuen Datensätzen jedoch nicht nur im View sondern muss da an anderer Stelle noch drauf zugreifen können.

Außerdem interessiert es mich, wie man das nach MVC Standard sauber lösen könnte :)

Edit:
Das Datenbankfeld "crdate" ist ja das Standard-Datenbankfeld von TYPO3. Wie kann ich denn im Controller darauf zugreifen, ohne es im Model als extra Variable definiert zu haben?

Edit 2:
Ok ich hab spaßeshalber einfach mal folgendes im Model hinzugefügt:

```php
/**
 * @var int
 */
protected $crdate;

public function getCrdate() {
    return $this->crdate;
}
```

Wenn ich im Controller mir das Object mittels t3lib_div::debug() ausgeben lasse, steht nun folgendes drin:

```html
[crdate] => DateTime Object
    (
    )
```

Wie kann ich denn auf so ein DateTime Object zugreifen und es z.B: als Timestamp ausgeben?

### [#11](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/11) · a.​berl · 2011-05-23

> **Typo3Cuckoo schrieb:**
>
> @a.berl:
>
> vielen Dank für deinen Vorschlag. Ich brauche die Unterscheidung zwischen alten und neuen Datensätzen jedoch nicht nur im View sondern muss da an anderer Stelle noch drauf zugreifen können.
>
> Außerdem interessiert es mich, wie man das nach MVC Standard sauber lösen könnte :)

In dem Fall würde ich das Model einfach erweitern. Im Grunde ist das ja einfach eine Eigenschaft deines Modells - ist es Neu oder nicht? - die nur über den Zustand eines anderen Feldes definiert ist.

```php
/**
 * @var int
 */
protected $crdate;

public function getNew() {
    return $this->crdate > (time() - 2419200);
}
```

Einen Setter brauchst du in dem Fall nicht, da es nur eine zu Lesende Eigenschaft ist und auch nicht in der Datenbank persistiert wird. Über diesen Getter kannst du aber von überall auf diese Eigenschaft deines Models zugreifen.

> Edit:
> Das Datenbankfeld "crdate" ist ja das Standard-Datenbankfeld von TYPO3. Wie kann ich denn im Controller darauf zugreifen, ohne es im Model als extra Variable definiert zu haben?
>
> Edit 2:
> Ok ich hab spaßeshalber einfach mal folgendes im Model hinzugefügt:
>
> ```php
> /**
>  * @var int
>  */
> protected $crdate;
>
> public function getCrdate() {
>     return $this->crdate;
> }
> ```
>
> Wenn ich im Controller mir das Object mittels t3lib_div::debug() ausgeben lasse, steht nun folgendes drin:
>
> ```html
> [crdate] => DateTime Object
>     (
>     )
> ```
>
> Wie kann ich denn auf so ein DateTime Object zugreifen und es z.B: als Timestamp ausgeben?

Standardmäßig ist das Feld nicht vom Model aus zugänglich, da es eigentlich ein Typo3-internes Feld ist, deswegen musst du dem Model noch den Member $crdate geben.
Ist das crdate Feld in der TCA für dein Model enthalten? Ansonsten funktioniert das mapping vom Datenbankfeld auf das Model nicht und der Wert bleibt leer.

```php
	'crdate' => array(
		'exclude' => 0,
		'label'   => 'LLL:EXT:lang/locallang_general.xml:LGL.crdate',
		'config'  => array(
			'type' => 'input',
			'size' => 12,
			'max' => 20,
			'eval' => 'datetime',
			'checkbox' => '1',
			'default' => '0'
		)
	),
```

### [#12](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/12) · Unbekannter Benutzer · 2011-05-23

Ok, also ich hab das Model einfach erweitert und das funktioniert soweit auch ganz gut (siehe Edit2 ;)).

**crdate** habe ich in der **ext_tables.php** wie folgt drinstehen:

```php
$TCA['tx_myext_domain_model_object'] = array (
    
	'ctrl' => array (
		'crdate' => 'crdate',
                ...
        );
```

Ich bekomme das Datum in View auch ausgeben mit:

```html
<f:format.date format="d.m.Y">{object.crdate}</f:format.date>
```

Die Daten sind also vorhanden, es funktioniert also auch ohne dein Vorschlag:

```php
'crdate' => array(
		'exclude' => 0,
		'label'   => 'LLL:EXT:lang/locallang_general.xml:LGL.crdate',
		'config'  => array(
			'type' => 'input',
			'size' => 12,
			'max' => 20,
			'eval' => 'datetime',
			'checkbox' => '1',
			'default' => '0'
		)
	),
```

Würde mir das nicht außerdem die Möglichkeit bieten, crdate direkt im BE bearbeiten zu können? Das sollte ja eigentlich nicht möglich sein,

Meine Frage bzgl. des DateTime Objects war eher so gemeint, dass ich in PHP damit nicht weiter arbeiten kann. Wie kann ich in PHP aus dem DateTime Object einen Timestamp generieren, so dass ich in PHP z.B. einen Vergleich zwischen zwei DateTime Objects machen kann?

### [#13](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/13) · a.​berl · 2011-05-23

> **Typo3Cuckoo schrieb:**
>
> Würde mir das nicht außerdem die Möglichkeit bieten, crdate direkt im BE bearbeiten zu können? Das sollte ja eigentlich nicht möglich sein,

Stimmt, das sollte dann natürlich ein exclude-Feld sein, war ungünstig zusammengepastet :) Aber du hast auch Recht, mit 'crdate' => 'crdate' im 'ctrl' funktioniert es wohl auch so.

> Meine Frage bzgl. des DateTime Objects war eher so gemeint, dass ich in PHP damit nicht weiter arbeiten kann. Wie kann ich in PHP aus dem DateTime Object einen Timestamp generieren, so dass ich in PHP z.B. einen Vergleich zwischen zwei DateTime Objects machen kann?

[getTimestamp](http://de2.php.net/manual/de/datetime.gettimestamp.php) ist hier dein Freund ;)

### [#14](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/14) · Unbekannter Benutzer · 2011-05-23

**getTimestamp()** funktioniert leider nicht :(

Wenn ich das mache, bekomm ich gar keine Ausgabe mehr (Browserfenster bleibt weiß):

```php
$date = $object->getCrdate();
t3lib_div::debug($date->getTimestamp(), '$object->getTimestamp()');
```

Und wenn ich das so versuche

```php
$date = new DateTime($object->getDateStart());
t3lib_div::debug($date->getTimestamp(), '$object->getTimestamp()');
```

erhalte ich folgende Fehlermeldung:

```html
Exception: DateTime::__construct() expects parameter 1 to be string, object given
```

Was mache ich falsch?

### [#15](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/15) · a.​berl · 2011-05-23

Schau doch bitte mal was get_class/is_int jeweils bei getCrdate() und getDateStart() zurückliefert. Ich vermute ersteres ist bereits ein Timestamp und letzteres ein DateTime Objekt.

### [#16](https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse/16) · Unbekannter Benutzer · 2011-05-24

Gesagt, getan ;)

Im Model ist **$crdate** und **$dateStart** wie folgt deklariert:

```php
<?php
/**
 * @var DateTime
 */
protected $dateStart;

/**
 * @var int
 */
protected $crdate;
?>
```

Ausgabe von get_class() und is_int() mit:

```php
<?php
// $crdate
t3lib_div::debug(get_class($object->getCrdate()), 'get_class($object->getCrdate())');
t3lib_div::debug(is_int($object->getCrdate()), 'is_int($object->getCrdate())');

// $dateStart
t3lib_div::debug(get_class($object->getDateStart()), 'get_class($object->getDateStart())');
t3lib_div::debug(is_int($object->getDateStart()), 'is_int($object->getDateStart())');
?>
```

ergibt:

```html
get_class($object->getCrdate())
|DateTime|

is_int($object->getCrdate())
| debug |

get_class($object->getDateStart())
|DateTime|

is_int($object->getDateStart())
| debug |
```

Rückgabe "debug" heißt in dem Fall "FALSE", **$crdate** und **$dateStart** sind also keine Integer sondern DateTime Objekte.

Wie sieht es mit der Deklarierung im Model aus? Muss die Variable vom Typ **int** oder vom Typ **DateTime** sein? Die Datenbankfelder habe ich beide als **int** deklariert, weil das Datum in der Datenbank als Timestamp gespeichert wird.

Edit:

Ausgabe von **get_class_methods($object->getCrdate())**:

```html
get_class_methods($object->getCrdate())
 0 	__construct
 1 	format
 2 	modify
 3 	getTimezone
 4 	setTimezone
 5 	getOffset
 6 	setTime
 7 	setDate
 8 	setISODate
```

**DateTime::getTimestamp()** gibts also gar nicht?! Kann man denn mit der **DateTime::format()** einen Timestamp ausgeben?

Edit 2:

**DateTime::getTimestamp()** gibts ab PHP 5.3,x und bei mir läuft 5.2.9. Das is wohl des Rätsels Lösung! Gibts dafür vielleicht ne Alternative in PHP 5.2.9?

Edit 3:

Ok ich habs raus! Schön wenn man seine eigenen Fragen selbst beantworten kann haha :D
Folgendes gibt mir ein DateTimeObject als Timestamp aus:

```php
$date = $object->getCrdate();
$timestamp = strtotime($date->format('Y-m-d H:i:s'));
```

---

Quelle: „Welche Funktion in welche Klasse?“, typo3.net, https://www.typo3.net/d/105463-welche-funktion-in-welche-klasse
Beiträge von Mitgliedern des Forums. Bitte mit Link auf die Diskussion zitieren.
