先给大家说下什么是RESTrestfulREST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。 他在论文中提到:"我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST指的是一组架构约束条件和原则。" 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。 所以我们这里描述的REST也是通过HTTP实现的REST。前不久做一个项目,是用Yii2框架写一套RESTful风格的API,就去查了下《Yii 2.0 权威指南 》,发现上面写得比较简略。所以就在这里写一篇教程贴,希望帮助刚接触Yii2框架RESTful的小伙伴快速入门。一、目录结构实现一个简单地RESTful API只需用到三个文件。目录如下:frontend├─ config│ └ main.php├─ controllers│ └ BookController.php└─ models└ Book.php二、配置URL规则1.修改服务器的rewrite规则,将所有URL全部指向index.php上,使其支持 /books/1 格式。如果是Apache服务器,在frontend/web/ 目录中新建.htaccess文件。文件内容如下:RewriteEngine on# If a directory or a file exists, use the request directlyRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d# Otherwise forward the request to index.phpRewriteRule . index.php如果是Nginx服务器,修改nginx/conf/nginx.conf,在当前"server{}"的"location / {}"中添加下面红色标记内容:location / {  try_files $uri $uri/ /index.php$is_args$args;}2.修改frontend/config/main.php文件,为book控制器增加一个 URL 规则。这样,就能通过美化的 URL 和有意义的 http 动词进行访问和操作数据。配置如下:'components' => ['urlManager' => ['enablePrettyUrl' => true,'enableStrictParsing' => true,'showScriptName' => false,'rules' => [['class' => 'yii\rest\UrlRule', 'controller' => 'book'],],],],三、创建一个model1.在数据库中创建一张book表。book表的内容如下:-- ------------------------------ Table structure for book-- ----------------------------DROP TABLE IF EXISTS `book`;CREATE TABLE `book` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` char(50) NOT NULL DEFAULT '',`num` tinyint(3) unsigned NOT NULL DEFAULT '0',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;-- ------------------------------ Records of book-- ----------------------------INSERT INTO `book` VALUES ('1', 'toefl', '10');INSERT INTO `book` VALUES ('2', 'ielts', '20');INSERT INTO `book` VALUES ('3', 'sat', '30');INSERT INTO `book` VALUES ('4', 'gre', '40');INSERT INTO `book` VALUES ('5', 'gmat', '50');2.在frontend/models/目录中新建Book.php。文件内容如下:namespace frontend\models;use yii\db\ActiveRecord;class Book extends ActiveRecord{public static function tableName(){return 'book';}}四、创建一个控制器在frontend/controllers/目录中新建BookController.php。控制器类扩展自 yii\rest\ActiveController。通过指定 yii\rest\ActiveController::modelClass 作为 frontend\models\Book, 控制器就能知道使用哪个模型去获取和处理数据。文件内容如下:namespace frontend\controllers;use yii\rest\ActiveController;class BookController extends ActiveController{public $modelClass = 'frontend\models\Book';}五、测试到这里,我们就已经完成了创建用于访问用户数据 的 RESTful 风格的 API。创建的 API 包括:GET /books: 列出所有的书HEAD /books: 显示书的列表的概要信息POST /books: 新增1本书GET /books/1: 返回 书ID=1的详细信息HEAD /books/1: 显示 书ID=1的概述信息PATCH /books/1 and PUT /books/1: 更新书ID=1的信息DELETE /books/1: 删除书ID=1的信息OPTIONS /books: 显示关于末端 /books 支持的动词OPTIONS /books/1: 显示有关末端 /books/1 支持的动词可以通过Web浏览器中输入 URL http://{frontend的域名}/books 来访问API,或者使用一些浏览器插件来发送特定的 headers 请求,比如Firefox的RestClient、Chrome的Advanced Rest Client、postman等。六、说明1.Yii 将在末端使用的控制器的名称自动变为复数。这是因为 yii\rest\UrlRule 能够为他们使用的末端全自动复数化控制器。可以通过设置yii\rest\UrlRule::pluralize为false来禁用此行为:'rules' => [['class' => 'yii\rest\UrlRule', 'controller' => 'book', 'pluralize' => false],],2.可以使用fields和expand参数指定哪些字段应该包含在结果内。例如:URL http://{frontend的域名}/books?fields=name,num 将只返回 name 和 num 字段。以上所述是小编给大家介绍的Yii2框架制作RESTful风格的API快速入门教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

什么意思呢?我来简单的描述下,小编妹子提的需求是这样的,你看啊,你这列表页的数据,能不能我就直接在列表上进行点一下就直接修改啊,我再点进去修改多麻烦,太不方便了。这尼玛,这需求,是不是真想给她一棒槌。ok,我们今天就来看看在yii2中如何去利用gridview实现列表上直接修改的功能,很全面哦,我们尽量各种类型的属性都给出实例。第一步,我们先来部署好yii2-grid利用composer安装yii2-gridcomposer require kartik-v/yii2-grid "@dev"如果你在安装的过程中需要让你输出Token,此时也就是需要你登录你的github帐号,通过setting>personal access tokens获取token值后输入你的token值,回车就好。安装好了之后,我们对module进行如下配置,这个是必须要配置的'modules' => ['gridview' => ['class' => '\kartik\grid\Module']];前面我们说了,要先把yii2-grid部署好,下载配置好之后,我们打开视图文件并参考下面的代码修改你的文件// use yii\grid\GridView;//这里屏蔽掉yii的gridview,user我们刚刚安装的gridviewuse kartik\grid\GridView;<?= GridView::widget([//......'export' => false,'columns' => [//......],?>上面代码中我们只需要添加一项 'export' => false, 即可,你原先的gridview无需改动。然后我们安装yii2-editablecomposer require kartik-v/yii2-editable "@dev"安装好了后,我们在刚才配置好gridview的文件中引入editableuse kartik\editable\Editable;首先介绍下textInput类型的修改,图如下从上图中可以很轻松的看到编辑的效果,直接贴代码['attribute' => 'title','class'=>'kartik\grid\EditableColumn',],但是从上图中我们也看到了,弹窗式修改呢不是很方便,我们接下来看看方便点的操作方式['attribute' => 'title','class'=>'kartik\grid\EditableColumn','editableOptions'=>['asPopover' => false,],],只需要对要修改的属性值点击一下可以直接进行修改,我们来看看这样会有什么问题也许你发现了,编辑框的宽度太小了,操作不是很方便,我们把input改为textarea会不会好点?试试看,当然你也可以给当前单元格指定headerOptions设定宽度,关于gridview常见操作可点击参考看图片上果然效果好很多,直接贴代码['attribute' => 'title','class'=>'kartik\grid\EditableColumn','editableOptions'=>['asPopover' => false,'inputType'=>\kartik\editable\Editable::INPUT_TEXTAREA,'options' => ['rows' => 4, ],],],有同学很好奇的点了图中的两个按钮,一个是重置按钮,另一个是应用按钮,重置还好,很容易理解,但是嘛,为啥点了应用按钮就貌似一直在处理中的意思呢?别急别急,从一开始到现在乃至接下来,我们都将先讲解view中的配置,其实这里你点击应用按钮后也就异步请求了后端,我们后面详细的说道。如果你的column是数字类型的呢?简单嘛,input内直接修改就好了,可如果你想要下面截图中的效果,需要你继续继续利用composer安装touch spin widgetrequire kartik-v/yii2-widget-touchspin "@dev"安装完毕后,我们看看数字类型的属性的修改方式第三种,关于下拉框式的修改,我们假定字段is_delete值1显示 2删除且数据库存的值是1 2这种数字类型,看效果图然后我们再贴代码左右两边是两个属性,为了做对比说明,左侧是不可修改的属性展示,代码如下['attribute' => 'is_delete','class'=>'kartik\grid\EditableColumn','editableOptions'=>['inputType'=>\kartik\editable\Editable::INPUT_DROPDOWN_LIST,'asPopover' => false,'data' => Article::itemAlias('is_delete'),],'value' => function ($model) {return Article::itemAlias('is_delete', $model->is_delete);},'filter' => Article::itemAlias('is_delete'),],第四个,我们讲解下日期组件和时间组件,先截图看效果,然后在安装//日期组件composer require kartik-v/yii2-widget-datepicker "@dev"//时间组件composer require kartik-v/yii2-widget-datetimepicker "*"//日期组件['attribute' => 'created_at',//这个设定表格的宽度// 'headerOptions' => ['width' => '150px'],'class'=>'kartik\grid\EditableColumn','editableOptions'=>['inputType'=>\kartik\editable\Editable::INPUT_DATE,'asPopover' => false,//这个设定我们组件的宽度'contentOptions' => ['style'=>'width:180px'],'options' => ['pluginOptions' => [//设定我们日期组件的格式'format' => 'yyyy-mm-dd',]],],'format' => ['date', 'Y-m-d'],],//时间组件['attribute' => 'updated_at',// 'headerOptions' => ['width' => '150px'],'class'=>'kartik\grid\EditableColumn','editableOptions'=>['inputType'=>\kartik\editable\Editable::INPUT_DATETIME,'asPopover' => false,'contentOptions' => ['style'=>'width:250px'],],],基本上就这4中类型吧,view配置好了,我们就需要配置controller层进行异步操作了,我们来看看是怎么操作的。声明:如果你的gridview是在视图article/index内,那么接下来的操作你需要在article控制器的index内操作。use yii\helpers\Json;public function actionIndex(){$searchModel = new ArticleSearch();$dataProvider = $searchModel->search(Yii::$app->request->queryParams);if (Yii::$app->request->post('hasEditable')) {$id = Yii::$app->request->post('editableKey');$model = Article::findOne(['id' => $id]);$out = Json::encode(['output'=>'', 'message'=>'']);$posted = current($_POST['Article']);$post = ['Article' => $posted];if ($model->load($post)) {$model->save();$output = '';isset($posted['title']) && $output = $model->title;// 其他的这里就忽略了,大致可参考这个title}$out = Json::encode(['output'=>$output, 'message'=>'']);echo $out;return;}return $this->render('index', ['searchModel' => $searchModel,'dataProvider' => $dataProvider,]);}关于小编给大家介绍的Yii2 GridView实现列表页直接修改数据的方法就给大家介绍到这里,希望对大家有所帮助,如果大家想了解更多内容敬请关注脚本之家网站。

XmlHttp是一套可以在Javascript、VbScript、Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API。XmlHttp最大的用处是可以更新网页的部分内容而不需要刷新整个页面。几乎所有的浏览器都支持XMLHttpRequest对象,它是Ajax应用的核心技术。js代码如下:<html> <head> <title> New Document </title> <meta charset="utf-8"> </head><script type="text/javascript"> /**创建 XMLHttpRequest 对象 *IE7+、Firefox、Chrome、Safari 以及 Opera均内建 XMLHttpRequest 对象 *IE5,IE6使用ActiveX对象,xmlHttp = new ActiveXObject("Microsoft.XMLHTTP") **/ function createXMLHttpRequest(){ var xmlHttp; if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); }else{ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlHttp.onreadystatechange = function(){ if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { document.getElementById("myDiv").innerHTML = xmlHttp.responseText; } }else{ document.getElementById("myDiv").innerHTML = "正在加载..."; } }; //向服务器放松请求 xmlHttp.open("GET","test.php",true); xmlHttp.send(); }</script> <body> <input type="button" onclick="createXMLHttpRequest()" value="请求数据" /> <div id="myDiv"></div> </body></html>对上面js代码部分解释:(1).XMLHttpRequest对象的onreadystatechange属性,当请求被发送到服务器时,需要执行任务。每当 readyState 改变时,就会触发onreadystatechange事件。(2).XMLHttpRequest对象的readyState属性,存有 XMLHttpRequest 的状态(0~4)。     0: 请求未初始化     1: 服务器连接已建立     2: 请求已接收     3: 请求处理中     4: 请求已完成,且响应已就绪 (3).open(method,url,async) 方法:规定请求的类型、URL 以及是否异步处理请求。(4).send(content) 向服务器发送请求。以上就是Ajax创建简单实例代码,希望对大家的学习有所帮助,大家也可以自己动手创建Ajax简单实例。

前言本文主要给大家介绍的是关于Yii2中load()和save()的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍吧。我这里用的数据库是mongo 数据库 为栗子:public function load($data, $formName = null) { $scope = $formName === null ? $this->formName() : $formName; //调用load 一般我是 $test = new test() $test->load('参数1','参数2')// 参数1 一般是post get 传过来的参数 第二个参数 是一个空字符串 '';//  $this->formName() 返回的额是 你实例化的类的名字 new test() 最后返回的是test if ($scope === '' && !empty($data)) { $this->setAttributes($data);  //进入 return true; } elseif (isset($data[$scope])) { $this->setAttributes($data[$scope]); return true; } else { return false; } }接下来看   setAttributes()public function setAttributes($values, $safeOnly = true) { if (is_array($values)) { $attributes = array_flip($safeOnly ? $this->safeAttributes() : $this->attributes());//这里执行的是$this->safeAttributes()方法,该方法返回的是当前场景下需要验证的字段。最后$attributes打印下来看下图foreach ($values as $name => $value) { if (isset($attributes[$name])) {     $this->$name = $value; } elseif ($safeOnly) {     $this->onUnsafeAttribute($name, $value);   } } } }图: 图1的文件名是test  实例化后是$test 对象  public function attribues() 方法中对应的就是表字段。我这里没有用场景  所以暂时不讲解场景这个功能。 不过大家可以看手册。很容易懂。这两个图是对相应的在之后 执行的是 foreache循环  这里的$this 是那个$test 这个对象对象去调用//例如post 提交过来的数据是这样$post=['a'=>123456,'b'=>'abcdef'] $test->a=123456$test->b='abcdef'所以这个load()方法只是分配post  或者get 发过来的数据,不做验证。接下来看save();查看save方法 。public function save($runValidation = true, $attributeNames = null) { if ($this->getIsNewRecord()) {  //判断是否是新纪录 return $this->insert($runValidation, $attributeNames);  //执行这里 之后$this代表的是test 这个模型表。                        //test 继承的是\yii\mongodb\ActiveRecord 查看insert() 方法 。    } else {     return $this->update($runValidation, $attributeNames) !== false; }   }insert() 方法中public function insert($runValidation = true, $attributes = null) { if ($runValidation && !$this->validate($attributes)) {    //下面的代码分析validate方法 验证rules return false; } $result = $this->insertInternal($attributes);  //保存数据 return $result; }首先看//进行数据验证。public function validate($attributeNames = null, $clearErrors = true) { if ($clearErrors) { $this->clearErrors(); } if (!$this->beforeValidate()) {  //在验证之前首先执行的是 beforValidata return false; } $scenarios = $this->scenarios();     $scenario = $this->getScenario();    //检查是否调用场景 if (!isset($scenarios[$scenario])) { throw new InvalidParamException("Unknown scenario: $scenario"); } if ($attributeNames === null) { $attributeNames = $this->activeAttributes(); //返回数组(值为属性的名称) }//$this->getActiveValidators() 验证数据。 读取rules 方法 getActiveValidators() ->getValidators()->createValidators()这里验证rules等信息->createValidator()foreach ($this->getActiveValidators() as $validator) {       $validator->validateAttributes($this, $attributeNames); //获取交集 检查是否有错误 hasError()     }   $this->afterValidate();   return !$this->hasErrors(); }此时数据验证完毕,之后就保存数据 保存数据这块 就暂时不写了 后续补上。好了 其中数据验证那一块 大家多看看源码吧。 一遍不行2遍 3遍 多了就懂了。总结以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

本文实例讲述了Zend Framework缓存Cache用法。分享给大家供大家参考,具体如下:<?phprequire 'Zend/Loader.php';Zend_Loader::loadClass('Zend_Cache');Zend_Loader::loadClass('Zend_Config');Zend_Loader::loadClass('Zend_Registry');$config = new Zend_Config_Ini('configsecr/config.ini');define('CACHE_DIR',FDROOT.'/'.'tmp/');/*配置文件config.ini:[cache]cache.needcache=1cache.frontend.name=Corecache.frontend.lifetime=7200cache.frontend.automatic_serialization=1cache.backend.name=File*//*选项参考手册*//*建立cache对象*/$frontendOptions = $config->cache->cache->frontend->toArray();$backendOptions = $config->cache->cache->backend->toArray();$frontendName = $frontendOptions['name'];unset($frontendOptions['name']);$backendName = $backendOptions['name'];unset($backendOptions['name']);if (empty($backendOptions['cache_dir'])){ $backendOptions['cache_dir'] = CACHE_DIR;}$_cache = Zend_Cache::factory($frontendName, $backendName, $frontendOptions, $backendOptions);Zend_Registry::set('cache', $_cache);/*使用cache*/$viewRenderer = $_cache->load('viewRenderer'); //试图从缓存加载变量if (!$viewRenderer instanceof Something)//加载不成功{ $viewRenderer = new Something(); /*some other work*/ $_cache->save($viewRenderer, 'viewRenderer');//保存变量到换存}/*这只是一种应用,还可以轻松缓存整页;也可将缓存存到数据库或者内存。*/?>更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。

分类:腾博会官方网

时间:2016-01-18 11:02:05