Created
September 29, 2013 05:07
-
-
Save sasezaki/6749529 to your computer and use it in GitHub Desktop.
This file contains hidden or 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 | |
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