Skip to main content
CakeDC Blog

PHP Quality Assurance Tools with CakePHP

In Software Development, we are always looking for resources to improve the products we deliver. In this article we show some awesome php qa tools to help us improve our CakePHP software quality and development process. Let's dive in.

Note: The snippets provided in this article can be found at https://github.com/CakeDC/phpqa-app-example
 

Coding Standards

Choosing a coding standard for your project will help the developers team speak the same language by defining a set of rules on how to name variables, methods, class and etc. The coding standard usage can make the integration of community libs and plugins easier.

Checking and fixing coding standards are easily done with the awesome tool PHP_CodeSniffer, this tool has two main scripts:

  • phpcs check for coding standard violations

  • phpcbf autofix coding standard violations, keep in mind that not all errors will be autofixed, but will help you a lot.
     

CakePHP offers a customized coding standards at https://github.com/cakephp/cakephp-codesniffer and you should be using it.
 

Let’s install the tool and the coding standard:

composer require --dev cakephp/cakephp-codesniffer:~4.1.0


Create the file phpcs.xml

<?xml version="1.0"?>

<ruleset name="App">

   <config name="installed_paths" value="../../cakephp/cakephp-codesniffer"/>

   <rule ref="CakePHP"/>

</ruleset>


Update “scripts” block in composer.json  with:

"scripts": {

        "cs-check": "phpcs -p ./src ./tests",

        "cs-fix": "phpcbf -p ./src ./tests",
 

Now we can run composer cs-check and composer cs-fix. In a sample app I got this output saying some errors can be autofixed with composer cs-fix


Static Analysis

How many times have you deployed a project on a production server and found a silly error like calling an undefined method? I hope not often. To avoid this type of issue, a static analysis tool is useful. I recommend you to use PHPStan and PSalm, these tools will help you find errors without having to run the application.

PHStan

PHPStan will rely on phpdoc, so that’s one more reason to use a coding standard tool like PHP_CodeSniffer. Also I recommend that you use the plugin: cakephp-ide-helper, to update annotations (phpdoc) in your app classes.

In some cases we need to help PHPStan understand our code better, and for this reason we created a custom extension: https://github.com/cakedc/cakephp-phpstan.

Let’s install PHPStan using composer:

composer require --dev phpstan/phpstan phpstan/extension-installer cakedc/cakephp-phpstan:^1.0
 

We also need to create two config files

Includes:

    - vendor/cakedc/cakephp-phpstan/extension.neon

    - phpstan-baseline.neon

parameters:

    level: 6

    checkMissingIterableValueType: false

    checkGenericClassInNonGenericObjectType: false

    autoload_files:

        - tests/bootstrap.php

    ignoreErrors:

services:

parameters:

    ignoreErrors:
 

And add two scripts into “scripts” block from composer.json

"stan": "phpstan analyse src/",

        "stan-rebuild-baseline": "phpstan analyse --configuration phpstan.neon --error-format baselineNeon src/ > phpstan-baseline.neon",


Now we can run composer stan and  composer stan-rebuild-baseline the second one will populate phpstan-baseline.neon to ignore all errors returned in composer stan so only use when all the errors shown should be ignored.

 

Psalm 

Psalm is another awesome static analysis tool, it provides a way to check for errors in your code, and can fix some of them, too. In my experience psalm and phpstan work perfect, so you don’t need to pick one or the other, you can use both.

Let’s install psalm:

composer require --dev  "psalm/phar:~3.11.2"


We also need to create two config files

<?xml version="1.0"?>

<psalm

    allowCoercionFromStringToClassConst="true"

    allowStringToStandInForClass="true"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns="https://getpsalm.org/schema/config"

    xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"

    errorBaseline="psalm-baseline.xml"

>
   <projectFiles>

        <directory name="src" />

    </projectFiles>

    <issueHandlers>

        <LessSpecificReturnType errorLevel="info" />

        <RedundantConditionGivenDocblockType errorLevel="info" />

        <TypeCoercion errorLevel="info" />

        <DocblockTypeContradiction errorLevel="info" />

    </issueHandlers>

</psalm>
 

<?xml version="1.0" encoding="UTF-8"?>

<files psalm-version="3.11.2@d470903722cfcbc1cd04744c5491d3e6d13ec3d9">

</files>
 

And add two scripts into “scripts” block from composer.json

"psalm": "psalm.phar --show-info=false src/ ",

        "psalm-rebuild-baseline": "psalm.phar --show-info=false  --set-baseline=psalm-baseline.xml  src/"

Now we can run composer psalm and  composer psalm-rebuild-baseline the second one will populate psalm-baseline.xml to ignore all errors returned in composer stan, so only use this when all the errors shown should be ignored.

When we run composer psalm it may inform you that some errors can be autofixed and which arguments you should use to fix. Normally it will be something like

vendor/bin/psalm.phar --alter --issues=MissingReturnType,MissingClosureReturnType --dry-run


Psalm will only change the file If you remove the --dry-run part.

 

Testing

Testing is extremely important for any application development. There are many types of software for testing, in this article we are focusing on unit tests. Unit tests help us check if one specific piece of code is working as expected, you can think like ‘Is method ‘A’ returning the correct value when argument has value ‘Z’?’.

In CakePHP we have built-in support to PHPUnit, CakePHP integration offers additional features to make it easier to run units tests like custom asserts and methods for integration tests, and fixtures logic for models. We can bake unit tests using the bake plugin.

To improve your unit tests try the cakedc/cakephp-db-test with this one you can use database fixtures instead of files. Learn more at: https://www.cakedc.com/rafael_queiroz/2020/04/27/unit-testing-with-cakedc-db-test

PHPUnit probably already is installed in your app but if not I recommend you to compare your project files with: https://github.com/cakephp/app.

For more information check out: https://book.cakephp.org/4/en/development/testing.html

 

Hope you enjoyed this article and will start using these awesome tools to make your projects better than ever. Good Baking.

 

Back to all articles
We Bake with CakePHP