skoop.dev

  • About
  • @skoop@phpc.social
  • API Platform Con 2024: About that lambo…

    September 21, 2024

    It’s over again. And it’s a bittersweet feeling. I got to meet many friends again, old and new. I’ve learned quite a few things. But it’s over, and that’s sad. Let’s have a look at the highlights of the conference.

    Laravel

    This was obviously the biggest news out there: During the keynote of Kevin Dunglas it was announced that API Platform, with the release of version 4 which is available now, not only supports Symfony, but also supports Laravel. And there are plans to start supporting more systems as well in the future. So it could well be that API Platform can become available for Yii, CakePHP, perhaps even WordPress or Drupal. All API Platform components are available as a stand-alone PHP package, so in theory it could be integrated into anything. And to jump immediately to the last talk of the conference as well, self-proclaimed “Laravel Guy” Steve McDougall compared for us what he used to need to do in Laravel to create an API, and what he can now do. And apparently, if you use Laravel, you get a Lambo. Not my words 😉

    This was by far the biggest news for the conference. And it surely brought on some interesting conversations. I for one am happy that API Platform is now also on Laravel, as I work with Laravel every once in a while as well. This will make creating APIs a lot easier.

    Xdebug, brewing binaries and consuming APIs

    Some other interesting talks were done by Derick Rethans, Boas Falke and Nicolas Grekas. Derick updated us on recent Xdebug developments by demoing a lot of stuff. Boas showed us in 20 minutes how he can brew binaries using FrankenPHP. Check how he did it! And Nicolas showed some interesting stuff for using Symfony’s HTTP Client.

    Meeting friends

    The hallway track is important at every conference, and so it is at API Platform Con. I was so happy to be able to talk to people like Sergès Goma, Hadrien Cren from Sensio Labs, Łukasz Chruściel, Florian Engelhardt, Allison Guilhem, Derick Rethans. Special mention: Francois Zaninotto. We hadn’t spoken in ages, it was so good to meet him again.

    Big thanks

    Big thanks to the organizers of the API Platform Con. It has been amazing. I feel very welcome here in the beautiful city of Lille. Hopefully see you next year!

    Up next

    Up next in unKonf, which is in Mannheim in two weeks time. This promises to be fun!

  • API Platform Con is coming

    September 16, 2024
    apiplatform, apiplatformcon, conferences, ddd, DPC, laravel, lille, php, sylius, symfony, xdebug

    Last year was my first API Platform Con, and it was an amazing experience. I heard good things about FrankenPHP and was able to get my first container migrated to FrankenPHP at the conference. It was that simple. I was blown away by the talk on the decentralized web and inspired by the possibilities that the decentralized web presents. I hope the stuff Pauline Vos presented there will become more mainstream soon. The great talks combined with the beautiful city of Lille and the very friendly community made it an amazing conference. I was quite happy to be invited back this year and am looking forward to being there again later this week.

    So let me share the stuff that I’m looking forward to.

    The subject of the opening keynote is still a surprise. The website states The subject of this conference will be announced shortly and I’m curious what it will be. Kevin is a great speaker though, so this will be good regardless.

    Sergès Goma on devs becoming villains

    I’ve seen this talk at Dutch PHP Conference and it is fantastic. It makes you think. I like it when talks make you think. It makes you laugh. I love it when speakers are able to put humour into a talk. Yes, this is one not to miss. Even if I’ve seen it before already.

    The performance dilemma

    Then it’s hard to pick. Both Allison Guilhem speaking on real-time message handling and notifications and Mathias Arlaud speaking on optimizing serialization in API Platform are really interesting subjects. I think I’ll wait until the last minute to decide which one to actually check out.

    After lunch we’ll have another mystery keynote. I guess we should be there as well!

    Admin generator!

    Admin generators have been there since the early days of before symfony (yes, with a lowercase s back then) 1.0. And Francois Zaninotto has also been around that long. I’m really looking forward to Francois speaking about the API Platform admin generator!

    Something something DDD

    Yeah, next up I’m on stage, so I can’t check out the other talk in that slot. The other one is in French anyway, so I probably would’ve skipped on it anyway. My friend is not much better than croissant, chauffeur, Disneyland Paris, baguette.

    Xdebug

    I am, still, a very happy VDD (var_dump/die)-driven developer. I know I should do more with Xdebug. And who better than to hear from than Derick himself.

    After the panel discussion it’s time for the community party. And given we’ll have a party, I’m not sure if I’ll be in time for the first session on Friday. I’ll try though because while I’ve played with FrankenPHP a bit, I’m not extremely familiar with Caddy, and in the first session Matt Holt will be talking about Caddy. So that could be very interesting!

    One Billion?!

    Florian Engelhardt will be doing some fun stuff with optimizing PHP in his experiment on processing a 1 billion row test file with PHP. That’s a lot!

    It’s alive!

    I’ve mentioned me playing with FrankenPHP already and Boas Falke will be talking about building stand-alone binaries using FrankenPHP. That is awesome!

    Consume!

    I work with a lot of API’s in all my projects, so I’m curious if Nicolas Grekas will be able to teach me what I’m doing wrong. He’s presenting his talk Consuming HTTP APIs in PHP The Right Way so I’m expecting a lot of shaking my head about how I’ve been doing this wrong the whole time.

    Sylius!

    My favorite e-commerce framework also has presence at API Platform Con, in the form of Łukasz Chruściel speaking on how they’ve handling migrating to API Platform 3. I’m working on a big migration project (although no API Platform), so it’s good to learn about how they handled this.

    Laravel?

    API Platform is a Symfony-based system, right? RIGHT? Well, apparently not. Perhaps the talk I’m looking forward to most is Steve McDougall’s talk on using API Platform within a Laravel application. I work a lot with Symfony, but I also work quite a bit with Laravel. Having a powerful tool such as API Platform available on Laravel projects is an excellent way to make Laravel projects even more fun. So yes, I’m really really looking forward to this one.

    Lille

    Having said all that, I’m also looking forward to visiting the beautiful city of Lille again. Last year on the Saturday after the conference I took a long walk through the city before driving back home. Lille is a fantastic city. Will I see you there?

  • A quick-follow up about the generated fields

    September 12, 2024
    doctrine, generated fields, json, mysql, symfony

    Since I posted about the generated fields I’ve learned some interesting new information that I wanted to share as well. There is an interesting detail that may lead to issues.

    In my previous example I used the following to map to fields inside the JSON:

    price_info->"$.salesprice"

    The -> here is the interesting part: There are two variations, being the aforementioned -> and another one ->>.

    -> simply extracts the value from the JSON. This is best used to ensure correct types from the data for basically anything but strings. If you have, for instance, an integer value or a boolean in your JSON and you map it to a correctly typed column, you’ll get an error if you use ->> because that will always cast it to a string. Why? I’ll get back to that. For now: If your value is not a string, best use ->.

    ->> does more than simply extracting the value. It also unquotes the value. This is useful for strings, because in JSON they are always between ". If you use -> on a string value, then you will get that value, plus the quotes. Such as "value". If you use ->> then you will get value. Without quotes. So ->> is the best one to use for string values. However, as mentioned before, this does mean that it will always assume a string value. So if your value is not a string, it will be made a string. If your generated column is not of a string type, this will give you errors about typing.

  • Using generated fields in MySQL

    August 23, 2024
    doctrine, generated fields, json, mysql, php, symfony

    Recently I have been working on a migration of data from an old application to a brand spanking new Symfony 7 application. This migration included getting rid of the old Couchbase document database and moving to MySQL. MySQL has for quite some time already had a special JSON field type that is actually pretty cool. And using Doctrine, you don’t even notice it’s JSON, because there are automatic transformations to a PHP array structure.

    I was looking for the right way to set indexes on specific fields inside the JSON structure for easy querying, and as I was doing so I learned about MySQL generated fields. This is pretty cool stuff, as it will automatically create virtual fields in your table with the data as it exists inside the JSON. And those fields can be part of an index!

    Step 1 is obviously creating the column. So let’s add a column to a table called articles:

    ALTER TABLE articles 
    ADD sales_price INT AS (price_info->"$.salesprice"),
    ADD cost_price INT AS (price_info->"$.costprice");

    In this example, the price_info is the JSON field. Inside the JSON structure, it has a field with key salesprice and a field with key costprice, and I here add those as seperate columns sales_price and cost_price into the table articles.

    Above query I can now add to a Doctrine migration.

    Now I also need to specify to Doctrine in the entity that the fields exist. But they are special fields, because they are read-only (you update the value by updating the JSON). So you need to configure that for your entity. For instance:

    /** * @Column(type="json") */
    protected $priceinfo;
    
    /**
     * @Column(type="int", nullable=true, insertable=false, updatable=false)
     */
    protected $sales_price;
    
    /** * @Column(type="int", nullable=true, insertable=false, updatable=false) */
    protected $cost_price;

    Notice the fact that I set insertable and updatable to false. Also important: I set nullable to true. Why? Because in a JSON field, there is no guarantee that a value is there. If a value is missing, MySQL will set it to NULL. If your field is not nullable, it will fail on writing the record to the database.

    Now, if you create a new Article and set JSON that contain the costprice and salesprice fields, as soon as you persist it in the database, the values of $cost_price and $sales_price are automatically populated based on the values in the JSON.

    Since they are now regular properties of your entity, you can also use them in the where clauses of your queries. They are, for all intents and purposes, simply regular fields in your table. The only thing you can not do is set the value on your entity and persist it, and expect it to stick. If you need to change the value, you need to update the JSON.

    I just wanted to share this because I think this is extremely cool and useful stuff. As for a practical example: One use case I know of at least is to store data structures from external systems in exactly the structure you receive it, and let MySQL sort everything out for you. Especially when you may also need that structure to communicate back to the external system, it is good to keep the structure the way you received it.

  • RabbitMQ in your Bitbucket pipeline

    August 15, 2024
    bitbucket, pipelines, rabbitmq, service

    Last week one of my tasks was getting our Behat tests to run successfully in the Bitbucket pipeline. Now, we have an interesting setup with several vhosts, exchanges and queues. Our full definition of our RabbitMQ setup is in a definitions-file. So that should be easy, right? Well, think again.

    Unfortunately, Bitbucket does not allow for volumes for services in your pipeline, so there is no way to actually get our definitions file into our RabbitMQ service. After searching for ways to solve this, with my express wish to not have to build my own RabbitMQ image, I ended up coming to the conclusion that the solution would be to… well, build my own image.

    Creating the image was very simple. As in, literally two lines of Dockerfile:

    FROM rabbitmq:3.12-management
    
    ADD rabbitmq_definitions.json /etc/rabbitmq_definitions.json

    I build the image and push it to our registry. So far so good. Now, I needed to alter our service definition in bitbucket-pipelines.yml. This was also not that hard:

    services:
        rabbitmq:
            image:
                name: <registry-url>/rabbitmq-pipeline:latest
                username: $AZURE_USERNAME
                password: $AZURE_PASSWORD
            environment:
                RABBITMQ_DEFAULT_USER: <rmq-user>
                RABBITMQ_DEFAULT_PASS: <rmq-pass>
                RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: -rabbitmq_management load_definitions "/etc/rabbitmq_definitions.json"

    The trick in this definition is in that environment variable RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS. This basically tells RabbitMQ to load the definitions file we baked into the image in the first step. That will then set up our whole RabbitMQ, so that the code executed during the Behat tests will be able to connect as usual. RabbitMQ will be available in your pipeline on 127.0.0.1.

  • Creating a Bitbucket merge train

    August 14, 2024
    bitbucket, git

    Sometimes it happens: You have to work on a new feature, but that feature is depending on another feature that isn’t merged yet. Especially when trying to keep your branches small and you’re not doing trunk-based development, this may happen.

    Luckily, Bitbucket makes our life a lot easier. Say you create a new feature-branch-2 based off of feature-branch-1, when you create the pull request, instead of targetting main which will cause your diff to contain the changes of both branches, you can set the target of your PR to be feature-branch-1. Now your diff will only contain the changes in feature-branch-2, which makes it a lot easier to review.

    Now, when the feature-branch-1 PR is reviewed and ready to be merged, you don’t really have to do anything to the feature-branch-2 PR, as long as you keep this checkbox checked that is checked by default:

    On merging, Bitbucket will now automatically re-target the feature-branch-2 PR to the main branch.

  • Goodbye Sculpin, hello WordPress

    August 9, 2024
    sculpin, wordpress

    I really liked the idea of a static site generator. I still the idea of a static site generator, to be honest. However, writing purely in Markdown and having to go through some stuff to publish a new post became a bit of a hassle. So I wanted to go for a dynamic CMS again. My initial idea was to build the site in Bolt, as I love that CMS and the flexibility it offers. I even started on that, but ended up finding I did not enjoy myself while buildings. That made me decide that perhaps I should actually go for WordPress. It works, I have a hosting provider with an easy installer, it has tons of plugins if I want something specific, and… I’ve come to enjoy the new editor on one of my other sites.

    Migration

    Now, the migration was not easy. I started looking for ways to automatically import all my Markdown files. There was a plugin, I couldn’t figure it out. It became a chore. I quit. I gave up.

    I ended up doing a manual migration. I combined the migration with a bit of a clean-up. I removed some articles, added some additional tags to some articles, etc. It was also a nice moment of reflection. Over the years I did a lot of different things. I made some mistakes, or no, I grew. I understand now why some of the opinions I used to have might not have been the best.

    And now it’s up

    So far I’m happy. I have a CMS again. I can easily write and update posts from wherever I have access to my password manager. After all the different CMS’es I’ve had, I wonder how long WordPress will last me. Should be at least a couple of years, looking at my track record of Pivot, Textpattern, Octopress and Sculpin (and possible others) that I’ve used in the past,

    Welcome to the new skoop.dev!

  • Unsupported operand types string * int

    July 30, 2024
    error, php, tip

    Today I had a weirdly failing unit test. PHPUnit complained about the data provider being invalid, with a very vague error:

    Unsupported operand types: string * int

    This was weird, because I wasn’t doing any calculations in the dataprovider.

    That made debugging annoying as well. If I’m not doing any calculations, why this error?

    It turned out a typo was the cause. The weird thing though: There was no * in there. The typo was:

    $errorString -= 'Missing required data key: "%s".';

    See the -= there? That was the issue. It’s still unclear to me why I got the error I got, but if anyone runs into this error, be aware that the error may imply more than just *.

  • Symfony and DDD (and SymfonyCon)

    July 25, 2024
    conferences, ddd, php, symfony, symfonycon, talks

    Last year at the SymfonyCon conference I did a talk about Domain-Driven Design in which I mostly focussed on the theory behind trying to understand what problem you’re actually solving. I really enjoyed doing that talk, but I got some interesting questions afterwards about practical implementation of DDD when using Symfony. And I’ve also seen at several clients that people are always looking how they can actually implement a DDD approach when building software with Symfony.

    That prompted me to consider what would be the best way to do this. There is so much to talk about and the answer to a lot of questions is “it depends”. So I decided to develop a new full-day workshop about this. In this workshop, we take a Symfony project, and we start adding some functionality.

    I am still developing the contents, but things that will come by are amongst other things:

    • How to split up domains
    • Implementing a hexagonal architecture
    • Doctrine entities vs domain entities and how to make that split
    • How to implement communication between bounded contexts and domains

    The workshop will contain a theoretical part per subject, but also exercises for people to actually get some experience with doing this, as I realize that some people learn more from listening to the theory and others learn more by doing.

    If you are interested to get this training for your team, shoot me an email. For those coming to Vienna for SymfonyCon, I do have some good news: On December 4, I’ll be doing this workshop at SymfonyCon. You can already book your tickets.

    Will I see you in Vienna?

  • Upcoming conferences

    June 21, 2024
    apiplatformcon, cakefest, conferences, php, talks

    Conferences are both fun and useful. Fun because you meet people and useful because you learn stuff. I have two conferences in the upcoming months, and I hope to see you there!

    Cakefest

    Last year was my first Cakefest. It was in Los Angeles, and a lot of fun. While I am not using CakePHP and have not used CakePHP in a while it was good to meet the community and share some information that might be useful.

    I am honored that they think I did good enough a job to be invited back again this year. And even better: I don’t have to fly out, I am actually driving to Esch-sur-Alzette in Luxembourg. The schedule is looking good! I will be doing my talk on sustainable open source contributions there.

    Tickets are available for the in-person conference, or you could even get a free ticket for the online stream of the conference. But in-person is usually more fun, so if you have the opportunity, join us!

    API Platform Conference

    Another conference that I got invited back to is API Platform Conference. Again in driving distance for me, and I had a lot of fun last time, so I’m absolutely looking forward again to being there. The conference is in Lille, in the North of France.

    In Lille, I will be doing my Domain-Driven Design basics talk, which focusses on what I think is the most important part of DDD: Understanding the problem. Lille is a beautiful city, the schedule is amazing… I’m really looking forward to it.

    This conference also has both in-person and online tickets. If you have the opportunity, I’d love to see you there!

Previous Page
1 2 3 4 … 60
Next Page

skoop.dev

  • Bandcamp
  • Mastodon
  • Bandcamp