Pop PHP
Version 7 is out

No magic. Just PHP.

A framework for people who want to see what their code is doing and just lean on the power of PHP.

$ composer create-project popphp/framework my-app

Transparent
by design

Understand exactly what your code is doing. No surprises and nothing happens in the dark.

Built for the
real world

Pop wasn't designed in the abstract. It was built solving real problems under real deadlines.

A gentle
on-ramp

Approachable enough to pick up fast. Capable enough that you won't outgrow it in six months.

And it comes with a full, practical toolkit for building real applications — no assembling a dozen packages before you can ship.

See what's inside →

17+ years in production. Modernized for today.

Pop started in 2009, solving real deployment problems in the real world. It's been in continuous use ever since.

More on Pop →

See it for yourself

There are more than a few options to wire up and run a Pop PHP application. Pick a style that fits you.

· web or console, same app object · REST verbs without a package · Broad PSR interoperability
01a Route by config and run index.php
$app = new Pop\Application([
    'routes' => [
        'get' => [
            '/hello[/:name]' => [
                'controller' => IndexController::class,
                'action'     => 'index'
            ],
        ],
        'post' => [
            '/users[/]' => [
                'controller' => UsersController::class,
                'action'     => 'create'
            ],
        ],
    ],
]);

$app->run();
01b Or, route it fluently and run index.php
$app = new Pop\Application();
$app->get('/hello[/:name]', 'IndexController->index')
    ->post('/users[/]', 'UsersController->create');

$app->run();
02 Build your dispatchable controller class
use Pop\Controller\AbstractController;

class IndexController extends AbstractController
{
    public function index(?string $name = null): void
    {
        $this->response->setBody(
            'Hello ' . ($name ?? 'World')
        );
        $this->response->send();
    }
}
03 Serve it terminal
$ ./kettle web:serve
04 See it in action terminal
$ curl http://localhost:8000/hello/Nick

Hello Nick

Simplicity, fully loaded.

Come explore the toolkit.