Uncategorized

  • Symfony 6.4 LTS, and choosing not to move to 7

    6.4 and 7.0 shipped in the same week, which is the release model working as designed and is still a decision. Taking the long-term-support release and stopping is…

  • A style variation nobody ever selected

    Three style variations shipped with a theme, of which one was used, and the other two were maintained for two years. A style variation is a full alternative…

  • Dynamic class constant fetch, and the lookup it replaces

    Fetching a class constant by a variable name required constant() with a string concatenation, which no tool could follow. The syntax is better than the string concatenation mainly…

  • A model cast as an object, and the money type it holds

    Two integer columns and a currency string, reassembled by hand in every place that needed a total. A cast that reads several columns and writes several is the…

  • #[Override] on a method that no longer overrides

    Renaming a parent method is a silent break in every child, and 8.3 finally gives a way to say a method is meant to override something. Adding it…

  • A typed class constant, and the child that narrowed it

    Constants were the last untyped declaration in the language, and 8.3 fixes that with the covariance rule you would expect. The type is checked at compile time on…

  • Typed class constants, and the interface that had been lying

    8.3 on 23 November, and a constant can finally declare a type. An interface constant documented as a string, implemented as an int in one class.

  • A transient that never expired because of one typo

    A transient set with a mismatched key on read, so every request wrote a new row and none was ever read. A transient with an expiry is only…

  • An idempotency key on a POST, documented

    A client that retried a timed-out payment request and created two, and no way for them to have avoided it. The conflict case is the part that has…

  • readonly and clone, still awkward in 8.3

    8.3 relaxed one readonly restriction and not the one everybody wants, so a wither is still a constructor call. The __clone relaxation is narrower than it first reads:…