Using Zend Framework with CodeIgniter
If you ever wanted to integrate CodeIgniter and Zend Framework, you might have come across this tutorial by Daniel Vecchiato.
Whilst Daniel has done a great job demonstrating the possibility of using the two frameworks together, concerns have been made: do we actually need to use hooks?
As I understand it, hooks are used to extend the core functionalities of CodeIgniter (as explained in the user guide). Obviously Zend Framework and CodeIgniter are two different systems and there is no intention for us to extend CodeIgniter’s core functionality with Zend Framework.
Using hooks can be dangerous as it’s system-wide, and it modifies the system behaviour.
What I have done is to simply use CodeIgniter’s library structure to load the Zend Framework resources. Below is the tutorial.
Assuming you already have CodeIgniter installed. If not please refer to the user guide for installation.
- Download Zend Framework from the official website.
- Unzip the Zend Framework package, and copy the Zend folder (under Library) to your CodeIgniter installation’s application/libraries/. You can actually place the folder anywhere, but remember to alter the script accordingly (read the comments in the script!).
- Place the library script (provided at the end of the post) in application/libraries/
- Done! That’s all you need to do. Now, let us see an example of using the library.
Usage Sample
<?php
class Welcome extends Controller {
function Welcome()
{
parent::Controller();
}
function index()
{
$this->load->library('zend', 'Zend/Service/Flickr');
$flickr = new Zend_Service_Flickr('YOUR_FLICKR_API_KEY');
$results = $flickr->tagSearch('php');
foreach ($results as $result)
{
echo $result->title . '<br />';
}
//$this->load->view('welcome_message');
}
}
?>
Library Script
Copy the code and paste it to a new file called Zend.php in application/libraries/.
<?php if (!defined('BASEPATH')) {exit('No direct script access allowed');}
/**
* Zend Framework Loader
*
* Put the 'Zend' folder (unpacked from the Zend Framework package, under 'Library')
* in CI installation's 'application/libraries' folder
* You can put it elsewhere but remember to alter the script accordingly
*
* Usage:
* 1) $this->load->library('zend', 'Zend/Package/Name');
* or
* 2) $this->load->library('zend');
* then $this->zend->load('Zend/Package/Name');
*
* * the second usage is useful for autoloading the Zend Framework library
* * Zend/Package/Name does not need the '.php' at the end
*/
class CI_Zend
{
/**
* Constructor
*
* @param string $class class name
*/
function __construct($class = NULL)
{
// include path for Zend Framework
// alter it accordingly if you have put the 'Zend' folder elsewhere
ini_set('include_path',
ini_get('include_path') . PATH_SEPARATOR . APPPATH . 'libraries');
if ($class)
{
require_once (string) $class . EXT;
log_message('debug', "Zend Class $class Loaded");
}
else
{
log_message('debug', "Zend Class Initialized");
}
}
/**
* Zend Class Loader
*
* @param string $class class name
*/
function load($class)
{
require_once (string) $class . EXT;
log_message('debug', "Zend Class $class Loaded");
}
}
?>
Happy coding! Oh and don’t forget, Zend Framework is PHP 5 only, so it won’t work on your PHP 4 installation.
Update: Using it with Kohana
Even though Kohana has the ability to load vendor classes, I still find it useful to use the library approach so that loading Zend Framework libraries will be transparent. :)
Usage is exactly the same as in CodeIgniter.
<?php defined('SYSPATH') or die('No direct script access.');
/**
* Zend Framework Loader
*
* Put the 'Zend' folder (unpacked from the Zend Framework package, under 'Library')
* in CI installation's 'application/libraries' folder
* You can put it elsewhere but remember to alter the script accordingly
*
* Usage:
* 1) $this->load->library('zend', 'Zend/Package/Name');
* or
* 2) $this->load->library('zend');
* then $this->zend->load('Zend/Package/Name');
*
* * the second usage is useful for autoloading the Zend Framework library
* * Zend/Package/Name does not need the '.php' at the end
*/
class Zend
{
/**
* Constructor
*
* @param string $class class name
*/
function __construct($class = NULL)
{
// include path for Zend Framework
// alter it accordingly if you have put the 'Zend' folder elsewhere
ini_set('include_path',
ini_get('include_path') . PATH_SEPARATOR . APPPATH . 'libraries');
if ($class)
{
require_once (string) $class . EXT;
Log::add('debug', "Zend Class $class Loaded");
}
else
{
Log::add('debug', "Zend Class Initialized");
}
}
/**
* Zend Class Loader
*
* @param string $class class name
*/
function load($class)
{
require_once (string) $class . EXT;
Log::add('debug', "Zend Class $class Loaded");
}
}
?>














Hi Fred, thanks for this helpful article. I have a few noobesque questions for you about the library file:
1. do you check for the BASEPATH because that is just part of how you handle security or is that required by CI (or both)?
2. in line 31 is APPPATH a constant that is defined somewhere in Code Igniter?
3. In line 35 and 51 what is EXT?
4. that bit about (string) on lines 35 and 51… is that an example of casting? Is that for security?
5. In lines 33-41 is that checking for the class just so you can log for your own convenience or is there another reason?
6. Why do you need the load() function? Seems like you take care of it (or could) in the constructor.
Thanks for your time!
Hi Stuart, to answer your questions:
1. Yes BASEPATH checking is required in CI to ensure users don’t accidentally access the library file itself directly. (remember, library files are meant to be called in your models/controllers)
2. APPPATH is defined in index.php which is in the root folder of your CI distribution.
3. EXT is another constant defined in the above mentioned file, it is used to echo the php file extension, usually ‘.php’.
4. Yes it is type casting, for added security measurement and code clarity (and in this case it’s more of code clarity).
5. Log class is one of the core classes provided by CI. By logging crucial events it offers better assistant for debugging purposes.
6. As demonstrated in the code comment section, there are two ways of calling the library, one is by calling it with a second parameter which will call the specific Zend component straight away, or you can omit the second parameter and use ‘$this->zend->load()’ later one, useful for autoloading the library.
Hope that helps. :)
what about integration with ez components?
You can use these tags: