# Nano-Hyperf **Repository Path**: ls_future/Nano-Hyperf ## Basic Information - **Project Name**: Nano-Hyperf - **Description**: Nano 是一款零配置、无骨架、极小化的 Hyperf 发行版,通过 Nano 可以让您仅仅通过 1 个 PHP 文件即可快速搭建一个 Hyperf 应用 - **Primary Language**: PHP - **License**: MIT - **Default Branch**: master - **Homepage**: https://www.oschina.net/p/nano-hyperf - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2020-12-23 - **Last Updated**: 2020-12-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README English | [中文](./README-CN.md)
# Nano, by Hyperf Nano is a zero-config, no skeleton, minimal Hyperf distribution that allows you to quickly build a Hyperf application with just a single PHP file. ## Purpose The author of `Svelte` has said that "Frameworks are not tools for organizing your code, they are tools for organizing your mind". The biggest advantages of Nano is that it doesn't interrupt your mind of thought. The Nano is good at self-declaration that you have no need to know the details of the framework. You can read the code fastly and know what it's for. Write a complete Hyperf application with minimal code declarations. ## Feature * No skeleton. * Fast startup. * Zero config. * Closure style. * Support all Hyperf features except annotations. * Compatible with all Hyperf components. ## Example Create a single PHP file, like `index.php`: ```php get('/', function () { $user = $this->request->input('user', 'nano'); $method = $this->request->getMethod(); return [ 'message' => "hello {$user}", 'method' => $method, ]; }); $app->run(); ``` Run the server: ```bash php index.php start ``` That's all you need. ## More Examples ### Routing `$app` inherits all methods from hyperf router. ```php 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 Container ```php getContainer()->set(Foo::class, new Foo()); $app->get('/', function () { /** @var ContainerProxy $this */ $foo = $this->get(Foo::class); return $foo->bar(); }); $app->run(); ``` > As a convention, $this is bind to ContainerProxy in all closures managed by nano, including middleware, exception handler and more. ### Middleware ```php get('/', function () { return $this->request->getAttribute('key'); }); $app->addMiddleware(function ($request, $handler) { $request = $request->withAttribute('key', 'value'); return $handler->handle($request); }); $app->run(); ``` > In addition to closure, all $app->addXXX() methods also accept class name as argument. You can pass any corresponding hyperf classes. ### ExceptionHandler ```php get('/', function () { throw new \Exception(); }); $app->addExceptionHandler(function ($throwable, $response) { return $response->withStatus('418') ->withBody(new SwooleStream('I\'m a teapot')); }); $app->run(); ``` ### Custom Command ```php addCommand('echo', function(){ $this->get(StdoutLoggerInterface::class)->info('A new command called echo!'); }); $app->run(); ``` To run this command, execute ```bash php index.php echo ``` ### Event Listener ```php addListener(BootApplication::class, function($event){ $this->get(StdoutLoggerInterface::class)->info('App started'); }); $app->run(); ``` ### Custom Process ```php addProcess(function(){ while (true) { sleep(1); $this->get(StdoutLoggerInterface::class)->info('Processing...'); } }); $app->run(); ``` ### Crontab ```php addCrontab('* * * * * *', function(){ $this->get(StdoutLoggerInterface::class)->info('execute every second!'); }); $app->run(); ``` ### Use Hyperf Component ```php 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(); ```