PHP - 将Api端点作为二叉树

时间:2015-06-27 07:34:53

标签: php rest pseudocode

我的团队正在为我们的平台开发R.E.S.T api。

我们目前拥有的端点的一些示例:

  • 运动/ 24566 /图片
  • 运动/ 24566 /用户
  • 用户/ 23445646
  • 用户/广告活动

我们目前以丑陋的方式编写端点来检查路径,我们正在尝试构建一个抽象的Endpoint类,其中包含路径并验证它。

我们的目标是创建这个抽象类,以便只需添加或删除端点类就可以轻松添加或删除端点。

显然,这种端点结构正在为二叉树结构而尖叫,但我在实现它时遇到了一些麻烦。

这是我的伪逻辑:

  1. 对于endpoint / sub_endpoint_1 / sub_enpoint_5
  2. 的请求
  3. 如果有一个名为endpoint的类,并且它可以是route - 则创建一个实例。
  4. 如果端点具有名为sub_endpoint_1的子项 - 创建它的实例
  5. 如果sub_endpoint_1有一个名为sub_endpoint_5的子项 - 创建它的实例
  6. 如果这是一个叶子 - 运行此端点中的代码
  7. 我在考虑每个终点应该保留其父母和孩子,但是我很难理解我怎样才能首先验证整个路径是否正确。

    如果每个端点只能知道它之前的内容以及它之后的内容,我可能会最终得到:

    端点1 / sub_endpoint_1 / sub_endpoint_5

    对于某些伪指南来说会很棒:)

1 个答案:

答案 0 :(得分:0)

我不确定这是否是你所要求的,但如果我是你,我会使用一些经过充分测试并且来自一个众所周知的框架。即使您使用自定义编码的PHP应用程序,也没有使用任何框架,您只能通过… { … files: { "#{BUILD_DIR}/src/js/production.js": ["Thing.js"] } … } 安装所需的组件。

我们以symfony/ruoting为例。为了获取HTTP请求上下文,它还需要symfony/http-foundation。要安装它们,请转到项目根目录,如果尚未安装则安装composer,然后

作曲家需要symfony / http-foundation 作曲家需要symfony / routing

然后您需要在项目入口点包含composer,就是这样,您现在可以使用vendor/autoload.php。好消息是,由于symfony2是一个组件框架,因此您不需要安装所有框架,只需安装这两个软件包。

现在,如果您使用以下代码创建测试文件:

symfony/routing

并尝试打开它,你会看到类似的东西:

require_once(realpath(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'));

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

$routes = new RouteCollection();
$route = new Route('/{endpoint}/{subendpoint}/{subsubendpoint}');
$route->setDefaults(array(
    'endpoint' => null,
    'subendpoint' => null,
    'subsubendpoint' => null,
));
$routes->add('main', $route);

$context = new RequestContext();

// this is optional and can be done without a Request instance
$context->fromRequest(Request::createFromGlobals());

$matcher = new UrlMatcher($routes, $context);

$parameters = $matcher->match('/hello');
var_dump($parameters);
$parameters = $matcher->match('/');
var_dump($parameters);
$parameters = $matcher->match('/campaigns/24566/pictures');
var_dump($parameters);
$parameters = $matcher->match('/campaigns/24566/users');
var_dump($parameters);
$parameters = $matcher->match('/users/23445646');
var_dump($parameters);
$parameters = $matcher->match('/users/campaigns');
var_dump($parameters);

如果您将其集成到REST API条目脚本中,则可以将array(4) { ["endpoint"]=> string(5) "hello" ["subendpoint"]=> NULL ["subsubendpoint"]=> NULL ["_route"]=> string(4) "main" } array(4) { ["endpoint"]=> NULL ["subendpoint"]=> NULL ["subsubendpoint"]=> NULL ["_route"]=> string(4) "main" } array(4) { ["endpoint"]=> string(9) "campaigns" ["subendpoint"]=> string(5) "24566" ["subsubendpoint"]=> string(8) "pictures" ["_route"]=> string(4) "main" } array(4) { ["endpoint"]=> string(9) "campaigns" ["subendpoint"]=> string(5) "24566" ["subsubendpoint"]=> string(5) "users" ["_route"]=> string(4) "main" } array(4) { ["endpoint"]=> string(5) "users" ["subendpoint"]=> string(8) "23445646" ["subsubendpoint"]=> NULL ["_route"]=> string(4) "main" } array(4) { ["endpoint"]=> string(5) "users" ["subendpoint"]=> string(9) "campaigns" ["subsubendpoint"]=> NULL ["_route"]=> string(4) "main" } 传递到$_SERVER['REQUEST_URI']方法,然后再进行以下操作:

::match()