<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>blog.johanv.org (Posts about symfony)</title><link>https://blog.johanv.org/</link><description></description><atom:link href="https://blog.johanv.org/en/categories/symfony.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2025 &lt;a href="https://blog.johanv.org/pages/contact/"&gt;Johan Vervloet&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-NC-SA"
style="border-width:0; margin-bottom:12px;"
src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png"&gt;&lt;/a&gt;</copyright><lastBuildDate>Wed, 29 Oct 2025 18:31:16 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Upgrading Wdebelek to krakboem 1.0</title><link>https://blog.johanv.org/en/posts/upgrading-wdebelek-to-krakboem-1/</link><dc:creator>Johan Vervloet</dc:creator><description>&lt;div&gt;&lt;p&gt;As I mentioned in a previous blog post, I recently released
&lt;a href="https://blog.johanv.org/posts/my-first-symfony-bundle"&gt;version 1.0 of rva-vzw/krakboem&lt;/a&gt;, the custom
php library I created to use event sourcing and CQRS in my applications.
It comes together with a Symfony bundle,
&lt;a href="https://gitlab.com/rva-vzw/krakboem-bundle/"&gt;rva-vzw/krakboem-bundle&lt;/a&gt;, which
is now at version 0.1.2.&lt;/p&gt;
&lt;p&gt;The first project to use version 1.0, was
&lt;a href="https://blog.johanv.org/en/posts/wiezen-score-app"&gt;dikdikdik&lt;/a&gt;, the score app for the 
&lt;a href="https://en.wikipedia.org/wiki/Solo_whist"&gt;wiezen&lt;/a&gt; card game. This is
one of my &lt;em&gt;pet projects&lt;/em&gt;, in fact the one that I regulary work on.
So in order to test if the krakboem-bundle and the updated krakboem
actually worked, I tried to use them for dikdikdik. As everything seemed
to work fine, I tagged it krakboem 1.0.&lt;/p&gt;
&lt;p&gt;After that, I wanted to use krakboem 1.0 in &lt;a href="https://blog.johanv.org/en/posts/wiezen-app"&gt;wdebelek&lt;/a&gt;,
the app I wrote in covid-times, to play cards online.&lt;/p&gt;
&lt;p&gt;&lt;img alt="screenshot of the wdebelek card playing app" src="https://blog.johanv.org/galleries/cards/wdebelek.png"&gt;&lt;/p&gt;
&lt;p&gt;Wdebelek also uses krakboem, but it is different in that it uses
event based entity repositories instead of
&lt;a href="https://blog.johanv.org/posts/whist-with-a-decider"&gt;deciders&lt;/a&gt;. So I had to figure out if this
would work out fine as well. And while doing he upgrade, I had a nice
chance to improve
&lt;a href="https://gitlab.com/rva-vzw/krakboem/-/blob/develop/UPGRADE-1.0.md"&gt;the upgrade instructions for krakboem 1.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I can't say the update was an easy one. Krakboem 1 requires php 8.3 and Symfony 
serializer 6. And for krakboem-bundle, I need Symfony 6.4.
All this means that I had to update some other dependencies as well. For php 8.3, it
mainly came down to updating
a package here and there. But since until last week, Wdebelek was built on Symfony 5.3, I had
quite some work with the Symfony upgrades. (&lt;strong&gt;update 2024-02-14:&lt;/strong&gt; Especially the new
recipes for codeception 5 were not straightforward.)&lt;/p&gt;
&lt;p&gt;The update of kraboem, from v 0.11 to 1.0, was also not trivial. Lots of classes
moved around. And quite some abstract base classes became read-only, a concept I wasn't
aware of back in 2020. (&lt;strong&gt;update 2024-02-15:&lt;/strong&gt; Identifiers are now expected to be
non-empty as well. This was also quiet an update.)&lt;/p&gt;
&lt;p&gt;But since last week, the 4th of february to be exact, wdebelek is running with
the latest versions of my libraries. It still needed a blog post, but hey,
here it is, so I am a happy programmer again. (Writing the blog post took me
a week, because of, you know, life.)&lt;/p&gt;
&lt;p&gt;If you want to try playing cards with Wdebelek,
you have to find at least 2 other people to play, and go to
&lt;a href="https://kaart.rijkvanafdronk.be"&gt;kaart.rijkvanafdronk.be&lt;/a&gt;. Remember that you
need to drag the cards to play them. (This is not really clear from
the UI, and it often causes some confusion).&lt;/p&gt;
&lt;p&gt;I still have one project to update: &lt;a href="https://gitlab.com/johanv/1jg"&gt;1jg&lt;/a&gt;,
another score app for another game. This will probably a little easier than
the Wdebelek update, because 1jg is already on Symfony 6.3. And of course
I now have nice upgrade instructions for krakboem and its bundle
now 😉.&lt;/p&gt;&lt;/div&gt;</description><guid>https://blog.johanv.org/en/posts/upgrading-wdebelek-to-krakboem-1/</guid><pubDate>Sat, 10 Feb 2024 14:42:00 GMT</pubDate></item><item><title>Krak? Boem! My first Symfony Bundle</title><link>https://blog.johanv.org/en/posts/my-first-symfony-bundle/</link><dc:creator>Johan Vervloet</dc:creator><description>&lt;div&gt;&lt;p&gt;Earilier this week, I published my first Symfony bundle. Should you use it? I don't think so.
But I'm proud that I unlocked this achievement 🏆🔓&lt;/p&gt;
&lt;p&gt;A little background.&lt;/p&gt;
&lt;p&gt;&lt;img alt="picture of an elephant and playing cards" src="https://blog.johanv.org/galleries/cards/krakboem1.png"&gt;&lt;/p&gt;
&lt;p&gt;Back in 2019, I started writing an 
&lt;a href="https://blog.johanv.org/en/posts/wiezen-score-app"&gt;application that keeps track of the points when playing whist&lt;/a&gt;. I called it
&lt;a href="https://gitlab.com/rva-vzw/dikdikdik"&gt;dikdikdik&lt;/a&gt;, a typical bad name for an open
source project. It refers to some catch phrase in Dutch, and it can be used
at &lt;a href="https://score.rijkvanafdronk.be"&gt;score.rijkvanafdronk.be&lt;/a&gt;. It has
become rather popular over time, which I find very cool.&lt;/p&gt;
&lt;p&gt;So ok, I created this app because I wanted something to help us with the
scores of our card game. But maybe
at least as important: I wanted to create an app to fiddle around, and to learn
new things. I wanted to use Symfony and event sourcing, two technologies
that were still rather new to me. After some time, I had a fun project,
and I talked about it in a &lt;a href="https://jv3.johanv.org/phpbnl20"&gt;lightning talk&lt;/a&gt; at
the last PhpBenelux conference (ever? 😢) in 2020.&lt;/p&gt;
&lt;p&gt;Not long after that, in 2020, Covid broke out, and we couldn't play cards anymore because
of the restrictions. So we needed an &lt;a href="https://blog.johanv.org/en/posts/wiezen-app"&gt;app to play cards online&lt;/a&gt;.
Because I wanted that one to be event sourced as well, and because I didn't want to
write everything again, I extracted all relevant
classes and interfaces to a php package. &lt;a href="https://gitlab.com/rva-vzw/krakboem"&gt;rva-vzw/krakboem&lt;/a&gt;
was born.&lt;/p&gt;
&lt;p&gt;This package worked quite well for a couple of years. But things have changed.
Back then, I used php 7.4. Now there's php 8.3, with &lt;code&gt;final&lt;/code&gt; and &lt;code&gt;readonly&lt;/code&gt;. I know more
about the relationship between &lt;code&gt;Traversable&lt;/code&gt; and &lt;code&gt;Generator&lt;/code&gt;. I also have better
understanding about what infrastructure code exactly is. And recently I 
&lt;a href="https://blog.johanv.org/en/posts/whist-with-a-decider"&gt;learned how to use deciders&lt;/a&gt;, and
krakboem didn't know deciders.&lt;/p&gt;
&lt;p&gt;So krakboem could use an update, and that's what I did. I rearranged the classes,
added &lt;code&gt;final&lt;/code&gt; and &lt;code&gt;readonly&lt;/code&gt;, introduced deciders. And while doing this, I also
extracted all symfony messenger and doctrine code, and moved that to a bundle.
So now I have a &lt;a href="https://packagist.org/packages/rva-vzw/krakboem-bundle"&gt;krakboem-bundle&lt;/a&gt;.
And I also tagged &lt;a href="https://packagist.org/packages/rva-vzw/krakboem"&gt;version 1.0&lt;/a&gt;
of the base krakboem package 🎉&lt;/p&gt;
&lt;p&gt;Not that I'm 100% happy with how krakboem is structured, but I didn't want to move
every class around. And I'm fairly sure that it will be useful again for a couple
of years without needing lots of changes.&lt;/p&gt;
&lt;p&gt;The bundle is still experimental (version 0.1.2 at the moment); I don't really know 
yet how to properly create a bundle. But I am happy, because it already takes care of the
dependency injection for the doctrine and messenger infrastructure.&lt;/p&gt;
&lt;p&gt;So next thing on my to-do will be: upgrade my other krakboem-based projects, so that they all use my
new bundle. I don't expect this to be a whole lot of work, but I don't have a whole
lot of time either. So we'll see how it works out.&lt;/p&gt;&lt;/div&gt;</description><guid>https://blog.johanv.org/en/posts/my-first-symfony-bundle/</guid><pubDate>Sat, 13 Jan 2024 20:52:00 GMT</pubDate></item><item><title>Whist with a decider</title><link>https://blog.johanv.org/en/posts/whist-with-a-decider/</link><dc:creator>Johan Vervloet</dc:creator><description>&lt;div&gt;&lt;p&gt;Back in June, I attended &lt;a href="https://2023.dddeurope.com/"&gt;DDD Europe 2023&lt;/a&gt;.
It was the first time I was at this conference, but I liked it a lot, and I was 
intrigued by 
&lt;a href="https://2023.dddeurope.com/program/aggregates-composition-a-new-view-on-aggregates/"&gt;Jérémie Chassaing's talk&lt;/a&gt;,
in which he used a &lt;em&gt;decider&lt;/em&gt; to keep track of the internal state
of aggregates.&lt;/p&gt;
&lt;p&gt;I don't know a lot (yet?) about functional programming, but I was charmed
by this elegant way to work with commands and events. So I 
wanted to experiment with deciders as well.
As it turns out, I have an ideal project for doing this kind of
experiments:
&lt;a href="https://gitlab.com/rva-vzw/dikdikdik"&gt;dikdikdik&lt;/a&gt;, my web based
score sheet for the &lt;a href="https://blog.johanv.org/categories/wiezen"&gt;wiezen&lt;/a&gt; (whist) card
game. It already had commands and events, so using a decider should not
be too hard.&lt;/p&gt;
&lt;p&gt;&lt;img alt="someone deciding what to bid with their cards" src="https://blog.johanv.org/galleries/cards/decider.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Dikdikdik has two aggregates: a table (as in a piece of furniture, the 
table is where the players sit down, and play their games)
and a score sheet. Initially those aggregates had methods that emitted
events, and other methods that applied those events to their internal
states. The latter ones were also used to rebuild the aggregates based
on their event streams, since dikdikdik is also an event sourced application.&lt;/p&gt;
&lt;p&gt;In a first step, I replaced the table entity by a TableDecider and a
TableInternalState class. The idea is that when you pass
the internal state of a table and a command to the
decide-method of the 
&lt;a href="https://gitlab.com/rva-vzw/dikdikdik/-/blob/develop/src/Domain/WriteModel/Table/Aggregate/TableDecider.php"&gt;TableDecider&lt;/a&gt;,
it produces events, describing
what happens. When passing those events with the internal state to
the evolve-method of the decider, it
applies the events, creating an updated internal state.&lt;/p&gt;
&lt;p&gt;I could use this decider pattern to implement event sourcing, and it also
allowed me to create a kind of testing
framework, that made it easy to create &lt;em&gt;given-when-then-unit tests&lt;/em&gt; in a quite elegant
way, see e.g. 
&lt;a href="https://gitlab.com/rva-vzw/dikdikdik/-/blob/develop/tests/unit/Domain/WriteModel/Table/TableDeciderTest.php#L135-157"&gt;this test that tests joining players&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I created the decider in a more-or-less test driven way, by converting my old
tests for the Table aggregate to new tests for the table decider, and then make them
pass by converting the old logic to the decider based logic.&lt;/p&gt;
&lt;p&gt;This conversion was interesting, because it made me look back into
the existing code for the write side of the table. And whenever I see
code I wrote a couple of months or years ago, I am reminded about the
things I learned since then. That's a good thing, I presume. Other pieces
of the code have become less relevant, since the project has changed as well
during the last couples of years. I created a couple of issues on gitlab
for the oddities I enountered, 
e.g. &lt;a href="https://gitlab.com/rva-vzw/dikdikdik/-/issues/304"&gt;#304&lt;/a&gt;,
&lt;a href="https://gitlab.com/rva-vzw/dikdikdik/-/issues/308"&gt;#308&lt;/a&gt;,
&lt;a href="https://gitlab.com/rva-vzw/dikdikdik/-/issues/302"&gt;#302&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When all unit tests passed, it didn't take a lot of work to make the integration tests
and e2e tests to be all green as well. Which made me happy, because I think this 
was an indication that the
degree of decoupling in my project is low.
If you look at the &lt;a href="https://gitlab.com/rva-vzw/dikdikdik/-/merge_requests/282"&gt;merge request&lt;/a&gt; 
(which I reviewed en merged myself, since I am the only developer on the project 😉),
you will notice that almost all changes are in the &lt;code&gt;Domain\WriteModel\Table&lt;/code&gt; namespace,
and almost no other things needed to change. The other aggregate, the
&lt;code&gt;ScoreSheet&lt;/code&gt;, still uses my old way of working, and guess what: that doesn't matter.
The score sheet doesn't need to care about the internal workings of the table,
and vice versa, the events are the only things that pass the boundries between them.&lt;/p&gt;
&lt;p&gt;All with all, there were two other things I needed to change. One thing, was the
validation of the games that can be logged. Now I can use a service for this, that I
can nicely inject into the decider, which is way more elegant than what I did before to
let the aggregate class validate the logged games. (The validation service still has some 
issues in its current form, but it is already injected; that's something.)&lt;/p&gt;
&lt;p&gt;Another thing is that the decider is aware of the initial state of the aggregate.
Previously, I prepared the initial state by handling the event &lt;code&gt;TableCleared&lt;/code&gt;. Now
this event is not really needed anymore, but in my integration tests I still
(ab)use it to reset the read models.&lt;/p&gt;
&lt;p&gt;Another interesting change that happened, when introducing the decider, is that I don't
have a dedicated handler for each command anymore. Which feels a little strange to me, I
always learnt that each command should have its own handler.
Now the &lt;code&gt;TableDecider&lt;/code&gt; takes every &lt;code&gt;TableCommand&lt;/code&gt;, and calls 
&lt;a href="https://gitlab.com/rva-vzw/dikdikdik/-/blob/develop/src/Domain/WriteModel/Table/Aggregate/TableDecider.php?ref_type=heads#L74-92"&gt;the handler function that corresponds to the command&lt;/a&gt;.
But I guess these functions are the handlers now, which may be fine.&lt;/p&gt;
&lt;p&gt;Anyway, I am happy about the result I've got so far. I think I will already
release this to &lt;a href="https://score.rijkvanafdronk.be"&gt;score.rijkvanafdronk.be&lt;/a&gt; at the
end of this month, so that we can try it out during the next meetup of our
wiezen club. (Of course everything should just work, 
&lt;a href="https://gitlab.com/rva-vzw/dikdikdik/-/pipelines/997997738"&gt;since all tests are green&lt;/a&gt;,
but I want to use the application quickly after the release, so that we would
notice any bugs that are not covered by the tests.)&lt;/p&gt;
&lt;p&gt;So what's next:&lt;/p&gt;
&lt;p&gt;Now that the write side for the table is handled by a decider, I will also replace
the one for the score sheet. Since the &lt;code&gt;ScoreSheet&lt;/code&gt; class is much smaller than
the &lt;code&gt;Table&lt;/code&gt; class was, this should take less time than converting the table, but
I also have little free time to develop these days, so we will see how this turns out.&lt;/p&gt;
&lt;p&gt;And then there's the process manager, that passes commands to the score sheet when games
are played at the table. I think Jérémy did something like this in his talk, by
combining deciders, but I will probably have to watch a recording of his talk again,
because I'm not sure anymore about how this works.&lt;/p&gt;
&lt;p&gt;Another thing I want to do, is add the generic decider classes I created to the
&lt;a href="https://gitlab.com/rva-vzw/krakboem"&gt;krakboem&lt;/a&gt; libray I created for my own
event sourced projecs. That library needs some updates as well, because it was
created when php 7.4 was a thing.&lt;/p&gt;
&lt;p&gt;For a short period of time, I had timelines for the new features of dikdikdik.
But not anymore, because life happens, and I will see when I have time to code.
Anyway, I want to thank
&lt;a href="https://mastodon.social/@thinkb4coding"&gt;Jérémie&lt;/a&gt; for his inspiring talk. I'm
glad I got this far already, and we'll see what the future brings. &lt;/p&gt;
&lt;p&gt;Until then:
have a nice time &lt;a href="https://score.rijkvanafdronk.be"&gt;playing whist&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</description><guid>https://blog.johanv.org/en/posts/whist-with-a-decider/</guid><pubDate>Thu, 07 Sep 2023 18:47:00 GMT</pubDate></item><item><title>Migrating a web app from VueJS to Symfony UX: retrospective</title><link>https://blog.johanv.org/en/posts/symfony-ux-retrospective/</link><dc:creator>Johan Vervloet</dc:creator><description>&lt;div&gt;&lt;p&gt;The last couple of weeks, I have been refactoring the frontend
of &lt;a href="https://gitlab.com/rva-vzw/dikdikdik"&gt;dikdikdik&lt;/a&gt;, one of my
pet projects, that we use to track the scores when we play the
card game &lt;a href="https://en.wikipedia.org/wiki/Solo_whist"&gt;'wiezen'&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="twig and class for DelaerSelectComponent" src="https://blog.johanv.org/galleries/cards/symfony-ux.png"&gt;&lt;/p&gt;
&lt;p&gt;The release of version 3.0, in which I threw out VueJS in favour of 
&lt;a href="https://github.com/symfony/ux-turbo"&gt;Symfony Turbo&lt;/a&gt; and 
&lt;a href="https://github.com/symfony/ux-live-component"&gt;Symfony Live Components&lt;/a&gt; was
&lt;a href="https://www.rijkvanafdronk.be/blog/dikdikdik-3.0/"&gt;announced yesterday&lt;/a&gt;,
and in this blog post I look back on the refactoring, making some
kind of roundup on what I like and dislike about the new frontend I
created with those new symfony-ux tools.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.johanv.org/en/posts/symfony-ux-retrospective/"&gt;Read more…&lt;/a&gt; (5 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://blog.johanv.org/en/posts/symfony-ux-retrospective/</guid><pubDate>Sun, 07 Nov 2021 20:34:00 GMT</pubDate></item><item><title>Combining Symfony live components and Mercure</title><link>https://blog.johanv.org/en/posts/combining-live-components-and-mercure/</link><dc:creator>Johan Vervloet</dc:creator><description>&lt;div&gt;&lt;p&gt;&lt;img alt="score sheet" src="https://blog.johanv.org/galleries/cards/scoresheet.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Here's the next blog post of my little series about Symfony live components.
Last week, I wrote &lt;a href="https://blog.johanv.org/posts/first-symfony-live-component/"&gt;my first Symfony live component&lt;/a&gt;,
and today I will use Symfony Turbo Streams (with mercure) to update my components.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.johanv.org/en/posts/combining-live-components-and-mercure/"&gt;Read more…&lt;/a&gt; (4 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://blog.johanv.org/en/posts/combining-live-components-and-mercure/</guid><pubDate>Wed, 27 Oct 2021 19:10:00 GMT</pubDate></item><item><title>My First Symfony Live Component</title><link>https://blog.johanv.org/en/posts/first-symfony-live-component/</link><dc:creator>Johan Vervloet</dc:creator><description>&lt;figure&gt;&lt;img src="https://blog.johanv.org/galleries/cards/live-components.png"&gt;&lt;/figure&gt; &lt;div&gt;&lt;p&gt;As I mentioned &lt;a href="https://blog.johanv.org/posts/trying-out-symfony-live-components"&gt;yesterday&lt;/a&gt;, I want to use
Symfony Twig Components (and even better: Symfony Live Components) to rebuild
the frontend of our wiezen score app, &lt;a href="https://github.com/rva-vzw/dikdikdik"&gt;dikdikdik&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today I am very happy, because I created my first live component 🎉🎉🎉. It works, and
it is very cool, because now I can use PHP to describe the behavior of a
front-end component.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.johanv.org/en/posts/first-symfony-live-component/"&gt;Read more…&lt;/a&gt; (2 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://blog.johanv.org/en/posts/first-symfony-live-component/</guid><pubDate>Wed, 20 Oct 2021 19:23:00 GMT</pubDate></item><item><title>Trying out Symfony Twig Components</title><link>https://blog.johanv.org/en/posts/trying-out-symfony-live-components/</link><dc:creator>Johan Vervloet</dc:creator><description>&lt;figure&gt;&lt;img src="https://blog.johanv.org/galleries/cards/twig-components.png"&gt;&lt;/figure&gt; &lt;div&gt;&lt;p&gt;Last summer, I attended SymfonyWorld Online 2021 Summer Edition, and I was
fascinated by &lt;a href="https://twitter.com/weaverryan"&gt;Ryan Weaver&lt;/a&gt;s
talk about &lt;a href="https://github.com/symfony/ux-twig-component"&gt;Symfony Twig Components&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As the README says on the &lt;a href="https://github.com/symfony/ux-twig-component"&gt;github project page&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Twig components give you the power to bind an object to a template, making it easier 
to render and re-use small template "units" - like an "alert", markup for a modal,
or a category sidebar.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I found the presentation very promising, and I wanted to try using
twig components in combination with &lt;a href="https://symfonycasts.com/screencast/stimulus"&gt;stimulus&lt;/a&gt;
for the frontend of &lt;a href="https://gitlab.com/rva-vzw/dikdikdik"&gt;dikdikdik&lt;/a&gt;, a hobby
webapp I maintain, to keep track of the score for the
&lt;a href="https://en.wikipedia.org/wiki/Solo_whist"&gt;wiezen&lt;/a&gt; card game.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.johanv.org/en/posts/trying-out-symfony-live-components/"&gt;Read more…&lt;/a&gt; (2 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://blog.johanv.org/en/posts/trying-out-symfony-live-components/</guid><pubDate>Mon, 18 Oct 2021 20:18:00 GMT</pubDate></item><item><title>Updating your Symfony app from Mercure 0.10 to Mercure 0.11</title><link>https://blog.johanv.org/en/posts/upgrade-mercure-to-0.11/</link><dc:creator>Johan Vervloet</dc:creator><description>&lt;div&gt;&lt;p&gt;Last wednesday I updated
&lt;a href="https://gitlab.com/rva-vzw/dikdikdik/"&gt;dikdikdik&lt;/a&gt;, a score sheet app
for &lt;a href="https://en.wikipedia.org/wiki/Solo_whist"&gt;solo whist&lt;/a&gt;,
so that it now uses &lt;a href="https://mercure.rocks"&gt;Mercure&lt;/a&gt; v0.11, instead of v0.10.
I use docker-compose for the development environment of dikdikdik, and 
&lt;a href="https://blog.johanv.org/posts/gitlab-ci-selenium-and-mercure/"&gt;GitLab CI/CD to run the end-to-end tests&lt;/a&gt;
with codeception and selenium.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mercure v0.11" src="https://blog.johanv.org/galleries/cards/mercure011.png"&gt;&lt;/p&gt;
&lt;p&gt;This was not a trivial update, because v0.11 was a
&lt;a href="https://dunglas.fr/2020/11/the-mercure-rocks-hub-is-now-based-on-caddy-web-server/"&gt;major milestone&lt;/a&gt;
for the Mercure project.
In retrospect, I didn't have to change much, but it took me some time
to find out what exactly I had to change, especially to make the 
end-to-end tests running again.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.johanv.org/en/posts/upgrade-mercure-to-0.11/"&gt;Read more…&lt;/a&gt; (2 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://blog.johanv.org/en/posts/upgrade-mercure-to-0.11/</guid><pubDate>Sat, 26 Jun 2021 05:59:00 GMT</pubDate></item><item><title>Selenium web tests on gitlab-ci for an app using Mercure</title><link>https://blog.johanv.org/en/posts/gitlab-ci-selenium-and-mercure/</link><dc:creator>Johan Vervloet</dc:creator><description>&lt;div&gt;&lt;p&gt;I recently learned
&lt;a href="https://symfony.com/doc/current/mercure.html"&gt;how to use Mercure&lt;/a&gt;
so that the php/Symfony back-end of my
application can send out events that can be picked up by the
javascript on my front end. This is really cool technology, you should
definitely try this out if you haven't already done so.&lt;/p&gt;
&lt;p&gt;Now if you write this kind of software, of course you also want to
write some web tests, so that you can automatically check if existing
features of your program keep working after you add new things.&lt;/p&gt;
&lt;p&gt;&lt;img alt="gitlab-ci, codeception and mercure" src="https://blog.johanv.org/galleries/misc/gitlab-codeception-mercure-smaller.png"&gt;&lt;/p&gt;
&lt;p&gt;For these kind of tests, I use gitlab-ci and codeception, as I wrote
in &lt;a href="https://blog.johanv.org/categories/ci"&gt;previous posts&lt;/a&gt;. Today I got these test working
with a Mercure hub.&lt;/p&gt;
&lt;p&gt;You need to use a mercure service in the job running your web tests,
which you can configure in &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2020-12-03:&lt;/strong&gt; I use the 0.10 version of the mercure container,
because the acceptance test job started failing with 0.11, with these
error messages:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Message: "Couldn't connect to server for "http://mercure:3000/.well-known/mercure"."
In HandleMessageMiddleware.php line 80:&lt;/p&gt;
&lt;p&gt;Couldn't connect to server for "http://mercure:3000/.well-known/mercure".)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So here's the adapted &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;-file:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nt"&gt;JWT_KEY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;YourSecretKey&lt;/span&gt;
  &lt;span class="nt"&gt;DEMO&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;1&lt;/span&gt;
  &lt;span class="nt"&gt;ALLOW_ANONYMOUS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;1&lt;/span&gt;
  &lt;span class="nt"&gt;HEARTBEAT_INTERVAL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;30s&lt;/span&gt;
  &lt;span class="nt"&gt;ADDR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;':3000'&lt;/span&gt;
  &lt;span class="nt"&gt;CORS_ALLOWED_ORIGINS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'*'&lt;/span&gt;
  &lt;span class="nt"&gt;PUBLISH_ALLOWED_ORIGINS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'*'&lt;/span&gt;

&lt;span class="c1"&gt;# ...&lt;/span&gt;

&lt;span class="nt"&gt;acceptance tests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# I would prefer to use a public php-7.3 image with mysqli, but&lt;/span&gt;
  &lt;span class="c1"&gt;# I don't think such a thing exists.&lt;/span&gt;
  &lt;span class="c1"&gt;# So let's reuse the image I created for the dikdikdik web tests.&lt;/span&gt;
  &lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;registry.gitlab.com/rva-vzw/dikdikdik.php&lt;/span&gt;
  &lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;mariadb:10.4&lt;/span&gt;
      &lt;span class="nt"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;db&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;selenium/standalone-chrome&lt;/span&gt;
      &lt;span class="nt"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;chrome&lt;/span&gt;
    &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;dunglas/mercure&lt;/span&gt;
      &lt;span class="nt"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;mercure:v0.10&lt;/span&gt;
  &lt;span class="c1"&gt;# (the rest of the job follows here)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;JWT_KEY&lt;/code&gt; should work with the &lt;code&gt;JWT&lt;/code&gt; your backend uses
to publish events. The port number in &lt;code&gt;ADDR&lt;/code&gt; as well. If you
use Symfony, as I do, the corresponding configuration of your
backend should be in the &lt;code&gt;.env&lt;/code&gt; file, e.g.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;MERCURE_PUBLISH_URL=http://mercure:3000/.well-known/mercure
MERCURE_JWT_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXJjdXJlIjp7InB1Ymxpc2giOltdfX0.FFSjymJCGRDWrmAmPJDoVGuYwnx5FRTjRFkkYfvLkUg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(Needless to say: don't use the production JWT and token in the
source code that is used by gitlab! If you're unsure how to
create a JWT, see the section ‘Creating your JWT’
of 
&lt;a href="https://thedevopsguide.com/real-time-notifications-with-mercure/"&gt;this excellent blog post&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2020-12-03:&lt;/strong&gt; That blog post doesn't exist anymore, but 
&lt;a href="https://medium.com/@stefan.poeltl/instant-realtime-notifications-with-symfony-and-mercure-e45270f7c8a5"&gt;I found another page&lt;/a&gt;
that covers mercure and the JWT token.&lt;/p&gt;
&lt;p&gt;Now the problem I ran into, is similar to the
&lt;a href="https://blog.johanv.org/posts/gitlab-ci-codeception-and-selenium-web-tests"&gt;general problem I had with web tests&lt;/a&gt;:
the chrome container doesn't know where the mercure hub is;
the host name ‘mercure’ is not resolved to an ip address.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2022-06-20:&lt;/strong&gt; &lt;em&gt;The solution described below will still work, but
I found a better one. You should just set the
&lt;code&gt;FF_NETWORK_PER_BUILD&lt;/code&gt; variable to 1 in your &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file,
as described &lt;a href="https://blog.johanv.org/posts/php-ci-demo"&gt;in this post&lt;/a&gt;. If you want to see how
this works for a real life project, you can check out the
&lt;a href="https://gitlab.com/rva-vzw/dikdikdik/-/blob/develop/.gitlab-ci.yml"&gt;.gitlab-ci.yml&lt;/a&gt;
file of &lt;a href="https://gitlab.com/rva-vzw/dikdikdik/"&gt;dikdikdik&lt;/a&gt;, an app to
keep track of the scores when playing &lt;a href="https://www.rijkvanafdronk.be/wiezen"&gt;solo whist&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To fix this, I figure out the IP address of the Mercure hub when I
start the job, and I replace the host name of the &lt;code&gt;MERCURE_PUBLISH_URL&lt;/code&gt;
in the &lt;code&gt;.env&lt;/code&gt; file by this IP-address. This works, since my frontend
retrieves the publish url from the backend by a rest-call.&lt;/p&gt;
&lt;p&gt;This is how that looks like:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;  script:
    - MERCURE_IP=$(getent hosts mercure | awk '{ print $1 }')
    - echo Mercure IP $MERCURE_IP
    - sed -i "s/mercure:3000/$MERCURE_IP:3000/" .env
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can review the complete job definition in the &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;
&lt;a href="https://gitlab.com/rva-vzw/wdebelek/-/blob/develop/.gitlab-ci.yml#L129-161"&gt;file in the wdebelek repository&lt;/a&gt;.
The file &lt;code&gt;acceptance/TrickCest.php&lt;/code&gt; contains an
&lt;a href="https://gitlab.com/rva-vzw/wdebelek/-/blob/develop/tests/acceptance/TrickCest.php#L42"&gt;example test involving server sent events&lt;/a&gt;.
And hopefully you can see in the
&lt;a href="https://gitlab.com/rva-vzw/wdebelek/pipelines"&gt;pipelines&lt;/a&gt; that all
tests passed without problems 🤓.&lt;/p&gt;&lt;/div&gt;</description><guid>https://blog.johanv.org/en/posts/gitlab-ci-selenium-and-mercure/</guid><pubDate>Fri, 08 May 2020 20:15:00 GMT</pubDate></item><item><title>Dependency hell when upgrading symfony from 4.3 to 4.4</title><link>https://blog.johanv.org/en/posts/symfony-4.4-upgrade-issues/</link><dc:creator>Johan Vervloet</dc:creator><description>&lt;div&gt;&lt;p&gt;Recently I tried to upgrade the symfony version of the
&lt;a href="https://gitlab.com/rva-vzw/dikdikdik"&gt;dikdikdik wiezen score app&lt;/a&gt;
from 4.3 to 4.4. As usual, I ended up in dependency hell.&lt;/p&gt;
&lt;p&gt;Here's what I got:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ composer update symfony/*
Loading composer repositories with package information
Updating dependencies &lt;span class="o"&gt;(&lt;/span&gt;including require-dev&lt;span class="o"&gt;)&lt;/span&gt;
Restricting packages listed &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"symfony/symfony"&lt;/span&gt; to &lt;span class="s2"&gt;"4.4.*"&lt;/span&gt;
Your requirements could not be resolved to an installable &lt;span class="nb"&gt;set&lt;/span&gt; of packages.

  Problem &lt;span class="m"&gt;1&lt;/span&gt;
    - Conclusion: don&lt;span class="s1"&gt;'t install symfony/validator v4.4.7&lt;/span&gt;
&lt;span class="s1"&gt;    - Conclusion: don'&lt;/span&gt;t install symfony/validator v4.4.6
    - Conclusion: don&lt;span class="s1"&gt;'t install symfony/validator v4.4.5&lt;/span&gt;
&lt;span class="s1"&gt;    - Conclusion: don'&lt;/span&gt;t install symfony/validator v4.4.4
    - Conclusion: don&lt;span class="s1"&gt;'t install symfony/validator v4.4.3&lt;/span&gt;
&lt;span class="s1"&gt;    - Conclusion: don'&lt;/span&gt;t install symfony/validator v4.4.2
    - Conclusion: don&lt;span class="err"&gt;'&lt;/span&gt;t install symfony/validator v4.4.1
    - symfony/validator v4.4.0 conflicts with doctrine/lexer&lt;span class="o"&gt;[&lt;/span&gt;v1.0.1&lt;span class="o"&gt;]&lt;/span&gt;.
    - symfony/validator v4.4.0 conflicts with doctrine/lexer&lt;span class="o"&gt;[&lt;/span&gt;v1.0.1&lt;span class="o"&gt;]&lt;/span&gt;.
    - symfony/validator v4.4.0 conflicts with doctrine/lexer&lt;span class="o"&gt;[&lt;/span&gt;v1.0.1&lt;span class="o"&gt;]&lt;/span&gt;.
    - Installation request &lt;span class="k"&gt;for&lt;/span&gt; symfony/validator &lt;span class="m"&gt;4&lt;/span&gt;.4.* -&amp;gt; satisfiable by symfony/validator&lt;span class="o"&gt;[&lt;/span&gt;v4.4.0, v4.4.1, v4.4.2, v4.4.3, v4.4.4, v4.4.5, v4.4.6, v4.4.7&lt;span class="o"&gt;]&lt;/span&gt;.
    - Installation request &lt;span class="k"&gt;for&lt;/span&gt; doctrine/lexer &lt;span class="o"&gt;(&lt;/span&gt;locked at v1.0.1&lt;span class="o"&gt;)&lt;/span&gt; -&amp;gt; satisfiable by doctrine/lexer&lt;span class="o"&gt;[&lt;/span&gt;v1.0.1&lt;span class="o"&gt;]&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I ran &lt;code&gt;composer require doctrine/lexer&lt;/code&gt;, hoping that this would give
me some clues:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ composer depends doctrine/lexer
doctrine/annotations  v1.8.0   requires  doctrine/lexer &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.*&lt;span class="o"&gt;)&lt;/span&gt;
doctrine/common       v2.10.0  requires  doctrine/lexer &lt;span class="o"&gt;(&lt;/span&gt;^1.0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I guess that doctrine must have been the problem.&lt;/p&gt;
&lt;p&gt;So I uninstalled doctrine (&lt;code&gt;composer remove symfony/orm-pack&lt;/code&gt;), 
&lt;a href="https://symfony.com/doc/current/setup/upgrade_minor.html"&gt;upgraded symfony&lt;/a&gt; 
(that worked, 🎉),
put the doctrine configuration files back in place, and reinstalled
doctrine (&lt;code&gt;composer require symfony/orm-pack&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;It did update something, but then I got this error:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Executing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;KO&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;KO&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;returned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="err"&gt;!!&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;PHP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;Uncaught&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Symfony&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Component&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="k"&gt;Exception&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nl"&gt;ClassNotFoundException&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Attempted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;load&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;"DoctrineCacheBundle"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;"Doctrine\Bundle\DoctrineCacheBundle"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="err"&gt;!!&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;Did&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;"use"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;statement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;another&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="vm"&gt;?&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After &lt;a href="https://stackoverflow.com/a/59497868/1417449"&gt;some searching on the internet&lt;/a&gt;,
I found out that I had to remove the line&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle::class =&amp;gt; ['all' =&amp;gt; true],
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/rva-vzw/dikdikdik/-/merge_requests/132/diffs?commit_id=90e133ac9c2a4766f155ca1881984fa66500444f"&gt;from &lt;code&gt;app.php&lt;/code&gt;&lt;/a&gt;
to fix that one.&lt;/p&gt;
&lt;p&gt;Of course now I had various other issues, but the dependency hell was fixed,
so I am glad I can share this with you.&lt;/p&gt;&lt;/div&gt;</description><guid>https://blog.johanv.org/en/posts/symfony-4.4-upgrade-issues/</guid><pubDate>Fri, 10 Apr 2020 19:19:00 GMT</pubDate></item></channel></rss>