Skip to content

Commit

Permalink
Patch Resolver
Browse files Browse the repository at this point in the history
  • Loading branch information
Zcasper committed Mar 6, 2016
1 parent 16a1fdb commit 7c37a7d
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 14 deletions.
52 changes: 41 additions & 11 deletions micro/Micro.php
Expand Up @@ -4,13 +4,15 @@

use Micro\base\Container;
use Micro\base\Dispatcher;
use Micro\Base\Exception;
use Micro\Base\FatalError;
use Micro\base\IContainer;
use Micro\cli\Consoles\DefaultConsoleCommand;
use Micro\resolver\ConsoleResolver;
use Micro\resolver\HMVCResolver;
use Micro\Resolver\IResolver;
use Micro\web\IOutput;
use Micro\web\IRequest;
use Micro\Web\IResponse;
use Micro\web\Response;

/**
Expand Down Expand Up @@ -200,6 +202,18 @@ protected function addListener($listener, $event, $prior = null)
return true;
}

/**
* Send signal to dispatcher
*
* @param $signal
* @param $params
* @return mixed
*/
protected function sendSignal($signal, $params)
{
return $this->container->dispatcher->signal($signal, $params);
}

/**
* Get start time
*
Expand All @@ -220,6 +234,7 @@ public function getStartTime()
* @param IRequest $request
*
* @return Web\IResponse|Response|string
* @throws \Micro\Base\Exception
*/
private function doRun(IRequest $request)
{
Expand All @@ -228,22 +243,28 @@ private function doRun(IRequest $request)
}

$this->container->request = $request;

$this->container->dispatcher->signal('kernel.request', ['container' => $this->container]);
if ($output = $this->sendSignal('kernel.request', ['container' => $this->container]) instanceof IResponse) {
return $output;
}

$resolver = $this->getResolver();
$this->container->dispatcher->signal('kernel.router', ['resolver' => $resolver]);
if ($output = $this->sendSignal('kernel.router', ['resolver' => $resolver]) instanceof IResponse) {
return $output;
}

$app = $resolver->getApplication();
$this->container->dispatcher->signal('kernel.controller', ['application' => $app]);
if ($output = $this->sendSignal('kernel.controller', ['application' => $app]) instanceof IResponse) {
return $output;
}

$output = $app->action($resolver->getAction());
if (!$output instanceof IOutput) {
$response = $this->container->response ?: new Response;
$response->setBody($output);
$output = $response;
}
$this->container->dispatcher->signal('kernel.response', ['output' => $output]);

$this->sendSignal('kernel.response', ['output' => $output]);

return $output;
}
Expand All @@ -253,17 +274,26 @@ private function doRun(IRequest $request)
*
* @access protected
*
* @param bool|false $isCli CLI or Web
*
* @return ConsoleResolver|HMVCResolver
* @return IResolver
* @throws \Micro\Base\Exception
*/
protected function getResolver()
{
if ($this->container->request->isCli()) {
return new ConsoleResolver($this->container);
$resolver = $this->container->consoleResolver ?: '\Micro\resolver\ConsoleResolver';
} else {
$resolver = $this->container->resolver ?: '\Micro\Resolver\HMVCResolver';
}

if (is_string($resolver) && is_subclass_of($resolver, '\Micro\Resolver\IResolver')) {
$resolver = new $resolver($this->container);
}

if (!$resolver instanceof IResolver) {
throw new Exception('Resolver is not implement an IReslover');
}

return new HMVCResolver($this->container);
return $resolver;
}

/**
Expand Down
18 changes: 15 additions & 3 deletions micro/base/Dispatcher.php
Expand Up @@ -2,6 +2,8 @@

namespace Micro\Base;

use Micro\Web\IResponse;

/**
* Dispatcher class file.
*
Expand Down Expand Up @@ -36,10 +38,14 @@ public function addListener($listener, $event, $prior = null)
return false;
}

if (!array_key_exists($listener, $this->listeners)) {
$this->listeners[$listener] = [];
}

if (!$prior) {
$this->listeners[$listener][] = $event;
} else {
array_splice($this->listeners, $prior, 0, $event);
array_splice($this->listeners[$listener], $prior, 0, $event);
}

return true;
Expand All @@ -57,12 +63,18 @@ public function addListener($listener, $event, $prior = null)
*/
public function signal($listener, array $params = [])
{
$result = null;

if ($this->listeners && array_key_exists($listener, $this->listeners)) {
foreach ($this->listeners[$listener] as $listen) {
return call_user_func($listen, $params);
$result = call_user_func($listen, $params);

if ($result instanceof IResponse) {
return $result;
}
}
}

return false;
return $result;
}
}
2 changes: 2 additions & 0 deletions micro/base/IContainer.php
Expand Up @@ -25,6 +25,8 @@
* @property \Micro\Micro $kernel
* @property \Micro\Auth\IAuth $permission
* @property \Micro\Base\IDispatcher $dispatcher
* @property \Micro\Resolver\IResolver $consoleResolver
* @property \Micro\Resolver\IResolver $resolver
* @property \Micro\Mail\Transport\ITransport $mail
* @property \Micro\Db\IConnection $db
* @property \Micro\Web\IRouter $router
Expand Down

0 comments on commit 7c37a7d

Please sign in to comment.