English | 中文
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.
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.
- No skeleton.
- Fast startup.
- Zero config.
- Closure style.
- Support all Hyperf features except annotations.
- Compatible with all Hyperf components.
Create a single PHP file, like index.php:
<?phpuseHyperf\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();Run the server:
php index.php startThat's all you need.
$app inherits all methods from hyperf router.
<?phpuseHyperf\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();<?phpuseHyperf\Nano\ContainerProxy;
useHyperf\Nano\Factory\AppFactory;
require_once__DIR__ . '/vendor/autoload.php';
class Foo {
publicfunctionbar() {
return'bar';
} }
$app = AppFactory::create();
$app->getContainer()->set(Foo::class, newFoo());
$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.
<?phpuseHyperf\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();In addition to closure, all $app->addXXX() methods also accept class name as argument. You can pass any corresponding hyperf classes.
<?phpuseHyperf\HttpMessage\Stream\SwooleStream;
useHyperf\Nano\Factory\AppFactory;
require_once__DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->get('/', function () {
thrownew \Exception();
});
$app->addExceptionHandler(function ($throwable, $response) {
return$response->withStatus('418')
->withBody(newSwooleStream('I\'m a teapot'));
});
$app->run();<?phpuseHyperf\Contract\StdoutLoggerInterface;
useHyperf\Nano\Factory\AppFactory;
require_once__DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->addCommand('echo {--name=Nano}', function($name){
$this->output->info("Hello, {$name}");
})->setDescription('The echo command.');
$app->run();To run this command, execute
php index.php echo<?phpuseHyperf\Contract\StdoutLoggerInterface;
useHyperf\Framework\Event\BootApplication;
useHyperf\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();<?phpuseHyperf\Contract\StdoutLoggerInterface;
useHyperf\Nano\Factory\AppFactory;
require_once__DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->addProcess(function(){
while (true) {
sleep(1);
$this->container->get(StdoutLoggerInterface::class)->info('Processing...');
}
})->setName('nano-process')->setNums(1);
$app->addProcess(function(){
$this->container->get(StdoutLoggerInterface::class)->info('Determine whether the process needs to be started based on env...');
})->setName('nano-process')->setNums(1)->setEnable(\Hyperf\Support\env('PROCESS_ENABLE', true))));
$app->run();<?phpuseHyperf\Contract\StdoutLoggerInterface;
useHyperf\Nano\Factory\AppFactory;
require_once__DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->addCrontab('* * * * * *', function(){
$this->get(StdoutLoggerInterface::class)->info('execute every second!');
})->setName('nano-crontab')->setOnOneServer(true)->setMemo('Test crontab.');
$app->run();<?phpuseHyperf\DB\DB;
useHyperf\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(){
returnDB::query('SELECT * FROM `user` WHERE gender = ?;', [1]);
});
$app->run();- require swow engine
composer require "hyperf/engine-swow:^2.0"- run the code
<?phpdeclare(strict_types=1);
useHyperf\Nano\Factory\AppFactory;
require_once__DIR__ . '/../vendor/autoload.php';
$app = AppFactory::createSwow();
$app->get('/', function () {
return'Hello World';
});
$app->run();