Skip to content

Instantly share code, notes, and snippets.

@pavlakis
Created February 4, 2014 19:42
Show Gist options
  • Save pavlakis/8810829 to your computer and use it in GitHub Desktop.
Save pavlakis/8810829 to your computer and use it in GitHub Desktop.
Getting started with Composer and PSR-4
<?php
/**
* This is a very basic getting started example for setting up a basic project using PSR-4 and
* using composer's autoloader to run the tests.
*
*/
// Create directory MyApp
// Inside MyApp/ create composer.json with the below contents
{
"require": {
},
"autoload": {
"psr-4": {
"MyApp\\": ["src/", "tests/"]
}
}
}
// Create two directories for src/ and tests/
// Create directory MyApp/src/Http
// This is a very lightweight Request.php file. A class handling only Get and Post
namespace MyApp\Http;
class Request
{
private $query;
private $request;
public function __construct(array $query = array(), array $request = array())
{
$this->query = $query;
$this->request = $request;
}
public static function init()
{
return new self(
$_GET,
$_POST
);
}
public function get($param, $default = null)
{
// order being called: GET, POST
return $this->getQuery($param, $this->getPost($param, $default));
}
public function getPost($param, $default = null)
{
if (!isset($this->request[$param])) {
return $default;
}
return $this->request[$param];
}
public function getQuery($param, $default = null)
{
if (!isset($this->query[$param])) {
return $default;
}
return $this->query[$param];
}
}
// Create directory MyApp/tests/Http
// This is the RequestTest.php file
namespace MyApp\Http;
class RequestTest extends \PHPUnit_Framework_TestCase
{
/**
* @var Request
*/
protected $request;
public function setUp()
{
$this->request = new Request();
}
public function testGet()
{
$request = new Request(array('q1' => 'query1'));
$this->assertEquals('query1', $request->get('q1', false));
}
public function testGetKeyNotFoundReturnsDefaultNull()
{
$request = new Request(array('q1' => 'query1'));
$this->assertNull($request->get('q3'));
}
public function testGetKeyNotFoundReturnsCustomEmptyArray()
{
$request = new Request(array('q1' => 'query1'));
$this->assertEquals(array(), $request->get('q3', array()));
}
public function testGetPost()
{
$request = new Request(array(), array('p1' => 'post1'));
$this->assertEquals('post1', $request->getPost('p1', false));
}
public function testGetQuery()
{
$request = new Request(array('q1' => 'query1'));
$this->assertEquals('query1', $request->getQuery('q1', false));
}
}
// Create MyApp/tests/phpunit.xml.dist so that phpunit knows where how to bootstrap the application
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
bootstrap="../vendor/autoload.php"
>
<testsuites>
<testsuite>
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
// Run composer install in the root directory of MyApp
// If succesful, composer has generated the autoloader file, at: MyApp/vendor/autoload.php
// Now we can run phpunit in MyApp/tests just by calling phpunit
@pavlakis
Copy link
Author

pavlakis commented Feb 5, 2014

For efficiency, we shouldn't be including the tests directory on the main namespace. Instead, we can add it to the autoloader but only in the phpunit's bootstrap. (thanks to @noginn for his suggestion)

We can adapt the above example by making three changes:

  1. In composer.json remove the reference to tests/, save and run composer update
  2. Create MyApp/tests/bootstrap.php

$autoloader = require DIR . '/../vendor/autoload.php';
$autoloader->add('MyApp\Tests', DIR);

  1. Change the bootstrap reference in MyApp/tests/phpunit.xml.dist to: bootstrap.php

@pavlakis
Copy link
Author

pavlakis commented Feb 5, 2014

I've created a public repo with the latest code: https://github.com/pavlakis/psr4-with-composer

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment