{"id":18258087,"url":"https://github.com/guanhui07/dcr","last_synced_at":"2025-04-04T18:31:33.545Z","repository":{"id":65646922,"uuid":"590747266","full_name":"guanhui07/dcr","owner":"guanhui07","description":"借鉴Laravel实现的 PHP Framework  ，FPM模式、websocket使用的workerman、支持容器、PHP8特性attributes以及反射实现了路由注解、中间件注解、Laravel Orm等特性  ","archived":false,"fork":false,"pushed_at":"2024-08-23T14:51:14.000Z","size":334,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-08-23T16:19:31.698Z","etag":null,"topics":["amqp","annotation","command","container","crontab","event","http","illuminate-database","middleware","mysql","orm-framework","php","rabbitmq","websocket","workerman"],"latest_commit_sha":null,"homepage":"https://packagist.org/packages/dcr/framework","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/guanhui07.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-01-19T05:17:47.000Z","updated_at":"2024-08-23T14:51:17.000Z","dependencies_parsed_at":"2024-10-25T15:13:28.109Z","dependency_job_id":"fafbfcb9-6554-4fba-9a8b-268047011f67","html_url":"https://github.com/guanhui07/dcr","commit_stats":{"total_commits":44,"total_committers":1,"mean_commits":44.0,"dds":0.0,"last_synced_commit":"131c341d08e7d0b13458b8c191c81e56769ef9d8"},"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanhui07%2Fdcr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanhui07%2Fdcr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanhui07%2Fdcr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanhui07%2Fdcr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guanhui07","download_url":"https://codeload.github.com/guanhui07/dcr/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247229402,"owners_count":20905043,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amqp","annotation","command","container","crontab","event","http","illuminate-database","middleware","mysql","orm-framework","php","rabbitmq","websocket","workerman"],"created_at":"2024-11-05T10:28:57.948Z","updated_at":"2025-04-04T18:31:33.540Z","avatar_url":"https://github.com/guanhui07.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\n# dcr框架 - 整合各个包，然后模仿laravel 骨架 实现的框架\n- 集成 laravel orm \n- restful route\n- predis\n- guzzle \n- monolog\n- rabbitmq, workerman websocket\n- container  \n-  facade\n-  console\n-  migrate\n-  event\n- crontab\n- middleware  中间件注解\n- validate\n- monolog\n- collection  carbon\n- dotenv\n- PHP8特性attributes以及反射实现路由注解\n\n### 安装\n```\ncomposer create-project dcr/framework skeleton\n```\n\nhttp: 生产不推荐，推荐使用nginx\n```\nphp -S 127.0.0.1:8001 -t ./public  \n```\nwebsocket: 基础于workerman gateway\n```\nphp ./bin/startWs.php start   \n```\ncrontab: 基础于workerman crontab\n```\nphp ./bin/crontab.php start  \n```\n\n##  [更多文档](https://github.com/guanhui07/dcr/tree/master/doc)\n\ncommand 应用\n```\nphp artisan test\n```\n\n## 路由注解 和 中间件注解 以及Inject注解  使用\n```php\n\u003c?php declare(strict_types=1);\n\nnamespace App\\Controller;\n\nuse App\\Middleware\\AuthMiddleware;\nuse App\\Middleware\\TestMiddleware;\nuse App\\Service\\TestService;\nuse Dcr\\Annotation\\Mapping\\Middlewares;\nuse Dcr\\Annotation\\Mapping\\RequestMapping;\nuse DI\\Attribute\\Inject;\n\nclass MIddlewareController extends Controller\n{\n    #[Inject]\n    public TestService $testService;\n\n    #[RequestMapping(methods: 'GET , POST', path:'/test/middleware')]\n    #[Middlewares(AuthMiddleware::class, TestMiddleware::class)]\n    public function test1()\n    {\n//        $this-\u003etestService-\u003etestDi();\n        return apiResponse([]);\n    }\n}\n```\n\n## 从容器 拿对象 获取 参数\n```php\n//-\u003eall()  -\u003eget()  -\u003epost() 等方法\nApplicationContext::getContainer()-\u003eget(Request::class)-\u003eall();\n//di()-\u003e(Request::class)-\u003eall();\n```\n\n## redis 操作\n```php\n$redis = Redis::connection();\n//-\u003esetex -\u003eget -\u003edel -\u003esetnx 等方法 和predis一致\n```\n\n## orm model ，使用和laravel orm一致\n```php\n\u003c?php\ndeclare(strict_types = 1);\nnamespace App\\Model;\nuse Illuminate\\Database\\Eloquent\\Model;\n\n/**\n * Class UserModel\n * @package App\\Model\n * @see https://github.com/illuminate/database\n */\nclass UserModel extends Model\n{\n    protected $table = 'user';\n}\n\n\n```\n### 控制器validate\n```php\n   #[RequestMapping(methods: \"GET , POST\", path:\"/test/test4\")]\n    public function test4($request, $response)\n    {\n        $validate = Validation::check($this-\u003erequest-\u003epost ?? [], [\n            // add rule\n            ['title', 'min', 40],\n            ['freeTime', 'number'],\n        ]);\n\n        if ($validate-\u003eisFail()) {\n            var_dump($validate-\u003egetErrors());\n            var_dump($validate-\u003efirstError());\n        }\n\n        // $postData = $v-\u003eall(); // 原始数据\n        $safeData = $validate-\u003egetSafeData(); // 验证通过的安全数据\n\n        return $safeData\n    }\n```\n\n### 获取配置 需要`use DI\\Attribute\\Inject`\n```php\n    #[Inject]\n    public Config $config;\n\n    #[RequestMapping(methods: \"GET , POST\", path:\"/test/config\")]\n    public function config()\n    {\n        //di()-\u003eget(Config::class)-\u003eget('app.debug');\n        return $this-\u003econfig-\u003eget('app.debug');\n    }\n```\n\n## 中间件 需要`app/Middleware/Kernel.php` 配置\n```php\n\u003c?php\n\nnamespace App\\Middleware;\n\nuse App\\Exception\\RuntimeException;\nuse App\\Middleware\\Contract\\MiddlewareInterface;\n\nclass TestMiddleware implements MiddlewareInterface\n{\n    public function handle()\n    {\n        return static function ($request, $next) {\n//            throw new RuntimeException('未登录');\n            $response = $next-\u003ehandle($request);\n            return $response;\n        };\n    }\n}\n\n```\n\n### Console 命令应用 需要在`app/Console/Kernel.php` 配置 命令类\n```php\n\u003c?php\ndeclare(strict_types = 1);\n\nnamespace App\\Console\\Command;\n\nuse Inhere\\Console\\IO\\Input;\nuse Inhere\\Console\\IO\\Output;\nuse Toolkit\\PFlag\\FlagsParser;\n\nclass Test extends \\Inhere\\Console\\Command\n{\n    // php artisan test \n    protected static string $name = 'test';\n\n    protected static string $desc = 'print system ENV information';\n\n    protected function configFlags(FlagsParser $fs): void\n    {\n        // 绑定选项\n        $fs-\u003eaddOptByRule('update, up', 'bool;update linux command docs to latest');\n        $fs-\u003eaddOptByRule('init, i', 'bool;update linux command docs to latest');\n        $fs-\u003eaddOptByRule('search, s', 'string;input keywords for search');\n\n        // - 这里没有设置必须 可以不传，获取到就是空string\n        $fs-\u003eaddArg('keywords', 'the keywords for search or show docs', 'string');\n    }\n\n    protected function execute(Input $input, Output $output): void\n    {\n        $keywords = $this-\u003eflags-\u003egetOpt('search', 23);\n        var_dump($keywords);\n        $output-\u003einfo('hello world ...');\n    }\n}\n\n```\n\n\n### event 事件\n```php\n\u003c?php\ndeclare(strict_types = 1);\nnamespace App\\Event;\nuse Symfony\\Contracts\\EventDispatcher\\Event;\n\n/**\n * Class TestEvent\n */\nclass TestEvent extends Event\n{\n    public const NAME = 'order.placed';\n    protected $params;\n    public function __construct($params)\n    {\n        $this-\u003eparams = $params;\n    }\n    public function getParams()\n    {\n        return $this-\u003eparams;\n    }\n}\n\n\n```\n### listener 监听者\n```php\n\u003c?php\ndeclare(strict_types = 1);\nnamespace App\\Listener;\n\nuse App\\Event\\TestEvent;\nuse App\\Utils\\LogBase;\nuse Symfony\\Contracts\\EventDispatcher\\Event;\n\nclass TestEventListener implements BaseListenerInterface\n{\n    public function process(object $event)\n    {\n        echo '打印参数'.PHP_EOL;\n        var_dump($event-\u003egetParams());\n    }\n}\n\n\n```\n\n### 触发事件\n```php\n  #[RequestMapping(methods: 'GET , POST', path:'/test/event')]\n    public function event(): string\n    {\n        $params = [\n            'test' =\u003e 23,\n        ];\n        event(new TestEvent($params),TestEvent::NAME);\n        // 初始化事件分发器\n\n        return apiResponse([]);\n    }\n```\n\n或者\n```php\n    #[RequestMapping(methods: \"GET , POST\", path:\"/test/event\")]\n    public function event($request, $response): array\n    {\n        $params = [\n            'test' =\u003e 23,\n        ];\n        $dispatcher = EventInstance::instance();\n    $dispatcher-\u003edispatch(new TestEvent($params), TestEvent::NAME);\n    }\n```\n\n### crontab 秒级定时任务 使用的workerman crontab\n```php\n\u003c?php\nnamespace App\\Crontab;\nuse App\\Crontab\\Contract\\CrontabInterface;\n/**\n *\n * 需要在 /config/crontab.php 配置\n */\nclass TestCrontab implements CrontabInterface\n{\n    public $name = 'test';\n    public $desc = 'just test demo';\n\n    public function execute(): void\n    {\n        echo 'test crontab'.PHP_EOL;\n//        di()-\u003eget(TestRepository::class)-\u003etest1();\n//        di()-\u003eget(TestRepository::class)-\u003efromRepos();\n    }\n}\n```\n\n## 依赖如下组件 并查阅文档 使用 组合了 此框架\n```\n\"illuminate/database\": \"^8.83\",    laravel orm \n\"qiniu/php-sdk\": \"^7.6\",        qiniu-sdk\n\"vlucas/phpdotenv\": \"^5.4\",     dotenv\n\"predis/predis\": \"^2.0\",        redis client\n\"guzzlehttp/guzzle\": \"^7.5\",     guzzle client http\n\"php-amqplib/php-amqplib\": \"dev-master\",   rabbitmq\n\"workerman/gatewayclient\": \"^3.0\",    workerman websocket client\n\"workerman/workerman\": \"^3.5.23\",    workerman 基础包 stream fork socket编程 用event扩展性能好\n\"workerman/gateway-worker\": \"^3.0.0\",   workerman websocket\n\"monolog/monolog\": \"^2.8\",        monolog  日志\n\"nikic/fast-route\": \"^1.3\",      restful route 路由\n\"illuminate/support\": \"^8.83\"   laravel collect  carbon\ndoctrine/instantiator 实例化对象不走 构造 \n\"inhere/php-validate\": \"^2.8\",   inhere的验证器\n\"php-di/php-di\": \"^6.4\",  容器 依赖注入 底层反射  \n\"guanhui07/facade\": \"^1.0\"  门面  底层魔术方法__callStatic\n\"workerman/crontab\": \"^1.0\" crontab 秒级定时任务 ，timer 用event扩展性能好\n\"doctrine/migrations\": \"^3.5\"  数据库文件迁移 \n\"doctrine/event-manager\": \"^1.1\",  事件 监听 观察者模式  解耦，比如事件投递 任务消费 \n\"middlewares/utils\": \"^3.3\",  中间件 解耦 比如auth cors rate_limit\n\"inhere/console\": \"^4.0\",    console 命令应用\n\"fzaninotto/faker\": \"^1.5\",   fake 数据   \n\"nesbot/carbon\": \"^2.64\"  carbon\n\"opis/closure\": \"^3.6\",  序列化闭包 https://opis.io/closure/3.x/serialize.html\n\"symfony/finder\": \"^6.2\",     \n\"symfony/console\": \"^5.1\",   命令行应用\n\"symfony/http-kernel\": \"^6.2\",  request response\n\"intervention/image\": \"^2.7\",    图片处理 水印 缩略图\n\"gregwar/captcha\": \"^1.1\",   验证码\n\"elasticsearch/elasticsearch\": \"7.16\",  es\n```\n\n## demo\n```\n./app/TestController.php\n```\n\n\n## test\n```\ncomposer test\n```\n\n##  [更多文档](https://github.com/guanhui07/dcr/tree/master/doc)\n\n\n## 我的其他包：\nhttps://github.com/guanhui07/dcr  借鉴Laravel实现的 PHP Framework ，FPM模式、websocket使用的workerman、支持容器、PHP8特性attributes实现了路由注解、中间件注解、Laravel Orm等特性\n\nhttps://github.com/guanhui07/redis Swoole模式下 Redis连接池\n\nhttps://github.com/guanhui07/facade  facade、门面 fpm模式下可使用\n\nhttps://github.com/guanhui07/dcr-swoole-crontab 基于swoole实现的crontab秒级定时任务\n\nhttps://github.com/guanhui07/database  基于 illuminate/database 做的连接池用于适配Swoole的协程环境\n\nhttps://github.com/guanhui07/dcr-swoole  高性能PHP Framework ，Cli模式，基于Swoole实现，常驻内存，协程框架，支持容器、切面、PHP8特性attributes实现了路由注解、中间件注解、支持Laravel Orm等特性\n\nhttps://github.com/guanhui07/open-ai   chatgpt sdk\n\n\n\n\nhttps://github.com/guanhui07/timer php定时器，参考了workerman源码 实现一个单进程(守护进程)的定时器。\n\nhttps://github.com/guanhui07/open-ai  open-ai  chatgpt调用\n\nhttps://github.com/guanhui07/geohash  附近的人 geohash\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguanhui07%2Fdcr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguanhui07%2Fdcr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguanhui07%2Fdcr/lists"}