[讲座] [Kohana的:一个轻量级PHP框架] [刘布兰登] [哈佛大学] [这是CS50。] [CS50.TV] >>大家好。我的名字是布兰登。 我是一个大三在这里的大学做计算机科学,今天我们要谈 Kohana的,这是一个PHP的Web开发框架。 今天将是一个活的编码研讨会上, 所以我基本上要花费5-10分钟解释什么是Kohana的是, 然后我简直要建立一个超级简单的博客 你从头开始就在这里字面上。 我们打​​算从Kohana的网站上下载代码, 而且我们要开始建立一个博客,并希望这将是非常有益的, 因为你会看到也许也许我会犯一些错误, 你会看到我从中恢复, 或者你会看到我的思考过程,因为我建立通过这个博客, 而同时,你也将获得熟悉框架本身。 希望这将是一个非常有启发性的运动。 >>首先,究竟什么是框架? 如果你一直在服用CS50到目前为止,你还没有真正曾与任何 框架着呢,事情是这样的。 你可能已经做了1 web开发PSET已经, 让我们说你继续建立网站,并保持网站建设。 你会开始注意到一些事情。 你会注意到的第一件事情是,你可能做同样的事情 一遍又一遍的时候, 之类的东西清理用户输入的数据, 事情,比如组织以某种方式文件。 你也可能注意到的另一件事是,你的代码 可能开始变得非常,非常凌乱, 你可以把它凌乱,只是有一个非常困难时期维护它, 或者您可以开始构建你的代码,并使其模块化 在某些方面,使之更易于维护。 >>这是Web框架基本上走了进来。 这些人谁已经建立了很多网站,他们说, “我们并不需要重做这每一次我们建立了一个网站。” “为什么我们不只是做一个包,做所有这些事情对你 每一次你想建立一个网站?“ 所以,当你做一个新网站, 你只关注究竟这个特殊的网站是关于。 你不必重复所有的各​​种配置 和代码的分离和重写代码 你经常有,当你正在做的网站做。 这个想法是,一​​个框架,允许你写一个更高级别的代码 而不必担心低级别的细节。 较低层次的细节可能是这样的 处理清洗用户输入数据。 在这个时候,你应该不是真的需要担心。 你应着眼于你的web配置内容到底如何。 它消除了大量的样板代码。 这是为您的项目的架构。 >>最流行的一种是模型 - 视图 - 控制器, 而我要谈的第二个。 并且很多时候这些框架体现了一套程序, 供您使用的规则和最佳实践 这样,当你采用Web框架 你必须编写代码以某种方式, 而且它一般是一套原则商定 由被普遍接受的是社会 编写代码的好方法。 它使你的代码更容易维护,更实用, 依此类推等等。 最后,我想要的东西,强调有关框架 与库是这种想法对控制反转,而事情是这样的。 之间的库和框架的不同之处在于用一个图书馆 你还在编写主程序, 而你那种调用库 并呼吁图书馆要为你做些什么。 之间的一个图书馆和一个框架的区别 是,框架开始时与对照, 它调用你的代码, 所以你可以把它看作是 - 这就是为什么它被称为一个框架 - 该框架提供了这个框架和结构,为您的代码, 而您在孔填充, 这将在第二变得更加明显 当你看到我开始的框架范围内编写代码。 你会看到,我填补国内空白, 该框架是一种控制所有移动件, 我必须把碎片在正确的地方。 >>今天我们要谈的Kohana, 这是许多PHP框架之一。 还有Web框架,并且有那些在几乎每一个单一的语言, 而且我捡Kohana的,因为Kohana的可以说是 一般公认的最简单的PHP框架回升。 这是最轻巧的。 还有其他的人在那里,拿出很多很多的功能, 但他们往往更难以回暖。 最后,Kohana中使用MVC架构。 它的重量足够轻,我们可以从字面上建设项目 在这里就在你眼前,你几乎可以 跟着很容易。 MVC架构是什么? 它代表了模型 - 视图 - 控制器, 也许,如果你想想你的代码已经写了这么远 对于你的一些web开发的pset 你也许能看到一些这方面,但通常当你开始写作 一个更复杂的网络应用程序, 这3段之间的分工变得越来越明显。 我制定了对MVC这里有点作为一个堆栈, 而且往往你会听到人们谈论栈在网络的发展, 这是为了说明的想法 每一层,每个组件真的只试图沟通 之间2等组成。 有人访问你的网站作为客户端或浏览器。 他们通过查看代码与你的程序进行交互。 与控制器的视图代码进行交互。 该控制器与模型进行交互, 与模型进行交互的SQL数据库。 如果你正确地写你的代码中有中间没有跳跃。 >>什么做这些事情呢? 该模型基本上是一段代码,与您的数据处理。 凡是与数据库处理,与你存储的对象, 或检索数据库中的那些对象, 这是所有的模型来处理。 也许你有你的数据库对象。 我们要创建不得不与岗位的典范, 这样一个职位可能有一些属性给它。 您可能必须围绕存储的职位或岗位检索功能 或过滤的职位等等等等, 而这一切是由模型处理的代码。 该控制器是排序的应用程序逻辑, 和很多不同的东西可以去在应用程序逻辑。 如果你在谈论一个不同的API, 这也许就是你正在处理的应用程序逻辑。 如果你想有带来来自多个不同的数据模型 并具有将它们结合起来,在某种程度上,这经常可以由控制器来处理。 例如,在Facebook,如果你的朋友的人, 建立这种关系的话,或许这种行为 可以由控制器来完成。 >>最后,认为是这是生成您实际看到的代码。 很多时候,我觉得在CS50的pset 他们真的不鼓励你们分开这三件事。 你会在顶部可能有这样大的,长的文件,其中 你做一些SQL查询,也许做一些处理 在你的数据从数据库中检索, 然后你把所有的HTML的底部。 你可能会发现,当你创造更多的页面 你要去有一些代码的重复,而且, 事情是你的文件变得非常大又长 并且变得难于管理。 之所以MVC是这么好视 为几个原因。 的第一件事就是一些所谓的关注点分离 这是想法,当你有 - 1理想一段代码应该做的1件事,做到这一点真的很好, 你不应该合并的代码片段,做不同的事情。 例如,查看代码和模型代码, 他们并不真正需要有关。 他们不必在同一个文件中,所以当你可以,将它们分开了 所以很容易维护。 >>另一件事是代码重用。 您可能会发现自己写相同的SQL查询或做 类似的查询,可以被抽象成1的功能, 而这背后的思想模型和控制器, 有它在一个单独的函数,你可以在不同的地方重复使用您的项目。 最后,这是绑在晒你的代码, 或不重复自己,不重复自己。 这是非常可以理解的发展。 只要你能,你不想重复自己,因为如果你重复自己,  它更昂贵的维护。 如果你想改变1件事,你要到处改变它, 并导致错误,而这是可怕的。 >>所有权利。 任何迄今为止关于Kohana的问题呢? 大。 现在,我们要深入现场编码会话, 并希望一切顺利。 我要基本建成本网站 在我的一个远程服务器,并且这样你们也可以 看网站和访问该网站, 也是环境比我的远程机器更好的配置 因为它的运行,而不是OS X上的Linux 我们确实要开始。 KohanaFramework.org。 我会从网站上下载的代码。 我要去复制链接地址, 去我的服务器,下载它, 和我要提取它。 [学生]什么是你可以使文本最大? [布兰登刘]那是更好吗? [学生]那是可行的? [布兰登刘]是啊,这很好。 我下载一个ZIP文件,解压缩该到一个名为Kohana的目录, 而且我们要重新命名CS50-Kohana的, 并让我们进去。 真棒。 在这里,你看到一堆不同的文件。 大多数时候,你可以忽略 - 方向走,不会去通过每一个文件,该文件在这里 因为我们的时间有限, 但通常,当您安装Kohana的,你要做的第一件事 是你去的目录, 你会基本上做一些环境测试和诸如此类的东西 以确保您的环境已正确设置运行Kohana的 并确保一切都正确无误。 你可以看到大部分事情过去了,但通常你总是遇到这样的问题1 它抱怨说,有些目录不可写, 那是因为一些权限。 我不知道有多少你们已经了解了CS50文件权限, 但如果你做网站开发,你会遇到这样的问题很多。 我要使其可写 我想我也有 - 我们走吧。 >>好了,现在你可以看到一切过去了, 而现在它会告诉你重命名install.php了。 我要去移动的install.php文件installed.php, 而现在,如果我刷新, 它给了我一些错误,而这正是调试用武之地。 在这里,你可以看到什么实际事情发生。 问题是,在默认情况下,Kohana的假设 你的项目是在您的域的根目录下, 因此它希望你能在demo.brandonkliu.com。 我们要告诉它,它实际上是在一个子文件夹。 这是在一个名为CS50 Kohana的子文件夹。 关键是,它的曲解CS50-Kohana的 作为别的东西,我会解释给你在第二。 但我要告诉你的东西,是可以预料的。 我们现在要做的是,我们要进入这个文件夹,名为bootstrap.php, 这是很多不同的东西都设置的配置文件夹。 我打开了。 那么也许的第一件事情我会做一个是更改时区。 >>然后让我们来看看。 啊哈!就在这儿。 有一堆不同的配置说法在这里, 但一来我要找的就是这个东西叫做基本URL, 并且在默认情况下我得到它设置为Kohana的, 但我要改变,要CS50-Kohana的, 我认为应该修复它。 是的,伟大的。 默认情况下,一看就知道它的工作,它说,“你好世界”。 哪里来的?我们是如何来的Hello World? 究竟出在哪里,实际上写的代码? 要理解这一点,我将介绍这个概念叫做路由。 几乎所有的web框架有一个叫做路由的概念, 这是一块软件,将映射特定的URL 到一定的一段代码的框架内。 例如,如果你有一些网址,你去一些URL如foo.com /博客/全部 那么什么样的框架是要干什么 - 或者至少是Kohana的是要干什么 - 是它要找到一个类调用控制器的博客, 并且它会运行一个名为功能操作的所有。 我知道我说的类和函数, 我知道你们还没有涉及到的类和函数 在CS50还,但就目前而言, 你能想到的类作为只是一组函数, 一种方式分组功能结合在一起的。 这的确是所有你需要知道的。 >>现在,如果我们看我们的文件夹结构, 应用程序文件夹里面有一个叫班另一个文件夹, 和其他文件夹被称为控制器和模型。 如果你看看控制器的文件夹里面, 我们看到,有一个叫欢迎文件, 你可以在这里看到的是一类叫做控制器欢迎, 并有一个称为动作指数函数 和它做什么是它设置你的回应的Hello World的身体。 这其中的代码被写入。 另一个问题是,好了,我没有去 胡说,胡说,胡说,/欢迎/​​索引。 我怎么会在这里结束? 嗯,这仅仅是因为 在这里我们的启动文件的底部 在这里我们设置我们的路线 你可以看到,他们设置一些默认值给你。 默认控制器是欢迎。默认操作是指数。 这就是为什么当我们把什么在那里它会自动跑到欢迎控制器 和索引操作。 >>更多有意义这么远吗? 现在,你可以做的不仅仅是去控制器 和具体的行动。 您也可以传递参数给控制器。 只是作为一个例子, 我要添加另一个行动,该控制器向您展示。 让我们把这个动作回音,因为它会告诉你,无论你给它, 所以我基本上要抢 一个参数,那将通过我被送到路由程序, 正如你可以在这里看到, 这条线就在这里,你可以看到, 这基本上意味着你有控制器,和你有一个/, 你必须采取行动,和你有另一/, 那将是参数,因为我们有这个名字的ID 尖括号内,这意味着我们命名这个参数标识。 在我的控制器代码后,如果我想要抓住保持该参数, 我可以用我写的代码,找到名为ID的参数。 这就是我在这里,和我要回来,说, “你说的”这一点。 所以现在如果我去我们的网站, 我去cs50-kohana/welcome/echo/Helloooo-- 哦,这是正确的。 有1步我离开了。 这是实时编码构思的一部分。 >>这里是1的事情。让我们来看看。 所以,通常在默认情况下有很多的这些Web应用程序 你必须包含这个index.php的事情在您的网址, 因为想法的index.php是排序的入口点 您的应用程序,但是,当然 这就是有点儿烦也。 你不希望有index.php文件出现在您的网址, 而几乎每一个Web框架的开箱 有这个index.php的问题, 所以你必须采取一些措施,可以删除。 所以在这种情况下, 我们要做的是什么,我们要使用一个名为。htaccess文件, 这是东西是特定于Apache Web服务器, 它可以做这样的事情的URL重写 和重定向的URL等等等等, 和Kohana的是不够好,提供我们可以使用模板。htaccess文件。 >>正如你可以看到,有一个文件叫做有ex​​ample.htaccess, 而且我们要复制到的。htaccess。 我要打开这个编辑它, 基本上它做了一堆不同的东西。 你可能想看看重点线就在这里。 我们的想法是,这设置了一个规则说, “好吧,不管你输入,前面加上index.php来了。” 你可以看到这一点。 的*代表什么,搭配什么, 然后第二部分是index.php文件/ 0元, 及$ 0指的是任何先前匹配。 这是否有道理? 但我想改变真正关键的是改变这种重写基地, 这是该URL基础。 它有点儿假设你来自哪里工作。 我要CS50 Kohana的补充, 而这种方式现在如果我去掉index.php文件, 它应该工作,和我将要添加一些数字 告诉你,它确实没有工作。 听起来不错。 >>到目前为止,有问题吗? [学生]这是如何知道要123? 是的说法呢? 没错。你可以认为它就像一个说法。 但奇怪的事情,不过,是Kohana的做它的方式 是他们不这样做完全一样的参数。 你必须抓住它,像这样。 你必须抓住的请求对象,并要求该公司名为ID的参数, 那名ID来自于引导文件 我表现出早了,该名ID是在那些尖括号, 这就是你如何抓住这些参数。 真棒。 还有没有其他问题? 就像我说的,控制器,他们处理应用逻辑, 所以这1个实例,你可以看到佼佼者 - 这是非常基本的,但它仍然是应用程序逻辑, 抓住了参数并创建一个新的字符串的想法 上面写着,“你说废话”,然后吐了还给你。 一般你要做的就是创建不同的控制器。 您为您的网站的不同部分单独的控制器。 >>今天,我们将提出一个非常简单的网站, 而这将是一个非常基本的博客。 我们将创建一个新的控制器只是在博客中的帖子。 但是如果我还添加注释到博客文章, 然后我可能会想为这些意见一个新的控制器。 如果我想添加的用户,我可能会添加这些用户一个新的控制器, 而在一般情况下,这个想法是,只要你有一个新的模式, 你正在处理一个新的数据对象, 你有这些数据对象的单个控制器。 今天,我们只打算用1个数据对象的工作, 那将是帖子, ,你也可以把数据对象对应于表。 通常每个表对应于1类型的数据对象, 因此该职位表将有1篇文章模型, 这将具有对应于1交控制器 和相同的意见中,相同的用户,依此类推等等。 这就是一般的经验法则。 这里将是特殊情况下,您可能不同于, 但90%的时候,就是你要什么做的, 我会告诉你,就是我们今天将要干什么。 1之前,我们深入放回代码更概念, 这个想法对象关系映射。 >>你们已经做了Web开发的pset, 和你见过,你做一个SQL查询, 也不论它返回到你的行。 你得到这些行,你为它们编制索引的一些名称, 列和表的名称, 这就是你的工作吧, 它可以是一个有点麻烦。 但此外,如果你有你的数据库中的关系, 例如像如果我有评论和帖子, 那么也许我要抢注释的父职。 如果我在SQL中使用刚刚行,那我只能得到的是ID 父职位,而不是实际的职位本身。 但是,当我们编码,其实我们要的是真正抢  父后本身有时。 什么对象关系映射确实是 它需要对数据库查询的结果 并把它转化为你的对象,这是好得多一起工作 比普通数组和行。 >>例如,现在当我有意见也许, 我想抓住它的父职, 我也说不定评论箭头后, 那么它实际上给我的职位对象 对应于实际的父职,不仅仅是一些ID, 我会以其他方式使用,使另一个SQL查询来抓住后, 这是麻烦的和不必要的。 进而,通过映射所有这些数据行插入对象, 您还可以附加更多的功能对象, 因此,例如,我谈到了类如何本质上属于功能组别。 你可以认为它这样。 例如,也许我这个职位的对象, 也许我想有连接到它的某种功能 它主要是告诉我它是最近贴? 它被张贴在最近一周内,真的还是假的? 那是一个函数,我可以附加到该对象, 而且它真的很方便有它在同一个地方, 而且有很多不同的功能,你可以创建 对于这些对象,而且它真的很高兴能够将它附加到一个类, 一个对象,而如果你只是不得不从您的数据库来行, 那么你真的不能附加任何功能的。 这只是字面上的数据。 有关,在所有有问题吗? 奥姆斯是很常见的Web开发, 这里面有很多不同类型的运筹学和管理学的, 和Kohana的有自己的ORM。 这是非常基本的,但你会得到什么,它看起来像一个味道。 >>让我们创建一个模型,我们的博客文章, 我们显然需要做的第一件事是创建一个实际的表 我们的数据库中实际存储我们的数据为这些职位。 我要做的第一件事就是去phpMyAdmin的。 有你们使用phpMyAdmin的呢? 好了,真棒,所以你们已经知道那是什么, 我要去创建一个新的表称为Kohana的帖子, 而这将是非常简单的。 我将不得不重新登录。 所有我们今天要做的是有一个作者和一个身体, 只是保持简单。 我要创建一个表, 现在我们只是有了代表职位表 有2个字段为我们的作者和我们的身体。 其他的事情,我现在要做的是 配置我的web应用程序,以便它知道如何连接到数据库, 而这,又是东西,你就必须做所有的Web应用程序。 你必须告诉它的用户名和密码 和数据库的名称等等等等 弄清楚如何实际连接到数据库。 >>在Kohana中,我们有一些所谓的数据库模块, 而在配置文件夹,我们有这个文件夹叫做数据库, 正如你可以看到,有一堆的设置,你必须在这里设置 告诉它什么是用户名和密码 数据库,所以我实际上可以连接到它。 因为我不想让你们真正知道 用户名和我的数据库的密码, 我有,我已经设置了这一切文件,并且我将其复制并粘贴过来。 真棒。 好吧。我认为这是所有我需要做的配置, 但让我们来看看。 我们会继续在它的工作,如果事情死机, 那么我们会解决它。 现在,我什么都做的是我将创建一个新的控制器。 或者实际上,对不起。 首先,我要创建一个新的模式。 我将创建一个名为Post.php新模式, 而我们要做的是什么,我们要调用它的类Model_Post。 得到一些语法高亮显示, 所以当我说,“延伸的ORM,”这基本上 一些面向对象编程, 不幸的是你们在CS50还没有学到的是, 但它很容易上手。 它给我进来这个ORM包所有这些额外的功能, 所以我得到了一堆额外的功能和诸如此类的东西是免费的, 你会看到在第二位的。 >>现在实际上所有我需要做的就是创建这个类。 我什至都不需要进行任何功能或任何东西, 但我已经创建了一个表示表的类, 因为我已经把这项ORM类, 我得到了一堆东西是免费的,所以现在你不必设置任何事情多了起来。 现在我什么都做的是我要创建一个新的控制器, 而我要去的名字blog.php的, 我要去复制在欢迎控制器 所以我不必重新输入一些东西, 现在我要重新命名此。 现在,我什么都做测试,以确保一切正常了, 我要抓住从我的数据库中的第一篇文章 并打印在屏幕上后的身体。 要做到这一点我什么都做第一是我要保存的职位 给一个变量,所以我们要做的是 - 在Kohana中你要做的就是抓住物体后 这是种累赘,但你必须做这个东西叫ORM ::工厂, 然后你通过在你想要的模型的名称, 它返回ORM的对象,表示模型。 然后,就像我说的,当我们扩展了ORM的对象, 我们得到的所有这些方法的自由,因此,例如, 我们得到这个所谓的新功能“找到” 它会自动返回数据库中每一个职位, 这是非常方便的。 >>现在的身体我将返回 在第一篇文章,并返回它的身体。 当然,我需要创建一个职位, 所以让我们插入一个新的职位。 我会说,“布兰登,我的第一个帖子。” 真棒。 现在我们要进入博客 如果一切运作良好 - 哦,这是其他一些愚蠢的文件权限的事情了。 按住1秒。这有点荒谬。 我们走吧。好吧。 我固定的权限问题。 它试图创建一些文件和一些日志, 和权限,再设定不正确,所以我做了它 所以这些文件是可写和可执行 所以它实际上可以登录到的东西。 现在,它给我另一个异常的说法,“一流的ORM没有找到,” 那是因为我忘了一大步。 这太糟糕了。 在程序的引导文件夹中的文件,也有这些模块在这里, 您可以选择启用或禁用。 这是一群不同的功能,你可以选择使用 Kohana的范围内,这是有点漂亮。 >>例如,他们有一个认证模块 它可用于验证用户身份。 他们有一个缓存模块,如果你想实现 某种缓存后端,使应用程序工作得更快和诸如此类的东西。 我们需要启用数据库和ORM模块, 因为就像我说的,我们使用的数据库,很明显, 而且我们还需要启用的ORM模块, 因为我们希望有额外的功能,这是不错的。 所有我需要做的就是取消注释这些2线, 而现在,如果我刷新,它给了我另一个错误。 它说,“类Model_Post没有找到。” 现在,这是一个很好的问题有。 让我们来看看。 把它公开。 第等一等。 哦,亲爱的。 我不知道为什么它不能够找到。 这真的很奇怪。 我有这个类就在这里。 我想我可能要 - 哦。 我很愚蠢的。我忘了补充一个PHP标签。 这就是为什么。 现在,我必须撤消1的变化我只是做了。 >>好吧。我们走吧。 这是非常愚蠢的。我没有开口的PHP标签。 但正如你所看到的,现在它的正常工作,对不对? 我们有1篇文章。 我们抢到了第一篇文章,现在我们打印出它的身体。 大。太棒了。 有任何疑问,这么远吗? 没了?有问题吗? 好了,所以我们刚刚创建的模型后,很基本的, 而我们要在以后添加一些功能。 我们可以添加验证和过滤。 验证是的事情之一 该框架解决你真的,真的很好, 而且我不认为你们不得不这样做对你的CS50 PSET, 但如果你做web开发为您的最终项目, 你可能会想要做一些验证, 就像没有空白用户名, 也许有一个密码,且至少有长度,这样的事情。 它真的很麻烦由我们自己来实现这些东西, 和几乎每一个Web框架会为你 并允许你做一个非常干净的方式。 该模型是你通常表达这些验证规则, 因为它在验证模型是否是有效还是无效。 >>但现在,我们将稍后把那之前, 而现在我们要工作的另一部分, 而且我们要尝试做一个新视图 列出所有的职位。 参与制定新的行动列出所有职位的步骤 是抓住所有的职位列表 然后通过视图渲染所有的帖子列表。 在这里,幸运的是,我们已经抓住了所有职位 使用这种第一线,发现所有的功能, 现在我们要做的是什么,是迄今为止 我一直在直接设置响应体 通过传递字符串,但现在我想使用一个视图, 和一个视图,只是这样的区别 与一个视图,我可以有一个很好的,大的HTML模板, 什么我可以做的是通过它的某些变量 然后有鉴于自动填充模板 使用这些变量。 我要做的是,我将创建一个新的视图, 我会命名视图类似“博客/指数” 我要去基本上绑定这个 - 哦,那我在写什么? 我的大脑在其他地方。 我要绑定变量到视图的职位, 所以这样的观点可以访问到这个职位的变量。 >>所以现在我需要创建这个视图, 所以在这里我们有这个文件夹,名为“查看” 和第一,我要去下调用来创建一个新的文件夹“博客”。 这是很好的。这样,我们就可以有一个很好的层次结构为我们的意见。 然后,我将在那里创建另一个文件名为“index.php的。” 真棒。 其实,让我们有他们都在这里。 制作一个视图文件可能是这一切的最简单的部分, 这些都是可能的事情你已经很熟悉了。 我们要做的很简单的东西, 开始说,“我的博客文章列表”。 然后,我们可以通过, 我们可以通过职位遍历数组, 抓住每一个职位,并这样说 - 也许添加一行 然后打印出作者和身体。 有意义的这么远吗? 让我们看看它的工作原理。 什么都没有发生。 我不知道为什么。 哦,我错过了1步。很无聊的我。 我创建了一个观点,但我没有设置视图作为响应, 所以你必须做更多的事情。 你需要做的“这样的反应体”,并将其设置为视图。 我们走吧。 我们有我们的标题,然后我们有一个帖子, 而只是踢,让我们插入另一篇文章 所以我们可以看到一个列表。 并插入这2个职位, 现在如果我刷新页面, 我们看到所有这些职位在这里。 >>这是否有意义这么远吗? 是啊,一个问题吗?哦,好吧。 正如你所看到的,我们已经能够分离所有这些代码了 成不同的部分,然后你就可以看到它的最清晰的视图代码。 这里该文件表示视图, 它只关心表示数据,显示数据。 它被传递某种形式的数据,它所做的只是把它给你。 在你的代码的所有其他部分,你将不必担心任何的是, 同样,你的视图代码不必担心任何事情 如何访问数据库等等,等等, 这是非常好,使你的代码很多更易于维护。 就像我说的,看法,他们是动态的, 这是1个文件,但它会产生不同的看法 根据您实际传递的变量, ,此外,还有很多不同的辅助函数的 您可以用它来帮你写你的代码速度更快, 我会告诉你,在短短一秒钟。 是啊。 [学生]所以$ 0是一个控制器,对不对? 这第二件事。 现在的问题是为0元控制器? $ 0 =我创建了这里的变量。 我创建了一个视图第一。我赋予它的一些变量。 然后,我通过它进入此功能,将其作为响应体。 这是否有道理? [学生]所以是视图::厂,是认为像一班 或库[听不清]工厂函数? 现在的问题是关于视图::工厂函数, 基本上这基本上是一些面向对象编程。 视图是视图类,它有一个方法叫做“工厂” 而这一种方式来获取该文件的命名对象“博客/指数。” 这就是一些面向对象编程的东西 说我不打算在这里赘述了太多。 现在很明显,我们要创造新职位, 但我们不希望有通过数据库来做到这一点, 所以我们要创建一个新动作,用于创建一个新的职位, 而且有很多的东西,我们必须做的。 >>我们要做的第一件事情 - 让我们处理这些事情一个接一个。 我们要做的第一件事是我们必须创建一个窗体 插入一个新的职位, 但我也要去先添加一个新的动作, 所以加入一个新的动作是一样一样容易 添加一个新的功能与您的控制器, 而现在我会做一些很基本的, 只要抓住这一观点,并张贴,只是显示它。 然后现在我要创建一个新的视图文件, 和我要开始写一些东西。 什么是好的关于Kohana的是,他们提供了很多不同的辅助函数的 让您更轻松地编写视图代码, 1这些辅助功能或辅助模块 围绕写作形式。 对于写作形式,我真的没有直接写任何HTML自己。 你们已经写HTML表单。 你知道它是如何可真是,真是痛苦和繁琐的书写形式。 这不好玩,所以幸运的是, 我们可以使用Kohana中的基本上写一个形式 形成辅助函数来为我们做了。 我们将主要有领域的每一件事情,我们有, 所以一个作者和一个用于尸体。 我们将有一个标签,我们将有一个输入。 >>然后最后,我们将有一个提交。 正如你所看到的,这是干净多了写 比这些杂乱的HTML,这是种不错的。 当然,还有一些有它甚至比这更清洁其他的web框架, 但至少这比自己写的HTML更好。 真棒,所以这就是你看到的。 这还算比较凌乱, 所以我打算添加一个换行符有 作出这样看起来更好一点。 嗯,当然,它仍然看起来真的,真的很糟糕,但我们只是专注 上的美学为现在而不是功能。 没有时间做的一切。 正如你可以看到,现在我们有一个超级基本形式, 这是种不错的。 这段代码我想说的是比试图写一个HTML表单自己清洁, 所以这是很好的。 下一步是什么? 现在我们需要做的事情与行动。 通常,当你写HTML表单, 你必须告诉它到哪里去的形式提交给。 默认情况下,在大多数web框架, 它提交的确切相同的URL,所以事情是, 如果你发送一个GET请求到/博客/新的, 它应该显示你的形式, 但如果你发送一个POST请求/博客/新的数据, 它实际上应该尝试保存该职位 并用它做什么。 >>我们现在要做的是 基本上所有我们必须做的,检查它是否是一个post请求或GET请求 是检查哪些变量后,您可以设置。 如果该职位变量被设置,那么我们将尝试创建一个新的职位。 同样,我们只是做到这一点, 并创建一个新的职位,并且我们从字面上去 设置其字段这样, 然后我们要保存它。 然后我会重定向 到索引页面,使他们能够再次看到我们的帖子列表。 我们来试一下。 我会说,“布兰登” 然后提交后,如果一切顺利的话, 你可以看到,它重定向我的索引页, 如果我滚动到底部,我们有一个新插入的岗位。 耶! 是啊,问题。 [学生]如果你已经进入了完全一样的东西 你之前输入? 不会检查,以确保你没有复制 同样提交? 缺省情况下,没有,因为默认情况下 - 不好意思,问题是,如果你在表单中完全相同的数据输入 并提交,将它允许你插入一个重复的对象, 重复的项目,基本上是? 现在,是的,它可以让你做到这一点, 因为在数据库中是完全有效的完全重复的行, 但如果这是一个问题,那么你可以添加验证,例如, 以确保如果这是完全一样的东西已经存在, 然后说,这是一个无效的对象, 然后,你甚至可以指定你的错误信息 并说,“无效的,因为这个已经存在”或类似的东西。 但在这种情况下,我可以创造一些重复的。 现在,让我们尝试添加一些验证。 这样做的问题,现在是, 我可以从字面上提交一个完全空白的职位。 我可以按一下这个按钮,现在,我们走吧。 你不能真正看到它,但在这里这些额外的行 表明我从字面上有一个新的职位。 它只是一个空白的作者和坯体, 我们不想让人们做到这一点。 这是验证的用武之地。 >>我可以去我的模型对象, 现在我可以添加一个新的函数,它指定 我要补充到这个模型是什么验证规则 以确保它是有效的或指定是什么意思是一个有效的岗位? 我想说,这只是一个有效的岗位,如果作者和身体 不为空,这是你如何做到这一点的Kohana的。 您可以创建一个名为“规则,”新功能 然后你基本上返回一个关联数组 定义此对象的验证规则。 我们要返回的数组,然后我们要做的是什么 说“作者,”它关系到一个数组, 这正好叫另一个数组“不是空的。” 然后我会说“身体”。 好吧,和语法,这和结构这 可能看起来有点麻烦,有点复杂。 如果您阅读文档,这是很简单的找出, 但本质上这就是你需要做的指定 一些验证规则,而且有很多不同的规则 这Kohana的会给你免费的,比如您可以添加规则说 它必须至少有这个长度。 也许它必须是数字。也许它必须是字母数字。 也许它必须是在最这个长度,等等,等等。 有很多不同的规则,Kohana的为您提供, 你可以去他们的网站上,看文档, 你可以看到所有不同的东西,你可以做。 >>但这是我必须做的, 现在让我们看看会发生什么 如果我提交一份空白后。 有什么事情发生?哦,不,我得到一个错误。 我得到了验证异常。 嗯,这是很好的。 它告诉我,我的模型是无效的, 但我不希望显示异常 我的用户,当他们尝试提交一些无效的,对不对? 我想给他们一些友好的错误消息 当不顺心的事。 我们现在要做的是我们要 在尝试捕捉环包裹的一切。 其实,我觉得这也是东西你还没有学会还 在CS50,因为C,编程语言C, 没有例外,但几乎每一个其他语言 有例外,所以真的,真的很短暂, 一个异常的东西,一段代码可以 抛出异常时,不顺心的事, 但随后也许一些其他的代码段越往上 可以捕获该异常,并用它做什么。 >>例如,在这种情况下, 的一段代码,它尽可能保存模型, 它验证了模型,如果它说,“好吧,这种模式是无效的。” 它会抛出一个异常,这是一种相当于 在C里,你可能会返回一个-1或类似的东西。 然后对我来说,这个功能,我的代码 在更高的层次,我可以尝试捕获该异常 基本上说,“好吧,如果我捕获该异常,我该怎么办?” 或者我可以选择不捕获该异常,并让别人高了 捕获异常,或者如果没有人抓住它, 那么整个程序崩溃,并说, “出事了,我不能处理它。” >>但是我们做的是你包装在一个try块中的一段代码, 然后你还可以添加一些所谓的catch块, 这是代码排序,将尝试捕获可能发生的异常。 所以如果我抓住这个特殊的例外 或无效的异常,然后我什么都做的是 我要设置的错误 - 我想这就是我要做的事 - 我要去设置错误的一些对象。 然后,如果它击中这个例外就是我要做的是, 它不会重定向,如果它不重定向, 它走出来的,如果博客的 而打这个博客/新的,这是要我想做的事情。 如果有错误的话,我想回去形式 并显示这些错误。 现在,我想要做的就是我想通过在这些错误 到视图。 好吧,我想我有看法就在这里, 基本上我想,如果他们的存在是为了显示这些错误。 之前我写的HTML是什么,我要真的很快 告诉你什么是这个错误的结构变量的样子, 这是一般的一个很好的做法。 很多时候,你得到的东西从某种方法回来, 在Web框架的一些功能, 你不知道什么是变量的样子, 所以你不知道如何使用它的工作。 我将使用一个印记R的方法基本上是把它打印出来。 >>正如你所看到的,它告诉我它是一个关联数组, 和你有一个关键,作者,指向这个字符串, 笔者不能为空,而另一个关键,身体, 点到另一个字符串,身体不能为空。 我想,好吧,冷静。 然后,我可以通过遍历数组,并打印出每一个消息。 这基本上就像一个关联数组有一堆的消息。 我什么都做的是“如果错误,” 我要去创建一个无序列表, 而且我要遍历所有的错误。 而这一点,现在我要去尝试再次提交此, ,让我们看看会发生什么。 现在,我们得到错误的这个漂亮的名单, 这仍然是很丑陋,但是这显然可以被格式化为看起来不错, 但其基本思想就是在几行代码, 我们能够验证我们的模型中, 确保某些字段不为空, 如果发生了错误,则返回某种错误消息 然后,我可以介绍给用户。 您还可以自定义您的验证 所以,你其实可以有一个错误信息 那就是更多的特定于应用程序或类似的东西。 所有这一切都是一般定制。 >>不幸的是,我们的时间不多了, 所以我将要在这里切断直播编码会话。 还有一堆其他的功能,我要证明给你 在这个例子。 例如,您可以添加模板到您的网站, 所以也许有HTML代码,您要应用某种 在你的网站的每一个页面,,而不是粘贴的 在每一个视图文件,你有,这显然将是一个不好的做法, 你基本上可以定义这些模板, 然后在你的控制器说,“好吧,我使用这个模板。” “有我所有的意见,使用此模板。” 我要证明给你听的最后一件事 我们没有时间的,是跨站点脚本, 基本上我想你们可能已经看到在CS50 - 我觉得大卫·马兰大概谈到你怎么能通常注入 JavaScript代码到 - 你谈过吗? 也许?也许不是? >>但很多时候,你可以注入恶意JavaScript代码 到别人的数据库,如果他们不逃避,妥善, 那么当他们提出这些数据返回给用户, 那么它可能会运行的任意JavaScript代码一些你不希望发生的事情, 而我将演示你如何做到这一点在Kohana的。 它实际上是真的,真的很方便。 我能做到这一点,现在在2秒内从字面上。 所有您需要做的基本上是包装这些东西 在这个东西叫做HTML实体。 并且,将自动转义的所有字符正确 并确保你没有得到这个问题。 [学生]你拼了第一次测试不正确。 [布兰登刘]哦,哎呀。 >>好吧,这就是我不得不跟你今天分享。 这些幻灯片将要发布,不过一般都是 你应该真正需要的唯一资源开始使用Kohana的。 你可以去网站。他们有一个用户指南,他们也有一个API的探险家。 我们可以探讨各种不同的功能和辅助功能,它们对你。 他们一般都在网站上足够的信息 您可以使用上手并获得与Kohana中去。 有没有那么多的教程,我认为,对于Kohana中,外 他们有什么网站就到这里,所以这可能是你最好的选择。 但是,如果你想要去的web框架 你不希望有拿起一个新的语言, 你想要的东西,也比较轻巧,有一个简单的学习曲线, 我肯定会建议Kohana的。 这可能是为最好的产品。 有趣的事情,虽然是如果我们是在Rails的使用Ruby, 我们可以复制我们刚刚做 而且可能更在3分钟内。 可不是闹着玩的,但学习Ruby on Rails需要花费很多时间 比,将采取学习Kohana的。 它基本上是你的选择,你要选择学什么, 但如果你想获得快速建立和运行, Kohana的绝对是一个非常不错的选择。 >>任何最后几个问题,才结束?是。 [学生]如何将我们整合了 在一个CSS框架,比如你使用时,你被指示? 现在的问题是如何将我们整合了一个CSS框架? 我们可能会做的是,我们可能会包括 一个新的文件夹,我们将放弃我们所有的CSS文件, 然后我们也想补充一个新的模板。 在模板中,我们希望包括CSS文件 以确保他们在每一个页面上引用, 然后当你真正在写HTML, 你只需要添加相应的类和诸如此类的东西, 和例如,当你使用类似的形式 辅助函数,你可以以后添加更多的参数 以指定要连接到各种各样的东西哪些类 这样他们就可以正确设置其样式,而且基本上你将如何去。 >>其他问题吗? 真棒。 谢谢您的时间,并感谢您的光临。 我是不是要添加很多东西, 但1非常快的事情是我们没有一个链接 到窗体。 非常愚蠢的。 让我们添加一个 - 居然在看,博客,指数, 让我们真的很快补充说,进入新的页面的链接, 的页面,我们可以插入一个新的职位。 我们将做到这一点。 什么是好的是存在的HTML辅助函数这​​整个组 它为你做不同的事情,所以你已经看到了实体 在这里发挥作用,但他们也有一个功能叫做“锚” 您可以输入博客/新 并说,“邮政一个新的博客。” 而且,它还将创建一个链接给你, 这似乎真的容易做到,但是这是很好的, 因为假设你正在你的网站从1个域到另一个。 如果你只是自己写出来的URL, 那么你将不得不改变所有的URL。 或者,也许你从1子文件夹移动到另一个子文件夹。 你必须自己改变所有这些网址, 而这不好玩。 你可以使用这个锚在这里, 您可以更改域名或子文件夹的前缀 在配置文件中一次, 然后它将应用的无处不在,这就是,同样, 一个很好的例子,不要重复自己,晒你的代码了。 无论你正在重复自己,尝试和提取某种配置文件 或到不同的函数,并将它处理为你。 >>而且,我想告诉你的最后一件事是 假设我们回到这个帖子,和我组成了一些很长的文章, 但我忘了,包括我的作者。 现在,当我点击“提交邮报” 我只是失去了一切。 不!真的很伤心。 那么,你如何处理呢? 这是我们做的。 我们要做的就是在这里为这些输入和文本区域的功能, 如果我们有第二个参数,即第二个参数则该值 将是什么样的字段是要首先填充来。 我们可以做的是在我们的博客控制器, 我们可以绑定另一个变量。 称之为“价值观”也许吧。 并通过后数组中,从字面上。 这意味着,如果验证失败, 传递给我,我从最后一个请求提交后阵, 而且这样我可以从我的上次提交使用的值 重新填充该字段。 现在,我可以做一些像笔者的值 和值身体,这种方式现在如果我做了一些随机的东西 并点击“提交后”,那么它​​在那里停留。 但我们要碰到的另一个问题。 这样的作品,但如果我去到页面的第一次, 它会崩溃,那是因为这是第一次 我们去的网页,这个帖子变量没有被定义。 它为空。它不存在。 >>而我们想说的是,如果该键存在, 然后返回这个数组的值, 但是,如果该键不存在,则返回一个空字符串。 这就是我们想在这里的功能。 我们要检查钥匙是否存在试图访问该阵列之前, 而幸运的是, Kohana的也给了我们一个辅助函数,该函数。 他们有这样的整体功能套件 的名义下房租,简称阵列, 他们有1个功能叫做“得” 您可以通过在阵列中, 你可以通过在键的名称。 那么基本上它会做什么是它会尝试获取该键, 但是,如果该键没有在数组中存在, 然后将返回空,或者我们也可以指定一个默认的,我相信, 这是很好的。 现在,如果我们再次做同样的事情, 那么你现在看到它的工作原理周围的第一次, 并再次,如果我们输入一些随机的东西 并尝试并提交,那么它在那里停留。 >>我想我也可以告诉你如何真正快速添加的模板。 我们可以首先做的是,我们可以添加一个名为“的template.php”的新观点 在Views文件夹, 而我什么都做的是我要打印出一些所谓的“内容”, 这将是我的主要内容。 也许在最底层我要补充,比方说, 版权所有。 [听不见学生提问] [布兰登刘]也许这是一个超级的基本模板,我想用。 我想和我的版权,每一个单页的文件夹中, 现在我什么都在我的控制做的 是不是说现在,“扩展控制器” 我会说,“延伸Controller_Template,” 而不是说,现在,“响应体等于这个观点,” 我会说,“这个模板的内容是 - ” 我认为 - 我把等号? 我忘记了。是啊,我是这么认为的。 现在我设定的内容变量等于视图。 我可以在这里做同样的。 现在如果我刷新,你可以看到现在这个版权被添加在那里, 而只是进行一些随机的帖子, 然后,再次,你应该看到,版权是在页面的最底部。 >>大。这就是我想给大家看看。 [鼓掌] 有问题吗? [CS50.TV]