greg-md / php-framework
Greg 框架提供了一种轻量级的引擎,用于快速创建强大的应用程序。
Requires
- php: ^7.3
- greg-md/php-dependency-injection: dev-master
- greg-md/php-router: dev-master
- greg-md/php-support: dev-master
- symfony/console: ^4
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-24 09:46:57 UTC
README
Greg 框架提供了一种轻量级的引擎,用于快速创建强大的应用程序。
Greg PHP 应用是一个准备就绪且可部署的应用程序,您可以使用它来实现该框架的最大生产力。
目录
需求
- PHP 版本
^7.1
安装
composer require greg-md/php-framework
工作原理
您只需要实例化一个新的 Application 并在您选择的环境中运行它。
<?php require_once __DIR__ . '/vendor/autoload.php'; $app = new \Greg\Framework\Application(); $app->run(function () { echo 'Hello World!'; });
您还可以使用自定义的配置和一个IoC 容器来构建 Application。
<?php require_once __DIR__ . '/vendor/autoload.php'; $config = new \Greg\Framework\Config([ 'name' => 'John', ]); $ioc = new \Greg\DependencyInjection\IoCContainer(); $ioc->register($config); $app = new \Greg\Framework\Application($config, $ioc); $app->run(function (\Greg\Framework\Config $config) { echo 'Hello ' . $config['name'] . '!'; });
是的,前面的例子实际上没有做什么,因为您没有使用任何功能。但让我们看看下一个例子,当我们想要创建一个需要在浏览器或控制台中运行的应用程序时。
运行 HTTP 请求
对于 HTTP 请求,我们可以使用内置的 \Greg\Framework\Http\HttpKernel
,它与HTTP 路由一起工作。
在下一个例子中,我们将实例化内核并创建一个将说“你好”的路由器。
向内核提供 Application 和 Router 是可选的。如果您不提供它们,内核会自行实例化。
$httpKernel = new \Greg\Framework\Http\HttpKernel($app); $router = $httpKernel->router(); $router->get('/', function() { return 'Hello World!'; }); $httpResponse = $httpKernel->run(); $httpResponse->send();
运行控制台请求
对于控制台请求,我们可以使用内置的 \Greg\Framework\Console\ConsoleKernel
,它与Symfony 控制台组件一起工作。
在下一个例子中,我们将实例化内核并创建一个将说“你好”的命令。
向内核提供 Application 和 Symfony 控制台应用程序是可选的。如果您不提供它们,内核会自行实例化。
$consoleKernel = new \Greg\Framework\Console\ConsoleKernel($app); $helloCommand = new Symfony\Component\Console\Command\Command(); $helloCommand->setName('hello'); $helloCommand->setDescription('Say Hello.'); $helloCommand->setCode(function(Symfony\Component\Console\Input\InputInterface $input, Symfony\Component\Console\Output\OutputInterface $output) { $output->writeln('Hello World!'); }); $consoleKernel->addCommand($helloCommand); $responseCode = $consoleKernel->run(); exit($responseCode);
配置
您可以使用\Greg\Framework\Config
类定义应用程序配置。它使用ArrayAccessTrait
并可以像数组一样操作。
$config = new \Greg\Framework\Config([ 'foo' => 'FOO', 'bar' => 'BAR', 'db' => [ 'username' => 'foousername', 'password' => 'foosecret', ], ]); $config->get('foo'); // result: 'FOO' // or $config['bar']; // result: 'BAR' $config->getIndex('db.username'); // result: 'foousername' // or $config['db.password']; // result: 'foosecret'
引导
为了保持应用程序的一致性,您可以在引导类中将组件定义/注册/加载到其中。
引导类应该是\Greg\Framework\BootstrapStrategy
的一个实例,它需要boot
方法。
class AppBootstrap extends \Greg\Framework\BootstrapAbstract { public function boot(\Greg\Framework\Application $app) { $app->inject('redis.client', function() { return new Redis(); }); } }
为了获得更好的体验,您可以扩展\Greg\Framework\BootstrapAbstract
类。它将允许您按特定顺序定义多个引导。此类中所有以boot
开头,格式为lowerCamelCase
的方法将被调用。
class AppBootstrap extends \Greg\Framework\BootstrapAbstract { public function bootFoo() { $this->dependsOn('redis'); // Call `bootRedis` method first. $redis = $this->app()->get('redis.client'); // ... } public function bootRedis() { $redis = new Redis(); $this->app()->inject('redis.client', $redis); } }
接下来,您必须将引导添加到应用程序中。
$app->addBootstrap(new AppBootstrap());
您还可以使用Greg\Framework\Console\BootstrapStrategy
和Greg\Framework\Http\BootstrapStrategy
策略,或通过扩展Greg\Framework\Console\BootstrapAbstract
和Greg\Framework\Http\BootstrapAbstract
类,仅针对 HTTP 和控制台内核定义和创建引导。
$httpKernel->addBootstrap(new AppHttpBootstrap());
$consoleKernel->addBootstrap(new AppConsoleBootstrap());
事件
您可以在应用程序中定义和触发事件。
监听器
监听器可以是可调用对象、一个对象或一个类名。
$app->listen('my.event', function() { // do the bussiness logic... });
对象和类名需要实现将被调用的handle
方法。
class MyListener { public function handle() { // do the bussiness logic... } }
$app->listen('my.event', MyListener::class); // or $app->listen('my.event', new MyListener());
触发事件
您可以用或不用自定义参数来触发事件。
$app->fire('my.event'); // or $user = new User(); $app->fire('my.event', $user); // or $app->fireArgs('my.event', [new User()]);
事件对象
遵循最佳实践,您可以定义事件为对象。
假设我们有一个需要User
的LoginEvent
类。
class LoginEvent { private $user; public function __construct(User $user) { $this->user = $user; } public function user() { return $this->user; } }
您可以使用类名作为事件名来定义监听器。
$app->listen(LoginEvent::class, function(LoginEvent $event) { // do the bussiness logic... });
并在应用程序中触发事件。
$app->event(new LoginEvent($user)); // or $app->fire(LoginEvent::class, ...[new LoginEvent($user)]);
内置事件
应用程序
\Greg\Framework\Application::EVENT_RUN
- 在应用程序运行前触发;\Greg\Framework\Application::EVENT_FINISHED
- 在应用程序运行后触发。
HTTP 内核
\Greg\Framework\Http\HttpKernel::EVENT_RUN
- 在内核运行前触发;\Greg\Framework\Http\HttpKernel::EVENT_DISPATCHING
- 在路由分发前触发;\Greg\Framework\Http\HttpKernel::EVENT_DISPATCHED
- 在路由分发后触发;\Greg\Framework\Http\HttpKernel::EVENT_FINISHED
- 在内核运行后触发。
控制台内核
\Greg\Framework\Console\ConsoleKernel::EVENT_RUN
- 在内核运行前触发;\Greg\Framework\Console\ConsoleKernel::EVENT_FINISHED
- 在内核运行后触发。
许可证
MIT © Grigorii Duca