[Гуляе музыка] Эрык Ауян: Гэй, усё. Сардэчна запрашаем. Гэты будынак Dynamic Вэб-прыкладанні з Laravel. Мяне клічуць Эрык Ауян. Я студэнт-другакурснік вывучэння сацыяльных даследаванняў з другасным па інфарматыцы, і я жыву ў Адамс Дом тут, у Гарвардзе. Так Laravel, на яго большасці асноўных, гэта фреймворк для вэб-дадатак MVC. Так падабаецца, што вы, хлопцы, ёсць рабілі з CS50 фінансаў, Laravel з'яўляецца асновай, якая дазваляе ствараць дынамічныя вэб-прыкладанні. Такім чынам, вы можаце думаць пра гэта ў нейкім сэнсе як пашырэнне тыпу матэрыялу Вы рабілі ў CS50 Фінансы, але сістэма, якая з'яўляецца шмат больш надзейнымі, шмат больш элегантны ў пэўным сэнсе, і дае шмат Функцыянальнасць для вас пабудаваць даволі складаны вэб-прыкладанняў. Так што давайце прайсці праз некаторыя з ключавых асаблівасцяў, і тады мы будзем апускацца ў Прыклад пабудовы блог Дадатак з Laravel. Такім чынам, адна з першых рэчаў, якія адрознівае яго ад MVC віду работ што вы рабілі з CS50 гэта ўключае ў сябе рухавік ОРМ. Так ORM расшыфроўваецца аб'екта рэляцыйнага адлюстравання. Так што гэта дазваляе будаваць пласт абстракцыі паміж базай дадзеных і кантралёры. Так, у адрозненне ад CS50 фінансаў, на якім Вы непасрэдна выконваць запыты, ORM пласт дазваляе абстрактны, што далёка і стварыць мадэлі, якія з'яўляюцца больш магутнымі, чым Вы можаце прама з запытамі SQL. Іншая справа, што на самой справе карыснай спадчынныя шаблоны. Такім чынам, вы ўбачыце, у CS50 фінансаў, вы ў канчатковым выніку перапісвання шмат рэчаў, дзе месцы, якія вы маглі б патэнцыйна выкарыстоўваць рэчы, вы не ў стане. Дык вось у Laravel, вы можаце выкарыстоўваць тое, што Вядома, як лязо шаблону рухавіка стварыць майстар-план. І адтуль, вы можаце успадкаваць так што на поўдзень шаблоны могуць на самай справе ўключаюць у сябе элементы, якія ўваходзяць у што большай базавай шаблону. Міграцыя. Так што гэта даволі стандартныя асаблівасці на большасць сучасныя рамкі вэб-прыкладанняў. Так што гэта дазваляе прадстаўляць змены схемы базы дадзеных у кодзе. Так што без збіраўся сказаць, PhpMyAdmin, Вы можаце фактычна стварыць гэтыя міграцыі дзе вы ўяўляеце базы дадзеных Змены схемы ў код. І гэта дазваляе to-- асабліва Калі ў вас ёсць некалькі людзей, якія працуюць на тым жа вэб application-- адсочваць гэтыя змены, кажуць у GitHub, або якой-небудзь іншай рэпазітар. Так што гэта вельмі карысна і зніжае неабходнасць каб, скажам, прайсці вакол шмат SQL звалак. І, нарэшце, Кампазітар з'яўляецца то вельмі, вельмі карысна што дазваляе выкарыстоўваць іншыя Код народны зрабіць дзіўныя рэчы. Так Laravel структураваны як некалькі кампазітар пакеты. Так бы мовіць, калі вы хочаце, каб прынесці у пакет праверкі сапраўднасці або калі вы хочаце, каб прынесці ў некаторых Сартаваць скрыпту генератара або адміністратарам інтэрфейс, вы можаце падключыць і гуляць гэтыя кампаненты з кампазітарам. Так што давайце пачнем. Любыя пытанні ад вас Хлопцы перш чым мы пачнем? Ніякіх пытанняў? Крута. Такім чынам, першы крок ўстаноўка Composer. Так Кампазітар дазваляе кіраваць гэтымі залежнасцямі, няхай гэта будзе база Laravel ці якой-небудзь іншай дадатковы трэцяя асоба. Першая каманда дазваляе Вы можаце спампаваць кампазітара, і другая каманда дазваляе перамясціць яго ў вашай лакальнай тэчцы бін так што вы можаце запускаць Composer непасрэдна праз тэрмінал. Пасля гэтага, ісці наперад і стварыць новы праект Laravel. Мы на самай справе адбываецца ў выкарыстоўваць некаторыя прыклад кода што я сабраў стварыць гэты блог. Але калі вы пачынаеце з драпіна, вы павінны выкарыстоўваць гэтую каманду тут, кампазітар стварыць-праект, Laravel скараціць Laravel, а затым Назва Вашага праекта. І што будзе ўключаць у сябе усе код размеркавання для пачатку новы праект Laravel. Такім чынам, для вашых CS50 скончаных праектаў, вы будзеце верагодна, захочаце выкарыстоўваць гэтую каманду. Але мы збіраемся пачаць з гэтага. Таму, як толькі вы зрабілі што вы збіраецеся атрымаць даволі шырокая нумар файлаў у blog50. Так што давайце проста прайсці некаторыя з гэтых кампанентаў. Вы заўважыце, на гэтым маршруце Каталог, ёсць тэчка прыкладання. Ўнутры тэчкі прыкладання, ёсць пару карысных тэчкі. Варта адзначыць, каб пачаць з гэта тэчка Config. Так гэта стварае як вэб-дадатак будзе, скажам, аўтэнтыфікацыі карыстальнікаў або грашовыя рэчы або падлучыцца да базы дадзеных. І тое, што на самой справе карысна ў тым, што Laravel дазваляе наладзіць розныя асяроддзях распрацоўкі. Такім чынам, што мы зрабілі тут, калі мы ідзем пад лакальнай тэчцы, ёсць файл database.php. І вы заўважыце, тут мы ўсталяваць злучэнне MySQL, што дазваляе людзям злучыцца да сервера MySQL, што гэта непасрэдна на прыборы CS50. І мы падключэнні да базы дадзеных што я стварыў называецца Blog50. Такім чынам, давайце на самай справе ісці наперад і запусціць рабочую версію гэтага, толькі, каб атрымаць адчуванне таго, што дадатак, якое мы будуем выглядае. Так што ў мяне копію гэта Blog50 завершана. Так Laravel на самай справе мае ўбудаваны сервер што вы можаце запусціць непасрэдна з каманднага радка. Так што гэта падобна на PSet раней, калі вы на самой справе пабудаваць свой уласны сервер у С. Такім чынам, яны маюць адну пабудаваны ў так што вы можаце запусціць вашыя прыкладання Laravel непасрэдна з каманднага радка. Так што, калі мы робім PHP рамесніка служыць, гэта пачне сервер распрацоўкі порт 8000. Так што, калі мы ідзем у лакальным хасце 8000, вы заўважыце, што, эй. У нас ёсць блог і працуе. Так Laravel тут генерацыі Галоўная старонка нашага блога. Вельмі простае прыкладанне. Але ёсць пара сапраўды карысных функцый што яна забяспечвае пад капотам. Так прымяненне блога проста. Калі б мы хацелі стварыць пост, мы можам націснуць на гэтую кнопку. Мы можам сказаць: "Гэй, усё. Гэта вельмі весела Семінар ", напрыклад. І напісаць што-то тут. Тэкст тут. Калі ціснем Submit, вы будзеце звярніце ўвагу, што наш новы блог Паведамленне было дададзена Галоўная старонка блога. Калі мы вернемся сюды, вы заўважыце, што былі некаторыя заўвагі, ужо на блогу. Так што, калі мы пракручваем ўніз, вы будзеце звярніце ўвагу, што Джонатан Тан кажа што ён быў вельмі заінтрыгаваны гэтай пасады. Такім чынам, мы пойдзем у тое, як аб'ект рэляцыйнага адлюстравання дазваляе Вы, каб зрабіць гэтыя адносіны ў даволі плыўны спосаб, як добра. Крута. Любыя пытанні аб функцыянальнасці што мы збіраемся будаваць? Крута. Такім чынам, давайце пачнем з сапраўды стварэння табліц базы дадзеных. Так Нагадаем, што ў CS50 фінансаў, вам сабраць стол для карыстальнікаў а таксама для акцыі ў вашым партфелі. Так як мы ўжо згадвалі раней, што мы выкарыстоўваем у Laravel што-то вядома, як міграцый. Так што, калі мы вернемся да Размеркаванне код тут, Першая каманда, якая карысна, што Laravel дае вам гэта каманда міграцыі. Такім чынам, мы можам зрабіць PHP, мігруюць майстравых: зрабіць. Так што гэта дазваляе нам стварыць міграцыі. І тады мы захочам стварыць міграцыі называецца create_posts_table, якая збіраецца каб быць там, дзе мы збіраемся быць захоўвання нашым блогу. І вы заўважыце, тут, што ён працуе праз код, які на самай справе генеруе файл з штамп часу на гэта. Так што, калі мы пойдзем і паглядзім на базы дадзеных, мы заўважылі пры міграцыі што ён створаны Пусты файл для нас, якія мае шаблонны код з назвай што мы паказалі, ствараць паведамленні стол. І яно мае дзве функцыі ў ёй. Да чаго мы хочам працаваць, калі міграцыя прымяняецца да базе даных. І ўніз, што мы збіраемся рабіць калі мы хочам павярнуць назад міграцыю. Дык вось давайце пачнем напісанню гэтай міграцыі. Так што карысна клас у Laravel называецца схемы. Такім чынам, мы збіраемся запусціць схемы :: стварыць. І мы збіраемся стварыць табліца з імем паведамленні. І тут мы ўжываем гэта, выкарыстоўваючы функцыю. І ў тут, мы ідзем на самай справе вызначыць змест нашай табліцы. Мы збіраемся стварыць ID, што автоинкрементные. Акрамя таго, мы збіраемся каб стварыць поле, што ўяўляе загаловак нашага блога. Мы таксама збіраемся стварыць поле для захоўвання тэкст нашага блога. І, нарэшце, мы збіраемся захоўваць некаторыя пазнакі калі наш пост быў створаны і калі ён быў абноўлены. І ўніз, гэта даволі проста. Усё, што мы хочам зрабіць, гэта падзенне табліца, якую мы стварылі. Выдатна. Ёсць пытанні? Так што цяпер, калі мы ідзем наперад и-- самай справе, лакальны хост, дазвольце мне выдаліць, што было раней. Перайсці да баз дадзеных. Я збіраюся выдаліць, што было раней. Пакіньце гэта і стварыць Новая база дадзеных Blog50. Так што цяпер чароўны частка тут, што мы можа ўжываць гэтыя міграцыі непасрэдна да базы дадзеных з дапамогай каманднага радка інструмент. Так што, калі мы робім PHP майстравых, мігруюць, Вы заўважыце, што, эй. Ён створаны табліцу міграцыі, якія мы зірнем на ў трохі, і ён ужываецца гэты першы міграцыі. Так мы глядзім на Blog50, вы заўважыце, што ён створаны дзве табліцы для нас. Па-першае гэта табліца міграцыі. Так што, калі мы праглядзець гэта, вы заўважыце, што Гэтая табліца з'яўляецца даволі просты. Гэта проста сказаў, што, эй. Мы ўжылі гэты міграцыі. Мы вернемся і паглядзім на пасады. Вы заўважыце, што структура менавіта тое, што мы прасілі яго. У нас ёсць автоинкрементный ID. У нас ёсць радок для захоўвання Назва і тэкставае поле для захоўвання кантэнту. Выдатна. Крута. Любыя пытанні аб міграцыі праца, як мы можам прымяняць іх? Няма? Крута. Так што цяпер мы збіраемся, каб ісці наперад а на самай справе стварыць мадэль. Таму мы хочам, каб стварыць паведамлення мадэль, якая захоўвае абстракцыі базы дадзеных. Такім чынам, замест таго, каб рабіць запыты MySQL непасрэдна, мы збіраемся стварыць. Такім чынам, мы павінны стварыць Тэчка тут званых мадэляў. І тут ўнутры, мы збіраемся стварыце файл з назвай post.php. У гэтым файле PHP, мы збіраемся стварыць клас пост, які працягваецца красамоўны. Красамоўнай з'яўляецца імя ORM рухавік, які забяспечвае Laravel. І тут, мы маглі б чакаць, што Вы на самой справе трэба напісаць код. Мы збіраемся напісаць некалькі дапаможныя функцыі больш позняй версіі. Але з скрынкі, гэта ўжо будзе прызнаюць, што ў базе дадзеных і мы можам атрымаць доступ, скажам, тэкст нашай блогу або назвы, і стварыць матэрыял непасрэдна з не вельмі шмат няма кода наогул. Так што гэта адна з магічных кампанентаў. І вецер адразу гэтага класа больш паўнавартаснай, мы будзем ўключаць інфармацыю аб тым, што гэта звязана з так каментарах. Акрамя таго, стварэнне функцыю таму мы можам на самай справе непасрэдна атрымаць URL старонкі ў паведамленні ў блогу. Крута. Ёсць пытанні па гэтай нагоды? Няма. Крута. Так што цяпер, калі мы маем мадэль, мы хачу стварыць кантролер, што гэта магчымасць ўзаемадзейнічаць з гэтымі мадэлямі, а затым базы дадзеных. Так што, калі мы зірнем на BlogController, вы заўважыць, што гэта не шмат тут і цяпер. Усё там ёсць функцыя індэкс што стварае хатнюю старонку, але без чаго-небудзь ёсць для адлюстравання яшчэ. Так у першай функцыі што мы збіраемся стварыць гэта той, які дазваляе стварыць пост у блогу. Такім чынам, мы збіраемся аб'явіць Новая функцыя называецца newPost. І тут ўнутры проста, мы збіраемся каб усталяваць гэтую старонку быць зрабіць версію, калі вы памятаеце з CS50, · п пад назвай blog.new, які мы збіраемся стварыць у няшмат. Вы заўважыце, тут, на шостым радку, што мы вызначылі гэтую зменную, макет. І калі мы зірнем у тэчцы Views, ёсць Макеты тэчкі, якая ўключае ў сябе вельмі просты файл HTML. І варта адзначыць, вы заўважыце, што ў нас ёсць гэты кантэйнер вось што дае змест. Так ўнутры нашага шаблону тое, што мы збіраемся зрабіць гэта стварыць тое, што будзе замешчаных непасрэдна ў гэтым макеце. Таму мы сказалі, што мы хочам зрабіць шаблон называецца blog.new. Але ўнутры Блог, ёсць пакуль гэта не новы шаблон. Такім чынам, мы збіраемся стварыць файл з імем new.blade.php. Гэта кажа Laravel, што Гэты файл PHP павінен быць вынесена з Лязо рухавік шаблон. Так што гэта даволі проста файл. Гэта будзе форма, з дапамогай якіх мы на самай справе дадаць у блогу. Так магіі сюды з Ўспадкоўванне з'яўляецца тое, што, эй. Мы хочам, каб паказаць, што раздзел, раздзел змест тут, які акрэслены поsection иstop. Так што паміж тут збіраецца павінны быць падстаўляючы у майстар-макета. А вось тое, што мы хочам зрабіць, гэта вельмі проста стварыць новы HTML файл. Давайце проста дадаць хуткі тытул. Дадаць запіс у блогу. І ў ім, мы збіраецца стварыць форму. Гэтая форма будзе мець дзеянне. І гэта будзе нешта што мы падставім у далейшым, і мы ўбачым, як маршрутызацыі ўпісваецца ў тут. Але мы проста збіраемся вызначыць зараз што гэта ідзе ў URL з маршрутам ад createPost. І тады гэта будзе мець метад пост. У тут, мы збіраемся каб мець два поля. Div клас = "формаў-група". Мы выкарыстоўваем бібліятэку Bootstrap CSS ласкава прадастаўлены Twitter. Такім чынам, мы збіраемся стварыць два з іх. Такім чынам, гэта першы ўваход будзе назва. Так Калі ласка, увядзіце імя = "Назва". Клас = "FormControl". Тып = "тэкст". Я збіраюся дадаць заменнік = "Title". І затым другая з'яўляецца будзе тэкставая вобласць. Name = "змест". Клас = "FormControl". І запаўняльнік = "Напішыце тут". Там мы ідзем. Нарэшце, мы збіраемся дадаць кнопку хуткага ўявіць. Type = "прадставіць" клас = "БТН БТН-асноўнай". Такім чынам, гэтыя ўсе асаблівасці загрузніку што гэта можа быць выкладзеная ў спосабе, якім гэта здабычай для карыстальніка, а не голы HTML. Такім чынам, мы вызначылі кантролер тут. Мы вызначылі вельмі простую пункт гледжання. Але тое, што хапае злучальнай тканіны. Таму на дадзеным этапе, Laravel не мае ні найменшага падання як мы збіраемся на самай справе гэты кантролер. Так гэта вызначана ў файл з імем routes.php. І зараз, у нас ёсць адзін маршрут. Які з'яўляецца, калі мы ідзем у Галоўная шлях для гэтага сайта, гэта будзе аказваць Кантролер індэкс. Дык вось, што нам трэба зрабіць, гэта рэалізаваць Новы маршрут для нас, каб стварыць паведамленне. Таму мы выкарыстоўваем гэты метад атрымаць, які вызначае што, калі карыстальнік спрабуе атрымаць гэта page-- спецыяльна Паведамленне скараціць новы page-- тое, што мы збіраемся зрабіць гэта выкарыстоўваць кантролер пад назвай BlogController новае паведамленне. Той, які мы толькі што стварылі. А потым мы збіраемся псеўданім як newPost. Мы збіраемся стварыць яшчэ функцыя няшмат. Але тое, што тут, пад ключ "як" ёсць што мы можам замяніць у Нашы шаблоны лязо. Так што зараз, давайце на самай справе таксама сказаць маршрут. Такім чынам, мы таксама збіраемся стварыць кантролер так што мы можам стварыць гэтыя паведамленні. Такім чынам, калі карыстальнік публікуе на старонку з пасады скараціць новае, тое, што мы збіраемся зрабіць гэта выкарыстоўвае кантролер, які мы збіраемся стварыць у бліжэйшы час называецца BlogController на createPost. І мы збіраемся стварыць псеўданім гэта з як createPost. Крута. Ёсць пытанні? Крута. Так што давайце працаваць, што мы маем да гэтага часу. Так што, калі мы робім PHP рамесніка служыць, мы ўбачым шмат памылак. Так гэта выглядае, як у нас Сінтаксічная памылка на маршрутах лініі 27. Ах. Адсутнічае кропка з коскі. Так што, калі мы ідзем у 8000, Вы нічога не ўбачыце тут яшчэ. Так што гэта хатняя старонка па змаўчанні. Але калі мы пойдзем на паведамленне слэш новы, эй. Гэта будзе выгляд, што мы толькі што стварылі. Прама зараз, мы не маем рэалізаваная функцыянальнасць пра тое, калі мы націскаем кнопку Адправіць. Так што, калі мы націснем на Адправіць Кнопка, ён збіраецца бегчы памылку. Але мы збіраемся код, які Прама зараз, менавіта тое, што мы хачу зрабіць, калі карыстальнік ўяўляе гэтую форму. Так давайце зробім гэта. Перайсці назад у файл кантролераў. Тое, што мы збіраемся зрабіць, гэта ажыццявіць гэтую новую функцыю што дазваляе стварыць паведамленне. Абвясціць новую функцыю. Грамадская функцыя createPost. І гэтая функцыя будзе трохі больш складаным, чым тое, што у нас было раней. Але вы ўбачыце тут, што мы не адбываецца на самай справе пісаць SQL. ORM, Красамоўным ORM, збіраецца дазволіць нам гэта зрабіць у некаторых спосабы больш элегантны спосаб. Такім чынам, мы збіраемся стварыць новую пасаду. І тут мы асобніка новага аб'екта ад мадэлі, што мы проста створаны, пасля мадэль. І тое, што мы збіраемся зрабіць, гэта ўсталяваць Назва атрыбутам гэтага выкарыстоўваць што-то што мы атрымліваем ад сервера. Такім чынам, гэта падобна на тое, што што было раней у CS50 фінансаў дзе мы хацелі б зрабіць, выкарыстоўваючы Супер Глабальны Паведамленне гледзячы на ​​тытул. Так Laravel забяспечвае некаторую санітарыі і яшчэ шмат чаго, выкарыстоўваючы гэтую дапаможную функцыю. Такім чынам, мы аддалі перавагу б выкарыстоўваць гэта замест таго, гэтай вельмі просты сырам выглядзе з PHP. І тады тое, што мы збіраемся зрабіць, гэта ўсталяваць Змест да ўваходу атрымаць змест. Мы на самай справе адбываецца, каб абгарнуць гэта карысны функцыі што PHP забяспечвае называюць nl2br, што Аказваецца новых ліній NLS, у БРС перапынкі, так што мы можам на самай справе ёсць розныя пункты ў ім. І, нарэшце, тое, што мы збіраемся зрабіць, гэта захаваць гэты пост. Так мы называем функцыю зэканоміць на гэтай мадэлі. Мы збіраемся, каб захаваць сваю пасаду. І, нарэшце, тое, што мы збіраемся зрабіць гэта перанакіраванне карыстальніка спецыяльна на маршрут, які мы збіраемся стварыць у бліжэйшы час, Псеўданім, viewPost. І мы збіраемся прайсці ў аргументах ID, будучы ідэнтыфікатар гэтай новай пасадзе. Выдатна. Такім чынам, калі мы на самай справе пайсці і запусціць гэтую. Мы збіраемся дадаць новую запіс. Давайце сказаць, што гэта семінар 50. І сказаць, вядома. ASDL. Усё роўна. Нейкая змест. І прадставіць яго. І мы заўважылі, што, эй. маршруты не вызначаны. Але калі мы зірнем на PhpMyAdmin і шукаць ці няма нашай функцыі нічога не рабіў. Паглядзіце на пасадах Blog50. Мы заўважылі, што, эй. На самай справе, у нас проста стварыць што блог пост з часовымі пазнакамі, як паказана. Такім чынам, зараз давайце вернемся і фактычна стварыць гэта іншая функцыя ў нашым кантролеры, у прыватнасці, кантролер viewPost. Функцыя viewPost Так грамадскасці. Дык вось што мы будзем рабіць, замест таго, каб мець пустыя дужкі, мы хочам прайсці па ідэнтыфікатару пост, які мы ствараем. А адсюль, што мы збіраемся рабіць на самай справе зварот у базу, для яго. Так што, калі мы ў тэмах, ёсць функцыя, званая Знайсці што дазваляе запытаць яго ID. У прыватнасці, на самай справе, мы збіраемся выкарыстоўваць альтэрнатыўную версію гэтага называецца Знайсці ці не, што дазваляе нам кінуць з гэтай функцыі, кінуць выключэнне, калі ID мы перадаем не існуе. І тады мы будзем нешта рабіць падобна на тое, што мы рабілі раней дзе мы ўсталёўваем ўтрыманне гэтай старонцы, каб быць аказана версія гэтага новага погляду які мы збіраемся стварыць, blog.view. І мы збіраемся перайсці ў it-- гэтак жа, як у CS50 зрабіць function-- слоўнік зменных. Ключы гэтага асацыятыўнага масіва стаць зменных ў шаблоне. Так што мы збіраемся рабіць пасля паста. Так праходзяць ўскосна пост, мы запытваецца з базы дадзеных. , Цяпер тое, што мы збіраемся стварыць гэты выгляд так што мы можам на самай справе глядзець Паведамленні ў блогу, што мы пабудавалі. Такім чынам, мы збіраемся стварыць файл з імем view.blade.php. Так ўнутры гэтага шаблону, тое, што мы збіраемся зрабіць разам узятыя проста старонка, дазваляе адлюстроўваць змесціва. Так мы робім раздзел, што, перш чым змест. Стоп. І тое, што мы збіраемся зрабіць у тут напісаць які-небудзь HTML для адлюстравання гэтай старонкі. Такім чынам, мы збіраемся, каб абгарнуць яго з фантазіі Новы элемент HTML5 пад назвай артыкула. І тут мы ідзем мець загалоўка, у якім мы збіраемся проста мець h1, які ўключае ў сябе загаловак запісу. Дык вось, калі мы паглядзім на гэта падвойныя фігурныя абазначэння дужкі, гэта будзе рабіць па сутнасці PHP рэха загаловак паста. Так што гэта карысна скарачэнне што Laravel дае нам. Такім чынам, мы збіраемся выкарыстаць гэта абазначэнне замест гэтага. І вось, мы збіраемся таксама раздрукаваць ўтрыманне яго. І тут мы ідзем зрабіць пост змест. І на дне, што мы збіраюся зрабіць, гэта стварыць калантытул. І ў склепе, мы збіраемся Першы паказ, калі гэта была размешчана. Так што гэта была размешчана на, створаны ў. І Laravel выкарыстоўвае вельмі прыемна Дата бібліятэкі пад назвай Carbon. Так што мы можам зрабіць што-то пад назвай difforHumans, што вы бачылі раней. Калі мы ў курсе. гэта скажу, як, пяць секунд таму. Так што гэта вельмі прыемна Функцыянальнасць Laravel. І, нарэшце, мы збіраемся каб закрыць гэты склеп. Такім чынам, калі мы вернемся да Галоўная старонка мы збіраемся не бачу нічога тут яшчэ і таму, мы не кадуецца да хатнюю старонку. Але калі мы пойдзем на паведамленне слэш адзін, мы збіраемся, каб убачыць выключэнне. Хто-небудзь ведае, чаму мы бачым выключэнне? Што нам не хапае? Любыя ідэі? Такім чынам, што ж мы робім раней для нас на самай справе каб вызначыць, як мы дабяромся да канкрэтныя кантралёры? SPEAKER 1: маршрут? Эрык Ауян: Так. Такім чынам, мы па-ранейшаму павінны вызначыць маршрут. Такім чынам, мы вернемся сюды, каб routes.php. Вы заўважыце, што мы фактычна не вызначаны як мы збіраемся, каб атрымаць для гэтага кантролера. Так што цяпер мы будзем вызначаць гэты маршрут. Гэта даволі проста, падобна на тое, што мы рабілі раней. Але тое, што мы збіраемся адзначыць тут што мы будзем мець запаўняльнік. Так што, калі мы робім route.get слэш ідэнтыфікатар паста. Так ID цяпер, што будзе быць перададзеныя ў кантролер. Гэта збіраецца выкарыстоўваць кантролер, які мы толькі што створаны, BlogController на viewPost. І мы збіраемся Псеўданім гэта як viewPost. Выдатна. Такім чынам, зараз мы збіраемся стварыць гэты маршрут. Так што цяпер, калі мы ідзем тут і абновіце гэтую старонку, мы на самай справе сапраўды ёсць наш новы пост у блогу. Так што гэта тое, што мы стварылі раней. Вельмі простая старонка, але адлюстроўвае паведамленне ў блогу, што мы толькі што стварылі. Крута. І калі мы на самай справе ісці праз увесь Працэс стварэння новай запісу ў блог, мы заўважылі, што ўсе перанакіроўвае правільна. Калі я кажу "Прывітанне. Я Джонатан Тан ". Скажам, "Гэта мой блог." І прадставіць яго, гэта створыць Гэты новы пост у блогу з ID 2, якая павялічвае ад таго, што мы мелі раней і адлюстроўвае яго правільна. Высокі. Ёсць пытанні? Так? SPEAKER 2: Ці ёсць Laravel ручку санітарная апрацоўка і ўсё для вас? Эрык Ауян: Так. Таму, калі мы бачылі раней, калі мы зрабілі ўваход тоўстай кішкі тоўстай кішкі атрымаць, што санирующей любы SQL ін'екцыі і яшчэ шмат чаго які мы маглі б выканаць, калі мы зламыснік сайта. Так Laravel апрацоўвае шмат таго, што за кулісамі. Добры пытанне. Такім чынам, давайце зірнем на галоўнай старонцы. Так што, калі мы спачатку вярнуцца да кантролер для хатняй старонцы, Вы заўважыце, што ён не рабіць тут. Вы заўважыце, што мы не пераходзячы ў гэтым кантролеры нічога асабліва карысным. Гэта толькі ў гэтым індэксны файл. Такім чынам, давайце пераходзіць у гэта нешта карыснае. І ў прыватнасці, мы збіраецца прайсці на пасадзе. І Laravel дазваляе зрабіць запіс усяго, што дазволіць нам атрымаць усе паведамленні. Цяпер, калі мы вернемся да index.php, вы ўбачыце, эй. Нічога яшчэ няма. Але тое, што мы хочам зрабіць тут на самай справе перабору, зрабіць цыкл па кожнаму элементу над пасад, якія дазваляе раздрукоўваць паведамленні. Так Foreach паведамленняў як пасаду, што мы хочам зрабіць, гэта раздрукаваць змесціва з паведамлення ў блогу. Але адна рэч, вы заўважыце, што мы на самай справе напісаў вялікую частку гэтага кода ўжо ў view.blade.php. Так што мы збіраемся на самай справе зрабіць гэта выкарыстоўваць добры карысную функцыю ляза і вынесці за гэты агульны код. Так мы ідзем сюды. Мы збіраемся ўзяць гэты кантэнт прама тут, і тое, што мы збіраемся рабіць гэта стварыць новую тэчку. Давайце проста называюць яго частковых. І тут мы ідзем стварыць post.blade.php. Дык вось, мы факторизовали шлях у якія мы хочам адлюстраваць гэтыя паведамленні. І вось што мы будзем рабіць, а не фактычна не маючы, што HTML наўпрост, мы збіраемся выкарыстоўваць гэтую дырэктыву называецца ўключаюць blog.partials.post. І тое, што мы збіраемся зрабіць тут гэта перадаць на пасадзе старонкі. Такім чынам, калі мы вернемся сюды, мы заўважыць, што функцыянальныя магчымасці па-ранейшаму такі ж. Але цяпер у нас ёсць гэта факторизовали код, на гэты HTML. Такім чынам, мы можам выкарыстоўваць яго ў індэкс. Дык вось, гэта вельмі проста. Усё, што мы робім, гэта ўключыць blog.partials.post і масіў. І дзе-то ў і раней, мы пасля паста. Такім чынам, калі мы вернемся да хатняя старонка, мы ўбачым, што, эй. У нас ёсць спіс усіх паведамленні ў блогу, якія мы мелі раней. Мы, магчыма, захочаце дадаць некаторыя "калі" ўмовы і "інакш" ўмовы так што калі ў нас няма што-небудзь на блогу, мы хочам паказаць нешта карыснае. Маўляў, эй. Там не мае зместу, але на блогу. І калі вы, хлопцы, на самой справе выглядаюць на Код размеркаванне на GitHub, вы ўбачыце прыклад таго, як мы робім гэта. Крута. Ёсць пытанні? Так. SPEAKER 2: Я думаю, проста Асноўнае пытанне ,. Вярнуцца на маршруце. Эрык Ауян: Так. Калі мы зірнем на маршрутах. SPEAKER 2: Дзе uses.blogcontroller на стварэнне пост, што гэта накіроўваюць нас да? Эрык Ауян: Так. Так. SPEAKER 2: Ці тое, што that-- Эрык Ауян: Такім чынам, зірнем, скажам, Напрыклад, гэты маршрут прама тут. Першая частка з'яўляецца фактычным URL, што карыстальнік будзе пайсці. І гэты масіў тут, Асацыятыўны масіў, вызначае як мы хочам, каб акт прымянення ў адказ на гэта. Так выкарыстоўвае гэта кантролер, функцыі, якія мы хочаце патэлефанаваць, калі карыстальнік пераходзіць да гэтага URL. Так viewPost тут быў функцыя, якую мы вызначаецца ўнутры з BlogController-- SPEAKER 2: Я бачу. Эрык Ауян: --so, што мы можа на самай справе зрабіць выгляд, выканаць некаторыя разлікі, ўзаемадзейнічаць з базай дадзеных SQL. SPEAKER 2: ОК. Эрык Ауян: А потым іншыя частка, "як" гэта псеўданім, які мы выкарыстоўваем. Так што, калі мы заўважаем, калі мы стварылі форму, Вы заўважыце, што URL :: routecreatePost. Так ён замяняе ў фактычнай URL, так што мы не складана кадавання іх у так што мы можам змяніць яго калі, скажам, калі мы хацелі перайменаваць. Замест таго, каб пасля касой рысы новае, мы хочам зрабіць падобнае, р скараціць новы проста ачысціць да нашых адрасоў бітаў. Усё змянялася ў адным месцы, а чым ва ўсіх розных файлаў. Крута. Гэта добра. Так што цяпер у нас ёсць вельмі Асноўны блог-платформа. Мы, верагодна, хочаце дадаць кнопкі, каб што мы сапраўды можам ствараць новыя паведамленні. Так што, калі мы зірнем на макет Настаўнікі, у нас ёсць раздзел пад назвай загалоўка правай што мы толькі што вызначылі на вяршыні. Такім чынам, мы можам дадаць кнопкі верхняя частка загалоўка. Так што, калі мы ідзем у index.blade.php, на самай справе зрабіць, гэта вызначыць, што адбываецца ўнутры тут. Так у гэтым раздзеле загалоўка справа, тое, што мы збіраемся зрабіць гэта дадаць ў кнопку, каб перайсці да URL вызначаецца па маршруце новай пасадзе. Проста, каб ачысціць яго і зрабіць гэта даволі і ўсё Bootstrap, мы збіраемся зрабіць гэтая кнопка па змаўчанні. Давайце проста зрабіць яго вялікім для задавальнення. А ўсярэдзіне яго, мы маглі б паставіць якой-небудзь тэкст. Але тое, што Bootstrap забяспечвае з'яўляецца glyphicons. Так што мы можам на самай справе дадаць, што добры аловак, які мы бачылі раней. Glyphicon. Glyphicon-аловак. Так што гэта дазволіць нам паставіць У значок замест тэксту. Цяпер, калі мы спыніць гэта будзе вызначаць гэты раздзел. І, эй. У нас ёсць добры кнопку, якая звязвае нас непасрэдна дадаць старонку блога пост. Такім чынам, мы маем даволі просты блог. Мы можам дадаць матэрыял на яго. Але тое, што мы звычайна чакаем ад блогах каментароў. Так што гэта сапраўды важна для нас, сказаць, калі хто-то наведвае вэб-сайт і сапраўды любіць пост, яны могуць удзельнічаць у абмеркаванні з іншымі людзьмі, якія наведваюць старонку. Такім чынам, мы збіраемся пайсці і стварыць Новая табліца базы дадзеных і новая мадэль так што мы можам звязаць каментары з пасадаў. Такім чынам, першы крок, гэтак жа, як і раней, з'яўляецца тое, што нам трэба запусціць міграцыю. Так як раней, мы робім PHP рамеснік мігруюць: зрабіць. І мы збіраемся, каб стварыць адну называецца create_comments_table. Гэта створыць файл што мае наш новы міграцыі. І мы збіраемся, як перш, вызначыць новую табліцу. Так Схема :: стварэння табліца з імем каментары. Гэтая функцыя тут. А ўнутры гэтай табліцы, што мы збіраемся зрабіць, гэта па-першае, як і раней, прысвоіць ідэнтыфікатар. Павялічвае ID. Мы збіраемся, каб дазволіць карыстачам мець зносіны іх назвы з асаблівым каментар. Мы збіраемся, каб мець змест, якое ідзе разам з гэтым, тэкставае ўтрыманне. А вось тое, што мы збіраемся зрабіць што-нешта іншае. Мы збіраемся стварыць цэлае што называецца post_id, якія будзе азначаць якую пасаду што спецыфічны каментар ідзе з. Акрамя таго, мы на самай справе адбываецца ў ўсталяваць абмежаванне знешняга ключа па гэтым пытанні. Так MySQL будзе прымяняць гэта. Мы не спрабуем прызначыць Колькасць каментарыяў 5 для размяшчэння 5000, калі мы не было 5000 паведамлення пра яго. Такім чынам, што мы робім тут, мы робім замежных post_id збіраецца быць звязаныя з поле ID ад пасады табліцы. І мы будзем на самай справе што-то зрабіць яшчэ карысна, гэта OnDelete. Так што, калі мы выдаляем некаторыя Паведамленне з базы дадзеных, што мы хочам каскадам выдаляе каментароў, а таксама. Таму што гэта не вельмі карысна для нас заўвагі па пасадзе што не існуе. І, нарэшце, як і раней, мы збіраецца ўсталяваць часовыя пазнакі на гэтым. І, як і раней, мы збіраемся ёсць зваротная міграцыя будзе выдаленне табліцы каментары. Такім чынам, калі мы вернемся сюды, мы збіраемся запусціць гэтую міграцыю, майстравых, мігруюць. А цяпер ён ужываецца гэта міграцыя, што мы толькі што стварылі. Так што, калі мы паглядзім на PhpMyAdmin, што мы робім, на самай справе, у цяперашні час ёсць каментарыі табліцу, якая мае структура, якую мы толькі што паказана. Так як раней, мы збіраецца стварыць новую мадэль да абстрактнага табліцы SQL што мы толькі што стварылі. Таму давайце дадамо новы файл. Мы збіраемся называць яго Comment.php. І гэта на самай справе будзе даволі проста з невялікім змяненнем ад чаго, што было раней. Так клас Каментарыі пашырае красамоўны. І тое, што мы збіраемся зрабіць тут вызначыць гэта функцыя, якая з'яўляецца Адносіны з іншымі мадэлямі. Такім чынам, мы будзем мець пасля функцыі вось што вяртае гэтую сувязь. Такім чынам, мы удакладніўшы, што Гэта ставіцца да паведамлення, кажучы, што ёсць адзін пост што гэты каментар ставіцца. Гэта на самай справе павінен быць капітал P для дадзенай мадэлі. А цяпер толькі на іншы фліп бок, мы павінны сказаць, што, эй. Паведамленняў есть каментары. Так што мы збіраемся зрабіць, гэта вызначыць каментары грамадская функцыя. І вось вяртаецца Гэта мае шмат каментар. Так што цяпер чароўным, калі ў нас ёсць пост, мы можам атрымаць каментары атрыбутаў і ён будзе запоўніць яе Інфармацыя з базы дадзеных. Такім чынам, давайце на самай справе ісці да канца і дадаць новую функцыю, на наш погляд файле так што мы можам і дысплей і ствараць каментары. Такім чынам, мы збіраемся, каб вызначыць новую секцыю. Давайце проста адлучыць яго з гарызантальнай лініі. Раздзел ID = "каментары". Тое, што мы збіраемся зрабіць вось, як і раней, перабору ўсіх каментароў. Таму на самай справе, як мы робім гэта, як я ўжо казаў, даволі магічнае. Мы робім пакідаць каментары. І тады мы можам зрабіць гэта для кожнага цыкл па кожнай з каментароў. І тое, што мы збіраемся зрабіць клас DIV каментар, і мы збіраемся на самай справе раздрукаваць гэты каментар. Так адлюстравання, што эй, каментары name-- чалавека , Якія размясцілі гэты comment-- кажа кропка кропка кропка. Мы збіраемся зрабіць гэта ў блоку цытата, проста каб зрабіць гэта добра выглядаць. А потым каментаваць Блакаваць змесціва цытату. І Еогеасп. Так што цяпер гэта будзе цыкл праз усе каментары які звязаны з кожным з паведамленняў і адлюстравання кожнага з гэтых заўваг. Я збіраюся дадаць яшчэ адзін падзел ўніз тут, які дазваляе дадаць каментар. Так h3 клас. Пакладзеце назву тут. Дадаць каментар. І мы збіраемся вызначыць новую форму. Так як раней, мы збіраецца рабіць выгляд дзеянні. І вось, новая акцыя мы будзе вызначаць новы кантролер, які дазваляе нам рэагаваць на паведамленне запыты для стварэння каментароў. Так URL :: Маршрут createComment. Я збіраюся прайсці ў параметры тут. ID паста, што мы ствараем каментар на. І тое метад гэтым Форма будзе пасля. Цяпер мы збіраемся дадаць у два поля, форма група. Гэта будзе уваход з Назва "Імя" і класа = "формаў-кантроль», тып = "тэкст", а з Прататып = "Імя". Мы таксама збіраемся вызначыць іншае поле формы, якая будзе тэкст вобласці, як было раней. Гэтак жа, як і раней, называць яго змест. Клас = "форма кантролю." Запаўняльнік = "Напішыце тут." І проста так, што мы можа на самай справе прадставіць яго, прадставіць тып і клас = "БТН БТН-першасныя." Зачыніце форму. Зачыніць гэта дзеянне. Так што цяпер, калі мы абновіце гэтую старонку, дзе у нас ёсць, скажам, тую ці іншую пасаду. Мы павінны перазагрузіць сервер. PHP рамеснік служыць. Перазагрузіце гэта. Мы павінны вызначыць маршрут. Але цяпер, давайце проста прыняць гэта так, што мы можам на самай справе паказаць вам, што старонка выглядае, а затым мы на самай справе стварыць гэты маршрут. Так, эй. У нас ёсць новы від сюды так што мы можам ствараць каментары. Такім чынам, давайце на самай справе вызначыць функцыі ў кантролеры так што мы можам дадаваць каментары. Давайце вернемся. І на працягу blogcontroller.php, тое, што мы збіраемся зрабіць гэта стварыць новую функцыю называецца стварыць каментар. Грамадская функцыя createComment. Гэта будзе мець аднаго Параметр, ID пасад што мы каментуючы. І, як і раней, мы будзе спачатку атрымаць пасаду. Так пісаць findOrfail ID. Пасля гэтага, мы збіраемся для стварэння новага каментара. Так каментарый = Новы каментар. Каментар Імя = Уваход :: атрымаць імя. Каментар ўтрыманне = жа новая лінія у перапынках ўваходных :: атрымаць змест. І, нарэшце, мы збіраемся мець, каб звязаць гэты каментар з гэтай пасады. Такім чынам, мы збіраемся выкарыстаць Гэтая функцыя, каментары, што дазваляе нам эканоміць гэтыя адносіны. Так што цяпер гэты каментар будзе аўтаматычна пасля ID. Мы маглі б таксама ўсталяваць яго ўручную, але гэта больш зручным для чытання, наколькі як функцыя ідзе. І пасля таго як мы выканаць гэта тое, што мы хочам зрабіць, гэта перанакіраванне карыстальніка на маршрут, зададзенае па viewPost з масівам з Параметр паштовага ідэнтыфікатара. І зараз, так што гэта на самай справе функцыі, мы павінны вызначыць гэты маршрут. Маршрут :: Post. І зараз мы збіраемся назваць гэта Паведамленне скараціць ID слэш каментар. Масіў выкарыстоўвае новую функцыю што мы толькі што стварылі. BlogController. CreateComment як createComment. Выдатна. Так што цяпер, спадзяюся, калі мы абновіце гэтую старонку і дадаць у каментар, скажам, Дэвід малая. "Спадзяемся, што гэта працуе." Адправіць. Мы, па сутнасці, ёсць каментары на гэтай пасадзе ў блогу. Крута. Так што цяпер у нас ёсць даволі функцыянальная блогу. Мы толькі збіраемся дадаць пару налад, так што ў нас ёсць яшчэ некалькі карысных Інфармацыя аб гэтых пасадаў. Так што, калі мы вернемся да Галоўная старонка, у нас няма ніякага сэнсу колькі каментары на кожным з гэтых пасад. Так што мы на самай справе адбываецца зрабіць гэта, у нашай мадэлі, вызначыць дапаможную функцыю, якая дазваляе нам паказаць колькасць каментарыяў якія ідуць з канкрэтнай пасады. Такім чынам, мы збіраемся стварыць дапаможная функцыя. Грамадская функцыя. GetNumCommentsStr. Так радок, якая вызначае колькасць каментароў, якія выходзяць разам з ім. І тое, што мы збіраемся зрабіць, гэта сказаць, што Num = гэта каментары ў рахунак. Такім чынам, мы збіраемся, каб разлічваць Колькасць каментароў. І калі гэта лік роўна 1, мы проста хачу, каб вярнуцца 1 каментар. А потым у адваротным выпадку, мы хочам, каб вярнуцца канкатэнацыя піт і каментары, такім чынам мы атрымліваем плюрализация правільна. Проста зрабіць гэта адзінарныя двукоссі. Адзін каментар. І зараз мы можам выкарыстоўваць гэтую функцыю непасрэдна ўнутры нашага зроку. Так што, калі мы вернемся да частковыя паведамленняў, якія мы стварылі, зараз мы хочам на самой справе адлюстраваць шэраг заўваг. Такім чынам, што мы можам зрабіць, гэта Паведамленне, выкарыстоўвайце гэтую функцыю што мы толькі што стварылі, каб адлюстраваць шэраг заўваг. Такім чынам, калі нам абнаўлення, ён робіць, на самай справе, дысплей лічбавыя каментары якія ідуць разам з ёй. Калі б мы хацелі быць вытанчанай, калі вас рэальна зірнуць на код размеркавання, мы можам на самай справе спасылаюцца гэта каментарах. Калі вы памятаеце, мы вызначылі ў глядзець, што гэта мае раздзел ID каментары. Так што, калі мы на самай справе хацелі звязаць непасрэдна раздзеле каментароў, што мы будзем рабіць тут HREF Адрас маршруце viewPost. Перайдзіце ў масіве ID пост ID. А потым мы хочам паехаць у у прыватнасці, раздзел каментароў. Вось давайце зачыніць тэгам. Так што цяпер, калі мы абновіце гэтую старонка, клікаем па гэтым пытанні. Мы пойдзем прама да раздзел каментары. Калі б мы мелі больш доўгую пошту, вы можаце Убачыць гэты адскок ўніз. Але вы заўважыце, што гэта не ў верхняй частцы старонкі. Крута. Выдатна. Дык вось даволі простая прыклад чаго-то простага што вы можаце зрабіць з Laravel. Але вы можаце заўважыць тут, што мы зрабілі шмат рэчаў, з даволі невялікай колькасцю кода. Laravel дазваляе нам рабіць SQL запыты за кулісамі. Гэта робіць санітарыі для нас за кулісамі. Дазваляе нам, каб зрабіць гэтыя адносіны вельмі лёгка і без нас неабходнасці рабіць якія-небудзь SQL далучыцца заявы аб'яднаць каментары з тым, што пасады. Дазваляе нам рабіць гэта ўспадкоўванне шаблонаў так што мы можам вызначыць гэтыя ўкладанні файлы, так што мы не паўтараючы сябе, гэтак жа, як калі мы былі, што адлюстраванне паведамленняў у блогу што мы не павінны скапіруйце і ўстаўце код. І тут вы можаце пабудаваць больш складаныя прыкладання. Вы можаце сабе ўявіць, калі мы хацеў рэалізаваць увайсці ў, мы маглі б сказаць, прыносяць у трэцяй партыі структура, якая дазваляе нам рабіць гэта. Там куча з іх што, сапраўды, вельмі Выдатна, што можна зрабіць, як, аднаўленне пароля. І гэта будзе дасылаць вам Скід пароля электроннай пошты. Мы можам рэалізаваць дазвол так што я магу стварыць пост, але хто-то не магу яго адрэдагаваць. Мы можам рэалізаваць Функцыянальнасць выдаляць паведамленні. Але вы можаце паглядзець тут, што мы маем даволі Шмат усяго рудыментарных кампаненты пабудаваць некаторыя сапраўды, сапраўды, дынамічны і займальны вэб-прыкладанняў. Так з гэтым, я думаю, што мы добра. Як вы, хлопцы, ёсць якія-небудзь пытанні? Так? SPEAKER 3: Як вам атрымаць статычны кантэнт? Эрык Ауян: Статычны кантэнт. Такім чынам, вы бачылі раней, што, калі мы былі гэта прама тут, гэта змест макета, Паглядзець робіць, мы мелі гэта без гэтага масіва пасля гэтага. Blog.index, у нас было гэта як толькі статычны файл. Так што, калі мы не праходзяць што-небудзь разам з ім, гэта будзе проста аказваць HTML напрамую. Але калі мы пяройдзем у гэтым асацыятыўным масіў паведамленняў, якія дынамічна выцягнуў з базы дадзеных, мы можа зрабіць старонку дынамічнай. Крута. Любыя іншыя пытанні? SPEAKER 3: Як бы вы параўнаць Laravel, можа быць, некаторых іншых варыянтаў? Эрык Ауян: Вядома. Так. Так Laravel is-- гэта вялікі question-- адзін з многіх варыянтаў для вэб-фреймворков. Так Рубін на Rails з'яўляецца той, які папулярны. Я лічу, што Twitter калі-то ажыццяўляецца з Рубінам на Rails. Я думаю, што яны так перамыкацца. Там яшчэ адзін называецца FuelPHP. Так Рубін на Rails выкарыстоўвае Ruby, мова і рэалізуе шмат матэрыялу MVC што мы бачым тут. FuelPHP яшчэ адзін рамкі PHP. Django з'яўляецца адным з маіх любімых. Гэта вэб-фреймворк для Python. Такім чынам, вы можаце напісаць вэб-прыкладанне ў Python. Так што тона гэтых варыянтаў. Laravel, я думаю, што ў агульным і вялікая мая любімая права Зараз для PHP толькі таму, што кампанентаў пра якія мы гаварылі раней. Гэта Кампазітар уключаны. Яна ўключае ў сябе вельмі, вельмі выразныя ORM сістэма. Таксама мае сапраўды дзіўны шаблонаў Мова, што некаторыя з іншых проста не даюць. І міграцыі. Міграцыі з'яўляюцца дзіўнымі, а таксама. Прахладны? Высокі. Ну, дзякуй за глядзець гэты семінар, і ўдачы ў вашых канчатковых праектаў.