Pragmatism in today's world

Some (disjointed) notes on provisioning Vagrant with Ansible

I've been playing with Vagrant over the last few days, using Ansible to provision it. These are some notes to remind myself for next time and are very disjointed! Configuring Vagrant to provision using Ansible is easy enough: config.vm.provision "ansible" do |ansible| ansible.playbook = "provisioning/playbook.yml" end

Writing to vagrant synced folders

I had a problem writing to the cache directory in my vagrant project due to file permissions. Fortunately Jeremy Kendall has already solved this problem in his Vagrant Synced Folders Permissions article.

Immutable entities

I've been thinking recently about using immutable objects for some of my model-layer entities. That is, an object that cannot be changed once it is created. Immutable objects have a number of benefits including the fact that they are much easier to understand, simple to use and very easy to test. The main motivation for me is that an immutable object is very predictable as it's state doesn't change. This means that any calculated properties… continue reading.

Use statements

I was having a discussion on IRC about use statements and whether they improved code readability or not. The choices Consider this hypothetical code: $cache = new \User\Service\Cache(); $mapper = new \User\Mapper\User($cache) $form = new \User\Form\Registration($mapper); $form->process($request->getPost()); vs use User\Service\Cache; use User\Mapper\User; use User\Form\Registration; // other code $cache = new Cache(); $db = new User($cache) $form = new Registration($mapper); $form->process($request->getPost()); The first snippet is completely unambiguous at the expense of verbosity. Those longer class names… continue reading.

Broken

On the 26th January, I fell off a skateboard, dislocating & fracturing my left elbow. A trip to A&E that Sunday resulted in hospital admittance on Monday and surgery on Tuesday. This was the first time I've been admitted to hospital for an overnight stay and I found the whole process fascinating, but not something I ever want to repeat. I also can't say enough good things about the staff at Worcester Royal Hospital. Everyone… continue reading.

Creating a zip file with PHP's ZipArchive

I recently had a requirement to create a zip file from a number of files created within my application. As it has been years since I last had this problem, I had a look around and discovered that PHP 5.2 has the ZipArchive class that makes this easy.

Implementing a ZF2 development mode

One feature that piqued my interested in the Apigility skeleton application was development mode. From the README: Once you have the basic installation, you need to put it in development mode: cd path/to/install php public/index.php development enable # put the skeleton in development mode

2013 in pictures

As 2013 finishes, I continue my tradition of showing off some photos that recap my year. Last year I discovered that I didn't take many photos at all, so this year I've published at least one photo every day! A lot of them were rubbish, but a good number are shots that I'm very pleased with. I've done this recap in 2008, 2009, 2010, 2011 and 2012. January It rained in January. I liked this… continue reading.

Global installation of PHP tools with Composer

The Composer package manager along with the Packagist repository site is quickly becoming the defacto PHP package management system. One feature I found out about recently is that you can install packages globally rather than locally into your project. I think that this is most useful for development tools, such as PHPUnit which are then available everywhere.

Apigility tutorial on TechPortal

A few days ago, techPortal published my tutorial Create a RESTful API with Apigility. Apigility was announced at ZendCon US in October 2013 and I think that it looks like a useful tool for creating APIs. I particularly like that versioning is built in from the start and that it handles content negotiation. If you want to learn about Apigility, then have a read. The source code is available on GitHub.