PHPackages                             jetea/ctx - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. jetea/ctx

ActiveLibrary[Framework](/categories/framework)

jetea/ctx
=========

the context library

2.0.3(6y ago)3894241MITPHPPHP &gt;=5.6CI failing

Since Jan 30Pushed 5y ago1 watchersCompare

[ Source](https://github.com/Jetea/ctx)[ Packagist](https://packagist.org/packages/jetea/ctx)[ RSS](/packages/jetea-ctx/feed)WikiDiscussions master Synced today

READMEChangelog (3)Dependencies (2)Versions (5)Used By (1)

 Ctx
=====

[](#-ctx-)

 一个模块化服务上下文框架，帮助模块化组织各种服务逻辑，让服务间调用方式更加统一。

关于 Ctx
------

[](#关于-ctx)

Ctx 是一个模块化服务上下文框架，帮助模块化组织各种服务逻辑，让服务间调用方式更加统一。

平时调用其他服务的方式一般是 `new XyzService()`或则采用`依赖注入`的方式实例化服务，前者会导致一个服务被实例化多次，服务提供方不能更好的进行控制，后者则会存在服务互相依赖的时候造成困扰，如果服务要单例的时候你还需要在服务提供者privider的地方声明服务为单例。

Ctx 提供了一种新的选择，每个模块都只会被实例化一次，每个模块的服务只会提供唯一的入口暴露给调用方，模块不支持多实例，这样可以让模块提供者可以更容易进行服务的控制和维护，所有的模块之间调用方式一致，如：

```
$this->ctx->模块名->方法()

```

同时Ctx提供了很方便的方式将模块方法rpc化，方便单独部署某些接口，比如某个接口频率特别高需要单独优化部署等或则这个接口需要进行保密，如加密算法等。

题外话
---

[](#题外话)

- 模块化开发：不同的模块只能操作自己的数据（包括数据库和缓存等），需要其他模块数据，只能让对应模块的开发人员提供接口，这样每个模块的人只需要了解自己模块的实现，减少复杂度和新人入职加入模块开发维护的难度（只需要了解他负责的模块），同时减少错误的其他模块数据操作，因为有的模块采用异步或则定时任务或则缓存的方式，直接操作对应模块，可能会因为不了解业务而导致数据操作遗漏带来脏数据。
- Ctx单独成为项目进行部署：减少不同的项目共用逻辑的时候拷贝代码，如果是每个都采用微服务减少拷贝代码又会增加网络开销，所以只需要把ctx发布到需要的项目即可。所有的项目依赖共同的ctx服务，每个项目只负责参数的获取和ctx服务的调用组装实现业务逻辑，每个项目实现参数获取和响应输出，具体业务逻辑都要依赖 ctx 进行实现。为了方便ctx模块中的方法的共用，不建议直接把 `$request` 这样的请求对象作为参数传递给 ctx模块的方法，也就是不要在controller之外的地方进行输入参数的获取，而是用参数的方式传递给service。项目关系大概组织为：

    ```
    web项目文件夹
    api项目文件夹
    脚本文件夹
    admin项目文件夹

    ctx文件夹 (供上边所有项目共用)

    ```

安装
--

[](#安装)

```
composer require jetea/ctx -vvv

```

> 同时在`composer.json`中声明 ctx 服务项目目录 psr4 规则

```
"autoload": {
    "psr-4": {
        "Ctx\\": "ctx/"
    },
},

```

编写ctx服务
-------

[](#编写ctx服务)

在调用服务之前需要先编写服务，以下将描述一个服务的编写过程。源码参考参考：

参考目录树结构如：

```
ctx 根文件夹
├── Ctx.php					Ctx入口类
├── Basic/					文件夹
│   └── Ctx.php				各个Ctx服务基类
└── Service/				Service文件夹，包括所有的服务模块
    └── Example/			服务模块1：Example模块
        └── Ctx.php			服务模块入口
        ├── Child/			模块子类文件夹
        │   └── Demo.php	模块子类
    └── Example2/			服务模块2：Example2模块
        ├── Child/
        │   └── Demo.php
        └── Ctx.php

```

1. 新建根文件夹，名称随意，如 `ctx`
2. 编写**Ctx入口类**：`Ctx.php`，为Ctx服务唯一入口，所有的模块调度都要通过此类实现，此类为**单例实现**。参考

    ```
