通过 hyperf/nano 可以在无骨架、零配置的情况下快速搭建 Hyperf 应用。
安装
composer install hyperf/nano
快速开始
<?php// index.phpuse Hyperf\Nano\Factory\AppFactory;require_once __DIR__ . '/vendor/autoload.php';$app = AppFactory::create('0.0.0.0', 9051);$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
简洁如此。
特性
- 无骨架
- 零配置
- 快速启动
- 闭包风格
- 支持注解外的全部 Hyperf 功能
- 兼容全部 Hyperf 组件
- Phar 友好
更多示例
路由
$app 集成了 Hyperf 路由器的所有方法。
<?phpuse 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 容器
<?phpuse 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上。
中间件
<?phpuse 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 类。
异常处理
<?phpuse 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();
命令行
<?phpuse 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
事件监听
<?phpuse 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();
自定义进程
<?phpuse 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();
定时任务
<?phpuse 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 组件.
<?phpuse 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();
