Iteratie #94 is vrijgegeven. In deze sprint hebben we ons gericht op de release van Symfony 3 en de herindeling van General Chat.
Symfony 3
Eind 2015 kwam Symfony's derde versie uit. We zijn bijna gelijk daarna enthousiast in onze composer.json gedoken om 'm aan te passen voor Symfony 3. Helaas bleek dat enthousiasme wat voorbarig, want er was niet alleen sprake van een paar kleine backward incompatible changes; de manier van werken met formulieren was compleet omgegooid. Hoewel de voorbeelden in de Upgrade-guide nog meevallen, hadden sommige van die wijzigingen een paar flinke consequenties.
De wijziging met de meeste gevolgen was: Passing custom data to forms now needs to be done through the options resolver. Uiteindelijk moesten we door alle aanpassingen samen zo'n tachtig formulieren met de bijbehorende aanroepcode controleren en vaak ook aanpassen.
Het had nog wel een klein voordeel; we konden gelijk die specifieke formulieren of de code waarmee ze worden aangeroepen, wat verbeteren. Soms leverde dat flinke vereenvoudigingen op, doordat een oud formulier onhandig was opgezet of onnodig werk 'zelf' deed. Als voorbeeld geldt onderstaand adresformulier. De oude code deed allerlei mapping tussen object en formulier zelf. In werkelijkheid was dat niet nodig, zelfs niet als je, zoals wij, geen Doctrine gebruikt. De oude aanroepcode zag er ongeveer zo uit:
public function addressesOldAction(Request $request, $id = null)
{
$shop = null; // Get the current shop
$address = null; // Get the address
$form = $this->createForm(new ShopPageAddressForm($address));
if ($request->isMethod('post')) {
$form->handleRequest($request);
$data = $form->getData();
if ($form->isValid()) {
if ( ! $id) {
$address = new Address();
}
$address->setShop($shop);
$address->setAddress($data['address']);
$address->setPostalCode($data['zipcode']);
$address->setPlace($data['city']);
$address->setPhoneNumber($data['phone']);
$address->setEmailAddress($data['email']);
$address->setCountry($data['country']);
$address->setAddressTypes($data['addressTypes']);
// Store the address
}
}
}
Door gebruik te maken van de 'dataclass'-functionaliteit van Symfony konden we het reduceren tot het onderstaande, waarbij bovendien het ShopAddressForm zelf wat eenvoudiger werd.
public function addressesAction(Request $request, Shop $shop, Address $address)
{
$form = $this->createForm(ShopPageAddressForm::class, $address);
$form->handleRequest($request);
if ($form->isValid()) {
$address = $form->getData();
// Make sure it has the correct shop, its not in the form.
$address->setShop($shop);
// Store the address
}
}
De Symfony-kenner zal herkennen dat het niet enkel een refactoring van de form logica is. Het stukje code voor Get the address is niet per se nodig en kon hier met een ParamConverter worden opgelost. Dit hebben we ook meteen veel vaker toegepast.
Al met al moesten we veel code aanpassen om Symfony 3 werkend te krijgen, complete statistieken hebben we helaas niet voor handen. Het samenvoegen van de Symfony 3-branch met onze standaardbranch gaf alleen al 455 aangepaste bestanden met 1120 toevoegingen en 1247 verwijderingen.
Herindeling General Chat
Om beter aan te kunnen sluiten op de behoefte van gebruikers van het forum hebben we General Chat in deze iteratie opnieuw ingericht. We hebben de volgende wijzigingen doorgevoerd:
- 'Werk & Inkomen' hernoemd naar 'Persoonlijke Financiën, Studie en Loopbaan';
- een nieuw subforum 'Wonen & Verbouwen' aangemaakt;
- een nieuw subforum 'Sport' aangemaakt;
- 'Actualiteit, Sport & Politiek' hernoemd naar 'Actualiteit, Wetenschap & Maatschappij';
- 'Wetenschap & Levensbeschouwing' en 'Nieuws, Sport, TV & Muziek' verwijderd;
- een duidelijkere splitsing tussen 'besloten' en 'openbaar' aangebracht, zodat de forumindex overzichtelijker wordt.
En verder…
- kun je nu filteren op prijs in de listing van grootste prijsdalers in de Pricewatch;
- hebben we het lazy loaden van images in singlepage-reviews en forumtopics verder verbeterd door de scrollsnelheid te detecteren. Als die onder de 500 pixels per seconde uitkomt, worden ook de afbeeldingen van de huidige zichtbare pagina en de 'volgende' pagina al opgehaald. Zo heb je als gebruiker minder last van afbeeldingen die zichtbaar geladen worden, terwijl de scrollprestaties goed blijven.
Tweakers zoekt een webdeveloper
In het developmentteam van Tweakers is plek vrijgekomen voor een webdeveloper. Ben jij of ken jij iemand die staat te popelen om mee te bouwen aan de ontwikkeling van Tweakers? Bekijk de vacature voor meer informatie.