>> [讲座] [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]