Laravel has taught me many things about maintainability, but it's mostly "don't write code like Laravel". My favorite is how cache tagging was broken in Laravel, and there was a complete PR presented to fix it, but Taylor just summarily closed the PR and removed all mention of cache tagging from the documentation instead.
Looking at the PR you posted below, your comment seems to be slight misrepresentation:
> taylorotwell commented on Sep 13, 2023
> I personally don't have the knowledge to trust merging this sadly. I would
> prefer to either de-document cache tags or recommend their use with Memcached
> only. Cache tags and Redis have been a maintenance and complexity nightmare.
Still maintaining a Laravel 3 project. Barely made it 2 years before maintainability became a nightmare and the only upgrade path was complete rewrite. Projects written without an opinionated framework easily sail past 10 years of comfy maintainability
Laravel 3.2 was released in May 2012, so 13 years ago. Sounds like you should port the application off of Laravel since Laravel’s got an “evergreen”/regular updates maintenance model. I’m not even sure that 13 year old PHP is still maintained FWIW. I’m struggling to think of a programming community that tries to achieve a “we will maintain this for decades” approach, maybe another reader knows of something.
> I’m struggling to think of a programming community that tries to achieve a “we will maintain this for decades” approach, maybe another reader knows of something.
I just pulled a PHP site out of my archive that I had taken down 7 years ago. Only one function call (each) had been removed, and everything else still works. There's been some major changes in some parts of PHP though; if I had been following along, I'd have gotten a deprecation warning, but I jumped two or three major versions.
I'd be pretty confident in any Perl code written for 5.8 or newer to continue working, with CPAN libraries as well. Earlier code is probably ok as long as you don't deal with binary data or non-ascii characters; 5.8 was the unicode reckoning.
If you ran FreeBSD 4, most of FreeBSD 13 will feel familiar. Although if you had a kernel driver for FreeBSD 4, it will likely need a lot of help to work in FreeBSD 13.
Of course, there are other communities where everything is thrown away every 6 months. I don't have that kind of time.
I have a Rust web project written ~5 years ago. Zero updates until a month ago, also zero problems. A month ago I upgrade the docker file to latest rust, zero problems compiling. Could have left it to run like this for 5 more years probably but I decided to experiment...
I issue a `cargo update` to upgrade the leaf dependencies and do automatic minor version updates. Issue cargo check. Some new warnings from `clippy`, but it still compiles and runs without problems. Could have deployed for 5 more years, but I decided to experiment more...
I upgrade some of the libraries to major new versions - I am experienced and I know which ones will upgrade without problem. They do upgrade without problem. Could have deployed for 5 more years but decided to walk the extra mile...
I upgrade the more problematic ones, especially actix_web, the web framework, which had a massive rewrite and a huge new release with almost completely different API surface... It's a bit difficult to understand the changes, especially some parts of the old code written for the old version (which I no longer remember), but in an hour I'm done. Afterwards `cargo outdated` does not report any outdated libraries. I deploy for the next 5 years. Zero problems since then.
Well, it's not decades yet, but I can imagine similar effort to maintain it over the next decade.
In Laravel's Defence (words I never though I'd say) the L3 -> L4 transistion was a nightmare because he went to PSR4/rewrote a bunch of stuff, I got bit by it as well.
All subsequent upgrades have been easier (if not always easy) by comparison - it was kind of a one time thing.
Laravel 3 and Laravel 4 were released in ~2012. The upgrade from Laravel 4 to 5 (released Oct 2013) is probably the biggest hurdle, but you can likely upgrade from Laravel 5 to Laravel 12 in a week or sooner with Laravel Shift.
> The upgrade from Laravel 4 to 5 (released Oct 2013) is probably the biggest hurdle....
Can confirm. We started on Laravel 4 and it languished at that version until someone in leadership agreed to get it updated to version 8, which seemed to mostly be about some APIs changing. (The configuration system changed quite a bit for example.) Further upgrades from 8 to 10 then 11 have been very quick. (Note that we don't use Eloquent ORM so that wasn't part of these upgrades.)
It's on PHP 7.4, so between RHEL and CloudLinux there's another few years left in it, before I weigh up rewrite vs another round of hacking modern PHP support into Laravel 3
As someone who came to Laravel from WordPress, I had a massive hole in my abilities to understand larger systems as a whole. During my tenure in WordPress, I actually got pretty good at the web native parts of modern web development but my “backend” skills were mostly about passing arrays around and doing simple database operations. Basic concepts like MVC were totally foreign to me and I was reminded of this a few months ago when I chatted with an old friend about their experiences with Laravel after the drama in WP land a few months back. When I told him that Models were not anything special and you didn’t need to scaffold out a Model using Laravel to create your own class against an existing table, his mind was blown and I could see the gears starting to turn. Mind you, this is a very successful solopreneur with a thriving theme business/platform and over a decade of experience; just that xp was in a domain set apart from the discipline of modern software engineering.
I’m super happy to have spent that time learning how to work with constraints to build absolutely giant systems (had a stint with an agency that worked for big online publishers that are known for using WP…) but after seeing the other side, I’m also happy to be past that and onto different and more interesting things.
The Laravel and Symfony communities are culturally very different. Laravel (and Taylor) are very US-American, Symfony (and Fabien) very European, and it comes through in communication style and presentation. Laravel has a share of users building products to sell to other Laravel users; Symfony doesn't. If I caricature, Laravel users are better at making money (as a Symfony user the social media presence looks like "grifting"); Symfony users at being architecture astronauts (and looking down on people "getting things done").
At a high level the WordPress community doesn't mesh because of having the WordPress way of doing things, and having a history of writing for old versions of PHP years after others have moved on and told users to upgrade. The WordPress community is fragmented into separate sub-communities which again don't mesh. There's the users who only build sites with page builders and hardly know how to code, those whose goal is to sell copies of their paid plugin (or hosting services), and those with permission to make changes to WordPress itself.
I've no recent experience of Drupal so can't comment on them.
Laravel builds on Symfony so it is in some way natural that more real products/applications are released based on Laravel than on pure Symfony. Laravel has more functions built in and more practical packages for real use cases. Developing a similar app based on Symfony would require much more work.
Symfony and Laravel are fundamentally ideologically opposed.
Laravel is designed from the ground up to be used by junior developers who don't care about pesky things like maintainability and scalability and just want to put out the minimum viable product as fast as possible, and with the least amount of work possible. It's full of "magic" abstractions built with the primary purpose of making the code look pretty at a glance to the inexperienced, completely disregarding good programming practices and even essential language features in the process, the programming equivalent of lipstick on a pig. It markets itself to beginners as "the magic framework that does everything for you" and is as big as it is today purely due to successfully capturing a large percentage of that audience.
Symfony goes in the complete opposite direction: it's designed to be used by experienced developers to build maintainable, extensible applications while employing good programming practices. It encourages you to "look under the hood" and understand how things work instead of just telling you "to do X, write Y" without elaborating. It has many convenience features but they're generally built on top of language features with good practices in mind instead of handwaving it all away. It's very modular and allows you to extend and/or replace almost every part of the framework with your own custom version if the included version isn't suitable for your use case. And so on.
One of the best examples of Symfony vs Laravel is the way database tables are mapped to PHP code. In Symfony, SQL tables are just PHP classes. To create a new table, you create a new class, add the columns you want as properties, add some attributes to tell the ORM how to map all of that to a table, and it's done. Your database columns match your class properties, every time you query the database you get instances of that class and can use them as a proper objects with properly typed fields.
Laravel, meanwhile, does none of that, your database tables are defined purely by the database itself at runtime, what they call "Models" are just empty classes that have the database columns injected into them at runtime as dynamic properties. You cannot know what properties your Model has just by looking at it, I believe you need a Laravel-specific IDE plugin just to autocomplete them. You're essentially working with glorified associative arrays the whole time. This alone is a massive red flag that should make any experienced programmer avoid Laravel.
Wordpress sits on its own little island as a big pile of legacy code that's almost frozen in time, full of bad practices that no self-respecting developer wants to touch. No lipstick on this pig, it's as ugly as it is obtuse. It's still commonly used today because someone with zero programming knowledge can load up a bunch of plugins full of security holes and make a somewhat usable site that vaguely matches their vision, but using it for any new project more complex than a basic blog is generally seen as a mistake.
Can't speak for Drupal as I have no experience with it.
Laravel uses the active record pattern, same as Rails. If anything, the Laravel implementation is the more pragmatic of the two.
It's fine if you don't like that pattern (I have my own misgivings), but it's a perfectly viable approach used by a lot of very experienced developers to build very successful applications.
Dismissing everyone who uses a framework or design pattern you dislike as "junior developers who don't care about pesky things like maintainability and scalability" is inaccurate, rude, and ignorant.
Not sure why Laravel decided to have that approach to models. In Django I can update the model properties and just generate a migration from that. I can always open the models.py file to see which fields a model class has. In Laravel I need to either look at the migration files or look inside the database table definition. And then also adding fields means writing the migration by hand I guess. There are other confusing things, like marking fields as fillable in the model, and if you fail to add your field in the fillable property, it won't be inserted into the database, and it took me awhile to figure out why my code wasn't working. Not sure what purpose it serves, I understand marking things as read only in serializers, but this is at the data layer, seems like a footgun.
Technically, you could swap Eloquent for Doctrine which would solve the database issues but Laravel was built around using Eloquent and vice-versa, there’s very little documentation for using doctrine with laravel or using eloquent with symfony, it’d be easier to just use what grew up together.
Laravel is more akin to rails with its rapid application development but rails does it better.
I agree that Laravel models rub the wrong way, but that shouldn't instantly remove Laravel from the equation when thinking about what tools to use for building a website.
Laravel is great for shipping things fast. Sometimes, that's what you want, even if that means a less maintainable app in the long run. Because sometimes there is no long run; you know it will just be an app made by you only as a rather one shot thing.
Same goes for wordpress. Lots of devs like to shit on it by default. But its like people shitting on PHP because of the PHP 5 days. You'd be surprised how quickly you can build really complex content websites with Wordpress. Way quicker than with barebones laravel or symfony. And with not that ugly code ;)
It sounds like some dynamic gain is happening every time he starts talking, and then after ~1 second it gets better. I don't think it's a "missing hardware" issue, just turning down the gain would probably be enough, or tuning the software dynamics if he's using that. Could also be that the podcaster tried doing some normalization across the entire podcast while mastering and fucked it up that way.
I started with a small prototype, a simple site using L6, and realized there were several issues with the idea. Years later, in 2019, I worked with Astro, which taught me a lot about maintainability and I found they got it right.
I started with pure HTML, CSS, and JS, then moved to AlpineJS with a Go backend, before eventually migrating to Astro with TypeScript and Tailwind CSS. I have not used a headless CMS, as avoiding one allows me to move faster. So far, upgrading from 2.0 to 5.x has been consistently smooth, unlike the MVC paradigm. Astro follows a folder structure similar to Vue.
My sites run in SSR, mainly a vendor and business networking platform. They include quite a bit of interactivity, such as an image slider, and a good deal of logic for complex content rendering from form fields. I also simplified error handling in forms with interactive elements.
Most of my work revolves around forms and SQL (Postgres). After translating designs from Figma and Marvellous, I export with Tailwind, which makes things easier. Still, I wish my UI/UX designer had listened to my struggles and made use of pre-built UI components to save time. Instead, they often executed poorly, rushed features, and changed things on a whim as though it were a toy, which was frustrating. Even so, I managed to overcome that as a sole developer and co-founder.
I did not expect to accumulate with such a large set of custom UI components, ranging from simple to complex logic, that are reused across different parts of the frontend. Managing that in Laravel’s workflow would have been a nightmare. I prefer JSX-like syntax over Blade because it is faster to work with TypeScript for both frontend and backend.
I also do not need to waste time dealing with routing, it was the same problem with Go + Echo, although Astro allows me to add flexibility with packages like micromatch for dynamic routes within middleware. Laravel, of course, has middleware too.
From my experience, I still have not found a convincing reason to adopt traditional MVC or to need that level of abstraction in Laravel.
Astro’s colocation (.astro) is optimised for developer velocity and a component-first mental model.
Despite my aim to strive for perfection, I have been out of work for years and have been affected by permanent hazy vision due to a health-related issue. My wish is to continue building with Astro.
> taylorotwell commented on Sep 13, 2023 > I personally don't have the knowledge to trust merging this sadly. I would > prefer to either de-document cache tags or recommend their use with Memcached > only. Cache tags and Redis have been a maintenance and complexity nightmare.
https://github.com/laravel/framework/pull/48078#issuecomment...
The PR in question: https://github.com/laravel/framework/pull/48078
I just pulled a PHP site out of my archive that I had taken down 7 years ago. Only one function call (each) had been removed, and everything else still works. There's been some major changes in some parts of PHP though; if I had been following along, I'd have gotten a deprecation warning, but I jumped two or three major versions.
I'd be pretty confident in any Perl code written for 5.8 or newer to continue working, with CPAN libraries as well. Earlier code is probably ok as long as you don't deal with binary data or non-ascii characters; 5.8 was the unicode reckoning.
If you ran FreeBSD 4, most of FreeBSD 13 will feel familiar. Although if you had a kernel driver for FreeBSD 4, it will likely need a lot of help to work in FreeBSD 13.
Of course, there are other communities where everything is thrown away every 6 months. I don't have that kind of time.
I issue a `cargo update` to upgrade the leaf dependencies and do automatic minor version updates. Issue cargo check. Some new warnings from `clippy`, but it still compiles and runs without problems. Could have deployed for 5 more years, but I decided to experiment more...
I upgrade some of the libraries to major new versions - I am experienced and I know which ones will upgrade without problem. They do upgrade without problem. Could have deployed for 5 more years but decided to walk the extra mile...
I upgrade the more problematic ones, especially actix_web, the web framework, which had a massive rewrite and a huge new release with almost completely different API surface... It's a bit difficult to understand the changes, especially some parts of the old code written for the old version (which I no longer remember), but in an hour I'm done. Afterwards `cargo outdated` does not report any outdated libraries. I deploy for the next 5 years. Zero problems since then.
Well, it's not decades yet, but I can imagine similar effort to maintain it over the next decade.
It helps that the core language has been incredibly stable
But ultimately it got better IMO, indeed.
On the other hand, Laravel decided to change from snake_case to CamelCase between versions 3 and 4, just because. Literally 0% compatibility
All subsequent upgrades have been easier (if not always easy) by comparison - it was kind of a one time thing.
Can confirm. We started on Laravel 4 and it languished at that version until someone in leadership agreed to get it updated to version 8, which seemed to mostly be about some APIs changing. (The configuration system changed quite a bit for example.) Further upgrades from 8 to 10 then 11 have been very quick. (Note that we don't use Eloquent ORM so that wasn't part of these upgrades.)
Is it even running on a still supported PHP version?
I’m super happy to have spent that time learning how to work with constraints to build absolutely giant systems (had a stint with an agency that worked for big online publishers that are known for using WP…) but after seeing the other side, I’m also happy to be past that and onto different and more interesting things.
At a high level the WordPress community doesn't mesh because of having the WordPress way of doing things, and having a history of writing for old versions of PHP years after others have moved on and told users to upgrade. The WordPress community is fragmented into separate sub-communities which again don't mesh. There's the users who only build sites with page builders and hardly know how to code, those whose goal is to sell copies of their paid plugin (or hosting services), and those with permission to make changes to WordPress itself.
I've no recent experience of Drupal so can't comment on them.
My biggest takeaway is Laravel is fast to get up and going with and ship something, while Symfony actually scales and is far more easily maintainable
If I were to choose building an app I expect to last I’d choose Symfony every time
Maybe they need to stay close to the metal based on the performance they need?
Drupal took their time but finally started using composer and a lot of their components were Symfony components.
Wordpress just held their ground.
Laravel is designed from the ground up to be used by junior developers who don't care about pesky things like maintainability and scalability and just want to put out the minimum viable product as fast as possible, and with the least amount of work possible. It's full of "magic" abstractions built with the primary purpose of making the code look pretty at a glance to the inexperienced, completely disregarding good programming practices and even essential language features in the process, the programming equivalent of lipstick on a pig. It markets itself to beginners as "the magic framework that does everything for you" and is as big as it is today purely due to successfully capturing a large percentage of that audience.
Symfony goes in the complete opposite direction: it's designed to be used by experienced developers to build maintainable, extensible applications while employing good programming practices. It encourages you to "look under the hood" and understand how things work instead of just telling you "to do X, write Y" without elaborating. It has many convenience features but they're generally built on top of language features with good practices in mind instead of handwaving it all away. It's very modular and allows you to extend and/or replace almost every part of the framework with your own custom version if the included version isn't suitable for your use case. And so on.
One of the best examples of Symfony vs Laravel is the way database tables are mapped to PHP code. In Symfony, SQL tables are just PHP classes. To create a new table, you create a new class, add the columns you want as properties, add some attributes to tell the ORM how to map all of that to a table, and it's done. Your database columns match your class properties, every time you query the database you get instances of that class and can use them as a proper objects with properly typed fields.
Laravel, meanwhile, does none of that, your database tables are defined purely by the database itself at runtime, what they call "Models" are just empty classes that have the database columns injected into them at runtime as dynamic properties. You cannot know what properties your Model has just by looking at it, I believe you need a Laravel-specific IDE plugin just to autocomplete them. You're essentially working with glorified associative arrays the whole time. This alone is a massive red flag that should make any experienced programmer avoid Laravel.
Wordpress sits on its own little island as a big pile of legacy code that's almost frozen in time, full of bad practices that no self-respecting developer wants to touch. No lipstick on this pig, it's as ugly as it is obtuse. It's still commonly used today because someone with zero programming knowledge can load up a bunch of plugins full of security holes and make a somewhat usable site that vaguely matches their vision, but using it for any new project more complex than a basic blog is generally seen as a mistake.
Can't speak for Drupal as I have no experience with it.
It's fine if you don't like that pattern (I have my own misgivings), but it's a perfectly viable approach used by a lot of very experienced developers to build very successful applications.
Dismissing everyone who uses a framework or design pattern you dislike as "junior developers who don't care about pesky things like maintainability and scalability" is inaccurate, rude, and ignorant.
Laravel is more akin to rails with its rapid application development but rails does it better.
Laravel is great for shipping things fast. Sometimes, that's what you want, even if that means a less maintainable app in the long run. Because sometimes there is no long run; you know it will just be an app made by you only as a rather one shot thing.
Same goes for wordpress. Lots of devs like to shit on it by default. But its like people shitting on PHP because of the PHP 5 days. You'd be surprised how quickly you can build really complex content websites with Wordpress. Way quicker than with barebones laravel or symfony. And with not that ugly code ;)
Lesson 1: Use the best tools available.
There's a reason why Laravel is more popular than Symfony.
Yes, and that reason is being more beginner friendly at the cost of pretty much everything else. It's not related to overall quality at all.
Also, this is very regional.
Here in Europe, actual, big projects that need to make money use Symfony, not Laravel.
Most of my work revolves around forms and SQL (Postgres). After translating designs from Figma and Marvellous, I export with Tailwind, which makes things easier. Still, I wish my UI/UX designer had listened to my struggles and made use of pre-built UI components to save time. Instead, they often executed poorly, rushed features, and changed things on a whim as though it were a toy, which was frustrating. Even so, I managed to overcome that as a sole developer and co-founder.
I did not expect to accumulate with such a large set of custom UI components, ranging from simple to complex logic, that are reused across different parts of the frontend. Managing that in Laravel’s workflow would have been a nightmare. I prefer JSX-like syntax over Blade because it is faster to work with TypeScript for both frontend and backend.
I also do not need to waste time dealing with routing, it was the same problem with Go + Echo, although Astro allows me to add flexibility with packages like micromatch for dynamic routes within middleware. Laravel, of course, has middleware too.
From my experience, I still have not found a convincing reason to adopt traditional MVC or to need that level of abstraction in Laravel.
Astro’s colocation (.astro) is optimised for developer velocity and a component-first mental model.
Despite my aim to strive for perfection, I have been out of work for years and have been affected by permanent hazy vision due to a health-related issue. My wish is to continue building with Astro.