FuelPHP框架学习笔记(二)——详解MVC

上一篇是通过脚手架建立的MVC,现在需要深入了解一下FuelPHP框架里的MVC结构以及基本的方法使用。

一、Controller

上一篇提到controller是以Controller为前缀的,通常其中的方法是以action开头的,但也不是绝对的,比如有以post和get开头的,像post_index()方法就会在post数据至index方法的时候被调用。当然如果直接在index方法中加上if(Input::post()){}语句的话也是可行的。

还有before()方法,在调用任何一个action之前被调用,它的作用是处理需要在调用每个action之前处理的一些逻辑。与之对应的是after()方法,在调用任何一个action之后被调用。

有些controller是继承Controller_Template类的,查看Controller_Template的源码就可以发现,Controller_Template其实就是对Controller类中的before()和after()方法进行了处理,主要目的也是为了在显示view的时候可以调用views下面的模板template.php文件,通过包裹一些header、footer、siderbar等等,保持整个页面风格的统一。
并且需要注意的是,如果要在继承Controller_Template类的Controller中定义before()和after()方法的话,必须要对应的加上parent::before();parent::after($response);如下图所示

图片

是不是继承了Controller_Template类的controller中都必须要用到template.php的风格呢?答案是否定的,如果想忽略掉template的显示格式的话,可以像继承Controller类里一样,在action里返回一个需要的Response对象。例如

return new Response(View::forge(’article/other’));

这样的话就仅显示index的页面了,就不包括模板的风格了。

二、Model

model里主要涉及一些数据库的读写,一些逻辑的处理。官方给出的model示例是首先声明一个命名空间的,谈到命名空间就需要注意到,命名空间必须在所有代码在前(<?php开始标记除外),所有非PHP代码包括空白符都不能出现在命名空间声明之前。但使用脚手架生成的model是使用Orm包,继承OrmModel类的,可以看到里面的protected static 的属性正是建立脚手架时包含的一些字段信息,当然还包括了created_at和update_at关于时间的属性。

model类里的方法最好写成静态方法,并且通过命令生成的示例方法也是静态的。那么为什么要写成静态的方法呢?首先,它们可以在代码中的任何地方都可用(假设可以访问该类),不需要在对象间传递类的示例,也不需要将实例存放在全局变量中,就可以访问类中的方法;其次,类中的每个示例都可以访问类中定义的静态方法,所以可以利用静态属性来设置值,该值可以被类的所有对象使用;最后,不需要实例对象就能访问静态属性或方法,这样我们就不用为了获取一个简单的功能而实例化对象。

三、View

view里面主要的就是html内嵌PHP了,对美工的要求比较高了。FuelPHP里也是写好了不少CSS里的样式了,需要我们慢慢去琢磨了。生成的view中有一个是叫做_form.php文件的,该文件通过将表单独立出来,在对应的增加、修改的文件中引用就行了。_form.php里需要调用的是Form类,通过其open、close方法新建一个表单,还封装了一些label、textarea、submit等等,直接调用就行,比直接写html语句简单多了。然后引用的话直接在create、edit中嵌入如下代码就行了

<?php echo render(’article/_form’); ?>

总结一下三种传值的方法,如下图所示

图片

第一种是先新建一个数组,数组一系列赋值之后传给view页面;第二种是先构造一个view对象,然后对各属性赋值,然后将该对象传给view页面;第三种方式与第二种类似,区别在于调用了view对象的set方法进行赋值。

在传值的时候就要考虑到一些特殊字符的处理了,比如有的标签希望进行过滤转义而不是直接运行出结果。这里给出js里的alert示例

图片

直接给属性赋值和通过set方法赋值是进行过滤的,会在页面里显示<script>alert("iat")</script>。而如果在set方法中传递一个参数false,这样的话就不进行过滤了;set_safe方法其实就是传递第三个参数false的set方法。


参考资料

Just a beginner.<br /><a href='https://github.com/yaoshanliang/about' target='_blank'>profile</a>