Category: PHP 5

Why is Laravel 5 So Bad?

Coming from Zend 1 and Yii 1, I find Laravel has made things complicated for itself. It has also tried to be too much of a unique item. Let me explain why Laravel 5 is so bad.


Who am I to Comment

Well I've used Yii 1 and Zend Framework extensively. You can take a look at my Yii share trading site. I have also dabbled, gone through a video tutorial and built a simple site and API with it, with Ruby on Rails 4. I have also worked with Magento (Sigh) and the Django Rest Framework. More recently I have been developing and learning python and django extensively.

So pretty much the best non-js server-side frameworks. That being said, I thought I would take a look at Taylor Otwells master piece, Laravel 5, before I check out Yii 2 (not going to do this anymore). Unfortunately in some respects I am disappointed (take note I'm only about 20% through an ebook teaching laravel).

The Good of Laravel 5

  • It leverages off other new and cool stuff: embracing npm, task runners, dev environments and more recently the best js frameowrk in my opinion (vuejs)
  • It uses the best (not just the easiest or most popular) out of the "new and cool stuff"
  • Homestead: a great development environment facilitator and cli tool

The Bad of Laravel 5

  • You have to manually create a view and action, no generator
  • laravel and php artisan command line utilities could be combined into a single laravel command
  • The directory structure is strange to the point of complexity. Controllers for example are not found in the app folder but in the app/Http folder. Views are not in the app/Http directory next to controllers, they are in a separate top level folder Resources/view

The Ugly of Laravel 5

    • It wraps everything as its own special thing: homestead is a wrapper for vagrant, elixir is a wrapper for gulp. Just use the tools as they are because it will allow php devs to work on a host of other frameworks and technologies without having to know domain specific commands.
    • Strange View and layout directives (maybe I need to get used to them): @yield, @extends, @section, @show, @parent. It can get rather complicated.
    • The Blade templating system, as above, declaring variables in views makes it seem like you are using angular, react or meteor. Sometimes I think php short tags make things simpler than: @foreach, @endforeach, @if, @else, @elseif, endif.
    • No generic route for Controller/Action/Id, although this is actually ok. Explicit is better than implicit.

Update (26-10-2015)

Another thing to notice is the caching of views. This feature is on by default and you have to hack it to turn off view caching. What this means is you can't pinpoint in what file an error has occurred (usually a typo). So you end up with a crap error like:


Summing it Up

Laravel 5 is probably the best PHP Framework. It's still not great though but it a massive step in the right direction. I can't help but think that yii2 may have got the rails to PHP conversion done a bit better. You will have to know Laravel 5 though because of this report, so might as well start linking it.

The best feature of Laravel is by far the Standard Local Development Environment: Homestead.
So instead of having to install all these crap PHP extensions and what not you can create a repeatable local laravel dev environment that just works. Furthermore if you use the homestead composer tool, creating shared folders and adding multiple sites to virtual host id a breeze. It makes development much better. Unfortunately frameworks like Django and Rails aren't as Vagrant friendly and hence you have to create an ansible script to setup your boxes which is a bit of a schlep.

Update 2 (29-10-2015)

There is also the issue of the blade templating system. Which is awesome, except that it is not strict and allows any old crap to pass.

Such as ending a section with @endsection instead of @stop

or specifying a section with:

@section('title', 'Establishment Name')@stop

Instead of:

Establishment Name

No error messages, and nothing in the logs. However it creates a huge problem in that...the session cookie is not set correctly due to template errors.

So now you will never be able to maintain a logged in session and all forms will now fail with a:

TokenMismatchException in VerifyCsrfToken.php line 46


laravel CSRF Token Mismatch Excpetion

Also you will find it is very hard to peruse the templates to find where the actual problem is and you will have to resort to deleting large portions of the template until the problem code is found.

The blade templates need a linter, to point out templating errors in the editor. Why Laravel should have one built into elixir.

Implement Testing on Yii Framework 1

How to Implement Testing on Yii Framework 1

So you've finally realised to verify the quality of the code in releases and make sure everything is working before you deploy to production you need to test.

First we'll use phpunit for unit testing.

Installing PHPUnit with Composer

We will only handle installing the required packages with composer because PEAR and PHP Archives are old news. Check out composer first, if you haven't used it.

Before we get going make sure your composer is updated

composer self-update

First of all it is easier to use the global composer and install phpunit globally:

composer global require "phpunit/phpunit=4.8.*"
composer global require "phpunit/phpunit-selenium": ">=1.2"

But make sure you update composer.json

      "require": {
          "php": ">=5.3.2",
          "yiisoft/yii": "1.1.*",
          "yiiext/migrate-command": "*",
          "phpunit/phpunit": "4.8.*",
          "phpunit/phpunit-selenium": ">=1.2"

But you will still get warnings like:

PHP Warning:  include(PHP_Invoker.php): failed to open stream: No such file or directory in /var/www/site/vendor/yiisoft/yii/framework/YiiBase.php on line 432
PHP Warning:  include(): Failed opening 'PHP_Invoker.php' for inclusion in /var/www/site/vendor/yiisoft/yii/framework/YiiBase.php on line 432
PHP Warning:  include(PHPUnit_Extensions_Database_TestCase.php): failed to open stream: No such file or directory in /var/www/site/vendor/yiisoft/yii/framework/YiiBase.php on line 432
PHP Warning:  include(): Failed opening 'PHPUnit_Extensions_Database_TestCase.php' for inclusion in /var/www/site/vendor/yiisoft/yii/framework/YiiBase.php on line 432
PHP Warning:  include(PHPUnit_Extensions_Story_TestCase.php): failed to open stream: No such file or directory in /var/www/site/vendor/yiisoft/yii/framework/YiiBase.php on line 432
PHP Warning:  include(): Failed opening 'PHPUnit_Extensions_Story_TestCase.php' for inclusion in /var/www/site/vendor/yiisoft/yii/framework/YiiBase.php on line 432

So we actually need more stuff, namely dbunit, phpunit-story and php-invoker:
So add the following to composer.json

 "phpunit/php-invoker": "*",
 "phpunit/dbunit": ">=1.2",
 "phpunit/phpunit-story": "1.*"

If you installed globally you need to install using:

composer global require {package}

But when running the tests from a task runner or continuous integration like jenkins, it is best to use the path to the composer phpunit in vendor.

Installed, Now let us write our first unit test

The folder where the test suite (class consisting of test functions) is <code>/protected/tests/unit</code>.

The file name needs to end in Test.php so for a test class: DummyTest.php.

Now the contents of the file:

 class DummyTest extends CTestCase{
   public function testTrue(){
     $var = true;

Running the Test

To run the tests you need to be within the test folder:

cd protected/tests
//run all the tests
../../../vendor/bin/phpunit unit
//run the single test suite
../../../vendor/bin/phpunit unit/DummyTest.php

The test results (output) is not the best.
A single dot . means a test passed.
A letter F means the test failed.

Setting Things up and Tearing things Down

Usually you will need certain things to happen before running a test. Such as: instantiation of an object or a connection to a database. To this we use setUp(). Which is a method called once before each test. Often calling the parent setUp function is good practice. Conversely, callingtearDown() is run after a test is run to free up resources.

setUp() and tearDown()

are run before and after each test case whether or not the test succeeds.

There are also

setUpBeforeClass() and tearDownAfterCall()

which are only called once regardless of test cases.


What are Fixtures? They are a state of being of the test. They are mainly used when databases are involved.

How to ace a PHP job test in South Africa

Initial Preparation

First of all do a project in PHP that utilises the database. I am talking about pure PHP and not a framework. Remember to turn make sure you set the following configuration settings.

display_errors = 1;

You can always view the php documentation which is always of great help.

 Get ready for some specialised questions

The off-the-wall questions

  • What do you think of garden gnomes? Your answer should include some form of analysis and deduction.
  • Why are man-hole covers a circle? The answer is because it is not possible for the cover to fall into the hole that way.

PHP Specific Questions

Increment and Decrement Operators

Example Name Effect
++$a Pre-increment Increments $a by one, then returns $a.
$a++ Post-increment Returns $a, then increments $a by one.
--$a Pre-decrement Decrements $a by one, then returns $a.
$a-- Post-decrement Returns $a, then decrements $a by one.

Question 1: ++$a * $a++ + $a = ? (Where $a = 5)

Answer 1: 6 * 5 + 5 = 35

Bitwise Operators

Example Name Result
$a & $b And Bits that are set in both $a and $b are set.
$a | $b Or (inclusive or) Bits that are set in either $a or $b are set.
$a ^ $b Xor (exclusive or) Bits that are set in $a or $b but not both are set.
~ $a Not Bits that are set in $a are not set, and vice versa.
$a << $b Shift left Shift the bits of $a $b steps to the left (each step means "multiply by two")
$a >> $b Shift right Shift the bits of $a $b steps to the right (each step means "divide by two")

Question 2: echo 5 & 7;

Answer 2:

5 = 0101
7 = 0111

Now AND the bits

Answer = 0101 (5)

Question 3: echo 12 ^ 9;

Answer 3:

12 = 1100
9  = 1001
Now XOR the bits
Answer = 0101 (5)

Question 4:$x = 5; echo $x >> 2;
Answer 4:

5 = 0101
Shift bits 2 steps to the right

Answer = 0001 (1)

Learn some functions of the PHP library

array_shift  - Shifts an element off the beginning of an array

array_combine - Creates an associative array by using 1 for keys and 1 for values

final keyword - Prevents overriding and extension of the class

interfaces - Interfaces specify which methods a class must implement, but does not specify the code for the methods.

suppression of errors

Learn some permutations, combinations and factorial

I'm not good at these and if anyone has a tutorial or content to add please free to comment.

Here are some resources that may help, if you find out how to do these please comment below.

Circular Permutations

Example Permutation and Combination Question

Maths is Fun

If ABCDEFGH are sitting at a table, where the configuration of the seats is 1 at each head of the table, and 3 on either side. If A can't sit next to B and F can't sit G, how many different configurations are there?

How many different numberplates can be made, if the numberplate must contain only digits and no signle digit can be repeated if there are 5 spaces for digits on the numberplate?

Please leave comments if you have anything else to add.

PHP job test