Opt*_*ime 14 php rest open-source
我正在开发一个跨平台系统,我需要创建一个rest API来将它们绑定在一起.我有很长的PHP经验,我想用这个服务.
我可以手动开发100%的API,但我希望有一些很棒的库可以减轻我的开发.
有没有人有像这样的图书馆的经验?你能推荐什么?
Opt*_*ime 15
我得到了Popular question这个问题的徽章,所以我觉得现在是时候详细说明我是如何完成我的REST-soluton了.
我确实看过这个REST Api的Laravel,Sympfony2和Codeigniter.他们都有一些我喜欢的元素和一些我不喜欢的元素.我主要担心的是如何进行身份验证,因为我有一个相当复杂的算法,我的用户可以使用谷歌或Facebook提供的应用程序的access_token或access_tokens登录.我也更完全控制我的框架,上面提到的框架有一些我认为不必要且难以解决的元素.因此,我决定制作自己的REST解决方案.它没有人们想象的那么难,而且可以通过多种方式完成.我这样做的方式需要一些关于OOP编程的知识.
Okey,所以开始创建一个名为REST的基类.这个课程负责每个电话的所有共同点.与身份验证一样,解析请求的方法路径,检查access_token等.
这个类的核心内容之一是请求的路径以及如何将其转换为方法.我的灵感来自Laravel.我有一个数组key=> value,其中键是它应匹配的URL,值是要调用的实际方法.我还包括Lavavel解析URL中变量的方式,如下所示:
'/user/(:id)' => 'user_id',
Run Code Online (Sandbox Code Playgroud)
这将匹配任何/ user/[number].它还检查这是什么类型的请求,所以如果这是一个简单的get方法,它会尝试调用get_user_id.解析的任何内容(:id)都将在调用该方法时用作参数(因此它实际上是在调用get_user_id($id)).
验证后,将评估实际的方法调用.我不想get_user_id在REST类本身中使用所有方法(例如),所以我在扩展REST类的不同控制器中打破了这些方法.这是通过查看所请求的URL来完成的.如果是/user/(:id)脚本将检查是否有名为的控制器userController.php.如果存在,请检查我们要调用的方法是否存在.如果是,请检查参数的数量是否与我们的参数相匹配.如果一切正常,请执行该方法,如果没有返回错误消息.在制作这样的API时,结构和错误消息非常重要.
在不同的控制器中,我调用REST类的构造函数来获取身份验证,解析url等解析.这里棘手的部分是我不想这样做:
$controller = new MyController();
$controller->printResponse();
Run Code Online (Sandbox Code Playgroud)
在每个控制器的底部.所以我做了一个小黑客和一个调用的脚本run.php,为每个控制器类动态地执行此操作.在我包含之前,我run.php只需执行操作即可保存控制器的路径$path = explode('/',__FILE__);.这在运行脚本中使用.运行脚本如下所示:
// Splitting the file-name, removing the extension
$name = explode('.',$path[count($path)-1]);
// Uppercasing the first letter to be nice and OOP-ish
$classToCall = ucfirst($name[0]);
// Creating a new instance
$controller = new $classToCall();
// Logging
$controller->doLog();
// Printing the final response
$controller->printResponse();
Run Code Online (Sandbox Code Playgroud)
我发现这是我想要构建API的完美解决方案.我可以通过在解析urls方法的数组中提供新方法来轻松添加新方法,并且我可以在分离良好的控制器中添加新方法以获得最大的清洁度.
有些人可能认为这是太多的工作,但实际上我花了几个小时来启动和运行.我也称之为高度动态,因为我可以添加新的控制器,如果它们是有效的url模式,系统将识别它们.
一些友好的建议.
如果您决定使用类似于此解决方案的东西,这些可能是一些很好的提示.在每个控制器中,执行以下操作:
public function __construct() {
// Loading the class-name, setting it in the REST-class, so we can check if it holds the method being called
$this->className = get_class($this);
// Calling RESTs constructor
parent::__construct();
}
Run Code Online (Sandbox Code Playgroud)
我们需要存储我们目前正在处理的课程.这将是UserController或类似的东西.
在REST类中,我可以使用此变量来检查在此控制器中是否存在被调用的实际方法.我这样做了:
// Checking if the method exists
if (method_exists($this->className,$method_name)) {
// Check to see if we have the required number of arguments represented
$ReflectionClass = new ReflectionClass($this->className);
if ($ReflectionClass->getMethod($method_name)->getNumberOfParameters() == count($this->methodUrl['args'])) {
$this->response['response'] = call_user_func_array(array($this, $method_name), $this->methodUrl['args']);
Run Code Online (Sandbox Code Playgroud)
我希望能让你们全力以赴.
快乐的鳕鱼
| 归档时间: |
|
| 查看次数: |
26955 次 |
| 最近记录: |