Nano v1.0 发布!一个 PHP 文件搭建 Hyperf 应用
Nano, by Hyperf
Nano 是一款零配置、无骨架、极小化的 Hyperf 发行版,通过 Nano 可以让您仅仅通过 1 个 PHP 文件即可快速搭建一个 Hyperf 应用。
设计理念
Svelte
的作者提出过一个论断:“框架不是用来组织代码的,是用来组织思路的”。而 Nano 最突出的一个优点就是不打断你的思路。Nano 非常擅长于自我声明,几乎不需要了解框架细节,只需要简单读一读代码,就能知道代码的目的。通过极简的代码声明,完成一个完整的 Hyperf 应用。
特性
- 无骨架
- 零配置
- 快速启动
- 闭包风格
- 支持注解外的全部 Hyperf 功能
- 兼容全部 Hyperf 组件
- Phar 友好
安装
composer require hyperf/nano
快速开始
创建一个 PHP 文件,如 index.php 如下:
<?php
use Hyperf\Nano\Factory\AppFactory;
require_once __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->get('/', function () {
$user = $this->request->input('user', 'nano');
$method = $this->request->getMethod();
return [
'message' => "hello {$user}",
'method' => $method,
];
});
$app->run();
启动服务:
php index.php start
简洁如此。
更多示例
路由
$app
集成了 Hyperf 路由器的所有方法。
<?php
use Hyperf\Nano\Factory\AppFactory;
require_once __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->addGroup('/nano', function () use ($app) {
$app->addRoute(['GET', 'POST'], '/{id:\d+}', function($id) {
return '/nano/'.$id;
});
$app->put('/{name:.+}', function($name) {
return '/nano/'.$name;
});
});
$app->run();
DI 容器
<?php
use Hyperf\Nano\ContainerProxy;
use Hyperf\Nano\Factory\AppFactory;
require_once __DIR__ . '/vendor/autoload.php';
class Foo {
public function bar() {
return 'bar';
}
}
$app = AppFactory::create();
$app->getContainer()->set(Foo::class, new Foo());
$app->get('/', function () {
/** @var ContainerProxy $this */
$foo = $this->get(Foo::class);
return $foo->bar();
});
$app->run();
所有 $app 管理的闭包回调中,$this 都被绑定到了
Hyperf\Nano\ContainerProxy
上。
中间件
<?php
use Hyperf\Nano\Factory\AppFactory;
require_once __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->get('/', function () {
return $this->request->getAttribute('key');
});
$app->addMiddleware(function ($request, $handler) {
$request = $request->withAttribute('key', 'value');
return $handler->handle($request);
});
$app->run();
除了闭包之外,所有 $app->addXXX() 方法还接受类名作为参数。可以传入对应的 Hyperf 类。
异常处理
<?php
use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\Nano\Factory\AppFactory;
require_once __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->get('/', function () {
throw new \Exception();
});
$app->addExceptionHandler(function ($throwable, $response) {
return $response->withStatus('418')
->withBody(new SwooleStream('I\'m a teapot'));
});
$app->run();
命令行
<?php
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Nano\Factory\AppFactory;
require_once __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->addCommand('echo', function(){
$this->get(StdoutLoggerInterface::class)->info('A new command called echo!');
});
$app->run();
执行
php index.php echo
事件监听
<?php
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Framework\Event\BootApplication;
use Hyperf\Nano\Factory\AppFactory;
require_once __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->addListener(BootApplication::class, function($event){
$this->get(StdoutLoggerInterface::class)->info('App started');
});
$app->run();
自定义进程
<?php
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Nano\Factory\AppFactory;
require_once __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->addProcess(function(){
while (true) {
sleep(1);
$this->get(StdoutLoggerInterface::class)->info('Processing...');
}
});
$app->run();
定时任务
<?php
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Nano\Factory\AppFactory;
require_once __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->addCrontab('* * * * * *', function(){
$this->get(StdoutLoggerInterface::class)->info('execute every second!');
});
$app->run();
使用更多 Hyperf 组件
<?php
use Hyperf\DB\DB;
use Hyperf\Nano\Factory\AppFactory;
require_once __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->config([
'db.default' => [
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', 3306),
'database' => env('DB_DATABASE', 'hyperf'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
]
]);
$app->get('/', function(){
return DB::query('SELECT * FROM `user` WHERE gender = ?;', [1]);
});
$app->run();

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
将OSS数据导入日志服务操作实践
概述 对象存储服务(Object Storage Service,简称 OSS),是海量、安全、低成本、高可靠的云存储服务。OSS与日志服务相比,OSS存储的成本更低,不过日志服务中查询、结果展示、实时监控、数据加工等功能是OSS所不具备的。所以,可以将历史数据投递到OSS进行长期保存,SLS存储近期有查询分析需要的数据。当历史数据有查询、分析需求时可以将OSS中的数据重新导入到SLS。 前提条件 已创建OSS Bucket,并将待导入的日志文件存储到OSS Bucket中,详情请参见上传文件。 已创建Project和Logstore,详情请参见准备流程。 已经完成云资源访问授权。 导入的OSS文件格式支持:JSON、CSV、Parquet、TEXT。 文件压缩格式支持:Gzip、Bzip2、Snappy,以及未压缩文件。 流程总览 检查导入日志服务的文件格式是否满足前提条件。 检查子账号是否有权限操作。主账号可以直接配置。 登陆日志服务配置OSS数据导入。 等待任务执行,查看数据及任务状态。 操作详情 测试导入的文件是之前从SLS发送到OSS的日志文件,bucket类型为标准存储。如...
-
下一篇
边缘计算将会取代云计算吗?
即将开播:5月14日,Jenkins在K8S下的三种部署流程和实战演示 随着云计算、移动网络、大数据和SDN的不断采用,互联网用户数量激增。为了赶上无线连接和互联网的快速变化趋势,公司努力为不同的业务运营采用更多的云。多年来,云计算提供了一种安全、可控的可靠远程访问方式。然而,它确实缺乏处理从网络边缘(即企业拥有的网络连接到第三方网络的点)收集的数据的速度。近年来,边缘计算解决了这一挑战,因为它提供了更好的延迟。 下面我们看一下边缘计算和云计算之间的一些区别,以及它是否可以代替云计算: 什么是边缘计算? 可以将其定义为远离集中式基础结构并靠近面向单个数据源的网络逻辑边缘的数据计算处理。 它也可以被描述为一个分布式IT网络体系结构,能够对本地产生的数据进行移动计算。因此,它不是将数据发送到数据中心,而是分散计算能力,以确保在减少网络存储和带宽要求的同时,无延迟地进行实时处理。 举一个很好的例子,考虑自动驾驶汽车。对于任何自动驾驶汽车来说,道路安全是驾驶中最关键的方面。这些自动驾驶汽车为了安全驾驶,必须能够实时识别障碍物或人员,并在遇到障碍物时刹车。这将需要视觉处理信息并快速做出决策,而这...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Hadoop3单机部署,实现最简伪集群
- MySQL数据库在高并发下的优化方案