提供像访问数组一样访问对象的能力的接口。
新建configs目录
新建contorller.php配置文件
<?php
namespace Frame;
class Config implements \ArrayAccess
{
protected $path;
protected $configs = array();
function __construct($path)
{
$this->path = $path;
}
function offsetGet($key)
{
if (empty($this->configs[$key]))
{
$file_path = $this->path.'/'.$key.'.php';
$config = require $file_path;
$this->configs[$key] = $config;
}
return $this->configs[$key];
}
function offsetSet($key, $value)
{
throw new \Exception("cannot write config file.");
}
function offsetExists($key)
{
return isset($this->configs[$key]);
}
function offsetUnset($key)
{
unset($this->configs[$key]);
}
}
在index.php中调用
<?php
define('BASEDIR',__DIR__);
include BASEDIR.'/Frame/Loader.php';
spl_autoload_register('\\Frame\\Loader::autoload');
$config = new \Frame\Config(__DIR__.'/configs');
var_dump($config['controller']);die;
结果:
下面我们结合这个Config.php去完善一下数据库连接
新建Application.php类
<?php
namespace Frame;
class Application
{
public $base_dir;
protected static $instance;
public $config;
protected function __construct($base_dir)
{
$this->base_dir = $base_dir;
$this->config = new Config($base_dir.'/configs');
}
static function getInstance($base_dir = '')
{
if (empty(self::$instance))
{
self::$instance = new self($base_dir);
}
return self::$instance;
}
function dispatch()
{
$uri = $_SERVER['REQUEST_URI'];
list($script,$c, $v) = explode('/', trim($uri, '/'));
$c_low = strtolower($c);
$c = ucwords($c);
$class = '\\App\\Controller\\'.$c;
$obj = new $class($c, $v);
$controller_config = $this->config['controller'];
$decorators = array();
if (isset($controller_config[$c_low]['decorator']))
{
$conf_decorator = $controller_config[$c_low]['decorator'];
foreach($conf_decorator as $class)
{
$decorators[] = new $class;
}
}
foreach($decorators as $decorator)
{
$decorator->beforeRequest($obj);
}
$return_value = $obj->$v();
foreach($decorators as $decorator)
{
$decorator->afterRequest($return_value);
}
}
}
编辑工厂类Factory.php文件
<?php
namespace Frame;
class Factory
{
static $proxy = null;
/**
* @param $id
* @return User
*/
static function getUser($id)
{
$key = 'user_'.$id;
$user = Register::get($key);
if (!$user) {
$user = new User($id);
Register::set($key, $user);
}
return $user;
}
/**
* @param $name
* @return bool
*/
static function getModel($name)
{
$key = 'app_model_'.$name;
$model = Register::get($key);
if (!$model) {
$class = '\\App\\Model\\'.ucwords($name);//首字母转成大写
$model = new $class;
Register::set($key, $model);
}
return $model;
}
static function getDatabase($id = 'proxy')
{
if ($id == 'proxy')
{
if (!self::$proxy)
{
self::$proxy = new \Frame\Database\Proxy;
}
return self::$proxy;
}
$key = 'database_'.$id;
if ($id == 'slave')
{
$slaves = Application::getInstance()->config['database']['slave'];
$db_conf = $slaves[array_rand($slaves)];
}
else
{
$db_conf = Application::getInstance()->config['database'][$id];
}
$db = Register::get($key);
if (!$db) {
$db = new Database\MySQLi();
$db->connect($db_conf['host'], $db_conf['user'], $db_conf['password'], $db_conf['dbname']);
Register::set($key, $db);
}
return $db;
}
}
这样就完成了自动加载配置~
Comment here is closed