Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Extbase: Alternativen zu "findAll"

move:elevator
September 14, 2019

Extbase: Alternativen zu "findAll"

Im Rahmen des TYPO3 Camps München hat Jan Männig einige Alternativen aufgezeigt, um in TYPO3 größere Datenmengen auslesen zu können.

move:elevator

September 14, 2019
Tweet

More Decks by move:elevator

Other Decks in Programming

Transcript

  1. Agenda • Extbase mit 
 „Imageproblem“ Problemstellung Alternativen • MySql-View

    • Doctrine • Eigenes Model für Liste • Eigene DB-Abfrage Weiterführend • Caching Framework • Lazy Loading
  2. Extbase mit schlechtem Image • Vor allem das Datenhandling ist

    als unperformant verschrien Problemstellung
  3. Alternativen MySql-View für Listen-Datensatz • MySql-View führt Daten aus mehreren

    Tabellen zusammen • Ergebnis ist eine Virtuelle Tabelle • Nutzbar wie normale Tabellen
  4. Alternativen MySql-View für Listen-Datensatz Controller tx_mebigdataexample_domain_model_booklist - B.uid - B.pid

    - B.title - B.description - R.uid AS ref_uid - F.identifier AS file_id
 sys_file_refenrence AS R
 - uid sys_file AS F
 - identifier
 tx_mebigdataexample_domain_model_book AS B
 - uid
 - title
 - description
 - …
  5. MySql-View für Listen-Datensatz # # Table structure for table 'tx_mebigdataexample_domain_model_booklist'

    # CREATE VIEW tx_mebigdataexample_domain_model_booklist AS SELECT b.uid, b.pid, b.title, b.description, sys_file_reference.uid as ref_uid, sys_file.identifier as file_id FROM tx_mebigdataexample_domain_model_book as b INNER JOIN sys_file_reference ON b.uid = sys_file_reference.uid_foreign INNER JOIN sys_file ON sys_file_reference.uid_local = sys_file.uid WHERE sys_file_reference.tablenames = 'tx_mebigdataexample_domain_model_book' group by b.uid order by b.sorting, sys_file_reference.sorting_foreign Anlage des Views
  6. MySql-View für Listen-Datensatz Wildcard für Haupttabelle • automatisiert alle Spalten

    der Ursprungstabelle 
 integriert • „images“ Spalte mit Anzahl der Bilder
  7. MySql-View für Listen-Datensatz # # Table structure for table 'tx_mebigdataexample_domain_model_booklist'

    # CREATE VIEW tx_mebigdataexample_domain_model_booklist AS SELECT b.*, sys_file_reference.uid as ref_uid, sys_file.identifier as file_id FROM tx_mebigdataexample_domain_model_book as b INNER JOIN sys_file_reference ON b.uid = sys_file_reference.uid_foreign INNER JOIN sys_file ON sys_file_reference.uid_local = sys_file.uid WHERE sys_file_reference.tablenames = 'tx_mebigdataexample_domain_model_book' group by b.uid order by b.sorting, sys_file_reference.sorting_foreign Anlage des Views mit allen Spalten der Haupttabelle
  8. MySql-View für Listen-Datensatz /** * Extract of the MySQL view

    repository */ class BooklistRepository extends Repository { private const ALLOWED_METHOD_PREFIX = 'find'; public function __call($methodName, $arguments) { if (self::ALLOWED_METHOD_PREFIX !== substr($methodName, 0, 4)) { throw new \BadMethodCallException( sprintf( 'You called method "%s". Only find methods are allowed!', $methodName ) ); } parent::__call($methodName, $arguments); } } Auszug aus dem Repository
  9. MySql-View für Listen-Datensatz # # Property mapping for single record

    # config.tx_extbase{ persistence{ classes{ MoveElevator\MeBigdataExample\Domain\Model\Booklist { mapping { tableName = tx_mebigdataexample_domain_model_booklist columns { title.mapOnProperty = title description.mapOnProperty = description ref_uid.mapOnProperty = imageReferenceId pages.mapOnProperty = pages file_id.mapOnProperty = imagePath } } } } } } Konfiguration des Mappings
  10. Doctrine Doctrine • Datenbankabstraktionsschicht seit TYPO3 Version 8/9 integriert •

    Nutzung komplett unabhängig von der Repository-Struktur die Extbase bietet • Einsatz des QueryBuilders • Unabhängig vom jeweiligen Datenbank-System • Ergebnisse kommen als einfache Arrays zurück
  11. Doctrine /** * @param ObjectManager $objectManager */ public function __construct(ObjectManager

    $objectManager) { $this->queryBuilder = $objectManager->get(ConnectionPool::class) ->getQueryBuilderForTable(self::TABLE_NAME); } Initialisierung des „Query Builders“
  12. Doctrine public function findAll(): array { return $this->queryBuilder ->select('book.*', 'file.identifier

    as file_id') ->from(self::TABLE_NAME, 'book') ->innerJoin( 'book', 'sys_file_reference', 'ref', $this->queryBuilder->expr()->eq( 'ref.uid_foreign', $this->queryBuilder->quoteIdentifier('book.uid') ) ) ->innerJoin( 'ref', 'sys_file', 'file', $this->queryBuilder->expr()->eq( 'ref.uid_local', $this->queryBuilder->quoteIdentifier('file.uid') ) ) Zugriff auf Daten per Select (1/2)
  13. Doctrine Ggf. Nachteile • Keine Objektstruktur -> in den meisten

    Anwendungsfällen aber auch nicht notwendig
  14. Alternativen List-Model • Eigenes Model für Listen und Filteransichten •

    Weniger Abhängigkeiten bzw. Verzweigungen in der Objekt- Struktur • Beschränkung auf alle Informationen die in der Ansicht notwendig sind
  15. List-Model class BookListEntry extends AbstractEntity { /** * @var string

    */ protected $title; /** * @var string */ protected $description; /** * @var int */ protected $pages; /** * Following setter and getter * … */ } Auszug aus Model
  16. List-Model use TYPO3\CMS\Extbase\Persistence\Repository; use TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings; /** * Repository for list

    entry */ class BookListEntryRepository extends Repository { public function initializeObject() { /** @var $querySettings Typo3QuerySettings */ $querySettings = $this->objectManager>get(Typo3QuerySettings::class); $querySettings->setLanguageMode('strict')->setRespectStoragePage(false); $this->setDefaultQuerySettings($querySettings); } } Auszug aus Repository
  17. List-Model config.tx_extbase{ persistence{ classes{ MoveElevator\MeBigdataExample\Domain\Model\BookListEntry { mapping { tableName =

    tx_mebigdataexample_domain_model_book columns { title.mapOnProperty = title description.mapOnProperty = description pages.mapOnProperty = pages } } } } } } Konfiguration des Mappings
  18. Caching Framework • Seit TYPO3 4.3 beinhaltet der Core ein

    Caching Framework • Ermöglicht die einfache Umsetzung verschiedener Cache- Strategien • Unabhängig vom Page-Cache Weiterführende Werkzeuge
  19. Caching Framework • Cache-Systeme Memcached, Database, Redis, … • Key/Value

    Zuweisung zwischen Cache-Identifikator und Wert • Weiterhin Tags und Lifetime als Parameter konfigurierbar Weiterführende Werkzeuge
  20. Caching Framework protected function getCachedMagic() { $cacheIdentifier = $this->calculateCacheIdentifier(); $cache

    = GeneralUtility::makeInstance( \TYPO3\CMS\Core\Cache\CacheManager::class )->getCache('myext_mycache'); // If $entry is null, it hasn't been cached. Calculate the value and store it: if (($entry = $cache->get($cacheIdentifier)) === FALSE) { $entry = $this->calculateMagic(); // [calculate lifetime and assigned tags] // Save value in cache $cache->set($cacheIdentifier, $entry, $tags, $lifetime); } return $entry; } Einfacher Zugriff auf den Cache
  21. Caching Framework /** * @param array $requestArguments * * @return

    string */ protected function calculateCacheIdentifier(array $requestArguments): string { $requestJson = json_encode($requestArguments); return md5($requestJson); } Generierung des „Cache Identifier“
  22. Generierung des „Cache Identifier“ • Um „Cache Flooding“ zu vermeiden,

    sollten zur Generierung des Identifiers nur die Parameter hinzugezogen werden, die Einfluss auf den Inhalt des Cache-Eintrags haben Caching Framework
  23. Lazy Loading • Kein Vorausladen von abhängigen Unterobjekten • Ermittlung

    der Daten erst bei Bedarf Weiterführende Werkzeuge
  24. Lazy Loading class Book extends AbstractEntity { /** * @var

    string */ protected $title; /** * @var string */ protected $description; /** * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\…> * @lazy */ protected $images; Notierung im Model