greg-md/php-framework

Greg 框架提供了一种轻量级的引擎,用于快速创建强大的应用程序。

dev-master 2019-07-23 22:17 UTC

This package is auto-updated.

Last update: 2024-09-24 09:46:57 UTC


README

StyleCI Build Status Total Downloads Latest Stable Version Latest Unstable Version License

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\BootstrapStrategyGreg\Framework\Http\BootstrapStrategy策略,或通过扩展Greg\Framework\Console\BootstrapAbstractGreg\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()]);

事件对象

遵循最佳实践,您可以定义事件为对象。

假设我们有一个需要UserLoginEvent类。

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

长引用

I fear not the man who has practiced 10,000 programming languages once, but I fear the man who has practiced one programming language 10,000 times. © #horrorsquad