php的tp框架和mvc有啥区别?

php的tp框架和mvc有啥区别?,第1张

首先说Model吧。
在TP中是一个表对应一个Model,而且普通Model中只是一些自动验证啊,自动完成啊、还有数据字段信息啊一些东西;而CI中的Model则完全不同,一个Model不必约束于一个表,也就是说名字为abc的Model中你也可以查询名字为def的表中的数据,而且可以定义方法完成一些数据查询,比如我可以在名为articles_model的Model中定义一个名字为get_articles的方法来获取所有文章信息,当某个Controller加载了这个Model后,就可以在相应的Controller中用
1

$this->articles_model->get_articles();
来方便地获取所有文章信息,而对于TP来说,这些 *** 作只能在Action类中完成。20版的TP已经把View、Relation和Adv三个高级查询model库类定为不自动加载了,看了一下手册,感觉除了View视图查询容易用一点,另外两个都不怎么好用,感觉用起来太复杂,还不如用原生的SQL查询。CI的Model还有一个使我很喜欢的方法就是dbprefix方法,在使用原生的sql查询时使用这个函数使得修改数据库表名前缀后你的代码不需要经过任何改动。在TP中我没有发现类似的函数,当我用TP开发一个博客系统时,发现关联查询很麻烦,于是想用原生的SQL查询,却没有找到自动增加数据库表名前缀的方法,虽然可以自己修改TP的核心库来实现,但是还是觉得这样有点不太好。真的要感谢TP,如果不是TP,也许我就不会去关注CI了,当我那天看了几页CI的英文文档后,立马就对它产生的深厚的兴趣,于是第二天一起床就开始看CI的手册,虽然是从官网下的英文版的,不过它的手册写得很简洁、很周到,边看边 *** 作,看完手册后我就几乎能熟练使用这个框架了。于是用它开发了一个博客系统。
CI的Model类简单易用,TP的Model类功能相对来说要强大一些,但是用起来个人感觉没有那么方便。
其次,对于View,从功能上讲,TP的View要更加强大一些,选择更多一些,在TP中你可以选择就用PHP作模板引擎,可以就用TP自身的模板引擎,也可以选择用smarty等其它第三方模板引擎。而在CI中就只能用CI内置的功能简单的模板引擎或者用原生的PHP代码作模板,个人觉得用PHP作模板更好一些,一来省去了学习另外的模板引擎语法的麻烦,二来执行效率更高一些。因些从View来讲,选择CI或者是TP都无所谓。
再次是Controller了,在CI中的应用的控制器是继承自核心类Controller的,TP中的控制器则是继承于核心类Action。不过还是有不同的,在TP中,你可以把一些公共的变量或者在多个控制器中都要执行的东西放在一个action里,假如这个action文件为CommonActionclassphp ,在它的_initialize方法中可以执行一些在多个控制器中都要执行的代码或者初始化一些多个控制器都要使用的变量,这样,应用的其它action只要继承CommonAction 就可以实现了。因为框架在加载相应action时首先会自动加载那个CommonAction的。而在CI中就没有这个方便的功能了,但是也可以自己写一个library,在该library类的__construct方法里放一些代码,然后在每个控制器中都加载这个library,这样也可以实现像TP一样的功能。不过相对来说麻烦了一些。TP还有一点比较灵活的就是,在这个控制器(action)里面可以执行那个控制器中的函数(比如用A或者R函数来实现),在CI中则不行,你不能在这个控制器中执行那个控制器中的函数。还有就是TP可以定义一个名为EmptyAction的控制器,当所有控制器都找不到时,就调用这个Empty控制器。这一点如果与empty方法配合,可以使得URL大大缩减。虽然CI和TP都支持空 *** 作,不过这二者的空 *** 作名称不相同,实现的优先级也不相同。在TP中的空 *** 作(_empty方法)优先级是最低的,也就是说当当前控制器的所有 *** 作都找不到时才调用这个空 *** 作;在CI中则恰恰相反,只要存在空 *** 作(_remap方法),该控制器的其它的 *** 作都没用了(不能访问了)。

目前的数据库包括Mysql、SqlServer、PgSQL、Sqlite、Oracle、Ibase、Mongo,也包括对PDO的支持,如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式。

tp51钩子的功能其实就是在代码中侵入其他代码流程。比如在初始化完后监听一个钩子,如果我们注册了这个钩子,并且绑定了一个行为,执行到这里的时候会执行我们绑定的行为。

1任何的URL访问,最终都是定位到控制器,由控制器中某个具体的方动法去执行

2一个控制器对应着一个类,如果这些类需要进行统一管理,怎么办?

容器来进行类管理,还可以将类的实例(对象)做为参数,传递给类方法,自动触发

依赖注入:将对象类型的数据,以参数的方式传到方法的参数列表

URL访问:通过GET方式将数据传到控制器指定的方法中,但是只能传字符串,数值

就是把 *** 作与模板联系起来!也就是说,如果比如你的index()方法没有\x0d\$this->display那你的内容只用在index()方法内使用,还有你没法php与html分离\x0d\加上了\x0d\$this->display\x0d\之后,你就可以定义html模板后 在index()方法内通过 $this->assign() 把分配变量给你的html 这就就可以php与html分离了

我们在安装lnmp一键安装的时候,一般都没有开启访问pathinfo模式
这种模式在比较多的框架中用到,比如国人的ThinkPHP,还比如C写的Yaf也用到,不支持就比较可惜了。
pathinfo的原理就是将indexphp/xxxx/xxx类似的网址当做php来执行,并且需要将xxx/xxx写入到$_SERVER[‘PATH_INFO’]中
这个是lnmporg(我装的就是这个,所以我以这个为例子)开出来的虚拟机的配置中的一段(vhost/conf),修改nginx配置文件也是这样修改
location ~ \(php|php5)$
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgisock;
fastcgi_index indexphp;
include fcgiconf;
}
大家明显看到,location中的正则中,写了一个$,悲剧了,表示就此结束(表示前面的php只匹配一次,这个只是随便提提)
最终,应该如此处理(location哪里也修改了,因为我没有用到php5处理):
if (!-e $request_filename)
{
rewrite ^\/()$ /indexphp/$1 last;
break;
}
location ~ \php
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgisock;
fastcgi_index indexphp;
include fcgiconf;
set $path_info "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(+\php)(/+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}
后面的部分处理我是参考的网络上搜索到的文档,带注释版告诉大家
location ~ \php
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgisock;
fastcgi_index indexphp;
include fcgiconf;
set $path_info "";#初始化一个变量
set $real_script_name $fastcgi_script_name;#初始化一个变量,并且获取到一个原始赋值
if ($fastcgi_script_name ~ "^(+\php)(/+)$") {#检测如果php后面还存在/开始参数,将参数处理
set $real_script_name $1;#将第一个正则子串匹配到的赋值
set $path_info $2;#将第二个正则子串匹配到的赋值
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;#修改SCRIPT_FILENAME值
fastcgi_param SCRIPT_NAME $real_script_name;#修改SCRIPT_NAME值
fastcgi_param PATH_INFO $path_info;#修改PATH_INFO值
#上述三个赋值都是replace into的模式,这些值都是写在fcgiconf中
}

$this->request->get('id', 100) 的意思获取id的值,当没有提交id参数时用默认值替代,也就是说可以获取到100,有id参数时无论是否有值,均以请求为准。

$this->request->has('id', 'get')  是判断否有id参数,当前get请求时有id参数,无论是否有值均返回true,当没有id参数时返回false

不明白时建议多看看框架源码,这样对你更有帮助,比在网上提问更高效。

比如搜索
id=1得N条数据
修改其中一条
然后返回ID=1
这样的话我们需要在get里面加点东西
比如indexphpid=1
修改页面 kkphp?pid=2&id=1
或者你用cook来储存搜索条件
说的再多就是用一个东西来储存搜索条件
或者用JS
historyback()


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/10538568.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存