创建API

创建API,仅需要两步:

  • 创建控制器: 主要用于路由回调,当路由被成功访问,会逐层处理直到调度到自定义控制器当中
  • 创建路由: 给控制器添加访问入口,如需要对外提供访问,必须要设置对应路由方法。

创建控制器与路由

假设你想创建一个 /hello/{名字} 生成对方名字并打印出来。为此,在其中创建一个 Controller 类和 Controller 方法即可:

  1. <?php
  2. namespace Controller;
  3. use FastD\Http\ServerRequest;
  4. class HelloController
  5. {
  6. /**
  7. * @param ServerRequest $request
  8. * @return \FastD\Http\Response
  9. */
  10. public function hello(ServerRequest $request)
  11. {
  12. return json([
  13. 'msg' => 'hello '.$request->getAttribute('name')
  14. ]);
  15. }
  16. }

现在,你需要将控制器和方法与路由进行关联,以便用户能够正常访问。这个关联通过 config/routes.php 文件进行配置。

  1. <?php
  2. $router = route();
  3. $router->get('/hello/{name}', 'HelloController@hello');

现在,你可以尝试对其进行访问:

http://localhost:9876/hello/jan

创建中间件

fastd 框架的另外一个特点,就是一切逻辑处理,控制器都是一个中间件。为此,先附上一个图:

创建API - 图1

整个应用就想一个洋葱,一层一层剥开,知道最内的"心(控制器)",至此,完成整个调用。

理解上述原理之后,那么咱们开始做第一个中间件吧。

假设我想在 /hello/{名字} 上做一个判断,如果是 jan 用户就显示 帅气,如果是 runnerlee 就显示 还好。为此,我们只需要添加一个简单的判断中间间即可:

  1. <?php
  2. namespace Middleware;
  3. use FastD\Middleware\DelegateInterface;
  4. use FastD\Middleware\Middleware;
  5. use Psr\Http\Message\ResponseInterface;
  6. use Psr\Http\Message\ServerRequestInterface;
  7. class ManMiddleware extends Middleware
  8. {
  9. /**
  10. * @param ServerRequestInterface $request
  11. * @param DelegateInterface $next
  12. * @return ResponseInterface
  13. */
  14. public function handle(ServerRequestInterface $request, DelegateInterface $next)
  15. {
  16. $man = $request->getAttribute('name');
  17. if ('jan' === $man) {
  18. $request->withAttribute('name', '帅气的'.$man);
  19. } else if ('runnerlee' === $man) {
  20. $request->withAttribute('name', '还好的'.$man);
  21. }
  22. return $next->process($request);
  23. }
  24. }

现在,添加中间件到应用配置(config/app.php):

<?php
return [
    /**
     * Http middleware
     */
    'middleware' => [
        'man' => [
            \Middleware\ManMiddleware::class
        ]
    ],
];

最后,给路由添加中间件:

此处路由添加的中间件需要与应用配置的中间件配置key保持一致。

<?php

$router = route();

$router->get('/hello/{name}', 'HelloController@hello')->withAddMiddleware('man');

尝试分别访问:

http://localhost:9876/hello/runnerlee

{
    "msg": "hello 还好的runnerlee"
}

http://localhost:9876/hello/jan

{
    "msg": "hello 帅气的jan"
}

操作看懂了吗? 其实理解运行原理之后,剩下的就迎刃而解了,是不是感觉开始有点意思了呢? 接下来的可能会有不一样的体验哦。😎