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:
-
phpstan-baseline.neon (https://github.com/CakeDC/phpqa-app-example/blob/master/phpstan-baseline.neon)
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>
-
Psalm-baseline.xml (https://github.com/CakeDC/phpqa-app-example/blob/master/psalm-baseline.xml)
<?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.