gstudio / g2

此包的最新版本(dev-master)没有可用的许可证信息。

这是第二代框架

dev-master 2019-12-05 13:31 UTC

This package is not auto-updated.

Last update: 2020-02-07 10:06:16 UTC


README

后端开发者始终只在 /app/ 文件夹中工作

例如,我们有一个返回数据库json数据的URL。此地址是 getListUsers() 方法的API。此时获取系统所有用户列表。

site.ru/api/test/getListUsers

将json数据返回到屏幕上

{"result":[{"id":"1","name":"Олег","surname":"Антипов","patronymic":"Алексеевич","status":"active","role":"user","avatar":null,"parent_id":null,"nickname":"oleg_antipov"},{"id":"4","name":"Второй","surname":"","patronymic":"","status":"unverified","role":"user","avatar":null,"parent_id":null,"nickname":""},{"id":"5","name":"Третий","surname":"","patronymic":"","status":"unverified","role":"user","avatar":null,"parent_id":null,"nickname":""}]}

关键字:api

/api/  -  это ключевое слово для обращения к API методам системы, которые взаимодествуют с данными БД, иначе говоря CRUD методы.

一切从presenter开始!

对于每个微服务都存在一个presenter。这是一个继承自基本presenter /app/presenters/_MainPresenter.php 的普通类。其中实现了与前端的工作、输出页面、小部件、翻译等工作。

/api/test - слово test обозначает какой presenter используется, который в дальнейшем и запускает метод.
			Для этого в проекте существует файл /app/presenters/TestPresenter.php

创建自己的presenter后,务必继承 _MainPresenter.php

创建一个测试presenter。其中包含getListUsers方法,该方法创建Users类的实例并调用getListUsers方法。

<?php

/*
 * TestPresenter work to test
 */

class TestPresenter extends MainPresenter {

	public function getListUsers(){

		if($this->isSecurity()){
			echo (new Users())->getListUsers();
		} 

	}

}

?>

方法中存在会话授权键的检查。这不是必需的,因为不是所有方法都需要检查用户会话。例如,如果这是获取新闻和内容的主页,则不需要检查授权,同样也不用于授权和注册页面。而在个人资料页中,其中会显示您的数据,这时就需要检查用户是否已授权。

框架会自动检查键,并在检查访问权限时如果没有键则输出错误!


if($this->isSecurity()){
	...
}

完整的带访问权限的API URL

/api/test/getListUsers - слово getListUsers обозначает название метода, который запускает TestPresenter.php. 
			Сам метод getListUsers осуществляет запрос к БД на получения данных о пользователях.

如果需要将GET参数传递给API URL,必须这样写:site.ru/api/test/getListUsers?var=1&var2=str

模型操作

模型存储在 /app/models/ 文件夹中。模型是一个普通类,其中定义了与数据库交互的方法。

模型要求

  • 方法实现的简单性
  • 被presenter调用的方法必须是public访问权限
  • 方法必须以JSON格式返回所有内容(数据库中的数据和错误)

Users模型的示例。在模型中存在一个获取用户列表的JSON格式的函数。

<?php
 
class Users {


    public function getListUsers(){
        $result = _MainModel::table("users_cards")->get()->send();
        
        _MainModel::viewJSON($result);   
    }

}

?>

数据库操作

框架中存在一个基本的模型 _MainModel.php,它简化了数据库查询的工作。其中实现了PDO机制。请注意,不是所有查询都可以使用基本模型执行。

在系统模型 _DB.php 中实现了数据库连接机制。不需要实现自己的连接。

更改数据库连接的配置数据

项目根目录下有一个 config.php 文件。替换文件中的连接数据。


<?php

self::$config['database'] = array(
    'hostname' => 'localhost',
    'username' => 'user_login',
    'password' => 'password',
    'dbname' => 'db'
);

self::$config['salt'] = "dlkcmdfv(4&*4mvnKDNAP)_)kdldi12cdl::L847GTe]|";

?>

1.查询

_MainModel::table("table")->get(array("id", "login"))->filter(array("id" => 1))->sort("id", "desc")->pagination(0,6)->send();

объяснение:

->get(array("field1", "field2")) - список полей, которые получаем из таблицы
->get() - получаем все поля из таблицы

->filter(array("field1" => 1, "field2" => "example")) -  аналог WHERE SQL запросе, field - столбец, 1 - значение, которому должен быть равен.
Если перевести на SQL запрос
WHERE field1 = 1 AND field2 = "example"


->sort("id", "desc") - аналог ORDER BY в SQL запросе, сортировка поля id по возрастанию, DESC 
->sort("id", "asc") - аналог ORDER BY в SQL запросе, сортировка поля id по убыванию, ASC

->pagination(0,6) - аналог LIMIT 0, 6 ы SQL запросе

->send() - отправка запроса и возвращение данных с запроса! 

2.添加新记录

_MainModel::table("table")->add(array("login" => "example@gmail.com", "pass" => "dfvkldfmlcdkfv"))->send(); 

->add(array("login" => "example@gmail.com", "pass" => "dfvkldfmlcdkfv")) - заполняем поле таблицы login и pass данными

Если перевести в SQL запрос
INSERT INTO `table` (`login`, `pass`) VALUES ("example@gmail.com", "dfvkldfmlcdkfv");

->send() - отправка запроса и получение id вставленной записи!

3.编辑记录

_MainModel::table("table")->edit(array("field1" => "значение1", "field2" => "значение2"), array("id" => 1))->send()

->edit(array("field1" => "значение1", "field2" => "значение2") - заполняем поля таблицы данными, которые хотим отредактировать

->send() - отправка запроса, при редактировании нечего не возвращается.

UPDATE `table` SET `field1` = 'значение1', `field2` = 'значение2' WHERE `table`.`id` = 1;

4.删除

_MainModel::table("table")->delete(array("id" => 4))->send();

Если перевести в SQL запрос

DELETE FROM table WHERE id = 4;

->send() - отправка запроса, при редактировании нечего не возвращается.

5.自定义PDO查询

$stmt = self::$db->prepare("SELECT * FROM  `x16_table` WHERE id= :id AND status = :status");

$result_query = $stmt->execute(array(":id" => _MainModel::$params_url['id'], ":status" => _MainModel::$params_url['status']));

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 

_MainModel::viewJSON($rows);

// где _MainModel::$params_url['id'] - это GET или POST параметр, переданный в запросе.

5. _MainModel::getQuery() 方法

获取发送到数据库的查询


SELECT id FROM x16_users WHERE login= :filter_login AND password= :filter_password

错误输出的示例

要输出错误,可以使用以下示例

_MainModel::viewJSON(["error" => "text error"]);

前端。处理页面及其内容

前端开发者始终只在 /assets/、/layouts/、/widgets/ 文件夹中工作

在此框架中实现了对Web组件的工作。更多详细信息可以在 官方文档 中找到

assets 文件夹

其中存储了项目使用的所有外部库。例如,Bootstra4、jQuery、各种API。

layouts 文件夹

其中存储了项目中的目录(子项目)。

例如,我们有一个由以下部分组成的在线商店:

  • 商品网站
  • 用户个人资料(订单列表、购物车等)
  • 管理面板(添加商品、类别等)

在本例中,我们为subproject确定了3个主要组成部分。它们将被分配到三个目录中。

示例

  • /layouts/site/
  • /layouts/account/
  • /layouts/admin/

接下来,网站的独立页面(如登录页面、商品和分类展示页面、订单表单页面等)也将存储在各自的文件夹中

  • /layouts/site/page1/
  • /layouts/site/page2/
  • /layouts/site/pageN/
  • ...

独立页面的文件结构如下

  • index.html - 页面,
  • style.css - CSS样式表,
  • script.js - 使用JavaScript编写的脚本。

widgets文件夹

插件是页面上的独立组件,例如表格、菜单、登录和注册表单等。它们不是完整的页面,只是页面的一部分。这个文件夹中存储着在web应用程序中使用的各种插件的目录。

单个插件的目录包括

  • index.html - 插件,
  • style.css - 插件的CSS样式表,
  • script.js - 使用JavaScript编写的插件脚本。