t4mer@notebook

// from the archives · #01 · php · codeigniter · 16 august 2026 · 2 min

Things CodeIgniter taught me before Laravel

From the archives - habits that survived a framework change.

From the Archives

I did not arrive at Laravel as a person who had never seen an MVC PHP application. For a stretch of years the framework in front of me was CodeIgniter. It was on the public skill list on my old site, next to PHP, jQuery, and MySQL, because that is what I was actually using - in client work, and in the courses I was teaching.

This is not a tutorial on CodeIgniter. The framework is not the interesting part anymore. The interesting part is what I kept when the folder names changed.

The application was still PHP and SQL

CodeIgniter made it easy to pretend the framework was the application. Controllers grew. Models became a place to dump queries. Helpers accumulated until nobody could remember which one was load-bearing.

Laravel did not cure that. It gave me a nicer place to make the same mistake.

What I eventually trusted more than either framework was the boring layer: the HTTP request, the database, and whether the operation was safe to retry. Those did not care which application/ folder I was standing in.

Teaching made the gaps obvious

I trained PHP and MySQL for several years - Coders For ICT, the Computer Programmers Society - overlapping with Digital Cloud and the rest of that period. Students do not let you hide behind $this->load->model(). They ask why the query is slow, why the form lost the POST, why the session vanished.

If I could not explain it on a whiteboard, I did not understand it yet. That test is still more reliable than a framework changelog.

What transferred

A few habits survived the move, and they were not the fashionable ones:

  • Read the request before blaming the framework. Headers, method, content type. I am still writing about that years later, because I still get it wrong sometimes.
  • The database is not an implementation detail. Indexes, transactions, and “what happens if this row already exists” mattered in CodeIgniter and they matter in Laravel. The syntax changed. The failure modes did not.
  • A helper is not an architecture. I used to add functions because they were convenient. Convenience is how you get a museum.
  • MVC is a starting folder layout, not a finished design. Controllers that do everything are not a CodeIgniter problem. They are a “I shipped on Thursday” problem.

What I am not claiming

I am not going to narrate a single dramatic rewrite from CodeIgniter to Laravel. I do not have a dated incident, an error message, and a pull request sitting in front of me, and I am not going to invent one so this essay has a climax.

The honest version is slower: I used one PHP framework heavily, then I used another, and the useful residue was not loyalty. It was a clearer sense of which problems were PHP, which were HTTP, which were MySQL, and which were just me.

Laravel is the framework I work in now. CodeIgniter is part of how I got there. That is enough history for one page.

Found something wrong?

These notes can be incomplete, or wrong in a different environment. Suggest a correction on GitHub or email me at me@t4mer.net.