cuculcan / core
小型 PHP 框架
Requires
- apache/log4php: ^2.3
Requires (Dev)
- mockery/mockery: ^0.9.9
- phpunit/phpunit: 5.7
This package is auto-updated.
Last update: 2024-09-09 17:00:18 UTC
README
一个用于培训目的的简单 PHP MVC RESTlike 框架
安装
composer create-project cuculcan/core
导航
模型
模型是继承自 Entity 类的对象。实体对应于数据库表中的一行
每个条目至少有一个 "id" 字段
用户类示例
class User extends Entity { public $name; public $email; public $cityId; public $login; public $password; /** * @type = json */ public $subscription; /** * @extra */ public $city_name; /** * @extra */ public $region_name; public function __construct(array $data = []) { parent::__construct($data); } }
实体字段可以进行注解。
extra 表示此属性与表列没有关系
type = json 用于在保存到数据库时打包数组
default_value = 用于在值未定义的情况下设置默认值
构造函数应按示例描述,并至少有一个数据参数,用于在从数据库中选择后构建对象
存储
对于实体,创建了实现与数据库存储库功能的对象,这些对象从 MysqlStorage 基类继承
MysqlStorage 基类中实现了 Entity 对象的 CRUD 方法
class UsersMysqlStorage extends MysqlStorage { /** * * @param \Pdo $connection */ public function __construct($connection) { parent::__construct($connection, 'users'); //Sets the name of the table with which the storage works } /** * uses the parent class method getById * @param int $id * @return User */ public function getById($id) { $data = parent::getById($id); if (!$data || $data === null) { return null; } return new User($data); } /** * direct query can be implemented using \PDO * @return int */ public function countUsers() { $sql = " SELECT count(id) AS cnt FROM users "; $stm = $this->connection->prepare($sql); $stm->execute(); $cnt = 0; while ($row = $stm->fetch(\PDO::FETCH_ASSOC)) { $cnt = $row['cnt']; } return $cnt; } }
控制器
控制器用于处理传入的请求
网站的任何请求都通过 .htaccess RewriteRule 转换
RewriteRule ^(.*)$ index.php?handler=$1 [QSA,L]
或 nginx 重写
location @rewrite { rewrite ^/(.*)$ /index.php?handler=/$1; }
并发送到 index.php
请求处理的顺序如下
.htaccess->index.php->Request->Router->Controller
控制器继承链
AController
^
|
BaseController
^
|
MainController and other controllers
AController 是抽象的。调用特定控制器中描述的地址处理方法。不应依赖于特定项目
BaseController 继承自 AController 并包含所有用户控制器通用的方法。例如,初始化会话用户。准备菜单和其他数据。
MainController 和其他用户控制器 从 BaseController 继承,包含处理特定 URL 地址的方法。项目必须至少有一个名为 MainController 的控制器,它负责处理对网站根的调用。
http://mysite.com
为了处理对网站的其它请求,必须在相应的控制器中描述请求处理器。例如,以
http://mysite.com/user
必须描述在 UserController 中
路由
每个控制器类都必须有一个方法实现
protected function setActions()
在内部注册了 URL 模板处理器。有 GET, POST, PUT, DELETE 请求的处理程序。作为具有适当名称的方法实现
get() post() del() put()
URL 模板处理器的格式为
$this->get | post | del | put ('[url pattern]', callback function with parameter ($urlParams));
请求的响应实现描述在这个方法的回调中。在 URL 模板中,可能有变量参数,用大括号写,可以在回调中访问
$this->get('/user/{userId}/get_name', function ($urlParams) { echo $urlParams['userId']; });
在这个例子中,将处理形式为 http: //myexample.com/user/12345/get_name 的请求,并显示 12345
请求参数 可以通过请求对象及其方法访问
getQueryParameters() - 将返回参数数组
getQueryParameter($name, $default = null) - 将返回参数的值或传递给默认值的值,如果参数不存在
//process GET request http://myexample.com/user/set_name?name=VasiliyPupkin $this->get('/user/set_name', function ($urlParams) { $name =$this->request->getQueryParameter("name", ""); echo $name });
所有在 setActions() 中描述的方法依次执行,并选择与模板匹配的方法,如果多个方法匹配模式,则抛出异常
在所有控制器对象中,都有一个 model 变量。它用于将数据传输到 View 类的对象,以便稍后显示。
通过方法 $this->showView("UserView") 调用 View 对象。参数是要显示的类的名称。
//process GET request http://myexample.com/user $this->get('/user', function ($urlParams) { $this->model['some_parameter'] = 'param from user controller'; $this->showView("UserView"); });
将使用 UserView 类显示视图
视图
视图类继承自抽象类AView,用于显示模板。PHP自身被用作模板引擎。
主视图类示例
class MainView extends AView { public function __construct($model) { parent::__construct(); $this->model = $model; } protected function setTemplateName() { /* * the template name is set relative to the path specified in config/config.php */ $this->templateName = '/main.php'; } //--------------------------------- SEO -------------------------------- protected function setTitle(){ $this->title = ""; } protected function setKeywords() { $this->keywords=""; } protected function setDescription(){ $this->description=""; } //--------------------------------------------------------------------------- protected function setAdditionalCSS(){ array_push($this->additionalCSS, '/css/main.css'); } protected function setAdditionalJS(){ array_push($this->additionalJS, '/js/main.js'); } protected function setCustomHeaders(){ array_push($this->customHeaders, "MY-PEW-HEADER: pew-pew-pew"); } }