Created
February 4, 2014 19:42
-
-
Save pavlakis/8810829 to your computer and use it in GitHub Desktop.
Getting started with Composer and PSR-4
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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:
$autoloader = require DIR . '/../vendor/autoload.php';
$autoloader->add('MyApp\Tests', DIR);