Move legacy PHP project to the modern Laravel ecosystem

Legacy projects can be a pain – you have to not just support an old code but add new features. And at some point this may become a nightmare. However, there are many ways to upgrade it without full re-development at one time. One possible solution is to move such projects to the modern Laravel ecosystem as it’s described in this article.

The idea behind of it is to wrap the old code to handle it by Laravel. Once it’ll be done, the old functionality will work as expected, while all new features will be added in Laravel. Additionally the old code can be refactored and moved under Laravel without a downtime or an interruption of the project. This solution will give a smooth transition from old system to the new one.

Also do not forget about tests – unit and integration, static analyzers like PHPStand and code style control with PHPCS. This will help you to catch possible bugs even before run your app.

Allow inline line breaks for Monolog

By default Monolog ignores line breaks inside debug message and puts it in one line. That’s fine for GrayLog or something similar but is not handy for me during local development. The fix is easy. Just add new Formatter with allowInlineLineBreaks option in true to your StreamHandler and enjoy formatted dumping of arrays:

$logger = new Monolog\Logger('MyLoggerName');
$formatter = new Monolog\Formatter\LineFormatter(
    null, // Format of message in log, default [%datetime%] %channel%.%level_name%: %message% %context% %extra%\n
    null, // Datetime format
    true, // allowInlineLineBreaks option, default false
    true  // ignoreEmptyContextAndExtra option, default false
);
$debugHandler = new Monolog\Handler\StreamHandler('/tmp/my_debug.log', Monolog\Logger::DEBUG);
$debugHandler->setFormatter($formatter);
$logger->pushHandler($debugHandler);

CakeFest 2011

I couldn’t participate CakeFest 2011 which was on September 1st – 4th in Manchester, UK. But at least I’d see slides of speeches. I found a few of them:

Enjoy!

Fix for WP plugin Flickr Photo Album

I use the WP plugin Flickr Photo Album a few years. Together with Firefox plugin Fotofox it makes inserting procedure of images into posts very simple. However, I found a problems with that plugin recently. I couldn’t activate it anymore. The page is just reloaded and plugin’s status remained ‘Inactive’. This simple modification fixes the problem. In the file tantan-flickr/flickr/class-admin.php change add_action to register_activation_hook function as follows.

add_action('admin_menu', array(&$this, 'addhooks'));
//add_action('activate_tantan-flickr/flickr.php', array(&$this, 'activate'));
register_activation_hook(__FILE__, array(&$this, 'activate'));
//add_action('deactivate_tantan-flickr/flickr.php', array(&$this, 'deactivate'));
register_deactivation_hook(__FILE__, array(&$this, 'deactivate'));
add_action('load-upload.php', array(&$this, 'addPhotosTab'));

Installation of Oracle client to Ubuntu 10.04 Lucid

Recently I moved from Fedora 13 to Ubuntu 10.04 on my work laptop. So, I faced again with problem to setup Oracle PHP interface. Oracle provides RPMs only and not DEBs. So, to install the client RPMs should be converted to the DEBs. It can be done easily using utility alien:
sudo alien oracle-instantclient11.1-basic-11.1.0.7.0-1.i386.rpm
sudo alien oracle-instantclient11.1-devel-11.1.0.7.0-1.i386.rpm
sudo alien oracle-instantclient11.1-sqlplus-11.1.0.7.0-1.i386.rpm

They can be installed then with sudo dpkg -i.
Don’t forget to install PHP interface to Oracle:
sudo pear install pecl/oci8
That’s it. I spent no more 15 minutes to setup PHP Oracle interface under Ubuntu. Thanks to that post!

Trick with variable name transformation in CakePHP

CakePHP is a good PHP MVC framework. You can study it easily and start developing web sites very fast. But it has some disadvantages, of course. One of them is strange rules for transformation variable name when it set in the controller. Statement

$my_var = 'Hello world!';
$this->set('my_var', $my_var);

will make the variable $my_var accessible in your view:
<?php echo $my_var; ?>
The phrase ‘Hello world!’ should appear on the web page. But if the same operation is done using function compact, the result is not predictable:
$my_var = 'Hello world!';
$this->set(compact('my_var'));

Instead of ‘Hello world!’ you’ll see the warning about undefined variable on your web page. It happens because cakePHP removes underscore and makes letter, followed by it, capital. So, instead of $my_var you should use $myVar in the view:
<?php echo $myVar; ?>

Note that this bug appears in the cakePHP version 1.2. It’s already fixed in the 1.3.

SugarCRM: check updating of object’s property

Sometimes it’s needed to know about updating of specified object’s property. SugarCRM keeps previous values for all object’s properties in the array fetched_row. For example, to realise it’s new object or just updated we should compare ID from that array and current value of object’s property:
if($obj->fetched_row['id'] != $obj->id) {
echo "This's a new object!\n";
} else {
echo "This's an existing object\n";
}

That approach might be used in the handler of logic hook, for example, to perform some action when desire property is changed.