Benutzen von Repositories

Hallo,

ich habe mir ein package per kickstart erstellt. In diesem sind ein StandardController, ein Model und ein Repository.

Model:

<?php

namespace vendor\hosts\Domain\Model;

use TYPO3\Flow\Annotations as Flow;
use Doctrine\ORM\Mapping as ORM;

/**
 * @Flow\Entity
 */
class Hosts {

    /**
     * @var string
     */
    protected $name;

    /**
     * @var string
     */
    protected $hostId;

Dazu die zugehörigen getter und setter.

StandardController:

<?php

namespace vendor\hosts\Controller;



use TYPO3\Flow\Annotations as Flow;
use vendor\hosts\Domain\Model\Hosts;
use vendor\hosts\Domain\Repository\HostsRepository;


class StandardController extends \TYPO3\Flow\Mvc\Controller\ActionController {

    /**
     * @Flow\Inject
     * @var HostsRepository
     */
    protected $hostsRepository;

     /**
     * @return void
     */
    public function indexAction() {

$info = new Hosts();
$info->setHostId($this->request->getInternalArgument('__hostId'));
$info->setName($this->request->getInternalArgument('__name'));

 $this->hostsRepository->add($info);
}

Die Werte hole ich mir aus dem Backend-Inspector des package und würde diese nun gerne mit der Methode ‘add’ in die Datenbank schreiben.

Wenn ich nun das Backend laden will bekomme ich einen InernalServerError 500.
Im error.log steht nun folgendes:

PHP Fatal error:  Allowed memory size of 268435456 bytes exhausted (tried to allocate 193794 bytes) in /var/www/vhosts/devneos/htdocs/Neos-2.1/Packages/Framework/TYPO3.Flow/Classes/TYPO3/Flow/Error/Debugger.php on line 157

Hat jemand eine Idee was ich nicht richtig mache?

Vielen Dank !

Hallo @dbuecker!

Also der Error an sich gesagt halt, dass dein RAM vollgelaufen ist. Ich glaube aber ehrlich gesagt nicht, dass das dein Problem ist. Bei Flow werden Änderungen in der DB nicht bei sogeannten “Safe Requests” durchgeführt. Dazu gehört zB ein normaler GET-Request. Dein Code sieht jetzt so aus, als würdest du die indexAction direkt aufrufen und nicht über einen POST-Request, also von einem Formular aus. In dem Fall wird in jedem Fall ein Error geworfen, dass das speichern hier nicht erlaubt ist.
Siehe dazu auch:
http://flowframework.readthedocs.org/en/stable/TheDefinitiveGuide/PartIII/Persistence.html?highlight=safe%20request#safe-request-methods-are-read-only

Du könntest jetzt, wie in der Doku beschrieben, den PersistenceManager nutzen und ein persistAll() ausführen. Dann werden die Änderungen in die DB geschrieben.

Sollte das alles nicht reichen erhöhe mal deinen RAM :smiley: :smiley: Aber 256MB sollten für die Anforderung dicke ausreichen!

Hey @stolle

Besten Dank, das hat wunderbar funktioniert!!!

Nun möchte ich nur ein Add ausführen wenn es noch keinen Eintrag mit einer HostId gibt(HostId ist Unique).
Falls es einen Eintrag gibt soll ein update ausgeführt werden. Das Funktioniert auch schon ganz gut.

Nur das mit dem Add klappt noch nicht so wie ich das gerne hätte.

Ich hatte mir das so überlegt:

Ich hole mir zunächst die HostId die im backend-inspector eingetragen ist und führe damit ein Query aus. Wenn dort ein Objekt zurück kommt soll ein update ausgeführt werden, wenn es noch keinen Eintrag gibt soll ein add gemacht werden.

Leider ist das Objekt, welches das Query zurückliefert nie leer. Gibt es eine Möglichkeit um zu überprüfen ob es einen Datenbank mit einer bestimmten HostId gibt?
Kenne mich leider mit dem ORM nicht so gut aus, aber es wird langsam :wink:

Hoffe ich habe mich halbwegs verständlich ausgedrückt.

Viele Grüße,
Damian

Hallo @dbuecker,

das Objekt, dass zurückkommt ist ein Objekt von \TYPO3\Flow\Persistence\QueryResultInterface ?
Mach auf dem Objekt mal ein getFirst(). Da kommt dann entweder null oder ein Object raus. Du kannst dann auf null bzw !== null prüfen

VG

hey @stolle,

das werde ich direkt mal ausprobieren!

Danke :slight_smile: