Skip to content

Instantly share code, notes, and snippets.

@sasezaki
Created September 29, 2013 05:07
Show Gist options
  • Save sasezaki/6749529 to your computer and use it in GitHub Desktop.
Save sasezaki/6749529 to your computer and use it in GitHub Desktop.
<?php
use Zend\Console\Console;
use Zend\Console\Adapter\AdapterInterface as ConsoleAdapter;
use Zend\Console\ColorInterface as Color;
use Zend\Console\Request;
use Zend\Console\Response;
use Zend\Mvc\Router\Console\SimpleRouteStack;
use Zend\View\Variables;
use Zend\View\Model\ConsoleModel;
use Zend\View\Model\ViewModel;
use Zend\View\Renderer\RendererInterface as Renderer;
use Zend\View\Renderer\ConsoleRenderer;
use Zend\View\Renderer\PhpRenderer;
use Zend\View\Resolver\TemplateMapResolver;
use Zend\View\Resolver\ResolverInterface;
class PlainResolver implements ResolverInterface
{
public function resolve($name, Renderer $renderer = null)
{
$fp = fopen('php://memory', 'r+');
fputs($fp, "aa");
return include $fp;
}
}
class DecorateVariables extends Variables
{
protected $console;
protected $decorators = [];
public function setConsole(ConsoleAdapter $console)
{
$this->console = $console;
}
public function setDecorators($decoraters)
{
$this->decorators = $decoraters;
}
public function offsetGet($key)
{
$var = parent::offsetGet($key);
if (isset($this->decorators[$key])) {
return $this->decorators[$key]($var, $this->console);
}
return $var;
}
}
$routes = [
[
'type' => 'simple',
'options' => [
'route' => 'find user [--id=] [--firstName=] [--lastName=] [--email=] [--position=]'
],
/**
'detail' => ''
'options_detail' => [
'id' =>
],*/
'action' => function($params, $response){
return ['id' => (isset($params['id'])) ?: 'foo', 'y' => 2];
},
'view' => 'data://text/plain,HELLO, <?= $this->id ?>',
'decorators' => [
'id' => function ($id, $console) {
return $console->colorize($id, Color::CYAN);
}
]
],
];
function dispatch($routes) {
$stack = new SimpleRouteStack;
$stack->addRoutes($routes);
$console = Console::getInstance();
if ($match = $stack->match($request = new Request)) {
$name = $match->getMatchedRouteName();
if (!isset($routes[$name]['action'])) {
goto usage;
} else {
$result = $routes[$name]['action']($match->getParams(), $response = new Response);
if (is_array($result)) {
//$result = new ViewModel($result);
$variables = new DecorateVariables($result);
$variables->setDecorators($routes[$name]['decorators']);
$variables->setConsole($console);
$result = new ViewModel($variables);
$result->setTemplate('view');
}
if ($result instanceof ViewModel) {
$renderer = new PhpRenderer;
$renderer->setResolver((new TemplateMapResolver)->add('view', $routes[$name]['view']));
$result = (new Response)->setContent($renderer->render($result));
}
if ($result instanceof Response) {
$result->sendContent();
} else {
goto usage;
}
}
} else {
goto usage;
}
return;
usage:
usage($stack, $console);
}
function usage($stack, $console) {
foreach ($stack->getRoutes() as $route) {
$routeReflection = new ReflectionClass($route);
$parts = $routeReflection->getProperty('parts');
$parts->setAccessible(true);
foreach ($parts->getValue($route) as $part) {
if ($part['positional']) {
echo " ". $console->colorize($part['name'], Color::GREEN);
} else {
echo " [--". $console->colorize($part['name'], Color::WHITE).']';
}
}
}
}
dispatch($routes);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment