cuculcan/core

小型 PHP 框架

维护者

详细信息

github.com/Cuculcan/core

源代码

问题

安装: 5

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 0

公开问题: 0

类型:项目

0.5.1 2019-09-02 16:05 UTC

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");
    }

}