Scrivere un CMF da zero: uno degli strumenti che il mondo PHP/Symfony mette a disposizione per la gestione dei contenuti è PHPCR. Nelle slide di questo talk presentato al SymfonyDay 2018 spieghiamo come abbiamo utilizzato Doctrine PHPCR ODM e API Platform per poter costruire un CMF ed esporre le sue funzionalità in maniera REST. Inoltre mostriamo gli imprevisti che ci ha lasciato e come li abbiamo superati.
2. Case Study - CMS
Premessa:
Un nostro cliente prestigioso ci ha chiesto di sviluppare un CMS custom
Requisiti:
• Restful
• Versionamento dei contenuti
• Multilingua
• Multisite
2
3. • Content Management Framework
• Un framework che offre gli strumenti
per la gestione dei contenuti
• E’ un toolbox per creare CMS custom
• Esempi:
• eZ Publish / eZ Platform
• Symfony CMF
• Content Management System
• E’ un sistema “pronto all’uso” per la
gestione dei contenuti
• Fornisce un interfaccia admin ben
precisa
• Esempi:
• Wordpress
• Craft CMS
3
CMS CMF
4. Symfony CMF
• E’ un insieme di bundle che possono essere usati per aggiungere
funzionalità CMS ad applicativi Symfony
• content-bundle, routing-bundle, menu-bundle, …
• Nato per applicativi Symfony server side(twig)
• SonataDoctrinePHPCRAdminBundle
4
6. 6
• Creare un bundle riutilizzabile(vendor) che
sfrutta i bundle necessari di Symfony CMF
• Esporre in maniera RESTFul le operazioni con
API Platform
Back-end
• Applicativo Angular che consuma le API del
CMF per la gestione dei contenuti(CMS)
Back-office
• Applicativo Angular che consuma in GET le API
del CMF per la visualizzazione dei contenuti
Front-end
9. Content Repository
• E’ uno storage engine che permette di accedere e manipolare contenuti anche di natura
eterogenea (e.g. pagine, video, immagini, recensioni, ecc..) in maniera uniforme.
• Esempio: Apache Jackrabbit
9
Albero dei Contenuti
1)Nodo
• rappresenta un contenuto
• raggiungibile da un path come in un
filesystem
2)Proprietà di un nodo
• contiene l’informazione
• semplice(stringa, bool, int)
• binaria(binary stream)
/
a b c
d e
path: /a/d
p1: true
path: /a/e
p1: “Titolo Pagina”
p2:
path: /a path: /b
p1: 25
path: /c
p1: 3.5
10. Workspace
• Un content repository è formato da n workspace.
• Ogni workspace ha il suo albero di contenuti.
• Sessione: E’ una connessione autenticata ad un singolo workspace
10
Content Repository
Workspace a Workspace b Workspace c
/
a b c
/ /
11. PHPCR(PHP Content Repository) API
• E’ una specifica di API Standard per interfacciarsi con qualsiasi
Content Repository in una maniera uniforme.
• E’ un porting di JCR(Java Content Repository) API
11
12. Jackalope
• E’ un’implementazione open-source di PHPCR API
• Supporta diversi driver backend (transport)
12
Jackalope Jackrabbit Jackalope DBAL
Content Repository
(Apache Jackrabbit)
RDBMS
(MySQL, SQLite,
Postgres)
13. Doctrine PHPCR-ODM
• E’ un ODM (Object Document Mapper)
• Utilizza il “Data Mapper” pattern per mappare Nodi PHPCR ad oggetti
PHP (Document)
• Supporta concetti PHPCR come children, references, versioning
13
30. 30
Richiesta GET Data Provider Normalization
Richiesta GET Page Data Provider Normalization
• Applicativo Client
richiede una pagina
• Ottiene l’oggetto
Document dal Content
Repository
• Serializza l’oggetto
Document in JSON
Workflow Operazioni READ
38. 38
01
S T E P
02
S T E P
03
S T E P
04
S T E P
Workflow Operazioni WRITE
1)Richiesta POST/PUT/DELETE
• Applicativo Client effettua
un‘operazione WRITE su un
Document/API Resource
2)Denormalization
• API Platform deserializza JSON in
oggetto Document/API Resource
3)WriteListener & Document Writer
• WriteListener mappa la richiesta al
metodo del Document Writer
4)Normalization
• Serializza l’oggetto Document in
JSON