[Powered by Google Translate] [講座] [Kohana的：一個輕量級PHP框架]
[劉布蘭登] [哈佛大學]
[這是CS50。] [CS50.TV]
>> 大家好。我的名字是布蘭登。
我是一個初中在大學做計算機科學，今天我們要談
Kohana的，這是一個PHP Web開發框架。
今天將是現場的編碼研討會，
所以我基本上要花費5-10分鐘解釋Kohana是什麼，
然後我從字面上去建立一個超級簡單的博客
你在這裡從字面上從頭。
我們要去Kohana的網站下載的代碼，
我們要開始建立一個博客，並希望這將是非常有啟發性，
因為你會看到，也許，也許我會犯一些錯誤，
你會看到我從它們中恢復，
或者你會看到我的思維過程，因為我通過這個博客建立，
同時，你也將獲得熟悉的框架本身。
希望這將是一個非常有啟發性的運動。
>> 首先，究竟是什麼框架？
如果你一直服用CS50到目前為止，你已經沒有真正的任何工作
框架，事情是這樣的。
你可能已經做web開發的pset
讓我們說你繼續建立網站，並保持網站建設。
你會開始注意到一些事情。
你會注意到的第一件事情是，你可能會做同樣的事情
一遍又一遍的時候，
之類的東西清理用戶輸入的數據，
之類的東西以某種方式組織你的文件。
你也可能注意到的另一件事是你的代碼
可能開始變得非常，非常凌亂，
，你可能會留下混亂和維護它，只是有一個很辛苦的時候，
或者，您就可以開始構建你的代碼，並使其模塊化
在某些方面，使其更易於維護。
>> 這是web框架基本上走了進來。
這些人誰建了很多的網站，他們說，
“我們並不需要重做這每一次，我們建立了一個網站。”
“為什麼我們不只是做一個包，為你做所有這些事情
每一次你想建立一個網站？“
所以，當你做一個新的網站，
你只關注正是這種特定的網站是關於什麼。
您不需要重複所有的各種配置
和分離代碼和重寫代碼
你經常做的時候，你的網站。
這個想法是一個框架，允許你寫一個更高級別的代碼
而不必擔心低級別的細節。
較低層次的細節，可能是這樣的
清洗用戶輸入的數據的處理。
這件事情，你不應該真正需要擔心。
你應著眼於你的網絡分配實際上是。
它省去了很多的樣板代碼。
這是一個為您的項目架構。
>> 最流行的模型 - 視圖 - 控制器，
我要談談在第二。
了很多次，這些框架體現了一套程序，
規則和最佳做法，供您使用
所以，當你採用Web框架
你必須以某種方式寫你的代碼，
它通常一個商定一套原則
被普遍接受的是由社區
一個很好的方式編寫代碼。
它使你的代碼更容易維護，更實用，
等等等等等等。
最後，這件事我想強調的有關框架
與圖書館，這是控制反轉的想法，事情是這樣的。
一個圖書館和一個框架之間的區別是，一個圖書館
你還在寫主程序，
你調用庫中的排序
並呼籲圖書館為你做些什麼。
一個圖書館和一個框架的區別
是框架開始控制，
它調用你的代碼，
所以你可以把它作為 - 這就是為什麼它被稱為一個框架 -
這個框架和結構框架提供了為您的代碼，
您填寫的孔中，
這將變得更加顯而易見，在第二
當你看到我開始編寫代碼的框架範圍內。
你會看到，我填補空白，
該框架是一種控制所有運動件，
在正確的地方，我必須把碎片。
>> 今天我們要談論Kohana的，
這是許多PHP框架之一。
有web框架，是在幾乎每一個單一的語言，
我採摘Kohana的，因為Kohana是無疑
和公認的最簡單的PHP框架拿起。
這是最輕量級的。
還有其他的還有很多，越來越多的功能配備，
但他們往往是比較難有起色。
最後，Kohana的使用MVC架構。
它的重量輕，以至於我們可以從字面上建項目
在這裡就在你的眼前，你幾乎可以
跟著很容易。
>> MVC架構是什麼？
它代表了模型 - 視圖 - 控制器，
也許關於代碼，如果你認為你已經寫了這麼遠
一些Web開發的pset
你也許可以看到一些，但通常當你開始寫
一個更複雜的Web應用程序，
這3個分部之間的分工越來越明顯。
我把這裡的MVC排序堆棧，
你會經常聽到人們談論棧在web開發中，
這是為了說明的想法
每一層，每一個組件真的試圖溝通
2其它組件之間。
有人作為客戶端或瀏覽器訪問您的網站。
他們與你的程序通過視圖代碼。
視圖代碼與控制器進行交互。
該控制器與模型交互，
模型與SQL數據庫交互。
有沒有之間跳躍，如果你寫你的代碼正確。
>> 這些東西是什麼呢？
該模型本質上是一段代碼，涉及與您的數據。
凡是涉及與數據庫，存儲的對象，你，
或檢索這些數據庫中的對象
這一切都處理模型。
也許你有你的數據庫中的對象。
我們要創建一個模型，做與職位，
這樣一個職位可能有它的一些屬性。
您可能需要圍繞這些職位存儲或檢索文章的功能
或過濾的職位，以及等等等等等等，
這是所有的代碼模型的處理。
該控制器是一種應用程序邏輯，
和很多不同的事情，可以在應用程序邏輯。
如果你在談論不同的API，
這可能是你正在處理的應用程序邏輯。
如果你試圖把數據從多個不同的模型
，並把它們混合起來，在某種程度上，往往可能通過控制器處理。
例如，在Facebook上，如果你的朋友的人，
那麼也許，建立這種關係的行為
可以由控制器來完成。
>> 最後，視圖是代碼生成您實際看到的。
很多時候，我覺得在CS50的pset
他們真的不鼓勵你們分開這3樣東西。
您可能會在頂部有這樣大的，長文件
你做出一些SQL查詢，也許做一些處理
的數據，從數據庫中檢索，
然後你把所有的HTML底部。
你可能會發現，當你創造更多的頁面
你有一些代碼重複，也
東西是你的文件變得非常大又長
，成為笨重管理。
之所以MVC是如此視為
有許多原因。
第一件事，就是所謂的關注點分離
它的想法是，當你有 -
1個理想的代碼應該做的事情，這樣做真的很好，
你不應該合併的代碼段做不同的事情。
例如，查看代碼和模型代碼，
他們並不真正是相關的。
他們沒有在同一文件中，所以當你可以將它們分開
所以很容易維護。
>> 另一件事是代碼重用。
您可能會發現自己寫的同一個SQL查詢或者做
類似的查詢，可以抽象成1的功能，
模型和控制器背後的想法，
它在一個單獨的功能，你可以在您的項目在不同的地方重複使用。
最後，那綁曬你的代碼，
或不重複自己，不重複自己。
在開發中，這是很好理解的。
只要你可以，你不希望重複自己，因為如果你重複自己，
它更昂貴的維護。
如果你想改變的事情，你必須改變它無處不在，
並導致錯誤，這太可怕了。
>> 好的。
到目前為止，在所有關於Kohana的任何問題嗎？
太好了。
現在，我們要潛入現場編碼會話，
但願一切順利。
我要基本建立這個網站
我的遠程服務器上，這樣，你們也可以
看到網站和訪問該網站，
環境也更好的配置比我的遠程機器，
因為它是運行Linux，而不是OS X。
從字面上，我們要開始。
KohanaFramework.org。
我從網站下載代碼。
我要複製的鏈接地址，
去到我的服務器，下載，
我要去把它解壓。
>> [學生]：什麼是最大的，你可以使文本？
[布蘭登劉]那個更好？
[學生]那是可行的嗎？>> [布蘭登劉]是啊，這很好。
我下載了一個ZIP文件並解壓縮到一個目錄稱為Kohana的，
我們要重命名的CS50-Kohana的，
並讓我們進去。
真棒。
這裡你可以看到一堆不同的文件。
你們中的大多數可以忽略 - 我們不會去通過每一個單一的文件，該文件在這裡
因為我們的時間限制，
但一般當你安裝Kohana的，你做的第一件事
你去到該目錄，
基本上你會做一些環境測試和諸如此類的東西
確保您的環境已正確設置運行Kohana的
並確保一切都正確無誤。
你可以看到大多數事情過去了，但一般你總是碰上這個問題
抱怨說，某些目錄是不可寫的，
這是因為一些權限。
我不知道你們已經學會了多少有關文件權限的CS50，
但如果你做web開發，你會碰到這個問題很多。
我要使其可寫
我想我也有 - 我們去那裡。
>> 好了，現在你可以看到一切都過去了，
現在它會告訴你重命名install.php了。
我要去移動install.php了installed.php的，
現在如果我刷新
它給了我一定的誤差，這是調試的用武之地。
這是在這裡你可以看到什麼實際將要發生。
事情是，默認情況下，Kohana的假設
你的項目是在您的域的根目錄下，
所以它正在期待您在demo.brandonkliu.com。
我們必須告訴它，它實際上是一個子文件夾中。
它的子文件夾中名為CS50 Kohana的。
事情是，它的曲解CS50-Kohana的
別的東西，我會向你解釋在第二。
但我要告訴你的東西，這是可以預料的。
我們要做的是什麼，我們要進入這個文件夾名為bootstrap.php的，
它的配置文件夾，那裡有很多不同的東西。
我打開這件事。
然後，也許我會做的第一件事情之一是更改時區。
>> 然後讓我們來看看。
啊哈！就在這裡。
在這裡有一堆不同配置的說法，
但我要找的是這個東西叫做基地網址，
默認情況下，我得到它設置Kohana的，
但我要改變，CS50-Kohana的，
我認為應該修復它。
是的，太棒了。
默認情況下，要看到它的工作，它說的“Hello World”。
在哪裡來的？我們怎麼為Hello World？
到底在哪裡，實際上寫的代碼？
要理解這一點，我就為大家介紹這個概念稱為路由。
幾乎所有的web框架稱為路由的概念，
這是一塊軟件，將特定的URL映射
代碼框架內的某一塊。
例如，如果你有一些網址，你去foo.com /博客/所有像某些URL
然後框架要做的 - 或者至少是Kohana是打算做什麼 -
是要找到一類叫做控制器博客，
它會命名的行動，所有的運行功能。
我知道我在談論類和功能，
我知道你們還沒有涉及到的類和函數
CS50還，但現在，
你能想到的只是一組函數的類，
分組功能結合在一起的一種方式。
這的確是所有你需要知道的。
>> 現在，如果我們看我們的文件夾結構，
應用程序文件夾裡面還有另外一個文件夾，名為類，
和其他文件夾被稱為控制器和模型。
如果你看看控制器的文件夾裡面，
我們可以看到，有一個名為歡迎，
你可以看到這裡是一類被稱為控制器，
有一個函數調用動作指數，
和它做什麼，它套在身上的Hello World你的回應。
這就是正在寫的代碼。
另一個問題是，好了，我沒有去
胡說，胡說，胡說，/歡迎/索引。
我怎麼會在這裡結束了嗎？
嗯，這僅僅是因為
在這裡我們的引導文件的底部
我們設定的路線
你可以看到，他們為你設置一些默認值。
默認控制器是歡迎的。默認動作是指數。
這就是為什麼當我們在那裡，什麼也沒有，它會自動去歡迎控制器
和索引操作。
>> 一切有意義這麼遠嗎？
現在，你可以做更多的不僅僅是去到控制器
和一個特定的動作。
您也可以傳遞參數到控制器。
只是作為一個例子，
我要添加到該控制器的另一個動作，向您展示。
讓我們把這個行動回音，因為它會告訴你，無論你給它，
所以我基本上搶
通過我將要發送到的路由程序的參數，
你可以在這裡看到，
這條線就在這裡，你可以看到，
這基本上意味著你有控制器，和你有一個/，
你有行動，你有另一個/
這將是參數，因為我們有這個名字ID
尖括號內，這意味著，我們命名這個參數ID。
後來在我的控制器代碼，如果我想抓住該參數保持，
我可以用我寫的代碼，找到名為ID的參數。
這是我在這裡做什麼，我要回來，說，
“你說的”。
所以，如果我現在去我們的網站，
我去cs50-kohana/welcome/echo/Helloooo--
哦，那是正確的。
是1步我離開了。
這是活的編碼的想法的一部分。
>> 這裡的1件事。讓我們來看看。
因此，通常默認情況下，這些Web應用程序有很多
你必須包括這個index.php的事情在你的URL，
因為想法是index.php樣的切入點
您的應用程序，但是，當然，
這就是一種惱人有。
您不希望到的index.php出現在您的網址，
幾乎每一個開箱即用的Web框架
有這一index.php的問題，
所以你必須採取一些措施，能夠刪除該。
因此，在這種情況下，
我們要做的是什麼，我們要使用一個名為htaccess的，
這是Apache Web服務器的具體的東西，
它可以做這樣的事情重寫的URL
以及重定向URL，等等等等，
Kohana是不錯的，足以提供一個模板。htaccess文件，我們就可以使用。
>> 正如你可以看到，有一個文件叫example.htaccess
我們要複製的。​​htaccess。
我要打開和編輯，
基本上，它做了一堆不同的東西。
你可能想看看是重點線就在這裡。
我們的想法是，這建立了一個規則說，
“好吧，不管你輸入，前面加上index.php來。”
你可以看到這一點。
。*代表任何，匹配任何事情，
然後第二部分是index.php / $ 0，
$ 0是指到以前任何匹配。
這是否有意義？
但非常關鍵的事情，我想改變的是改變這種重寫基地，
這是URL的基礎上。
假設您在何處工作。
我要加CS50 Kohana的，
現在這樣，如果我刪除的index.php
它應該工作，我要加一些數字
告訴你，它確實工作。
聽起來很不錯。
>> 有任何疑問，這麼遠嗎？
[學生]：它是怎麼知道要123？
這是一個說法嗎？
沒錯。你可以認為它就像一個說法。
但奇怪的事情，雖然是Kohana的路上，它
是他們不這樣做完全一樣的參數。
你必須抓住這樣。
你必須抓住的請求對象，名為ID的參數要求，
這個名字ID來自該引導文件
剛才我發現，那些尖括號中的名稱ID，
這就是你如何抓住這些參數。
真棒。
任何其他的問題嗎？
就像我說的，控制器，他們處理的應用程序邏輯，
所以這是1個實例，在那裡你可以看到佼佼者 -
這是非常基本的，但它仍然是應用程序邏輯，
抓住參數的想法，創建一個新的字符串
說，“你說，等等，然後隨地吐痰，還給你。
通常你做什麼，是你創建不同的控制器。
您可以創建單獨的控制器，你的網站的不同部分。
>> 今天我們要做出一個非常簡單的網站，
這將是一個非常基本的博客。
我們要建立一個新的控制器只是在博客中發表。
不過，如果我還可以添加註釋到博客文章，
那麼我可能會希望這些意見作出新的控制器。
如果我想要來添加用戶，我可能會為這些用戶添加一個新的控制器，
在一般情況下，這個想法是，只要你有一個新的模式，
一個新的數據你正在處理的對象，
你有一個單一的控制器，該數據對象。
今天，我們只打算工作1個數據對象，
那將是帖子，
，你也可以認為數據對象對應表。
一般每個表對應於不同的數據對象，
後表將有1個模型後，
這將有1篇文章對應的控制器，
和相同的評論，相同的用戶，依此類推等等。
這是一個一般的經驗法則。
都將是有特殊的情況下，您可能有別於
但90％的時候，就是你將要幹什麼，
我會告訴你，這就是我們要今天做。
更多的概念之前，我們潛回代碼，
這個想法的對象關係映射。
>> 你們已經做了一個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標籤。
這就是為什麼。
現在，我必須撤消變化，我只是做了。
>> 好吧。我們去那裡。
這是真的很傻。我沒有開口PHP標籤。
但你可以看到，現在它的正常工作，對不對？
我們有1篇文​​章。
我們搶到了第一篇文章，現在我們打印出它的身體。
太好了。太棒了。
有任何疑問，這麼遠嗎？
不？有什麼問題嗎？
好了，所以我們剛剛創建的模型後，很基本的，
我們打算以後添加一些功能。
我們可以添加驗證和過濾。
驗證的事情之一
框架可以解決你真的，真的好，
我不認為你們不得不這樣做CS50的pset，
但如果你做web開發為您的最終項目，
你可能會想要做某種驗證，
像沒有空白的用戶名，
也許有一個密碼的長度至少有一些這樣的東西。
由我們自己來實現這些東西，它真的麻煩
幾乎每一個單一的Web框架，它為你
並允許您在一個非常乾淨的方式做到這一點。
模型通常表達這些驗證規則，
因為它的驗證模型是否是有效還是無效。
>> 但現在，我們要放，直到後來，
現在我們要去工作的另一部分，
我們要去嘗試，使一個新的視圖
列出所有職位。
在一個新的動作列出所有職位所涉及的步驟
是搶了所有的職位列表
通過視圖，然後渲染的所有職位列表。
在這裡，幸運的是，我們已經抓住了所有的職位
使用此第一行，找到所有的功能，
現在我們要做的，是迄今為​​止
我已經直接定身的響應
通過字符串，但現在我想使用視圖，
和視圖之間的區別，只是在做這個
是一個觀點，我可以有一個不錯的，大的HTML模板，
什麼我能做的就是把它傳遞某些變量
然後視圖會自動填充其模板
使用這些變量。
我要做的是我會創建一個新的觀點，
我將其命名為類似“博客/索引，視圖”
我要去基本上綁定 - 哦，我寫的是什麼？
我的大腦是別的地方。
我要綁定到視圖的職位變數，
所以這樣的觀點具有訪問這個變量後。
>> 所以現在我需要創建這個視圖，
所以在這裡，我們有這個文件夾，名為“查看，”
首先，我要創建一個新的文件夾下，所謂的“博客”。
這是很好的。這樣，我們就可以有一個很好的層次結構為我們的意見。
然後我會創建另一個稱為“的index.php文件在那裡。”
真棒。
其實，讓他們都在這裡。
視圖文件可能是這一切的最簡單的部分，
這些可能是你已經很熟悉的東西。
我們要做的很簡單的東西，
開始說，“我的博客文章列表。”
然後我們就可以穿過去，
我們可以遍歷職位數組，
抓住每一個職位，這樣說 -
也許添加一行
然後打印出作者和身體。
有意義這麼遠嗎？
讓我們來看看，如果它的工作原理。
什麼都沒有發生。
我不知道為什麼。
哦，我錯過了1步。我非常愚蠢。
我創建了一個觀點，但我沒有設置視圖作為響應，
所以你必須做更多的事情。
你必須這樣做“這種反應體”，並設置它的視圖。
我們去那裡。
我們有我們的標題，然後我們有個post，
只是踢，讓我們的另一篇文章中插入
所以我們可以看到一個列表。
並插入這2個職位，
如果我現在刷新頁面，
我們看到這裡這些職位。
>> 這是否有意義這麼遠嗎？
是啊，一個問題嗎？哦，好吧。
正如你可以看到，我們已經能夠分離出的這些代碼
成不同的部分，然後你可以看到它是最清晰的視圖代碼。
此文件在這裡，代表該視圖
只關心表示數據，顯示數據。
它被通過某種數據，它所做的一切只是顯示給你。
在所有其他部分的代碼，你不會有任何的擔心，
同樣，你的視圖代碼不擔心什麼
如何訪問數據庫，等等，等等，
這是非常好的，並且使你的代碼更容易維護了很多。
就像我說的，視圖，它們是動態的，
這是1個文件，但它會產生不同的看法
變量的基礎上，你實際上傳遞，
此外，也有很多不同的輔助功能
您可以用它來幫助你更快地編寫代碼，
我會告訴你，一秒鐘。
是啊。
>> [學生] $ 0是一個控制器，對不對？
這第二件事。
現在的問題是控制器為0元？
$ 0是一個變量，我在這裡。
我創建了一個觀點第一。我分配到一些變量。
然後，我通過它進入此功能，將它設置為身體的反應。
這是否有意義？
[學生]所以景觀::工廠，像類
或庫[聽不清]工廠功能？
現在的問題是關於視圖::工廠功能，
基本上這是一些更加面向對象編程的本質。
視圖是視圖類，它有一個方法叫做“工廠”
這是一個名為“博客/索引搶的對象。”
這就是一些更加面向對象編程的東西
我不會進入太多。
現在很明顯的是，我們要創造新的職位，
但我們不希望有做它通過一個數據庫，
所以我們要創建一個新的行動，創建一個新的職位，
有很多的東西，我們需要做的。
>> 我們要做的第一件事 - 讓我們解決這些事情一個接一個。
第一件事情，我們要做的是，我們已經有了創建一個表單
插入一個新的職位，
但我還要先添加一個新的行動，
所以添加一個新的動作是一樣容易
添加一個新的功能與您的控制器，
現在我打算做一些很基本的，
只要抓住這個觀點，並張貼，只是為你顯示。
那麼現在我要創建一個新的視圖文件，
我要開始寫一些東西。
關於Kohana的不錯的是，他們提供了很多不同的輔助功能
為你寫的視圖代碼更容易，
這些輔助功能或輔助模塊1
是周圍書面形式。
對於寫作形式，我真的不直接寫自己的任何HTML。
你們寫HTML表單。
你怎麼知道它可以是真的，真的很痛苦和繁瑣的編寫形式。
這不好玩，所以幸運的是，
基本上，我們可以寫一個形式使用Kohana的
形成輔助功能為我們做了。
我們要去基本上有事情，我們必須為每一個領域，
所以一個作者和一個的屍體。
我們將有一個標籤，我們將有一個輸入。
>> 最後，我們將有一個提交。
你可以看到，這是更清潔的寫
比凌亂HTML，這是一種很好的。
當然，也有其他的web框架，它甚至比清潔，
但至少，這是優於自己編寫HTML。
真棒，所以這是你所看到的。
這是有點亂，
所以我要添加換行符
作出這樣看起來更好一點。
嗯，當然，它仍然看起來非常，非常糟糕，但我們只是專注
現在的功能上，而不是美學。
沒有時間做的一切。
你可以看到，現在我們有一個超級的基本形式，
這是一種不錯的。
我想說的是這個代碼乾淨多嘗試自己編寫一個HTML表單，
所以這是很好的。
下一步是什麼？
現在，我們需要做的事情與行動。
通常，當你寫HTML表單
你必須告訴它到哪裡去提交表單。
默認情況下，在大多數的web框架，
提交完全相同的URL，這樣的事情是，
如果你發送一個GET請求/博客/新
它應該顯示你的形式，
但如果你發送POST請求/博客/新的數據，
它實際上應該嘗試保存該職位
並用它做什麼。
>> 我們要做的是什麼
基本上所有我們需要做的，以檢查它是否是一個post請求或GET請求
檢查後的變量，你可以設置是什麼。
後變量被設置，那麼我們要去嘗試，並創建一個新的職位。
同樣，我們只是做到這一點，
創建一個新的崗位，我們從字面上去
設置等領域，
然後我們要拯救它。
然後我要重定向
到索引頁面，這樣他們就可以再次看到我們的職位列表。
讓我們嘗試。
我會說，“布蘭登”
然後提交後，如果一切順利，
你可以看到，我重定向到索引頁面，
如果我滾動到了谷底，我們有一個新插入的職位。
太棒了！
是啊，問題。
>> [學生]：如果你已經進入了完全一樣的東西
你之前輸入？
是否進行檢查，以確保你沒有複製
提交相同？
缺省情況下，沒有，因為默認情況下 -
不好意思，問題是，如果你在完全相同的數據輸入的形式
並提出，將允許你插入一個重複的對象，
重複條目，基本上嗎？
眼下，它會允許你這樣做，
因為在數據庫中，它是完全有效的有完全重複的行，
但如果這是一個問題，那麼你可以添加驗證，例如，
確保，如果這是已經存在的東西完全一樣，
然後說，這是一個無效的對象，
那麼你甚至可以指定你的錯誤信息
並說，“無效的，因為這已經存在”或類似的東西。
但是，在這種情況下，我可能只是創造一些重複的。
現在，讓我們試著添加一些驗證。
這一權利的問題是，現在
我可以從字面上一個完全空白後提交。
現在我可以點擊這個按鈕，而且我們去。
你真的不能看到它，但這個額外的線在這裡
表示，我從字面上有一個新的職位。
它只是一個空白的作者和坯體，
我們不想讓人們能夠做到這一點。
這是在驗證的用武之地。
>> 我可以去我的模型對象，
現在我可以添加一個新的功能，指定
我要補充這個模型驗證規則
以確保它是有效的，或指定這是什麼意思是一個有效的崗位呢？
我想說這只是一個有效的後，如果作者和身體
是不是空白的，你這是怎麼做到這一點在Kohana。
您可以創建一個新的函數稱為“規則”
那麼你基本上返回一個關聯數組
此對象定義的驗證規則。
我們要返回的數組，那麼我們要做的是
說“的作者，”進入到一個數組中，
去到另一個陣列稱為“不空”。
然後我會說“身體”。
好吧，這個語法和結構
可能看起來有點麻煩，有點複雜。
如果你讀的文件，這是非常簡單的，要弄清楚，
但基本上這就是你需要做的指定
一些驗證規則，也有很多不同的規則
該Kohana的會給你免費的，比如，你可以添加規則說
它必須至少這個長度。
也許它是數字。也許它是字母數字。
也許它必須是在大多數這個長度，等等等等等等。
是Kohana的為您提供了很多不同的規則，
你可以去他們的網站上，看的文檔，
你可以看到，你可以做不同的事情。
>> 但是，這是我必須做的，
現在讓我們看看會發生什麼
如果我提交一份空白後。
會發生什麼？哦，不，我得到一個錯誤。
我得到一個驗證異常。
嗯，這是很好的。
它告訴我，我的模型是無效的，
但我不想顯示異常
我的用戶，當他們嘗試提交一些無效的，對不對？
我想給他們某種友好的錯誤消息
出問題的時候。
我們要做的是什麼，我們要
包裹在一個try一切趕上循環。
其實，我覺得這也是你還沒有學會的東西
CS50，因為C，C語言編程，
沒有例外，但幾乎每一個其他語言
有例外，所以真的，真的很短暫，
一個異常是一段代碼
出問題的時候拋出一個異常，
但隨後也許更高一些其他的代碼片段
可以捕獲該異常，並用它做什麼。
>> 例如，在這種情況下，
一段代碼，試圖保存模型，
它驗證模式，如果它說，“好吧，這種模式是無效的，”
它會拋出一個異常，這是一種相當於
在C中，你可能會返回一個-1或類似的東西。
然後對我來說，這功能，我的代碼
在較高的水平，我可以嘗試捕獲該異常
基本上說，“好吧，如果我趕上例外，我打算怎麼辦？”
或者，我可以選擇不捕獲該異常，並讓別人更高
捕獲異常，如果沒有人抓住它，
那麼整個程序崩潰並說，
“出事了，我無法處理它。”
>> 但我們做的是包裝在try塊中的代碼片段，
然後您還添加了一種叫做catch塊，
這是代碼排序，將嘗試和捕捉可能發生的異常。
所以，如果我抓住這個特殊的例外
或無效異常，那麼我打算做什麼
我要設置的錯誤 - 我想這就是我要做的事 -
我要去某個對象設置錯誤。
然後呢，我要做的是，如果它擊中這個異常，
它不會重定向，如果它不重定向，
它走出來的，如果博客
打這個博客/新的，這是想要我想要做的。
如果有錯誤的話，我想回去的形式
並顯示這些錯誤。
現在我想要做什麼，我想通過這些錯誤
的觀點。
好吧，我覺得在這裡我有看法，
基本上我想顯示這些錯誤，如果它們存在。
在我寫的是HTML之前，我要真的很快
告訴你這個錯誤變量的結構看起來像，
這是一個很好的實踐中一般。
很多時候，你得到的東西回來一些方法，
某些功能在web框架，
你不知道變量看起來像什麼，
所以你不知道如何使用它。
我要使用的印記R方法基本上把它打印出來。
>> 你可以看到，它告訴我，它是一個關聯數組，
和你有一個關鍵，作者，指向這個字符串，
作者不能是空的，另一個關鍵，身體，
點到另一個字符串，身體不能為空。
我想，沒關係，涼爽。
然後我就可以遍歷數組，並打印出每一個消息。
這基本上就像一堆消息的關聯數組。
我打算做的是什麼，“如果錯誤，”
我要創建一個無序列表，
我要遍歷所有的錯誤。
而這一點，現在我要去嘗試再次提交此，
讓我們來看看我們得到了什麼。
現在，我們得到這個漂亮的錯誤列表，
這仍是一個很醜陋，但是這顯然可以被格式化好看，
但其基本思路是，只需幾行代碼，
我們能夠驗證我們的模型，
確保某些字段不為空，
如果事情出了錯，然後返回某種錯誤消息
然後，我可以展示給用戶。
您還可以自定義您的驗證
所以，你實際上可以有一個錯誤消息
更具體到您的應用程序或類似的東西。
一般定制。
>> 不幸的是，我們的時間不多了，
所以我將不得不切斷實時編碼會話。
還有一堆其他功能，我要為你展示
在這個例子。
例如，您可以添加到您的網站模板，
所以也許有某種HTML代碼，您要套用
在您的網站，而不是粘貼，每一個單頁
你必須在每一個單一的視圖文件，這顯然將是一個不好的做法，
你基本上可以定義這些模板，
在你的控制器，然後說，“好吧，我使用這個模板。”
“有我所有的意見，使用此模板。”
而最後一件事我要展示給你
我們沒有時間是跨站點腳本，
基本上，我想你們可能已經看到在CS50 -
我覺得大衛·馬蘭可能談到如何，通常可以注入
JavaScript代碼插入 - 有你談過這個？
也許嗎？也許不是？
>> 但有很多次，你可以注入惡意JavaScript代碼
到別人的數據庫，如果他們不逃，妥善，
然後當他們提出的數據返回給用戶，
那麼它可能會運行某種隨機的JavaScript代碼，你不希望發生的，
我要證明你如何做到這一點Kohana的內。
它實際上是真的，真的很容易。
我能做到這一點，現在在2秒內從字面上。
所有你必須做的基本上是包裝這些東西
這個東西叫做HTML實體。
而且，它會自動的所有字符進行轉義
並確保你沒有得到這個問題。
[學生]：您拼寫錯誤的第一次測試。
[劉布蘭登]哦，哎呀。
>> 好吧，這是我今天與大家分享。
這些幻燈片將要發布，但這些通常是
唯一的資源，你真的應該需要上手Kohana的。
你可以去我們的網站。他們有一個用戶指南，他們也有一個API瀏覽器。
我們可以探索不同的功能和輔助功能，他們有你。
他們通常有足夠的網站上的信息
您可以使用上手Kohana的。
不會有很多教程，我認為，對於Kohana的，外面的
他們有什麼網站上，所以這可能是你最好的選擇。
但是，如果你想要去與Web框架
你不想不得不拿起一門新的語言，
你想要的東西，其重量較輕，有一個簡單的學習曲線，
我肯定會建議Kohana的。
這可能是最好的祭。
，不過，有趣的是，如果我們使用Ruby on Rails，
我們可以複製的，我們只是做了什麼
大概在3分鐘內。
沒有玩笑，但學習的Ruby on Rails需要花費很多的時間
它會採取比Kohana的學習。
它基本上是你的選擇，你要選擇學習什麼，
但如果你想獲得快速啟動和運行，
Kohana是絕對是一個非常不錯的選擇。
>> 任何最後一個問題之前，我們結束了嗎？是。
[學生]我們將如何整合
像你當你被指示在一個CSS框架？
現在的問題是我們將如何整合一個CSS框架？
我們可能會做什麼，我們可能會包括
一個新的文件夾，在這裡我們將我們所有的CSS文件轉儲，
那麼我們還可以添加一個新的模板。
在模板中，我們想包括CSS文件
，以確保他們在每一個頁面引用，
，然後當你實際編寫HTML，
你只需要添加相應的類和諸如此類的東西，
例如，當你使用類似的形式
輔助函數，你可以添加更多的參數之後
指定你要什麼類被附加到各種事物
，使他們能夠正確風格，那就是基本上你將如何去。
>> 任何其他的問題嗎？
真棒。
謝謝您的時間，並感謝你們的到來。
我是不是要添加其他非常，
但真快的事情是我們沒有鏈接
到窗體。
非常愚蠢的。
讓我們添加一個 - 實際上，博客，索引，視圖中
讓我們真的很快添加一個鏈接，進入到新的頁面，
頁面，在這裡我們可以插入一個新的職位。
我們將做到這一點。
什麼是好的，是有這一組HTML輔助功能
為你做不同的事情，所以你已經看到實體
功能在這裡，但他們也有一個功能叫做“錨”
您可以輸入博客/新
並說，“發布一個新的博客。”
，它會為您創建鏈接，
這似乎很容易做到，但是這是很好的，
因為假設你正在你的網站從1個域到另一個。
如果你只是寫了自​​己的URL，
那麼你將不得不改變所有的網址。
或者，也許你把它從1子子文件夾。
你將不得不改變自己的網址，
沒有樂趣。
你可以使用這個錨在這裡，
您可以更改域名或子文件夾的前綴
在配置文件中一次，
然後它會到處都適用，這是再次，
一個很好的例子，不要重複自己，曬你的代碼。
無論你重複自己，盡量在某種配置文件中提取
或到不同的函數，它處理為你。
>> 而最後一件事，我想告訴你的是
假設我們在這篇文章中，我已經由一些很長的文章，
但我忘了，包括我的作者。
現在，當我點擊“提交郵報”
我只是失去了一切。
“不！”真的很傷心。
那麼，你怎麼處理呢？
這是我們做什麼。
我們在這裡做的是為這些輸入和文本區域功能，
如果我們包括第二個參數，然後，第二個參數的值
將是字段最初填充。
我們可以做的是在我們的博客控制器，
我們可以綁定另一個變量。
稱它為“價值”也許吧。
並通過後的數組中，從字面上。
這意味著，如果驗證失敗，
傳遞給我的陣列後，我提交的最後一個請求，
這樣，我可以用我上次提交的值
重新填充字段。
現在我可以做類似價值觀作者
和價值觀的身體，這樣，現在如果我做了一些隨機的東西
並點擊“提交郵報”，那麼它在那裡停留。
但是我們會碰上另一個問題。
這樣的作品，但如果我去的第一時間，
它會崩潰，這是因為這是第一次
我們去的網頁，這個帖子的變量沒有被定義。
它是空的。它不存在。
>> 我們想說的是，如果該鍵存在，
然後返回這個數組的值，
但是，如果該鍵不存在，則返回空字符串。
這是我們想在這裡的功能。
我們要檢查，如果該鍵存在，然後再試圖訪問數組，
幸運的是，
Kohana也為我們提供了一個輔助的功能。
他們有這樣的一整套功能
ARR的名字下，短陣列，
，他們有1個功能叫“，”
你可以通過在陣列中，
你可以通過在關鍵的名稱。
然後，基本上它會做什麼是它會嘗試獲取該鍵，
但如果該鍵不存在數組中
然後將返回空白，或者我們也可以指定一個默認的，我相信，
這是很好的。
現在，如果我們再次做同樣的事情，
那麼現在你看到它的工作原理第一時間解決，
再次，如果我們輸入一些隨機的東西
和嘗試，並提交，然後在那裡停留。
>> 而我想我也可以告訴你如何添加一個模板，真的很快。
我們可以先做的是，我們可以添加一個新的視圖“的template.php”
Views文件夾內，
我打算做什麼是我要打印出來的東西被稱為“內容”
這將是我的主要內容。
也許在最底層，我要添加，也就是說，
版權。
[聽不清學生的問題]
[劉布蘭登]也許這是一個我想用超基本模板。
我想我的版權，每一個頁面上有一個文件夾，
現在我要做的事情在我的控制器
現在是不是說，“擴展控制器”
我要去說，“擴展Controller_Template的。”
現在不是說，“響應主體是平等的這一觀點，”
我會說，“這個模板的內容是 - ”
我想 - 我把等號嗎？
我忘了。是啊，我是這麼認為的。
現在我該內容設置變量等於視圖。
我可以在這裡做同樣。
現在如果我刷新，你可以看到現在有添加此版權，
只是進行一些隨機的職位，
然後，再次，你應該看到的版權是在頁面的最底部。
>> 太好了。這就是我想告訴你們的。
[鼓掌]
有什麼問題嗎？
[CS50.TV]