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