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