入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

yii2框架-restful的自定义api(二十二)

创建时间:2016-07-29 投稿人: 浏览次数:138
昨天的大新闻---国家的相关监管部门正式出台了“网约车”的合法法规!滴滴,UBER,易到,神州专车等积极响应,表示支持网约车的新规!一方面看来是这些企业受益,其实从侧面映射中国的移动互联网中的o2o服务,分享经济和共享经济的模式已经在国家层面得到很好的支持,在管理,监管,安全,实惠等方面都会以法律的形式来规范责任。那么对于用户来说,这也是一件好事,因为我们以后做的车不再是黑车了。


中国的移动互联网的发展催生了很多新型的经济模式,这些模式从一定程度上是在改变人们的生活,促进社会的进步的。特别是关乎到老百姓的日常生活,安全食品的这些经济实体,政府也是在一步一步的论证“网约车”的合法性。分享经济的新业态模式下,必须要有更规范的出行规定来规范运营和责任主体,这对中国的出行市场是一个肯定和鼓励。


另外一个在无人驾驶的领域,目前百度和google是走在前面的,无论技术还是路段测试,两者的优势都是很大的。但是由于政府的监管制度不同,百度的无人驾驶计划在国内已经得到政府的政策支持--百度与安徽省芜湖市人民政府在北京正式签订合作协议,宣布将在芜湖共同建设“全无人驾驶汽车运营区域”。这种政策是有利于促进无人驾驶技术在中国出行市场的应用的,也是目前百度在政策上的优势。而美国对于无人驾驶的相关政策似乎还没有什么的规定,合法化,商业化的暂时不明!


啪啪啪,回归正题,继续关于restful风格的自定义api接口

上一节主要了解关于yii2的restful的基本入门,那么如果想不按照yii2默认规定的那些写接口来,如何重写或者自定义呢?

在yii estActiveController.php中

public function actions()
    {
        return [
            "index" => [
                "class" => "yii
estIndexAction",
                "modelClass" => $this->modelClass,
                "checkAccess" => [$this, "checkAccess"],
            ],
            "view" => [
                "class" => "yii
estViewAction",
                "modelClass" => $this->modelClass,
                "checkAccess" => [$this, "checkAccess"],
            ],
            "create" => [
                "class" => "yii
estCreateAction",
                "modelClass" => $this->modelClass,
                "checkAccess" => [$this, "checkAccess"],
                "scenario" => $this->createScenario,
            ],
            "update" => [
                "class" => "yii
estUpdateAction",
                "modelClass" => $this->modelClass,
                "checkAccess" => [$this, "checkAccess"],
                "scenario" => $this->updateScenario,
            ],
            "delete" => [
                "class" => "yii
estDeleteAction",
                "modelClass" => $this->modelClass,
                "checkAccess" => [$this, "checkAccess"],
            ],
            "options" => [
                "class" => "yii
estOptionsAction",
            ],
        ];
    }
这是默认的接口方法,那么如何重写呢?
我们可以在Controller中重写action()这个函数从而实现重写

namespace apimodulesv1controllers;
use Yii;
use yii
estActiveController;
use yiidataActiveDataProvider;
use apimodelsOrder;

class UsersController extends ActiveController {
	public $modelClass = "apimodulesv1modelsUser";
	
	public function actions() {
		$actions = parent::actions();
		// 禁用""index,delete" 和 "create" 操作
	    unset($actions["index"],$actions["delete"], $actions["create"]);
	    
	    return $actions;

	}
	//重写index的业务实现
	public function actionIndex()
    {
        $modelClass = $this->modelClass;
        return new ActiveDataProvider([
            "query" => $modelClass::find()->asArray(),
            
            "pagination" => false
        ]);
    } 

}
a)因为访问的时候先去执行actions方法里面的对应独立操作,如果找不到再去找对应的内联操作。
b)actions方法的执行$actions = parent::actions();然后将$actions的需要重写的方法禁用(删除),然后return $actions 就没有这个方法了,所以就会执行内联操作actionIndex()这个方法,而我们的重写业务就是在这个actionIndex()方法中。其他的方法也是这样子重写。

如果我们想在自己定义不同的api接口方法呢?
那么我们可以通过配置实现,在main.php的主文件中

"urlManager" => [
    "enablePrettyUrl" => true,
    "showScriptName" => false,
    "rules" => [
        [
            "class" => "yii
estUrlRule",
            "controller" => ["v1/users"],
            "pluralize" => false,
            "extraPatterns" => [
                "GET versions" => "version",
                "GET search/<id:d+>" => "search",
                "POST newusers" => "add"
            ],
            
        ],
    ],
],
"extraPatterns"这个属性是额外模式配置
a)"GET versions" => "version",代表获取接口版本,例如http://localhost/lianxi/XML/advanced/api/web/v1/users/versions ,对应的内联操作actionVersion();


b)"GET searches/<id:d+>" => "search", 代表搜索一个指定id的用户,例如http://localhost/lianxi/XML/advanced/api/web/v1/users/searches/1,对应的内联操作actionSearches();



c)"POST newusers" => "add",代表添加一个用户,例如http://localhost/lianxi/XML/advanced/api/web/v1/users/newusers,对应的内联操作actionAdd();

我们只需要在控制器中实现这些方法,完成相应的逻辑业务,那么各个需要的接口就完成了。

友情推荐

本人已开源基于swoole扩展实现的轻量级框架

https://github.com/bingcool/swoolefy





声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。