PHP TYPO3: Declaration of should be compatible with

Schumiel

Lieutenant
Registriert
Jan. 2010
Beiträge
825
Hallo,

ich habe mein TYPO3 von PHP7.0 auf PHP7.2 erhöht und bekomme nun bei TYPO3 v7.6 folgenden Fehler:

PHP:
#1: PHP Warning: Declaration of TYPO3\CMS\NewsExt\ViewHelpers\LinkViewHelper::render(GeorgRinger\News\Domain\Model\News $newsItem, array $settings = Array, $uriOnly = false, $configuration = Array, $content = '') should be compatible with TYPO3\CMS\Fluid\ViewHelpers\Link\PageViewHelper::render($pageUid = NULL, array $additionalParams = Array, $pageType = 0, $noCache = false, $noCacheHash = false, $section = '', $linkAccessRestrictedPages = false, $absolute = false, $addQueryString = false, array $argumentsToBeExcludedFromQueryString = Array, $addQueryStringMethod = NULL) in /html/***/typo3conf/ext/news_ext/Classes/ViewHelpers/LinkViewHelper.php line 19

Wie folgt sieht die Datei aus:

PHP:
<?php

namespace TYPO3\CMS\NewsExt\ViewHelpers;

use TYPO3\CMS\Core\Utility\GeneralUtility;

class LinkViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Link\PageViewHelper {

    /**
     * Render link to news item or internal/external pages
     *
     * @param \GeorgRinger\News\Domain\Model\News $newsItem current news object
     * @param array $settings
     * @param boolean $uriOnly return only the url without the a-tag
     * @param array $configuration optional typolink configuration
     * @param string $content optional content which is linked
     * @return string link
     */
    public function render(\GeorgRinger\News\Domain\Model\News $newsItem, array $settings = array(), $uriOnly = FALSE, $configuration = array(), $content = '') {
        $tsSettings = $this->pluginSettingsService->getSettings();
       
        $this->init();

        $newsType = (int)$newsItem->getType();
        switch ($newsType) {
            // internal news
            case 1:
                $configuration['parameter'] = $newsItem->getInternalurl();
                break;
            // external news
            case 2:
                $configuration['parameter'] = $newsItem->getExternalurl();
                break;
            // normal news record
            default:
                $configuration = $this->getLinkToNewsItem($newsItem, $tsSettings, $configuration);
        }
        if (isset($tsSettings['link']['typesOpeningInNewWindow'])) {
            if (GeneralUtility::inList($tsSettings['link']['typesOpeningInNewWindow'], $newsType)) {
                $this->tag->addAttribute('target', '_blank');
            }
        }

        $url = $this->cObj->typoLink_URL($configuration);
        if ($uriOnly) {
            return $url;
        }

        $this->tag->addAttribute('href', $url);

        if (empty($content)) {
            $content = $this->renderChildren();
        }
        $this->tag->setContent($content);

        return $this->tag->render();
    }
}

Ich kann den Fehler nicht finden. Sobald ich die Funktionparameter anpasse, stimmen die Übergaben aus dem Fluid-Template nicht mehr.
 
Zuletzt bearbeitet:
Manche TYPO3 7.6 Erweiterungen sind nicht mit PHP 7.2 kompatibel (Versuche mal 7.1). Außerdem solltest du schauen, dass du mindestens auf 8.6.26 updatest, da die LTS-Phase abgelaufen ist. Evtl. erhältst du ja Zugriff auf eine 7.6 ELTS-Version.

Es sieht mir auch so aus, als ob die News-Erweiterung nicht mit PHP 7.2 kompatibel ist. Evtl. gibt's ja ein Kompatibilitätsupdate der Erweiterung auf PHP 7.2 für TYPO3 7.6.

Hier auch mal eine gute Übersicht:
https://typo3.org/cms/roadmap/
 
Zuletzt bearbeitet:
Auf php7.0 läuft alles super.
Aber ich muss es auf php7.2 und TYPO3 7.6 bringen, leider.
 
Kannst du nicht einfach das error_reporting() anpassen und Warnings nicht mehr ausgeben lassen?
 
Krafty schrieb:
Kannst du nicht einfach das error_reporting() anpassen und Warnings nicht mehr ausgeben lassen?

Genau das ist es, was es bisher unter php 7.0 hat funktionieren lassen. Der Fehler war da auch schon da, wurde aber durch die Servereinstellung unterdrückt. Diese Warnung würde auch unter PHP 5.x schon kommen.

@Schumiel
Generell ist es schlechter Stil eine Methode derart in der Signatur zu verändern. Allerdings ist die Vorlage von Typo3 jetzt auch nicht unbedingt ein Beispiel dafür, wie man sowas sauber strukturiert.

Dein Problem besteht darin, dass die Methodensignatur der abgeleiteten Klasse nicht mehr der der Elternklasse entspricht. Während dies bei Erweiterung mit optionalen Parametern kein Problem darstellt, verhält es sich hier wegen der Reduktion der Parameter genau anders herum.

Ändere mal bitte die Methodensignatur in deiner Klasse folgendermaßen.
PHP:
public function render(GeorgRinger\News\Domain\Model\News $newsItem, array $settings = [], $uriOnly = false, $configuration = [], $content = '', $_1 = null, $_2 = null, $_3 = null, $_4 = null, array $_5 = null, $_6 = null) 
{
//...
}

Das sollte das Warning beheben, weil nun die Signatur (Anzahl der Parameter, vorhandene Typehints) wieder passt. Deine Einschränkung auf das Objekt der Klasse News im ersten Parameter könnte auch problematisch sein. Da in der Elternklasse keine Einschränkung vorgenommen wird, kann das funktionieren. Sicher bin ich mir aber nicht. Gegebenenfalls musst du diesen Typehint entfernen und mittels instanceof Prüfung sicher stellen.
 
Es ist kein Fehler sondern ein Warning und du kannst es ignorieren.
 
Ich habe php-Fehlerlevel weit unten. Dann erhalte ich den Fehler von TYPO3 selbst. Selbst wenn ich die Error-Meldung ausschalte im TYPO3.

Sgt_H4rtman
Die Änderung der Methode hat nichts gebracht. Gleiche Fehlermeldung.
 
Sgt_H4rtman schrieb:
PHP:
public function render(GeorgRinger\News\Domain\Model\News $newsItem, array $settings = [], $uriOnly = false, $configuration = [], $content = '', $_1 = null, $_2 = null, $_3 = null, $_4 = null, array $_5 = null, $_6 = null)
{
 //... 
}

Ich habe übersehen, dass der erste Parameter in der Elternmethode auch optional ist. Probiere es bitte mal so. Du musst dann natürlich prüfen, ob der erste Parameter eben nicht null ist.
PHP:
public function render(\GeorgRinger\News\Domain\Model\News $newsItem = null, array $settings = [], $uriOnly = false, $configuration = [], $content = '', $_1 = null, $_2 = null, $_3 = null, $_4 = null, array $_5 = null, $_6 = null)
{
    if (null === $newsItem) {
        return '';
    }
    //... 
}
 
Auch das hilft leider nicht. Unveränderte Fehlermeldung. Ich habe auch schon viele Dinge selbst ausprobiert und hänge nun an der einen Sache schon 2-3 Tage. Echt frustrierend ...
 
Hmm vielleicht habe ich mich verzählt oder sowas. Prüfe das bitte evtl. noch mal.

Ansonsten
Warum leitest du überhaupt vom PageViewHelper ab? Also welche Methoden/Properties daraus brauchst du? Prüfe am besten, ob es nicht eine abstrakte ViewHelper Klasse gibt, die du stattdessen verwenden kannst.
Generell ist das Ableiten von konkreten Klassen nicht empfehlenswert und gilt als schlechter Stil.

Ich muss dazu sagen, ich kenne Typo3 jetzt so gar nicht. Wird die render Methode irgendwo automagisch aufgerufen oder machst du das im Template explizit? In letzterem Fall könntest du die Methode auch umbenennen. In jedem Fall hast du bei der aktuellen Struktur aber eine Verletzung des Single Responsibility Principle
 
Ich hatte deins abgezählt. Habe sogar die Typen korrigiert bzw. entsprechend richtig angepasst.

render wird automatisch geladen und ist leider nicht änderbar.

Der Viewhelper wird leider so gebraucht. Habe da auch schon einiges ohne probiert.
 
Zurück
Oben