Aan de slag - referentie-informatie (Drupal 8)
Drupal 8 maakt gebruik van een reeks geavanceerde PHP-functies en complexe externe bibliotheken om externe ontwikkelaars de meest geavanceerde API te bieden van alle beschikbare CMS’en. Hoewel ervaren Drupal 7-ontwikkelaars enkele grote veranderingen zullen opmerken, blijft het grootste deel van de basisstructuur vertrouwd.
Als enig materiaal dat wordt gepresenteerd in deze stapsgewijze handleiding voor D8-moduleontwikkeling nieuw voor je is, kan de onderstaande informatie helpen. Er is echter geen diepgaande kennis vereist om verder te gaan met de beschrijving van de D8-module.
Objectgeoriënteerd programmeren
OOP, hoewel het in het begin intimiderend kan lijken, is nu algemeen erkend als de beste aanpak.
Voor een algemeen overzicht van de beste PHP-praktijken, lees phptherightway.com. Drupal gebruikt niet alle verschillende tools en technieken die daar zijn gedocumenteerd, maar het dient als een uitstekende introductie tot PHP en veel van de taalfeatures.
Vernieuw je kennis van OOP door de officiële PHP-documentatie over klassen en objecten te lezen, evenals enkele van deze uitstekende tutorials:
- OOP in PHP volledig uitgelegd
- Objectgeoriënteerd programmeren (Wikipedia)
- Objectgeoriënteerde PHP voor beginners (tuts+)
- OOP-concepten (tutorialspoint.com)
- Objectgeoriënteerd programmeren in PHP (phpro.org)
- Objectgeoriënteerd programmeren in PHP (YouTube)
- Grondbeginselen van programmeren: objectgeoriënteerd ontwerp (lynda.com)
- 12 essentiële OOP-concepten in PHP
- OOP-track op SymfonyCasts (voorheen KNP University)
Drupal 8 gebruikt ook enkele veelvoorkomende ontwerp-patronen, en het is nuttig om een algemeen begrip van deze patronen te hebben:
Factory pattern en late static binding
Ontwerppatronen in software (Wikipedia)
Grondbeginselen van programmeren: ontwerppatronen (lynda.com)
@todo: voeg meer verwijzingen toe naar documentatie over de patronen die we gebruiken...
PHP-namespaces
Als je niet bekend bent met het concept van namespaces in PHP, probeer dan enkele van deze artikelen:
- Hoe PHP-namespaces te gebruiken
- PHP: namespaces
- Video over PHP-namespaces
- Uitleg over PHP-namespaces (door Dayle Rees)
- Namespaces in PHP (tuts+)
In de meeste gevallen is de code van Drupal genamespaceerd op basis van de module waartoe de code behoort.
Voorbeeld: namespace voor block.module
namespace Drupal\block;
@todo: uitleggen waarom het soms Drupal\ is en soms Drupal\\[Controller|Form|Plugin|enz.] en hoe te weten welke te gebruiken...
Lees meer over de Drupal-namespacestandaarden. Meer over het gebruik van PSR-4 in Drupal vind je hier. Een goed ingestelde ontwikkelomgeving zou in staat moeten zijn PHP-namespaces te herkennen en autocomplete te bieden.
Dependency Injection
Hoewel dependency injection eigenlijk een ander OOP-ontwerppatroon is, noemen we het hier apart omdat Drupal 8 dit concept intensief gebruikt, en het belangrijk is om een basisbegrip te hebben om toegang te krijgen tot en gebruik te maken van veel van de core API’s.
Lees over dependency injection in PHP, evenals de aanvullende artikelen op die pagina. Vooral deze blogpost is relevant, aangezien Drupal uitgebreid gebruikmaakt van de Symfony service container die daar wordt besproken.
Zie ook:
Symfony
Symfony is een PHP-framework dat Drupal gebruikt om codeherhaling tussen verschillende PHP-projecten te verminderen. Een groot deel van de code die Drupal 8 gebruikt voor het beheren van routing, sessies en de servicecontainer, is overgenomen uit Symfony 2 (en in latere versies uit Symfony 3). Als je meer wilt weten over waarom deze keuze is gemaakt, bekijk dan deze presentatie van hoofdcommitter alexpott.
Bekijk het Symfony 2-handboek om je kennis van Symfony op te frissen. Hoewel niet alles noodzakelijk is voor Drupal, zal begrip van Symfony je een betere Drupal- en PHP-ontwikkelaar maken. Je kunt ook interesse hebben in de Symfony-woordenlijst.
Bekijk core/composer.lock om de Symfony-bibliotheken te zien. Vanaf Drupal 8.6.15 bevat dit de volgende Symfony- en gerelateerde bibliotheken:
...
"symfony/class-loader": "~3.4.0",
"symfony/console": "~3.4.0",
"symfony/dependency-injection": "~3.4.26",
"symfony/event-dispatcher": "~3.4.0",
"symfony/http-foundation": "~3.4.26",
"symfony/http-kernel": "~3.4.14",
"symfony/routing": "~3.4.0",
"symfony/serializer": "~3.4.0",
"symfony/translation": "~3.4.0",
"symfony/validator": "~3.4.0",
"symfony/process": "~3.4.0",
"symfony/polyfill-iconv": "^1.0",
"symfony/yaml": "~3.4.5",
"twig/twig": "^1.38.2",
"doctrine/common": "^2.5",
"doctrine/annotations": "^1.2",
...
Annotaties
Drupal 8 gebruikt PHP-annotaties — @docblock-commentaar dat met speciale syntaxis aan je code wordt toegevoegd — om plug-ins te detecteren en extra context of metadata te leveren voor uitvoerbare code. Annotaties worden gelezen met behulp van de Doctrine-annotatieparser (v1.6) en omgezet in informatie die Drupal kan gebruiken om je code beter te begrijpen.
Lees meer over het gebruik van annotaties voor plug-in-detectie.
Bekijk de lijst van alle verschillende annotatietypen in Drupal 8.
Zie ook: PHPDoc (Wikipedia)
Plug-ins
Plug-ins bieden kleine stukjes functionaliteit op een manier die gemakkelijk vervangbaar is door een andere plug-in. Plug-ins met vergelijkbare functionaliteit behoren tot hetzelfde type. Bijvoorbeeld, een «veldwidget» is een plug-intype, en elke individuele veldwidget (zoals tekstveld, tekstgebied, datum, enz.) wordt geïmplementeerd als een plug-in.
Lees meer over het plug-in API in Drupal 8.
Services
In Drupal 8 is een service elk object dat wordt beheerd door de servicecontainer. Het concept van services werd geïntroduceerd om herbruikbare functies te scheiden en ze plugbaar en vervangbaar te maken door ze te registreren in de servicecontainer voor dependency injection, waarmee ze nauw verbonden zijn.
Zie ook: Servicecontainer voor Drupal Geeks
Andere bronnen
Hieronder staat een lijst met aanvullende bronnen om je te helpen vertrouwd te raken met Drupal 8.