Front Controller Source Code for CI Explained

I’ve stopped work on this series to start a new one for CI 3.

The front controller source code is usually found in a file named index.php found in the root folder of a CI installation. You can have more than one front controller per CI installation. However, in that case it’s considered to be a state of having multiple applications.

Introduction

My intention is to explain the source code for the CodeIgniter (CI) framework. The information on this page relates to the front controller for version 2.1.2 of CI.

Background Info.

The words “folder” and “directory” are interchangeable.

Assumptions regarding applications:

  • An application is a CI application.
  • An application is one of possibly several applications.
  • Each application has its own front controller.
  • Each application is likely to have its own application folder.
  • If a CI installation has more than one application then all but one application folder will be named something other than application.
  • Each application can have its own system folder.

Allowing an application to have its own application folder makes it easier to configure; and, makes it more modular.

HMVC can add modularity to CodeIgniter. See codeigniter-modular-extensions-hmvc

Functions have global scope. They can be called from within other functions.

Variables don’t have global scope. Constants though have global scope.

Code

<?php

This tells the web server to expect PHP source code.

Code

define('ENVIRONMENT', 'development');

This code defines a constant named ENVIRONMENT assigned the value development.

This can be set to anything, but default usage is:

  • development
  • testing
  • production

Code

if (defined('ENVIRONMENT'))
{
	switch (ENVIRONMENT)
	{
		case 'development':
			error_reporting(E_ALL);
		break;
	
		case 'testing':
		case 'production':
			error_reporting(0);
		break;

		default:
			exit('The application environment is not set correctly.');
	}
}

This code sets the level of PHP error reporting based on the value of the ENVIRONMENT constant.

Code

$system_path = 'system';

System Folder Name. This variable must contain the name of the “system” folder. Include the path if the folder is not in the same directory as this file.

Code

$application_folder = 'application';

Application Folder Name. If you want this front controller to use a different “application” folder than the default one you can set its name here. The folder can also be renamed or relocated anywhere on your server. If you do, use a full server path. For more info please see the user guide: http://codeigniter.com/user_guide/general/managing_apps.html

Comment

/*
 * --------------------------------------------------------------------
 * DEFAULT CONTROLLER
 * --------------------------------------------------------------------
 *
 * Normally you will set your default controller in the routes.php file.
 * You can, however, force a custom routing by hard-coding a
 * specific controller class/function here.  For most applications, you
 * WILL NOT set your routing here, but it's an option for those
 * special instances where you might want to override the standard
 * routing in a specific front controller that shares a common CI installation.
 *
 * IMPORTANT:  If you set the routing here, NO OTHER controller will be
 * callable. In essence, this preference limits your application to ONE
 * specific controller.  Leave the function name blank if you need
 * to call functions dynamically via the URI.
 *
 * Un-comment the $routing array below to use this feature
 *
 */
	// The directory name, relative to the "controllers" folder.  Leave blank
	// if your controller is not in a sub-folder within the "controllers" folder
	// $routing['directory'] = '';

	// The controller class file name.  Example:  Mycontroller
	// $routing['controller'] = '';

	// The controller function you wish to be called.
	// $routing['function']	= '';

This gives instructions on how to hard code a particular routing.

Comment

/*
 * -------------------------------------------------------------------
 *  CUSTOM CONFIG VALUES
 * -------------------------------------------------------------------
 *
 * The $assign_to_config array below will be passed dynamically to the
 * config class when initialized. This allows you to set custom config
 * items or override any default config values found in the config.php file.
 * This can be handy as it permits you to share one application between
 * multiple front controller files, with each file containing different
 * config values.
 *
 * Un-comment the $assign_to_config array below to use this feature
 *
 */
	// $assign_to_config['name_of_config_item'] = 'value of config item';

Comment

// --------------------------------------------------------------------
// END OF USER CONFIGURABLE SETTINGS.  DO NOT EDIT BELOW THIS LINE
// --------------------------------------------------------------------

Code

/*
 * ---------------------------------------------------------------
 *  Resolve the system path for increased reliability
 * ---------------------------------------------------------------
 */

	// Set the current directory correctly for CLI requests
	if (defined('STDIN'))
	{
		chdir(dirname(__FILE__));
	}

	if (realpath($system_path) !== FALSE)
	{
		$system_path = realpath($system_path).'/';
	}

	// ensure there's a trailing slash
	$system_path = rtrim($system_path, '/').'/';

	// Is the system path correct?
	if ( ! is_dir($system_path))
	{
		exit("Your system folder path does not appear to be set correctly. Please open the following file and correct this: ".pathinfo(__FILE__, PATHINFO_BASENAME));
	}

If the constant STDIN is defined THEN change PHP’s current working directory to the parent directory of the current file. NOTE: __FILE__ is the full path and filename of the file.

If $system_path (the string defined above) is a real filesystem location THEN redefine $system_path to be the canonicalized absolute pathname with a trailing forward slash appended to it.

To ensure there’s a trailing slash. If $system_path has a trailing slash THEN remove it. Then, add a trailing slash to $system_path!

If $system_path is not a directory THEN quit and display a message. The message will say “Your system folder path does not appear to be set correctly. Please open the following file and correct this:”—followed by the filename of the front controller.

Code

/*
 * -------------------------------------------------------------------
 *  Now that we know the path, set the main path constants
 * -------------------------------------------------------------------
 */
	// The name of THIS file
	define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));

	// The PHP file extension
	// this global constant is deprecated.
	define('EXT', '.php');

	// Path to the system folder
	define('BASEPATH', str_replace("\\", "/", $system_path));

	// Path to the front controller (this file)
	define('FCPATH', str_replace(SELF, '', __FILE__));

	// Name of the "system folder"
	define('SYSDIR', trim(strrchr(trim(BASEPATH, '/'), '/'), '/'));


	// The path to the "application" folder
	if (is_dir($application_folder))
	{
		define('APPPATH', $application_folder.'/');
	}
	else
	{
		if ( ! is_dir(BASEPATH.$application_folder.'/'))
		{
			exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF);
		}

		define('APPPATH', BASEPATH.$application_folder.'/');
	}

Define the constant SELF to be the filename of this front controller.

Define the constant EXT to be the string .php.

Define the constant BASEPATH to be $system_path with any backslashes in it replaced with forward slashes. NOTE: BASEPATH is the absolute complete path of the system folder.

Define the constant FCPATH to be the path to this front controller.

Define the constant SYSDIR to be the name of the system directory extracted from BASEPATH.

Define APPPATH to be the path of the application folder—It will have a trailing forwardslash. NOTE: unlike BASEPATH this path may or may not be an absolute path.

Code

/*
 * --------------------------------------------------------------------
 * LOAD THE BOOTSTRAP FILE
 * --------------------------------------------------------------------
 *
 * And away we go...
 *
 */
require_once BASEPATH.'core/CodeIgniter.php';

Load the script CodeIgniter.php (the bootstrap)—which is in the core folder of the system folder.

Cross reference

Note

/* End of file index.php */
/* Location: ./index.php */

(Unlike what PHP coders did in the past) CodeIgniter does not use ?> to terminate its PHP scripts. I wrote about this in a different post. Newer versions of PHP allow this!

Also, take note of the comments used at the end of CI scripts.

Advertisements

About samehramzylabib

See About on https://samehramzylabib.wordpress.com
This entry was posted in CI Source Code Explained. Bookmark the permalink.

One Response to Front Controller Source Code for CI Explained

  1. Burçlar says:

    amazing tutorial thank you! I love Codeigniter.

Comment

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s