当前位置: 首页 > 后端技术 > PHP

如何基于Notadd构建API(Laravel写API)

时间:2023-03-30 02:19:41 PHP

如何基于Notadd构建APINotadd在底层实现了passport机制,有统一的授权管理,主要支持两种API授权方式,一种一个是client,一个是passport。这个在其他文档中有详细说明。这里最主要的是如何开发基于Notadd的API接口。业务逻辑熟悉Laravel的同学应该知道,Laravel遵循这样的业务逻辑实现:路由(route)->控制器(controller)->业务逻辑(model)->数据输出(view)和Notadd的API业务逻辑实现也是遵循类似的流程:路由(route)->控制器(controller)->API处理器(handler)->模型(model)->数据输出(json)其中,主要的区别在于API处理器提供了对于输出数据输出格式,返回的数据格式统一:['code'=>200,//API接口返回的状态码,默认为200'data'=>[],//返回的数据API接口,主要是数组形式'message'=>'success!',//API接口返回的提示信息可以包含错误信息或成功信息]RoutingNotadd通过路由中间件(middleware)实现API授权。具体实现方法是在路由的中间配置参数中加入auth:api。例如在实现api/setting/all和api/setting/set两个API时,添加auth:api中间件,代码参考如下:$this->router->group(['middleware'=>['auth:api','web'],'prefix'=>'api/setting'],function(){$this->router->post('all','Notadd\Foundation\Setting\Controllers\SettingController@all');$this->router->post('set','Notadd\Foundation\Setting\Controllers\SettingController@set');});Notadd还为需要跨域的API提供了跨路由中间件,实现API跨域功能。例如,为前两个API提供跨域功能实现,代码参考如下:$this->router->group(['middleware'=>['auth:api','cross','web'],'prefix'=>'api/setting'],function(){$this->router->post('all','Notadd\Foundation\Setting\Controllers\SettingController@all');$this->router->post('set','Notadd\Foundation\Setting\Controllers\SettingController@set');});由于controller有独立的API处理器,controller层可以做简单的处理,只需要在controller中注入handler,handler提供的辅助方法将API数据返回给前台即可。比如之前路由调用的SettingController中,只需要注入AllHandler,使用toResponse和generateHttpResponse方法将结果返回给前台。代码参考如下:*@copyright(c)2016,iBenchu.org*@datetime2016-11-0817:01*/namespaceNotadd\Foundation\Setting\Controllers;useNotadd\Foundation\路由\摘要\控制器;使用Notadd\Foundation\Setting\Contracts\SettingsRepository;使用Notadd\Foundation\Setting\Handlers\AllHandler;使用Notadd\Foundation\Setting\Handlers\SetHandler;/***ClassSettingController。*/classSettingControllerextendsController{/***@var\Notadd\Foundation\Setting\Contracts\SettingsRepository*/protected$settings;/***设置控制器构造函数。**@param\Notadd\Foundation\Setting\Contracts\SettingsRepository$设置**@throws\Illuminate\Contracts\Container\BindingResolutionException*/publicfunction__construct(SettingsRepository$settings){parent::__construct();$this->settings=$settings;}/***所有处理程序。**@param\Notadd\Foundation\Setting\Handlers\AllHandler$handler**@return\Notadd\Foundation\Passport\Responses\ApiResponse*@throws\Exception*/publicfunctionall(AllHandler$handler){返回$handler->toResponse()->generateHttpResponse();}/***设置处理程序。**@param\Notadd\Foundation\Setting\Handlers\SetHandler$handler**@return\Notadd\Foundation\Passport\Responses\ApiResponse*@throws\Exception*/publicfunctionset(SetHandler$handler){返回$handler->toResponse()->generateHttpResponse();}}APIHandler和模型APIHandler提供了模型的操作接口。在Notadd中,提供了两种APIHandlers,一种是DataHandler,另一种是SetHandler。顾名思义,DataHandler只提供Data返回接口,而SetHandler不仅提供数据返回接口,还提供其他操作处理接口。具体区别在于DataHandler在返回数据接口时只调用了方法数据,而SetHandler在调用数据方法之前还要先调用execute方法。比如前面SettingController中使用的AllHandler是DataHandler类的一个Handler,提供返回所有配置项的API函数,SetHandler是SetHandler类的一个Handler,提供修改配置项并返回的API函数所有配置项。AllHandler的代码如下:*@copyright(c)2016,iBenchu.org*@datetime2016-11-2314:44*/namespaceNotadd\Foundation\Setting\Handlers;useIlluminate\Container\容器;使用Notadd\Foundation\Passport\Abstracts\DataHandler;使用Notadd\Foundation\Setting\Contracts\SettingsRepository;/***类AllHandler。*/classAllHandlerextendsDataHandler{/***@var\Notadd\Foundation\Setting\Contracts\SettingsRepository*/protected$settings;/***AllHandler构造函数。**@param\Illuminate\Container\Container$容器*@param\Notadd\Foundation\Setting\Contracts\SettingsRepository$settings*/publicfunction__construct(Container$container,SettingsRepository$settings){parent::__construct($container);$this->settings=$settings;}/***HTTP代码。**@returnint*/publicfunctioncode()//定义API操作结果的状态码{return200;}/***处理程序的数据。**@returnarray*/publicfunctiondata()//定义APIreturnThedata{return$this->settings->all()->toArray();}/***处理程序的错误。**@returnarray*/publicfunctionerrors()//定义API操作失败时返回的内容info{return['获取全局设置失败!',];}/***处理程序的消息。**@returnarray*/publicfunctionmessages()//定义API操作成功时返回的消息{return['获取全局设置成功!',];}}SetHandler的代码如下:*@copyright(c)2016,iBenchu.org*@datetime2016-11-2315:09*/namespaceNotadd\Foundation\Setting\Handlers;使用Illuminate\Container\Container;使用Notadd\Foundation\Passport\Abstracts\SetHandler作为AbstractSetHandler;使用Notadd\Foundation\Setting\Contracts\SettingsRepository;/***类SetHandler。*/classSetHandlerextendsAbstractSetHandler{/***@var\Notadd\Foundation\Setting\Contracts\SettingsRepository*/protected$settings;/***SetHandler构造函数。**@param\Illuminate\Container\Container$容器*@param\Notadd\Foundation\Setting\Contracts\SettingsRepository$settings*/publicfunction__construct(Container$container,SettingsRepository$settings){parent::__construct($container);$this->settings=$settings;}/***处理程序的数据。**@return数组*/publicfunctiondata()//定义API返回的数据{return$this->settings->all()->toArray();}/***处理程序的错误。**@returnarray*/publicfunctionerrors()//定义操作失败时返回的API信息{return['修改设置失败!',];}/***执行处理程序。**@returnbool*/publicfunctionexecute()//定义API执行的修改操作{$this->settings->set('site.enabled',$this->request->input('enabled'));$this->settings->set('site.name',$this->request->input('name'));$this->settings->set('site.domain',$this->request->input('domain'));$this->settings->set('site.beian',$this->request->input('beian'));$this->settings->set('site.company',$this->request->input('company'));$this->settings->set('site.copyright',$this->request->input('copyright'));$this->settings->set('site.statistics',$this->request->input('statistics'));返回真;}/***处理程序的消息。**@returnarray*/publicfunctionmessages()//定义API操作成功时返回的消息{return['修改设置成功!',];}}数据输出API结果的数据输出已经在controller中进行了处理。至此,一个完整的API开发已经完成。