Skip to content

Commit

Permalink
doc
Browse files Browse the repository at this point in the history
  • Loading branch information
guanhui07 committed Feb 12, 2023
1 parent c975fed commit 0f7fabb
Show file tree
Hide file tree
Showing 11 changed files with 448 additions and 2 deletions.
20 changes: 20 additions & 0 deletions doc/aop.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,26 @@

## aop切面

# AOP 面向切面编程

## 概念

AOP 为 `Aspect Oriented Programming` 的缩写,意为:`面向切面编程`,通过动态代理等技术实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,也是 Hyperf 中的一个重要内容,是函数式编程的一种衍生范型。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

用通俗的话来讲,就是在 Hyperf 里可以通过 `切面(Aspect)` 介入到任意类的任意方法的执行流程中去,从而改变或加强原方法的功能,这就是 AOP。

> 注意这里所指的任意类并不是完全意义上的所有类,在 Hyperf 启动初期用于实现 AOP 功能的类自身不能被切入。
## 介绍

相对于其它框架实现的 AOP 功能的使用方式,我们进一步简化了该功能的使用不做过细的划分,仅存在 `环绕(Around)` 一种通用的形式:

- `切面(Aspect)` 为对流程织入的定义类,包括要介入的目标,以及实现对原方法的修改加强处理
- `代理类(ProxyClass)` ,每个被介入的目标类最终都会生成一个代理类,来达到执行 `切面(Aspect)` 方法的目的

## 定义切面(Aspect)


```php
<?php
declare(strict_types=1);
Expand Down
12 changes: 12 additions & 0 deletions doc/cache.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
## cache

```php
use DcrSwoole\Utils\DataRedis;


#[Inject]
public DataRedis $redis;
```

操作和predis一致

303 changes: 303 additions & 0 deletions doc/coroutine.md

Large diffs are not rendered by default.

21 changes: 21 additions & 0 deletions doc/event.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@

### event 事件


## 概念

事件模式是一种经过了充分测试的可靠机制,是一种非常适用于解耦的机制,分别存在以下 3 种角色:

- `事件(Event)` 是传递于应用代码与 `监听器(Listener)` 之间的通讯对象
- `监听器(Listener)` 是用于监听 `事件(Event)` 的发生的监听对象
- `事件调度器(EventDispatcher)` 是用于触发 `事件(Event)` 和管理 `监听器(Listener)``事件(Event)` 之间的关系的管理者对象

用通俗易懂的例子来说明就是,假设我们存在一个 `UserService::register()` 方法用于注册一个账号,在账号注册成功后我们可以通过事件调度器触发 `UserRegistered` 事件,由监听器监听该事件的发生,在触发时进行某些操作,比如发送用户注册成功短信,在业务发展的同时我们可能会希望在用户注册成功之后做更多的事情,比如发送用户注册成功的邮件等待,此时我们就可以通过再增加一个监听器监听 `UserRegistered` 事件即可,无需在 `UserService::register()` 方法内部增加与之无关的代码。

## 使用事件管理器

> 接下来我们会通过配置和注解两种方式介绍监听器,实际使用时,二者只需使用其一即可,如果既有注解又有配置,则会造成监听器被多次触发。
### 定义一个事件

一个事件其实就是一个用于管理状态数据的普通类,触发时将应用数据传递到事件里,然后监听器对事件类进行操作,一个事件可被多个监听器监听。


```php
<?php

Expand Down
15 changes: 15 additions & 0 deletions doc/guzzle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
```php
#[RequestMapping(methods: "GET , POST", path:"/test/guzzle")]
public function guzzle($request, $response): string
{
// $client = di()->get(\GuzzleHttp\Client::class);
$client = $this->guzzleClient;
$result = $client->get('http://127.0.0.1:9501/test1');
$ret = $result->getBody()->getContents();
$result->getBody()->close();

return 'test '.$ret;
}
```


23 changes: 21 additions & 2 deletions doc/inject.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,26 @@

## Inject

## 方式一
# 注解

注解是 非常强大的一项功能,可以通过注解的形式减少很多的配置,以及实现很多非常方便的功能。

## 概念

### 什么是注解?

注解功能提供了代码中的声明部分都可以添加结构化、机器可读的元数据的能力, 注解的目标可以是类、方法、函数、参数、属性、类常量。 通过 反射 API 可在运行时获取注解所定义的元数据。 因此注解可以成为直接嵌入代码的配置式语言。

通过注解的使用,在应用中实现功能、使用功能可以相互解耦。 某种程度上讲,它可以和接口(interface)与其实现(implementation)相比较。 但接口与实现是代码相关的,注解则与声明额外信息和配置相关。 接口可以通过类来实现,而注解也可以声明到方法、函数、参数、属性、类常量中。 因此它们比接口更灵活。

注解使用的一个简单例子:将接口(interface)的可选方法改用注解实现。 我们假设接口 ActionHandler 代表了应用的一个操作: 部分 action handler 的实现需要 setup,部分不需要。 我们可以使用注解,而不用要求所有类必须实现 ActionHandler 接口并实现 setUp() 方法。 因此带来一个好处——可以多次使用注解。

## 使用注解

注解一共有 3 种应用对象,分别是 ```类方法``类属性`


## 依赖注入方式一 使用注解
```php
#[Inject]
public TestService $testService;
Expand All @@ -11,7 +30,7 @@
`use DI\Attribute\Inject;`


## 方式二
## 方式二 构造方式
```php
public TestService $testService;

Expand Down
6 changes: 6 additions & 0 deletions doc/install.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
## install

### 安装
```
composer create-project dcrswoole/framework skeleton
```
15 changes: 15 additions & 0 deletions doc/request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
## request

```php
#[RequestMapping(methods: "GET , POST", path:"/index/test2")]
#[Middlewares(AuthMiddleware::class, TestMiddleware::class)]
public function test2(): string
{
di()->get(Request::class)->get();
di()->get(Request::class)->get('name');
di()->get(Request::class)->post();
di()->get(Request::class)->post('name');

di()->get(Request::class)->getRawContent();
}
```
11 changes: 11 additions & 0 deletions doc/response.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## response

```php
#[RequestMapping(methods: "GET , POST", path:"/index/test2")]
#[Middlewares(AuthMiddleware::class, TestMiddleware::class)]
public function test2()
{
// return 'test 1121';
return [];
}
```
23 changes: 23 additions & 0 deletions doc/validateion.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@

### 控制器validate
```php
#[RequestMapping(methods: "GET , POST", path:"/test/test4")]
public function test4($request, $response)
{
$validate = Validation::check($this->request->post ?? [], [
// add rule
['title', 'min', 40],
['freeTime', 'number'],
]);

if ($validate->isFail()) {
var_dump($validate->getErrors());
var_dump($validate->firstError());
}

// $postData = $v->all(); // 原始数据
$safeData = $validate->getSafeData(); // 验证通过的安全数据

return $safeData;
}
```
1 change: 1 addition & 0 deletions doc/watcher.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

0 comments on commit 0f7fabb

Please sign in to comment.