继续学习Container类的内容
昨天主要学习了一下,该类中的构造函数中的 parent::__construct($values);下面接着学习。
public function __construct(array $values = [])
{
parent::__construct($values);
$userSettings = isset($values['settings']) ? $values['settings'] : [];
$this->registerDefaultServices($userSettings);
}
重点看一下registerDefaultServices该方法
private function registerDefaultServices($userSettings)
{
$defaultSettings = $this->defaultSettings;
/**
* This service MUST return an array or an
* instance of \ArrayAccess.
*
* @return array|\ArrayAccess
*/
$this['settings'] = function () use ($userSettings, $defaultSettings) {
return new Collection(array_merge($defaultSettings, $userSettings));
};
$defaultProvider = new DefaultServicesProvider();
$defaultProvider->register($this);
}
接下来,我们看下$this[‘settings’]最后输出的结果.
根据代码注释来看,返回的是@return array|\ArrayAccess,下面我们看下结果
object(Slim\Collection)#7 (1) {
["data":protected]=>
array(7) {
["httpVersion"]=>
string(3) "1.1"
["responseChunkSize"]=>
int(4096)
["outputBuffering"]=>
string(6) "append"
["determineRouteBeforeAppMiddleware"]=>
bool(false)
["displayErrorDetails"]=>
bool(false)
["addContentLengthHeader"]=>
bool(true)
["routerCacheFile"]=>
bool(false)
}
}
这里返回了一个集合对象
最后看下重点内容,就是注册方法
$defaultProvider = new DefaultServicesProvider();
$defaultProvider->register($this);
我们进入到DefaultServicesProvider类中。看下register方法
public function register($container)
{
if (!isset($container['environment'])) {
/**
* This service MUST return a shared instance
* of \Slim\Interfaces\Http\EnvironmentInterface.
*
* @return EnvironmentInterface
*/
$container['environment'] = function () {
return new Environment($_SERVER);
};
}
if (!isset($container['request'])) {
/**
* PSR-7 Request object
*
* @param Container $container
*
* @return ServerRequestInterface
*/
$container['request'] = function ($container) {
return Request::createFromEnvironment($container->get('environment'));
};
}
if (!isset($container['response'])) {
/**
* PSR-7 Response object
*
* @param Container $container
*
* @return ResponseInterface
*/
$container['response'] = function ($container) {
$headers = new Headers(['Content-Type' => 'text/html; charset=UTF-8']);
$response = new Response(200, $headers);
return $response->withProtocolVersion($container->get('settings')['httpVersion']);
};
}
......
}
仔细看一下,其实很简单。就是把闭包对象,设置键名,最后存入到了容器当中
今天就先讲到这里,明天继续