Goodbye CodeIgniter, Hello Laravel

Share this article

A lot of PHP developers are fan boys of their PHP framework, and there are quite a few from which you can choose. Among the most popular ones are CodeIgniter, Zend Framework, CakePHP, Symfony, Yii, and the new kids on the block Silex, Slim, Lithium, and Laravel. In the beginning of my career I stumble upon CodeIgniter and I love it for its simplicity, small footprint, and good documentation. It worked great for me when I developed a small to medium sized applications (usually Facebook apps), and the learning curve for new developers who worked with me was shallow enough that they could easily be integrated in the development process. But last year, because of the Twitter buzz from some in the PHP community, blog posts, and the suggestions of some friends, I give Laravel 3 a try – and since that time I’ve never looked back. So, in this article I’d like to present a comparison of the two frameworks from my point of view.

Requirements

CodeIgniter 2.1.3 needs PHP 5.1.6, but versions before 2 still worked with PHP 4. This was a drag since everybody moved on to use PHP 5. Laravel 3 needs PHP 5.3 and also the Mcrypt extension. CodeIgniter 1 didn’t need Mcrypt, since if you didn’t have the extension installed then it would use a custom functions to encode/decode strings. Of course this slows down the application, and we were amazed at some of the production servers that didn’t have it installed.
<?php
function encode($string, $key = '') {
    $key = $this->get_key($key);
    if ($this->_mcrypt_exists === true) {
        $enc = $this->mcrypt_encode($string, $key);
    }
    else {
        $enc = $this>_xor_encode($string, $key);
    }
    return base64_encode($enc);
}

REST

It’s easy to build a REST API with Laravel using RESTful Controllers where you simply have the $restful property set true inside your controller. For example, if you’re building an API for a task manager, for updating a task it would use something like this:
<?php
class Tasks_Controller extends Base_Controller {
    public $restful = true;
    public function get_index()
    {
    }
    public function put_update()
    {
    }
...
}
To handle PUT in CodeIgniter you would need this workaround:
<?php
if ($_SERVER["REQUEST_METHOD"] == "PUT") {
    parse_str(file_get_contents("php://input"), $post_vars);
    $arData = json_decode(array_pop(array_keys($post_vars)));
}
As you can see, this is error prone and not very clean.

Code Organization

Most of the time, the project you are working on will have a frontend and backend. In order to better organize the code in CodeIgniter, the best approach is to use HMVC. In this way you would have separate directories for backend code and frontend code so that different developers can work independently. To achieve something similar with Laravel, you can use nested controllers.

The View

CodeIgniter doesn’t have a default template engine, but you can easily integrate one like Smarty. On the other hand, Laravel uses Blade as its template engine which is very simple but powerful. With Blade, it’s very easy to set up a two-step view. You have a master template where usually you put the basic HTML structure with a header, navigation, footer, etc. Most of the time this template is called layout.blade.php
or master.blade.php. The portion of code that will be injected from different different controllers is declared in the master template by @yield('content').
<!DOCTYPE HTML>
<html>
 <head>
  ...
 </head>
 <body>
  <div class="header">
   ...
  </div>
  @yield('content')
 </body>
</html>
In custom templates declared per each method of a controller, for example a CMS page like “About Us”, you have a template called page.blade.php which looks something like this:
@layout('master')
...
@section('content')
About page section
@endsection
...
You can have as many section as you like to declare and reuse. A more detailed explanation about this can be found in the section Blade Layouts in the online open source book called Code Happy by Dayle Rees. To achieve this in CodeIgniter, at least as far as I’ve been able to figure out, is to create a master controller which all other controllers extend and call a render method. A CodeIgniter start project for implementing two step views can be found under my GitHub account.

The Model

Codeigniter uses Active Record for database manipulation which is quite easy to master, but you can also use raw queries if you have complicated requirements. Laravel uses Eloquent as a ORM which is simple and works with major database servers. For writing queries, you can also use Fluent Query Builder, which looks like a lot like the Active Record approach. And of course, you can also write raw queries too.

Command Line (Crons)

For Codeigniter to call a cron script, the best approach is to create a Cron controller. You also need to duplicate index.php and create a cron.php
file right in the root directory, overriding the following the following $_SERVER values:
<?php
$_SERVER['SERVER_NAME'] = "xxxxxx.org";
$_SERVER['REQUEST_URI'] = "cron/index";
$_SERVER['QUERY_STRING'] = "lang=en";
$_SERVER['SERVER_PORT'] = "0";
$_SERVER['REQUEST_METHOD'] = "GET"
Then you can call it from the command line with php cron.php cron index. In Laravel it’s easier. You have Tasks using the command line tool that Laravel comes with called Artisan.

Miscellaneous

  • Unit Testing – Codeigniter uses a very rudimentary testing class for writing unit tests. It is limited, but you can integrate PHPUnit. Laravel comes with PHPUnit out of the box, the most popular PHP unit testing framework.
  • Authentication – Codeigniter doesn’t have anything out of the box for authentication, but you can always use a third-party library, like Ion Auth. Larvel on the other hand has a basic auth library that you only need to configure before using.
  • Caching – With CodeIgniter, the driver supports APC, Memcache, and the filesystem. Laravel on the other hand supports those and also database tables and Redis.
  • Hooks/Filters – If you want to step in and run certain code at different points of execution in CodeIgniter, you should do so using Hooks. Laravel offers Filters.
  • Routing – Routing is done pretty much the same way in both Laravel and CodeIgniter, although I’ve found Laravel to be more flexible.
  • Configuration – Configuration is done via predefined arrays stored in config files which support multiple environments in both frameworks.
  • Extensibility – Extending the core functionality of CodeIgniter is done with Libraries, and you can find a lot of them on Sparks (a package management system for CodeIgniter). Laravel uses Bundles, which might seem familiar to you if you’ve worked with Symfony 2. You can find check already-created bundles at bundles.laravel.com.
  • MigrationsDatabase migrations are specific for Laravel, a concept borrow from Ruby on Rails which is versioning at the database level.

Community

CodeIgniter used to have a bigger community, but many moved to different frameworks after EllisLab, the company behind it, dropped support and no new features were added. Some of those people joined the Laravel community which is now very active with a lot of tutorials, books, and even its first international conference. The future seems to be very bright for Laravel since Laravel 4 is in beta 2 and its first conference has just ended. On the other side for CodeIgniter, there are few member contributors who so commit/merge patches into CodeIgniter 2 but there is no release date for CodeIgniter 3.

Conclusion

With Laravel 4 on the horizon, the framework definitely has the momentum now and the community behind it is very active. I’m kind of nostalgic when I talk about CodeIgniter, but it served me very well at the time. It taught me how to use MVC, was easy to learn, earned me my first money, and I even did my first book review about it, but as time went on it hardly changed. Maybe it’s just because it was very good at what it did? But web development changes rapidly, and new technologies come around, so if you want to survive you have to keep up. Just like in politics, everyone chooses a side. And for most of the time you can stick with your choice, but it’s always good to explore new things. For me, it meant goodbye CodeIgniter, hello Laravel. Comments on this article are closed. Have a question about PHP frameworks? Why not ask it on our forums? Image via Fotolia

Frequently Asked Questions about CodeIgniter and Laravel

Why should I switch from CodeIgniter to Laravel?

Laravel offers several advantages over CodeIgniter. It has a more modern, expressive syntax, which can make your code easier to read and maintain. Laravel also includes built-in support for more advanced features, such as queues, events, and package development. Additionally, Laravel’s community is larger and more active, which means you’ll have more resources and support available to you.

How difficult is it to transition from CodeIgniter to Laravel?

The difficulty of transitioning from CodeIgniter to Laravel can vary depending on your familiarity with both frameworks. However, Laravel’s extensive documentation and active community can make the transition smoother. It’s recommended to start with Laravel’s official documentation and tutorials, which provide a comprehensive introduction to the framework’s features and syntax.

What are the main differences between CodeIgniter and Laravel?

CodeIgniter and Laravel are both PHP frameworks, but they differ in several key areas. Laravel uses the MVC (Model-View-Controller) pattern, while CodeIgniter does not strictly adhere to it. Laravel also includes built-in support for more advanced features, such as ORM (Object-Relational Mapping), middleware, and authentication. Additionally, Laravel uses Composer for dependency management, while CodeIgniter does not.

Can I use CodeIgniter and Laravel together in the same project?

While it’s technically possible to use CodeIgniter and Laravel together in the same project, it’s generally not recommended. Mixing two different frameworks can lead to confusion and maintenance issues. Instead, it’s usually better to choose the framework that best fits your project’s needs and stick with it.

How does Laravel’s performance compare to CodeIgniter’s?

Laravel and CodeIgniter have similar performance characteristics. Both frameworks are capable of handling high-traffic websites. However, Laravel’s more modern architecture and built-in features can potentially lead to better performance in certain scenarios.

What is Laravel’s learning curve like compared to CodeIgniter’s?

Laravel’s learning curve is generally considered steeper than CodeIgniter’s. This is because Laravel has more features and a more complex architecture. However, Laravel’s extensive documentation and active community can help ease the learning process.

How does Laravel’s community compare to CodeIgniter’s?

Laravel’s community is larger and more active than CodeIgniter’s. This means you’ll have more resources and support available to you when using Laravel. The Laravel community regularly contributes to the framework’s development and produces a wealth of tutorials, packages, and other resources.

How does Laravel handle database migrations compared to CodeIgniter?

Laravel includes built-in support for database migrations, which can make managing your database schema easier. CodeIgniter does not include built-in support for migrations, so you’ll need to manage your database schema manually or use a third-party library.

How does Laravel’s routing system compare to CodeIgniter’s?

Laravel’s routing system is more flexible and powerful than CodeIgniter’s. Laravel allows you to define routes using closures and controllers, and includes support for route parameters, named routes, and route groups. CodeIgniter’s routing system is simpler and less flexible.

How does Laravel’s support for testing compare to CodeIgniter’s?

Laravel includes built-in support for testing with PHPUnit and provides additional testing utilities for things like clicking links and filling out forms. CodeIgniter does not include built-in support for testing, so you’ll need to set up your own testing environment.

Daniel GafitescuDaniel Gafitescu
View Author

Daniel Gafitescu is a senior PHP developer working for Pentalog in Iasi, Romania. He loves new web development technologies, and enjoys watching movies and games from English Premiership, playing soccer with friends, and most of all spending time with his newborn son and his lovely wife.

Advanced
Share this article
Read Next
Get the freshest news and resources for developers, designers and digital creators in your inbox each week