Skip to main content

Migrating from CakePHP 1.3 to CakePHP 2.x


Installing CakePHP 2.0

This is pretty straight forward. Install Cake per the instructions. There isn't much difference between installing CakePHP 2.0 and previous versions. Unzip the downloaded file in your desired location.

Configure CakePHP

core.php

You should start with default core.php file. Update the configuration values to match those in the app you are migrating. Make sure you copy the Security.salt and Security.cipher_seed from your old core.php or you won't be able to login in addition to other possible security issues. Copy any custom configuration values you have added to your old core.php. Take notice of how errors, sessions, and caching has changed.

database.php

The database configuration has only a minor change in how you designate the database engine. Previously, you used this:
'driver' => 'mysqli',
now, you use this:
'datasource' => 'Database/Mysql',

routes.php

The Route file has been changes slightly. Cake's default routes are now optionally loaded at the end of the file. If you do not want to use Cake's routes, then you can comment this line. In addition, CakePHP 2.0 now has much better handling of plugins. One of those features is automatically loading routes for plugins. You can place your custom routes before or after CakePlugin::routes(), depending on whether you want your custom routes to be matched before or after plugin routes.

bootstrap.php

Other than loading plugins, the bootstrap file hasn't changed much. Copy any functions, constants, or other code from your old bootstrap into the new one.

Copy/Rebake Files

The directory structure for CakePHP 2.0 is a bit different from previous versions. Most notably, most files and folders are now CamelCased instead of lower_underscored. My understanding is that this was done so that files and directory names matched their class names. This should also provide a performance boost as file and folder names will not have to be run through the Inflector Class. As a result, you will either need to rebake your files and then copy code from your old files. While this might be the best bet if you are using a lot of baked controllers and views; for most, this would create a lot of work. Instead, I decided to simply copy all of my old files into their respective directories in the new app. I then went through and renamed the models, controllers, and component files to match the class name. Your users controller called users_controller.php becomes UsersController.php. While you need to rename the View folders to be CamelCased, the view files keep their naming conventions so that they match the action name.

Move App Files

The parent app_ classes have been moved and renamed as well. Instead of app_controller.php, app_model.php, and app_helper.php now become Controller/AppController.php, Model/AppModel.php, and View/Helper/AppHelper.php.

Copy Email Elements

Email elements have been moved from views/elements to View/Emails.

Ok, now let's make things work! At this point, I was actually getting a login screen. I couldn't login however. I disabled the Auth Component temporarily to see what worked. Surprisingly, most things were functioning and rendering ok.

Auth Component

The Auth Component has gone through quite a bit of changes and now boasts some very cool features. Auth now supports multiple authorization adapters that can all be used together. No longer are you limited to using actions, controllers, or crud as the sole method of authorization. Not only can you create custom adapters, but you can also use multiple adapters together. This will be incredibly powerful! As a result of these new features, the configuration of the Auth Component has changed. You will need to update this:
    $this->Auth->authorize = 'actions';
    $this->Auth->actionPath = 'controllers/';
    $this->Auth->flashElement = 'flash/error';
to this:
    $this->Auth->authorize = array(
        'Actions' => array(
            'actionPath' => 'controllers'
        )
    );
    $this->Auth->flash = array(
        'element' => 'flash/error',
        'key' => 'auth',
        'params' => array()
    );


Request Data

CakePHP 2.0 has consolidated some request related classes into the Request Class. This changes how you get data from forms and passed from other methods.
The Request Object does not have form element any longer. You will need to replace $this->params['form'] with $this->request['data'] or $this->request->data. In addition, $this->data needs to be replaced with $this->request->data.

Helpers

The Ajax, Javascript, and Xml helpers have been removed. You will need to replace these helper calls with appropriate alternatives. In addition, the old style of calling helpers in no longer supported. Helpers can no longer be called with $helper->function(). You need to update your helper calls to use $this->Helper->function(). I did run the utility to update the helper calls. I did notice, however, that it did not update the Paginator calls. I had to do that with a custom find and replace.

__() Function

The __() function no longer has the option to echo. It always returns. As a result, any calls that used the return argument need to be updated. This is often used by the Paginator when rendering the counter as well as Session flash messages. Change this:
echo $this->Paginator->counter(array(
    'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true)
));

to this:
echo $this->Paginator->counter(array(
    'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%')
));

PHPUnit Tests

CakePHP 2.0 has replaced SimpleTest with PHPUnit. Unfortunately, this is where I have had the greatest trouble. I initially tried installing PHPUnit from pear, however, I was running into errors that turned out to be related to MAMP's default pear configuration. Deleting the pear config file ended up solving that problem. I decided to rebake my tests and then copy the test methods from my old app. I am having trouble with some fixtures that use virtual fields on my Model tests. I can't seem to get any controller tests to run. Once I solve the testing dilemmas, I will come back and update this.
I still have a few CSS issues to resolve, but the application is up and running! Now I can't wait to dig into the new features!

Comments

Popular posts from this blog

How to Create a PDF file in Cakephp 2.0 using Fpdf

Step 1: Download FPDF folder from  http://www.fpdf.org/  . Step 2: Unzip the downloaded Fpdf file and name it “fpdf” or however you require and make sure that you use the same name while calling it. Step 3: Move the “fpdf” unzipped files to  your /app/Vendor directory within Cakephp. Now you should have the directory path as   /app/Vendor/fpdf. Step 4: Create a new Cakephp layout file for the pdfs. We will use this layout when serving a pdf to the client. Create a file called pdf.ctp inside of /app/View/Layouts. Add the following code to /app/View/Layouts/pdf.ctp Layout: /app/View/Layouts/pdf.ctp 1 2 3 4 <?php      header ( 'Content-Disposition: attachment; filename="downloaded.pdf"' ) ;      echo $content_for_layout ; ?> The header function above tells the browser that it is going to receive a file called download.pdf. If you want to change the name

Setup CakePHP Using Xampp On Windows

Step 1: Download XAMPP  and  CakePHP .   Step 2: Install Xampp Once you have installed Xampp (version 1.7.3) on your Windows with the default option, all your files will be located in the C:\xampp folder. Step 3: Mod Rewrite Module Once Xampp is installed as the local server, you can then proceed to enable mod_rewrite. To do so, you will have to open the httpd.conf file that is located in C:\xampp\apache\conf and uncomment by removing # from the following line: # LoadModule rewrite_module modules/mod_rewrite.so Step 4: Place CakePHP Files in a New Folder Extract the CakePHP (version 1.3.8) zip file and copy all its contents to your local web server, which in this instance is C:\xampp\htdocs\cakephp . I have decided to name the CakePHP folder as cakephp, and in it, you will find many files and folders for the framework, including app, cake, docs, vendors, .htaccess, and index.php. Step 5: Set Up Virtual Host Open the httpd-vhosts.conf file from the C:\xampp\apa

Installing Wamp on Windows

WAMP is an abbreviated name for the software stack Windows, Apache, MySQL, PHP. It is  derived from LAMP which stands for Linux, Apache, MySQL, and PHP. As the name implies, while LAMP is used on Linux servers, WAMP is used on Windows servers.  The “A” in WAMP stands for Apache.  Apache  is server software that is used to serve webpages. Whenever someone types in your WordPress website’s URL, Apache is the software that “serves” your WordPress site. The “M” in WAMP stands for MySQL.  MySQL  is a database management system. It’s job in the software stack is to store all of your website’s content, user profiles, comments, etc. The “P” in WAMP stands for PHP. PHP is the programming language that WordPress is written in. It is also the piece that holds the entire software stack together. It runs as a process in Apache and communicates with the MySQL database to dynamically build your webpages. Download the wamp for the url  http://www.wampserver.com/en/download.php .  You

Dynamic Sitemap Generation plugin in Cakephp

Here for the SEO implementation we need to generate the sitemap.xml in our application which is accessed by the webmaster tool. So here i am outlined the steps to generate the Xml file . 1. Lets think we have controller by name sitemap,Inside that create an action by name sitemap and paste the following code    public function sitemap(){     $this->layout='ajax';     $this->RequestHandler->respondAs('xml');     $listData = $this->Sitemap->find('all',/*Conditions if you have any*/);     $this->set(compact('listData')); } I through variable $listData to render all data( Keywords,Title,Url,etc ...) that will be shown in sitemap.xml.  This   depends   on the   dynamic link  what   we want to   show  in sitemap.xml.For request handler to work include the RequestHandler component public $components = array('RequestHandler'); Step 2. Create View based on action sitemap On structure MVC as default we need create sitemap.