SlideShare a Scribd company logo
1 of 24
Practical symfony 4дөх өдөр<br />4 Aug <br />The Controller and the View<br />Өчигдөр бид symfony өгөгдлийн баазыг хэрхэн энгийнээрdatabase engine хоорондын ялгааг abstract хийдэг, харилцан холбоотой элемент (relational element) –ыг объект хандалтад класс болгохыг  судалдсан. Мөн бид Doctrine-оор өгөгдлийн баазын схем (schema) –г тодорхойлох, хүснэгт үүсгэх, мөн баазаас өгөгдлийг цуглуулахыг авч үзсэн.<br />Өнөөдөр бид өчигдрийн үүсгэсэн үндсэн job модуль-г өөрчлөхболно. Job модуль аль хэдийн бидэн хэрэгтэй Jobeet –д байх бүх кодуудыг агуулсан байгаа.<br />• Бүх ажлыг жагсаах хуудас<br />• Шинэ ажил үүсгэх хуудас<br />• Өмнөх ажилыг засварлах хуудас<br />• Ажлыг устгах хуудас<br />Код ашиглахад бэлэн байгаа хэдий ч бид Jobeet-ын шаардлагад тохируулахын тулд template-үүдийг дахин байгуулна.<br />The MVC Architecture<br />Хэрэв та ямар нэгэн framework ашиглахгүй PHP вэбсайт хөгжүүлж байсан бол HTML хуудас бүрт нэг PHP файл гэсэн дүрмээр ажиллаж байсан байх.  Тэдгээр PHP файлууд нь нэг ижил төрлийн бүтцийг агуулдаг: үүсгэх, ерөнхий тохиргоо, хүсэлтийн хуудастай холбоотой бизнес логик, баазаас өгөгдөл цуглуулах мөн эцэст хуудсыг үүсгэх HTML хуудас гэх зэрэг.<br />Та магадгүй HTML хуудсаас template-ын логик-ыг тусд ашиглаж байсан байх. Мөн та баазын abstraction layer—ыг тусд нь бизнес логик-с ангид авч ашиглаж байсан байж магадгүй.  Гэсэн ч  та ихэвчлэн эмхтгэхэд нилээн төвөгтэй маш их кодтой л үлддэг байсан.<br />Хэдийгээр хийхэд нилээн хурдан боловч, хөгжүүлэх тусам өөрчлөлт хийхэд төвөгтэй болж, таниас бараг  өөр хүн хэрхэн хийгдэж, ажиллаж байгааг бараг ойлгохгүй болдог.<br />Энэ бүх асуудлаас гарах сайхан шийдэл бас байнаа. Вэбийн хөгжилд өнөө үед кодоо  зохицуулах хамгийн түгээмэл шийдэл бол MVC загварчлалын  хэв маяг юм. Товчхондоо, MVCзагварчлалын хэв маяг нь кодыг тань байх ёстой зарчмых нь дагуу зохицуулахыг тодорхойлдог. Энэ хэв маяг нь кодуудыг 3 давхаргад (layer) –т хуваан авч үздэг.<br />• The Model давхарга бизнес логикийг тодорхойлдог  (өгөгдлийн бааз мөн энэ давхаргад хамаарна). Та symfony  бүх класс болонModel-той холбоотой бүх файлуудыг lib/model/ хавтасд хадгалдгыг аль хэдийн мэдсэн байх.<br />• The View хэрэглэгч ямар зүйлтэй харицаж байгаа байдал(template engine энэ давхаргын нэг хэсэгт орно). Symfony-д голдуу View давхарга нь PHP template-ээр үүсдэг. Тэд өөр өөр templates/ хавтасд хадгалагддаг. Өнөөдрийн хичээлээр үүнийг харна.<br />• The Controller бол хэрэглэгчээс хүссэн өгөгдлийг Modelхэсгээс View давхарга руу дамжуулах Model-ыг дуудах багахан код. Эхний өдөр symfony-ыг суулгах үед бүх хүсэлт front controller-р зохицуулагддыг харсан (index.php ба<br />frontend_dev.php). Эдгээр контроллорууд нь яг жинхэнэ ажиллахaction-уудыг төлөөлдөг. Өчигдөр харсанчлан тэдгээр action-гууд логикоор module-уудад бүлэглэгдэн байрладаг.<br />Өнөөдөр бид 2 дахь өдөр тодорхойлогдсон гараар гаргасан загварын дагуу нүүр хуудас болон job хуудсыг өөрчлөх болно. Бид мөн тэдгээрийг динамик болгоно. Тэдгээрийн хажуугаар бидsymfony-ийн хавсын бүтцийн дагуу, кодуудыг давхаргуудаар тусгаарлах зэрэг маш их чимхлүүр ажил хийнэ.<br />The Layout<br />Хэрэв та гараар гаргасан загварыг сайн харсан бол ихэнх хуудас бүр ижилхэн харагдаж байгааг ажигласан байх.  HTMLэсвэл PHP код гэдгээс хамааран код дахин давтах нь муу арга гэдгийг та мэдэж байгаа байх. Тиймээс бид харагдах элементүүдийг дахин код давтагдахгүйгээр харуулах арга замыг олох хэрэгтэй болно.<br />Энэ асуудлыг шийдэх нэг арга бол header болон footer-ыг тусд нь үүсгээд include хийж  template  бүрт дуудаж өгөх.<br />Гэвч энд header болон footer файлууд нь яг үнэн HTML –г агуулахгүй.  Энэнээс өөр дээр арга байх ёстой. Өмнө байсан зүйлийг дахин үүсгэхийн орон бид энэ асуудлыг шийдэх өөр нэг загварчлалын хэв маягийг хэрэглэнэ. Decorator загварчлалын хэв маяг (design pattern).http://en.wikipedia.org/wiki/Decorator_pattern<br />Decorator design pattern нь өөр аргаар энэ асуудлыг шийднэ:global template-ээр content нь өгөгдсөний дараа template нь чимэглэгдэнэ. Үүнийг symfony –д Layout гэж нэрлэнэ.<br />Application-ны  default layout нь layout.php гэж дуудагддаг бөгөөдapps/frontend/templates/ гэсэн хавтасд байрлана. Энэ хавтас нь бүх глобал template-үүдийг агуулдаг.<br />Дараах кодоор default symfony-ийн layout-ыг өөрчил.<br /><!– apps/frontend/templates/layout.php –><!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”><html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” lang=”en”><head><title>Jobeet – Your best job board</title><link rel=”shortcut icon” href=”/favicon.ico” /><?php include_javascripts() ?><?php include_stylesheets() ?></head><body><div><div><div><h1><a href=”<?php echo url_for(‘job/index’) ?>”><img src=”http://www.symfony-project.org/images/logo.jpg”alt=”Jobeet Job Board” /></a></h1><div><div><h2>Ask for people</h2><div><a href=”<?php echo url_for(‘job/index’) ?>”>Post a Job</a></div></div><div><h2>Ask for a job</h2><form action=”quot;
 method=”get”><inputid=”search_keywords” /><input value=”search” /><div>Enter some keywords (city, country, position, …)</div></form></div></div></div></div><div><?php if ($sf_user->hasFlash(‘notice’)): ?><div><?php echo $sf_user->getFlash(‘notice’) ?></div><?php endif; ?><?php if ($sf_user->hasFlash(‘error’)): ?><div><?php echo $sf_user->getFlash(‘error’) ?></div><?php endif; ?><div><?php echo $sf_content ?></div></div><div><div><span><img src=”http://www.symfony-project.org/images/jobeet-mini.png” />powered by <a href=”http://www.symfony-project.org/”><img src=”http://www.symfony-project.org/images/symfony.gif”<br />alt=”symfony framework” /></a></span><ul><li><a href=”quot;
>About Jobeet</a></li><li><a href=”quot;
>Full feed</a></li><li><a href=”quot;
>Jobeet API</a></li><li><a href=”quot;
>Affiliates</a></li></ul></div></div></div></body></html><br />Symfony-ын template нь жирийн PHP файл. Layout template-д таPHP функц дуудалт  болон PHP хувьсагчыг харсан байх.~$sf_content~ бол хамгийн сонирхолтой хувьсагч: Энэ ньframework-оос өөрөөс нь тодорхойлогдсон ба action-аар боловсруулагдсан HTML-ийг агуулдаг.<br />Хэрэв та Брауз хийгээд job модулийг харвал(http://jobeet.localhost/frontend_dev.php/job),  бүх action layout-аар хүрээлэгдсэн (чимэглэгдсэн) байгааг олж харна.<br />The Stylesheets, Images, and JavaScripts<br />Энэ хичээл нь  загварчлалых биш болохоор бид аль хэдийнjobeet-д ашиглагдах нэмэлтүүдийг бэлтгэсэн байгаа:  шахсан зураг http://www.symfony-project.org/get/jobeet/images.zip<br />, stylesheet-үүдийг эндээс татаж аваад web/images/,  web/css/ хавтасд хадгал.<br />Layout –д бид favicon-ыг include хийсэн байгаа.  Та Jobeet-д зориулсныг эндээс татаж аваад web/ гэсэн хавтасд байрлуул.<br />Default –аараа generate:project команд нь project-ийн нэмэлтүүдэд зориулж 3 –н хавтсыг үүсгэдэг:  зураг-дweb/images/, stylesheets-д web/css/, javascript-үүдэд web/js/хавтсыг.<br />Энэ нь symfony-с тодорхойлогдох бас нэг давуу тал бөгөөд мэдээж та өөрийн хүссэнээр тэдгээрийг web/ хавтасын хаа нэгтээ хадгалж бас болно.<br />Овсгоотой уншигч main.css файл default layout-ийн хаана нь ч дурьдагдаагүй болохыг ажигласан байх. Энэ гарцаагүй HTML-ээр харагдана. Гэвч энэ алга байна. Яаж ийм байж боломжтой вэ?<br />Stylesheet файлууд Layout-ын <head> tag-н доторхinclude_stylesheets() функцээр дуудагдан гарна.include_stylesheets() функцыг helper гэж нэрлэдэг. Helper болsymfony –д тодорхойлогддог параметер авч HTML код буцаадаг функц юм.<br />Ихэвчлэн helper-үүд template-үүдэд хэрэглэгдэх кодуудыг багцалж байдаг учираас цаг хэмнэгч болдог.include_stylesheets() helper stylesheet-үүдийн <link> tag-ийг үүсгэдэг.<br />Харин helper аль stylesheet-үүд include хийгдэх ёстойг яаж мэдэх вэ?<br />View давхарга нь application-ны тохиргооны файл болохview.yml гэсэн файлыг edit хийж тохируулж өгч болдог. Дараах код нь generate:app командаар үүссэн default нь:<br /># apps/frontend/config/view.yml<br />default:<br />http_metas:<br />content-type: text/html<br />metas:<br />#title: symfony project<br />#description: symfony project<br />#keywords: symfony, project<br />#language: en<br />#robots: index, follow<br />stylesheets: [main.css]<br />javascripts: []<br />has_layout: true<br />layout: layout<br />View.yml файл нь application-ны бүх template-ийн анхны утгуудыг тохируулдаг. Тухайлбал, stylesheet файлуудын массив оролтыгapplication-ны бүх хуудасд тодорхойлохыг include_stylesheets() helper-ээр тодорхойлно.<br />View.yml тохиргооны файлын default хамаатай файл нь main.css,/css/main.css биш юм. Хэдийгээр хоёулаа ижилхэн боловчsymfony угтвар(prefix) нь /css/ замтай холбоотой байдаг.<br />Хэрэв олон файл тодорхойлогдсон бол symfony тэдгээрийг тодорхойлолтых нь дарааллаар include хийдэг.<br />stylesheets: [main.css, jobs.css, job.css]<br />Та мөн .css гэсэн дагаврыг авч хаян медиа attribute –г өөрчлөх боломжтой.<br />stylesheets: [main.css, jobs.css, job.css, print: { media: print }]<br />Энэ тохиргоо нь дараах байдлаар харагдана гэсэн үг.<br /><link rel=”stylesheet” media=”screen”<br />href=”/css/main.css” /><br /><link rel=”stylesheet” media=”screen”<br />href=”/css/jobs.css” /><br /><link rel=”stylesheet” media=”screen”<br />href=”/css/job.css” /><br /><link rel=”stylesheet” media=”print”<br />href=”/css/print.css” /><br />view.yml тохиргооны файл нь application-нд хэрэглэгдэх defaultlayout-ыг мөн тодорхойлдог.  Default үедээ нэр нь layout байдаг ба энэ нь symfony бүх хуудсуудыг layout.php файлаар хүрээлж чимнэ гэсэн үг. Мөн та has_layout оролтыг false болгосноор хүрээлж чимэх процессыг идэвхгүй болгож болно.<br />Дээрх ажиллах ёстой дагуу ажиллах боловч jobs.css файл нь зөвхөн нүүр хуудсанд мөн  job.css файл нь зөвхөн job хуудсанд хэрэг болно. Энэ тохиолдолд view.yml тохиргооны файл нь модуль бүрт тохируулж өөрчлөгдөх боломжтой. Application-ныview.yml-ын stylesheet-ын хэсэгт зөвхөн main.css –ыг агуулахаар өөрчил.<br /># apps/frontend/config/view.yml<br />stylesheets: [main.css]<br />job модулын view-г өөрчлөхийн тулдapps/frontend/modules/job/config/ хавтасд view.yml файлыг үүсгэнэ:<br /># apps/frontend/modules/job/config/view.yml<br />indexSuccess:<br />stylesheets: [jobs.css]<br />showSuccess:<br />stylesheets: [job.css]<br />indexSuccess болон showSuccess (index болон show action-уудаар үүсэх template-ын нэрс, өнөөдөр бид үзнэ ,) хэсгийн доор та application-ны view.yml-ны default хэсэгт орох ямар ч оролтыг өөрчлөх боломжтой. Бүх онцлох оролтууд application-ны тохиргоонд холбогдон ажилладаг. Та мөн модулын бүх action-нд тохиргоо хийх бол all гэсэн онцгой хэсгийг ашиглах боломжтой.<br />Symfony-ын тохиргооны үндсэн зарчмууд<br />Их олон тохиргооны файлуудад ижилхэн тохиргоо өөр өөр level-д тохируулагдаж болдог.<br />• The default configuration: framework-д байрлана.<br />• The global configuration:  project-д ( config/ хавтасд)<br />• The local configuration: application-д (apps/APP/config/ хавтасд)<br />• The local configuration: модульд зориулагдсан нь ( apps/APP/modules/MODULE/<br />config/)<br />Ажиллах үед тохиргооны систем өөр өөр файлуудын тэдгээрт байгаа бүх утгуудыг холбон cache- хийж ажиллагааг сайжруулдаг.<br />Гол бас зарчим бол хэрэв файл-ын тохиргоо нь via байдлаар тохируулагддаг бол PHP кодоор ижилхэн гүйцэтгэгдэж болдог. Тухайлбал job модульд view.yml файл үүсгэхийн орондuse_stylesheet() helper-ыг ашиглан stylesheet-ыг template-д ашиглаж болно:<br /><?php use_stylesheet(‘main.css’) ?><br />Та мөн энэ helper-ыг ашиглан layout-д stylesheet-ыг глобал-аарinclude хийх боломжтой.<br />Аль аргыг ашиглах нь тухайн байдлаас л хамаарна. View.ymlфайл нь Template-д боломжгүй тохиргоог модулын бүх Action-д зориулж тодорхойлогдох боломжтой бөгөөд тохиргоо нь статик хэлбэртэй байна. Харин нөгөө талаас use_stylesheet() ашиглах нь илүү уян хатан бөгөөд мөн түүнчлэн stylesheet-үүн тохируулалт болон HTML кодууд нэгэн доор байрлана. Jobeet-д бид use_stylesheet() helper-ыг ашиглана. Тиймээс та үүсгэсэнView.yml-ыг устгаад job template-ыг use_stylesheet()-ээр дуудахаар өөрчилнө үү:<br /><!– apps/frontend/modules/job/templates/indexSuccess.php –><br /><?php use_stylesheet(‘jobs.css’) ?><br /><!– apps/frontend/modules/job/templates/showSuccess.php –><br /><?php use_stylesheet(‘job.css’) ?><br />Ижилхэнээр javascript-ын мөн view.yml тохиргооны файлдjavascripts оролт болон template хэсэгт use_javascript() helper-ыг ашиглан javascript-ыг include хийх боломжтой.<br />The Job Homepage<br />3 дахь өдөр харсанчлан job-ын нүүр хуудас нь job модулын indexaction-аар үүсдэг. Index action нь хуудсын Controller хэсэг бөгөөд template-тэй холбогддог, IndexSucces.php бол View-ын хэсэг.<br />apps/<br />frontend/<br />modules/<br />job/<br />actions/<br />actions.class.php<br />templates/<br />indexSuccess.php<br />The Action<br />Action бүр класын method (функц)-ыг төлөөлдөг. Job нүүр хуудасны хувьд класс нь jobActions (модулын нэр залгаад Actions) ба method нь executeIndex() (execute залгаад action-ны нэр). Энд өгөгдлийн баазаас бүх ажлын байрны жагсаалтыг гаргаж ирнэ.<br />// apps/frontend/modules/job/actions/actions.class.php<br />class jobActions extends sfActions<br />{<br />public function executeIndex(sfWebRequest $request)<br />{<br />$this->jobeet_job_list = Doctrine::getTable(‘JobeetJob’)<br />->createQuery(‘a’)<br />->execute();<br />}<br />// …<br />}<br />Кодыг нарийвчилж үзвэл: executeIndex() функц (Controller) бүх ажлын байрны мэдээллийг авах хүсэлтийг үүсгэхийн тулд JobeetJob хүснэгтийг дуудна. Энэ jobeet_job_list руу объектыг дамжуулах JobeetJob объектын Doctrine_Collection –г буцаана.<br />Бүх гарах объектууд автоматаар template (view)  рүү дамжигдана. Controller-оос  View рүү өгөгдөл дамжуулахыг харахын тулд шинийг үүсгэж үзэцгээе:<br />public function executeFooBar(sfWebRequest $request)<br />{<br />$this->foo = ‘bar’;<br />$this->bar = array(‘bar’, ‘baz’);<br />}<br />Энэ код нь $foo ба $bar хувьсагчдыг template-с холбогдохуйц болгоно.<br />The Template<br />Ерөнхийдөө template-ын нэр action-ны нэртэй холбогдсон байна(action-ны нэр залгаад Success).<br />indexSuccess.php template нь бүх ажлын байрны HTMLхүснэгтийг үүсгэнэ. Дараах бидний одоо ашиглах код:<br /><!– apps/frontend/modules/job/templates/indexSuccess.php –><br /><?php use_stylesheet(‘jobs.css’) ?><h1>Job List</h1><table><thead><tr><th>Id</th><th>Category</th><th>Type</th><!– more columns here –><th>Created at</th><th>Updated at</th></tr></thead><tbody><?php foreach ($jobeet_job_list as $jobeet_job): ?><tr><td><a href=”<?php echo url_for(‘job/show?id=’.$jobeet_job->getId())?>”><?php echo $jobeet_job->getId() ?></a></td><td><?php echo $jobeet_job->getCategoryId() ?></td><td><?php echo $jobeet_job->getType() ?></td><!– more columns here –><td><?php echo $jobeet_job->getCreatedAt() ?></td><td><?php echo $jobeet_job->getUpdatedAt() ?></td></tr><?php endforeach; ?></tbody></table><a href=”<?php echo url_for(‘job/new’) ?>”>New</a><br />Template кодонд foreach нь job объектын жагсаалт ба job бүрт давтагдан багана бүрийн утгыг гаргана. Баганы утгыг авах нь тун энгийн бөгөөд get-ээр эхлээд camelCase-д баганы нэрийг залгаж (жишээ нь getCreatedAt method бол created_at баганых)холбогдох method-ыг дуудна.<br />Дээрх кодоо цэвэрлээд боломжтой багануудын утгуудыг харуулъя.<br /><!– apps/frontend/modules/job/templates/indexSuccess.php –><br /><?php use_stylesheet(‘jobs.css’) ?><div><table><?php foreach ($jobeet_job_list as $i => $job): ?><tr><td><?php echo $job->getLocation() ?></td><td><a href=”<?php echo url_for(‘job/show?id=’.$job->getId()) ?>”><?php echo $job->getPosition() ?></a></td><td><?php echo $job->getCompany() ?></td></tr><?php endforeach; ?></table></div><br />Template –д байгаа url_for функц бол symfony-ын helper бөгөөд маргааш бид үүнийг ярих болно.<br />The Job Page Template<br />Одоо job хуудсын template-ыг өөрчилцгөөе.  showSuccess.phpфайлыг нээгээд дараах кодоор контентыг засварлана уу.<br /><!– apps/frontend/modules/job/templates/showSuccess.php –><br /><?php use_stylesheet(‘job.css’) ?><?php use_helper(‘Text’) ?><div><h1><?php echo $job->getCompany() ?></h1><h2><?php echo $job->getLocation() ?></h2><h3><?php echo $job->getPosition() ?><small> – <?php echo $job->getType() ?></small></h3><?php if ($job->getLogo()): ?><div><a href=”<?php echo $job->getUrl() ?>”><img src=”http://www.symfony-project.org/uploads/jobs/<?php echo$job->getLogo() ?>”alt=”<?php echo $job->getCompany() ?> logo” /></a></div><?php endif; ?><div><?php echo simple_format_text($job->getDescription()) ?></div><h4>How to apply?</h4><p><?php echo $job->getHowToApply() ?></p><div><small>posted on <?php echo$job->getDateTimeObject(‘created_at’)->format(‘m/d/Y’) ?></small></div><div style=”padding: 20px 0″><a href=”<?php echo url_for(‘job/edit?id=’.$job->getId()) ?>”>Edit</a></div></div><br />Энэ template-д action-аас дамжигдах $job хувьсагч нь job-ын мэдээллийг харуулна. Бид template рүү дамжигдах $jobeet_job-ыг $job болгож өөрчилсөн болохоор, show action-д та мөн энэ өөрчлөлтыг хийх хэрэгтэй ( Энд хувьсагч 2 удаа давтагдсан байгааг анхаараарай).<br />// apps/frontend/modules/job/actions/actions.class.php<br />public function executeShow(sfWebRequest $request)<br />{<br />$this->job = Doctrine::getTable(‘JobeetJob’)-><br />find($request->getParameter(‘id’));<br />$this->forward404Unless($this->job);<br />}<br />Date баганын утга PHP-ын DateTime объект болсоныг анзаарсан байх. Бид created_at баганыг timestamp-аар тодорхойлсон болохоор, та getDateTimeObject method-ыг ашиглан баганын утгыг DateTime объект руу хөрвүүлэх боломжтой ба мөн format method-г ашиглан  эхний аргументэд фоматын загварыг өгч дуудаж ашиглах боломжтой.<br />$job->getDateTimeObject(‘created_at’)->format(‘m/d/Y’);<br />Job description нь simple_format_text() helper-ыг хэрэглэн дамжих утгыг засварлаж жишээ нь <br /> -ыг ашиглан HTML руу форматлаж байна. Энэ helper нь Text Group-д багтах бөгөөдdefault үед дуудагдаагүй бид use_helper helper-ыг ашиглан дуудаж өгсөн болно.<br />Slots<br />Яг одоо бүх хуудасны гарчигууд layout-ны <title> тэг-ээр тодорхойлогдож байгаа.<br /><title>Jobeet – Your best job board</title><br />Харин job хуудсын хувьд бид илүү хэрэгтэй мэдээлэл болох компани нэр, ажлын байр зэргийг гаргамаар байна.<br />Symfony-д дэлгэцэд харагдах layout нь template –ээс хамаарч байгаа үед та slot-ыг тодорхойлох шаардлагатай:<br />Slot-ыг layout-д нэмсэнээр гарчигийг динамик болгож байна.<br />// apps/frontend/templates/layout.php<br /><title><?php include_slot(‘title’) ?></title><br />Slot бүр нэртэйгээр (title) тодорхойлогдох ба include_slot() helper-ыг ашиглан дэлгэцэнд гарна.<br />Одоо, showSuccess.php template-ын эхэнд slot() helper-ыг тодорхойлж job хуудасны slot- ыг тодорхойлъё:<br />// apps/frontend/modules/job/templates/showSuccess.php<br /><?php slot(<br />‘title’,<br />sprintf(‘%s is looking for a %s’, $job->getCompany(),<br />$job->getPosition()))<br />?><br />Хэрэв гарчиг нь бүрэн гүйцэт бол slot helper-ыг блок кодоор мөн ашиглаж болдог.<br />// apps/frontend/modules/job/templates/showSuccess.php<br /><?php slot(‘title’) ?><br /><?php echo sprintf(‘%s is looking for a %s’, $job->getCompany(),<br />$job->getPosition()) ?><br /><?php end_slot(); ?><br />Нүүр хуудас зэрэг зарим хуудасны хувьд бид ерөнхий гарчиг оноох шаардлагатай. Ижил гарчиг template бүрт давтан өгөхийн оронд бид default гарчгийг layout-д тодорхойлж өгч болно.<br />// apps/frontend/templates/layout.php<br /><title><br /><?php include_slot(‘title’, ‘Jobeet – Your best job board’) ?><br /></title><br />Include_slot() method-ын 2 дахь аргумент нь slotтодорхойлогдоогүй үед дуудагдах default утга. Хэрэв default утга нь урт эсвэл зарим HTML tag агуулсан бол дараах байдлаар тодорхойлж мөн болно:<br />// apps/frontend/templates/layout.php<br /><title><br /><?php if (!include_slot(‘title’)): ?><br />Jobeet – Your best job board<br /><?php endif; ?><br /></title><br />Slot тодорхойлогдсон бол include_slot() helper true утгыг буцаана. Тиймээс template-д та гарчгын slot-ын утгыг тодорхойлсон бол тэр нь хэрэглэгдэнэ, үгүй бол default гарчиг нь хэрэглэгдэнэ.<br />Бид include_ -аар эхэлсэн хэд хэдэн helper-ыг авч үзлээ. Эдгээрhelper-үүд HTML код буцаах ба ихэнх үед get_ helper агуулгыг буцааж байна.<br /><?php include_slot(‘title’) ?><br /><?php echo get_slot(‘title’) ?><br /><?php include_stylesheets() ?><br /><?php echo get_stylesheets() ?><br />The Job Page Action<br />Job хуудас show action-аар үүсэж, job модулын executeShow()method-д тодорхойлогдоно.<br />class jobActions extends sfActions<br />{<br />public function executeShow(sfWebRequest $request)<br />{<br />$this->job = Doctrine::getTable(‘JobeetJob’)-><br />find($request->getParameter(‘id’));<br />$this->forward404Unless($this->job);<br />}<br />// …<br />}<br />Index action дээрх шиг, JobeetJob table класс job-ыг гаргахад хэрэглэгдэх ба энэ удаад find() method-г хэрэглэнэ.  Энэ method-ын параметер нь job-ын цор ганц (unique) ялгагч primary keyбайна. Дараагын хэсэгт яагаад $request->getParameter(‘id’)гэсэн мөр job primary key-ыг буцаадгыг тайлбарлана.<br />Хэрэв job өгөгдлийн баазад байхгүй бол бид хэрэглэгчдэдforward404Unless() method-ын  404 хуудсыг хэвлэнэ. Эхний утгыг Boolean-аар авах ба үнэн биш бол хийгдэх үйлдлийг зогсооно.Forward method Action-ны үйлдлийг шууд тэр дор нь зогсоогоодsfError404Exception –г шиднэ. Араас нь ямар нэгэн утга буцаах шаардлагагүй.<br />Хэрэглэгчдэд харагдах exception бүр prod болон dev орчиноос хамаараад өөр өөрөөр хэвлэгдэнэ.<br />Jobeet вэбсайтаа production server-рүү deploy хийхээс өмнө таdefault 404 хуудсыг хэрхэн өөрчлөхыг сурч авна.<br />“forward” method-ын бүлэг<br />forward404Unless үнэндээ дараахтай тэнцүү:<br />$this->forward404If(!$this->job);<br />Энэ нь мөн дараахтай тэнцүү:<br />if (!$this->job)<br />{<br />$this->forward404();<br />}<br />forward404() method бол $this->forward(‘default’, ’404′); -ынshortcut н юм.<br />Forward() method ижил application-ны өөр Action руу заадаг: өмнөх жишээн дээр default модулын 404 action руу заасан.<br />The Request and the Response  (хүсэлт ба хариу)<br />Хэрэв та /job юмуу /job/show/id/1 гэсэн хаягаар хандвал сервэртэй харьцах харилцааг үүсгэнэ. Хандалт нь хүсэлтийгилгээж сервер хариуг буцааж илгээнэ.<br />Бид symfony хүсэлтийг sfWebRequest объектод агуулдгийг өмнө нь харсан (executeShow method –ыг хар).   Мөн symfony объект хандалтад framework болохоор хариу (response) мөнsfWebResponse классын объект. Та хариу (response) объекттойaction дээр $this->getResponse() гэж дуудан холбогдох боломжтой.<br />Эдгээр объектууд PHP функцууд болон PHP глобал хувьсагчууд харьцах маш олон боломжит method-г агуулдаг.<br />Яагаад symfony өмнөх PHP функционалуудыг бүрхдэг вэ? Нэгдүгээрт<br />Symfony-ын method-ууд PHP ижил method- оос хамаагүй хүчирхэг. Мөн хэрэв та application-г тест хийвэл хүсэлт ба хариу(request Ба response) объекттой ажиллахад глобал хувьсагч эсвэл  хэтэрхий түвэгтэй PHP функцууд болох header()функцуудыг бодвол илүү  энгийн байдаг.<br />The Request (Хүсэлт)<br />sfWebRequest класс ~$_SERVER~, ~$_COOKIE~, ~$_GET~, ~$_POST~, болон<br />~$_FILES~ PHP глобал array-уудыг агуулдаг:<br />Method-ын нэр PHP –ын тэнцүү утга<br />getMethod() $_SERVER['REQUEST_METHOD']<br />getUri() $_SERVER['REQUEST_URI']<br />getReferer() $_SERVER['HTTP_REFERER']<br />getHost() $_SERVER['HTTP_HOST']<br />getLanguages() $_SERVER['HTTP_ACCEPT_LANGUAGE']<br />Method-ын нэр PHP -ын тэнцүү утга<br />getCharsets() $_SERVER['HTTP_ACCEPT_CHARSET']<br />isXmlHttpRequest() $_SERVER['X_REQUESTED_WITH'] == ‘XMLHttpRequest’<br />getHttpHeader() $_SERVER<br />getCookie() $_COOKIE<br />isSecure() $_SERVER['HTTPS']<br />getFiles() $_FILES<br />getGetParameter() $_GET<br />getPostParameter() $_POST<br />getUrlParameter() $_SERVER['PATH_INFO']<br />getRemoteAddress() $_SERVER['REMOTE_ADDR']<br />Бид өмнө нь getParameter() method –г ашиглаж хүсэлтийн параметртэй холбогдож байсан. Энэ $_GET эсвэл $_POST эсвэл PATH_INFO глобал хувьсагчуудын утгыг буцаадаг.<br />Хэрэв та яг аль хувьсагчаас утга ирж байгаас мэдэхийг хүсвэл та getGetParameter(), getPostParameter(), болон getUrlParameter() method-уудыг ашиглах хэрэгтэй.<br />ХЭрэв та action-г тодорхой нэг HTTP method-р хязгаарлагдмал байлгахыг хүсвэл тухайлбал хэрэв та форм-аас ирсэн утгаPOST-р илгээгдсэнийг мэдэхийг хүсвэл, та isMethod() method-ыг ашиглаж болно: $this->forwardUnless($request->isMethod(‘POST’));.<br />The Response (Хариу)<br />sfWebResponse класс header()  болон serawcookie() PHP method-уудыг агуулдаг.<br />Method-ын нэр PHP –ын тэнцүү утга<br />setCookie() setrawcookie()<br />setStatusCode() header()<br />setHttpHeader() header()<br />setContentType() header()<br />addVaryHttpHeader() header()<br />addCacheControlHttpHeader() header()<br />Мэдээж, sfWebResponse класс мөн response-ын агуулгыг оноож өгч болдог (senContent болон браузер руу хариуг буцаах send()).<br />Өнөөдрийн эхний хэсэгт бид stylesheet болон JavaScript –үүдийгview.yml болон template-д хэрхэн зохицуулж өгөхийг харсан. Эцэст нь хоёулаа response-ын объектын  addStylesheet()  болонaddJavascript() method-уудыг ашигладаг.<br />The sfAction/ http://www.symfony-project.org/api/1_4/sfAction/ , sfRequest/ http://www.symfony-project.org/api/1_4/sfRequest/ ,болон<br />sfResponse/ http://www.symfony-project.org/api/1_4/sfResponse/классууд өөр олон method-уудыг тодорхойлдог. API-ын хавтас-д зочилж бүх symfony классуудыг мэдэж авахдаа бүү эргэлз.<br />Маргааш болтол баяртай.<br />Өнөөдөр бид symfony-д ашиглагддаг зарим загварчлалын хэв шинжийг авч үзлээ.  Одоо project –ын бүтэц илүү ойлгомжтой болсон гэдэгт найдаж байна. Бид мөн layout –д гаргах template-үүд болон template файлуудыг авч үзсэн. Бид мөн slot-ууд болонaction-уудын ачаар тэдгээрийг багахан динамик болгосон.<br />Маргааш бид өнөөдөр ашигласан url_for() helper-ын талаар илүү сурна мөн дэд framework болох routing-ын талаар үзнэ.<br />
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх
04 practical symfony 4дөх

More Related Content

Similar to 04 practical symfony 4дөх

Entity+framework+
Entity+framework+Entity+framework+
Entity+framework+Rey zhang
 
автоматизация Flex приложений с помощью selenium rc
автоматизация Flex приложений с помощью selenium rcавтоматизация Flex приложений с помощью selenium rc
автоматизация Flex приложений с помощью selenium rcIgor Khrol
 
Une application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de MainsonneuveUne application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de MainsonneuvePhilippe Gamache
 
2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NET2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NETBruno Capuano
 
Architecture related with Zend Framework (Japanese only)
Architecture related with Zend Framework (Japanese only)Architecture related with Zend Framework (Japanese only)
Architecture related with Zend Framework (Japanese only)T K
 
Komplexe Sites sauber aufbauen
Komplexe Sites sauber aufbauenKomplexe Sites sauber aufbauen
Komplexe Sites sauber aufbauenJens Grochtdreis
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶 wensheng wei
 
Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Corcioli
 
Lecture1
Lecture1Lecture1
Lecture1orgil
 
夜宴16期《变化ing》
夜宴16期《变化ing》夜宴16期《变化ing》
夜宴16期《变化ing》Koubei Banquet
 
Fatih BAZMAN CodeIgniter Sunumu
Fatih BAZMAN CodeIgniter SunumuFatih BAZMAN CodeIgniter Sunumu
Fatih BAZMAN CodeIgniter SunumuFatih Bazman
 
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиковCodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиковCodeFest
 
さよならmobylet~携帯デバイスはスマートフォンの時代へ~
さよならmobylet~携帯デバイスはスマートフォンの時代へ~さよならmobylet~携帯デバイスはスマートフォンの時代へ~
さよならmobylet~携帯デバイスはスマートフォンの時代へ~Shin Takeuchi
 
前端规范(初稿)
前端规范(初稿)前端规范(初稿)
前端规范(初稿)EnLei-Cai
 
第2章 asp
第2章  asp第2章  asp
第2章 aspbillao
 
Introduction sur l'Open Source
Introduction sur l'Open SourceIntroduction sur l'Open Source
Introduction sur l'Open SourceEtienne Juliot
 
20 种提升网页速度的技巧
20 种提升网页速度的技巧20 种提升网页速度的技巧
20 种提升网页速度的技巧wensheng wei
 
IIS7.5概要 10月17日
IIS7.5概要 10月17日IIS7.5概要 10月17日
IIS7.5概要 10月17日hirookun
 
Formulier extensies voor Joomla - Tijs Hensen #jd11nl
Formulier extensies voor Joomla - Tijs Hensen #jd11nlFormulier extensies voor Joomla - Tijs Hensen #jd11nl
Formulier extensies voor Joomla - Tijs Hensen #jd11nlJoomla!Days Netherlands
 

Similar to 04 practical symfony 4дөх (20)

Entity+framework+
Entity+framework+Entity+framework+
Entity+framework+
 
автоматизация Flex приложений с помощью selenium rc
автоматизация Flex приложений с помощью selenium rcавтоматизация Flex приложений с помощью selenium rc
автоматизация Flex приложений с помощью selenium rc
 
Une application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de MainsonneuveUne application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de Mainsonneuve
 
2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NET2010 06 15 SecondNug - JAVA vs NET
2010 06 15 SecondNug - JAVA vs NET
 
Architecture related with Zend Framework (Japanese only)
Architecture related with Zend Framework (Japanese only)Architecture related with Zend Framework (Japanese only)
Architecture related with Zend Framework (Japanese only)
 
Komplexe Sites sauber aufbauen
Komplexe Sites sauber aufbauenKomplexe Sites sauber aufbauen
Komplexe Sites sauber aufbauen
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶
 
Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.
 
Der lachende Dritte
Der lachende DritteDer lachende Dritte
Der lachende Dritte
 
Lecture1
Lecture1Lecture1
Lecture1
 
夜宴16期《变化ing》
夜宴16期《变化ing》夜宴16期《变化ing》
夜宴16期《变化ing》
 
Fatih BAZMAN CodeIgniter Sunumu
Fatih BAZMAN CodeIgniter SunumuFatih BAZMAN CodeIgniter Sunumu
Fatih BAZMAN CodeIgniter Sunumu
 
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиковCodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
 
さよならmobylet~携帯デバイスはスマートフォンの時代へ~
さよならmobylet~携帯デバイスはスマートフォンの時代へ~さよならmobylet~携帯デバイスはスマートフォンの時代へ~
さよならmobylet~携帯デバイスはスマートフォンの時代へ~
 
前端规范(初稿)
前端规范(初稿)前端规范(初稿)
前端规范(初稿)
 
第2章 asp
第2章  asp第2章  asp
第2章 asp
 
Introduction sur l'Open Source
Introduction sur l'Open SourceIntroduction sur l'Open Source
Introduction sur l'Open Source
 
20 种提升网页速度的技巧
20 种提升网页速度的技巧20 种提升网页速度的技巧
20 种提升网页速度的技巧
 
IIS7.5概要 10月17日
IIS7.5概要 10月17日IIS7.5概要 10月17日
IIS7.5概要 10月17日
 
Formulier extensies voor Joomla - Tijs Hensen #jd11nl
Formulier extensies voor Joomla - Tijs Hensen #jd11nlFormulier extensies voor Joomla - Tijs Hensen #jd11nl
Formulier extensies voor Joomla - Tijs Hensen #jd11nl
 

04 practical symfony 4дөх

  • 1. Practical symfony 4дөх өдөр<br />4 Aug <br />The Controller and the View<br />Өчигдөр бид symfony өгөгдлийн баазыг хэрхэн энгийнээрdatabase engine хоорондын ялгааг abstract хийдэг, харилцан холбоотой элемент (relational element) –ыг объект хандалтад класс болгохыг  судалдсан. Мөн бид Doctrine-оор өгөгдлийн баазын схем (schema) –г тодорхойлох, хүснэгт үүсгэх, мөн баазаас өгөгдлийг цуглуулахыг авч үзсэн.<br />Өнөөдөр бид өчигдрийн үүсгэсэн үндсэн job модуль-г өөрчлөхболно. Job модуль аль хэдийн бидэн хэрэгтэй Jobeet –д байх бүх кодуудыг агуулсан байгаа.<br />• Бүх ажлыг жагсаах хуудас<br />• Шинэ ажил үүсгэх хуудас<br />• Өмнөх ажилыг засварлах хуудас<br />• Ажлыг устгах хуудас<br />Код ашиглахад бэлэн байгаа хэдий ч бид Jobeet-ын шаардлагад тохируулахын тулд template-үүдийг дахин байгуулна.<br />The MVC Architecture<br />Хэрэв та ямар нэгэн framework ашиглахгүй PHP вэбсайт хөгжүүлж байсан бол HTML хуудас бүрт нэг PHP файл гэсэн дүрмээр ажиллаж байсан байх.  Тэдгээр PHP файлууд нь нэг ижил төрлийн бүтцийг агуулдаг: үүсгэх, ерөнхий тохиргоо, хүсэлтийн хуудастай холбоотой бизнес логик, баазаас өгөгдөл цуглуулах мөн эцэст хуудсыг үүсгэх HTML хуудас гэх зэрэг.<br />Та магадгүй HTML хуудсаас template-ын логик-ыг тусд ашиглаж байсан байх. Мөн та баазын abstraction layer—ыг тусд нь бизнес логик-с ангид авч ашиглаж байсан байж магадгүй.  Гэсэн ч  та ихэвчлэн эмхтгэхэд нилээн төвөгтэй маш их кодтой л үлддэг байсан.<br />Хэдийгээр хийхэд нилээн хурдан боловч, хөгжүүлэх тусам өөрчлөлт хийхэд төвөгтэй болж, таниас бараг  өөр хүн хэрхэн хийгдэж, ажиллаж байгааг бараг ойлгохгүй болдог.<br />Энэ бүх асуудлаас гарах сайхан шийдэл бас байнаа. Вэбийн хөгжилд өнөө үед кодоо  зохицуулах хамгийн түгээмэл шийдэл бол MVC загварчлалын  хэв маяг юм. Товчхондоо, MVCзагварчлалын хэв маяг нь кодыг тань байх ёстой зарчмых нь дагуу зохицуулахыг тодорхойлдог. Энэ хэв маяг нь кодуудыг 3 давхаргад (layer) –т хуваан авч үздэг.<br />• The Model давхарга бизнес логикийг тодорхойлдог  (өгөгдлийн бааз мөн энэ давхаргад хамаарна). Та symfony  бүх класс болонModel-той холбоотой бүх файлуудыг lib/model/ хавтасд хадгалдгыг аль хэдийн мэдсэн байх.<br />• The View хэрэглэгч ямар зүйлтэй харицаж байгаа байдал(template engine энэ давхаргын нэг хэсэгт орно). Symfony-д голдуу View давхарга нь PHP template-ээр үүсдэг. Тэд өөр өөр templates/ хавтасд хадгалагддаг. Өнөөдрийн хичээлээр үүнийг харна.<br />• The Controller бол хэрэглэгчээс хүссэн өгөгдлийг Modelхэсгээс View давхарга руу дамжуулах Model-ыг дуудах багахан код. Эхний өдөр symfony-ыг суулгах үед бүх хүсэлт front controller-р зохицуулагддыг харсан (index.php ба<br />frontend_dev.php). Эдгээр контроллорууд нь яг жинхэнэ ажиллахaction-уудыг төлөөлдөг. Өчигдөр харсанчлан тэдгээр action-гууд логикоор module-уудад бүлэглэгдэн байрладаг.<br />Өнөөдөр бид 2 дахь өдөр тодорхойлогдсон гараар гаргасан загварын дагуу нүүр хуудас болон job хуудсыг өөрчлөх болно. Бид мөн тэдгээрийг динамик болгоно. Тэдгээрийн хажуугаар бидsymfony-ийн хавсын бүтцийн дагуу, кодуудыг давхаргуудаар тусгаарлах зэрэг маш их чимхлүүр ажил хийнэ.<br />The Layout<br />Хэрэв та гараар гаргасан загварыг сайн харсан бол ихэнх хуудас бүр ижилхэн харагдаж байгааг ажигласан байх.  HTMLэсвэл PHP код гэдгээс хамааран код дахин давтах нь муу арга гэдгийг та мэдэж байгаа байх. Тиймээс бид харагдах элементүүдийг дахин код давтагдахгүйгээр харуулах арга замыг олох хэрэгтэй болно.<br />Энэ асуудлыг шийдэх нэг арга бол header болон footer-ыг тусд нь үүсгээд include хийж  template  бүрт дуудаж өгөх.<br />Гэвч энд header болон footer файлууд нь яг үнэн HTML –г агуулахгүй.  Энэнээс өөр дээр арга байх ёстой. Өмнө байсан зүйлийг дахин үүсгэхийн орон бид энэ асуудлыг шийдэх өөр нэг загварчлалын хэв маягийг хэрэглэнэ. Decorator загварчлалын хэв маяг (design pattern).http://en.wikipedia.org/wiki/Decorator_pattern<br />Decorator design pattern нь өөр аргаар энэ асуудлыг шийднэ:global template-ээр content нь өгөгдсөний дараа template нь чимэглэгдэнэ. Үүнийг symfony –д Layout гэж нэрлэнэ.<br />Application-ны  default layout нь layout.php гэж дуудагддаг бөгөөдapps/frontend/templates/ гэсэн хавтасд байрлана. Энэ хавтас нь бүх глобал template-үүдийг агуулдаг.<br />Дараах кодоор default symfony-ийн layout-ыг өөрчил.<br /><!– apps/frontend/templates/layout.php –><!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”><html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” lang=”en”><head><title>Jobeet – Your best job board</title><link rel=”shortcut icon” href=”/favicon.ico” /><?php include_javascripts() ?><?php include_stylesheets() ?></head><body><div><div><div><h1><a href=”<?php echo url_for(‘job/index’) ?>”><img src=”http://www.symfony-project.org/images/logo.jpg”alt=”Jobeet Job Board” /></a></h1><div><div><h2>Ask for people</h2><div><a href=”<?php echo url_for(‘job/index’) ?>”>Post a Job</a></div></div><div><h2>Ask for a job</h2><form action=”quot; method=”get”><inputid=”search_keywords” /><input value=”search” /><div>Enter some keywords (city, country, position, …)</div></form></div></div></div></div><div><?php if ($sf_user->hasFlash(‘notice’)): ?><div><?php echo $sf_user->getFlash(‘notice’) ?></div><?php endif; ?><?php if ($sf_user->hasFlash(‘error’)): ?><div><?php echo $sf_user->getFlash(‘error’) ?></div><?php endif; ?><div><?php echo $sf_content ?></div></div><div><div><span><img src=”http://www.symfony-project.org/images/jobeet-mini.png” />powered by <a href=”http://www.symfony-project.org/”><img src=”http://www.symfony-project.org/images/symfony.gif”<br />alt=”symfony framework” /></a></span><ul><li><a href=”quot; >About Jobeet</a></li><li><a href=”quot; >Full feed</a></li><li><a href=”quot; >Jobeet API</a></li><li><a href=”quot; >Affiliates</a></li></ul></div></div></div></body></html><br />Symfony-ын template нь жирийн PHP файл. Layout template-д таPHP функц дуудалт  болон PHP хувьсагчыг харсан байх.~$sf_content~ бол хамгийн сонирхолтой хувьсагч: Энэ ньframework-оос өөрөөс нь тодорхойлогдсон ба action-аар боловсруулагдсан HTML-ийг агуулдаг.<br />Хэрэв та Брауз хийгээд job модулийг харвал(http://jobeet.localhost/frontend_dev.php/job),  бүх action layout-аар хүрээлэгдсэн (чимэглэгдсэн) байгааг олж харна.<br />The Stylesheets, Images, and JavaScripts<br />Энэ хичээл нь  загварчлалых биш болохоор бид аль хэдийнjobeet-д ашиглагдах нэмэлтүүдийг бэлтгэсэн байгаа:  шахсан зураг http://www.symfony-project.org/get/jobeet/images.zip<br />, stylesheet-үүдийг эндээс татаж аваад web/images/,  web/css/ хавтасд хадгал.<br />Layout –д бид favicon-ыг include хийсэн байгаа.  Та Jobeet-д зориулсныг эндээс татаж аваад web/ гэсэн хавтасд байрлуул.<br />Default –аараа generate:project команд нь project-ийн нэмэлтүүдэд зориулж 3 –н хавтсыг үүсгэдэг:  зураг-дweb/images/, stylesheets-д web/css/, javascript-үүдэд web/js/хавтсыг.<br />Энэ нь symfony-с тодорхойлогдох бас нэг давуу тал бөгөөд мэдээж та өөрийн хүссэнээр тэдгээрийг web/ хавтасын хаа нэгтээ хадгалж бас болно.<br />Овсгоотой уншигч main.css файл default layout-ийн хаана нь ч дурьдагдаагүй болохыг ажигласан байх. Энэ гарцаагүй HTML-ээр харагдана. Гэвч энэ алга байна. Яаж ийм байж боломжтой вэ?<br />Stylesheet файлууд Layout-ын <head> tag-н доторхinclude_stylesheets() функцээр дуудагдан гарна.include_stylesheets() функцыг helper гэж нэрлэдэг. Helper болsymfony –д тодорхойлогддог параметер авч HTML код буцаадаг функц юм.<br />Ихэвчлэн helper-үүд template-үүдэд хэрэглэгдэх кодуудыг багцалж байдаг учираас цаг хэмнэгч болдог.include_stylesheets() helper stylesheet-үүдийн <link> tag-ийг үүсгэдэг.<br />Харин helper аль stylesheet-үүд include хийгдэх ёстойг яаж мэдэх вэ?<br />View давхарга нь application-ны тохиргооны файл болохview.yml гэсэн файлыг edit хийж тохируулж өгч болдог. Дараах код нь generate:app командаар үүссэн default нь:<br /># apps/frontend/config/view.yml<br />default:<br />http_metas:<br />content-type: text/html<br />metas:<br />#title: symfony project<br />#description: symfony project<br />#keywords: symfony, project<br />#language: en<br />#robots: index, follow<br />stylesheets: [main.css]<br />javascripts: []<br />has_layout: true<br />layout: layout<br />View.yml файл нь application-ны бүх template-ийн анхны утгуудыг тохируулдаг. Тухайлбал, stylesheet файлуудын массив оролтыгapplication-ны бүх хуудасд тодорхойлохыг include_stylesheets() helper-ээр тодорхойлно.<br />View.yml тохиргооны файлын default хамаатай файл нь main.css,/css/main.css биш юм. Хэдийгээр хоёулаа ижилхэн боловчsymfony угтвар(prefix) нь /css/ замтай холбоотой байдаг.<br />Хэрэв олон файл тодорхойлогдсон бол symfony тэдгээрийг тодорхойлолтых нь дарааллаар include хийдэг.<br />stylesheets: [main.css, jobs.css, job.css]<br />Та мөн .css гэсэн дагаврыг авч хаян медиа attribute –г өөрчлөх боломжтой.<br />stylesheets: [main.css, jobs.css, job.css, print: { media: print }]<br />Энэ тохиргоо нь дараах байдлаар харагдана гэсэн үг.<br /><link rel=”stylesheet” media=”screen”<br />href=”/css/main.css” /><br /><link rel=”stylesheet” media=”screen”<br />href=”/css/jobs.css” /><br /><link rel=”stylesheet” media=”screen”<br />href=”/css/job.css” /><br /><link rel=”stylesheet” media=”print”<br />href=”/css/print.css” /><br />view.yml тохиргооны файл нь application-нд хэрэглэгдэх defaultlayout-ыг мөн тодорхойлдог.  Default үедээ нэр нь layout байдаг ба энэ нь symfony бүх хуудсуудыг layout.php файлаар хүрээлж чимнэ гэсэн үг. Мөн та has_layout оролтыг false болгосноор хүрээлж чимэх процессыг идэвхгүй болгож болно.<br />Дээрх ажиллах ёстой дагуу ажиллах боловч jobs.css файл нь зөвхөн нүүр хуудсанд мөн  job.css файл нь зөвхөн job хуудсанд хэрэг болно. Энэ тохиолдолд view.yml тохиргооны файл нь модуль бүрт тохируулж өөрчлөгдөх боломжтой. Application-ныview.yml-ын stylesheet-ын хэсэгт зөвхөн main.css –ыг агуулахаар өөрчил.<br /># apps/frontend/config/view.yml<br />stylesheets: [main.css]<br />job модулын view-г өөрчлөхийн тулдapps/frontend/modules/job/config/ хавтасд view.yml файлыг үүсгэнэ:<br /># apps/frontend/modules/job/config/view.yml<br />indexSuccess:<br />stylesheets: [jobs.css]<br />showSuccess:<br />stylesheets: [job.css]<br />indexSuccess болон showSuccess (index болон show action-уудаар үүсэх template-ын нэрс, өнөөдөр бид үзнэ ,) хэсгийн доор та application-ны view.yml-ны default хэсэгт орох ямар ч оролтыг өөрчлөх боломжтой. Бүх онцлох оролтууд application-ны тохиргоонд холбогдон ажилладаг. Та мөн модулын бүх action-нд тохиргоо хийх бол all гэсэн онцгой хэсгийг ашиглах боломжтой.<br />Symfony-ын тохиргооны үндсэн зарчмууд<br />Их олон тохиргооны файлуудад ижилхэн тохиргоо өөр өөр level-д тохируулагдаж болдог.<br />• The default configuration: framework-д байрлана.<br />• The global configuration:  project-д ( config/ хавтасд)<br />• The local configuration: application-д (apps/APP/config/ хавтасд)<br />• The local configuration: модульд зориулагдсан нь ( apps/APP/modules/MODULE/<br />config/)<br />Ажиллах үед тохиргооны систем өөр өөр файлуудын тэдгээрт байгаа бүх утгуудыг холбон cache- хийж ажиллагааг сайжруулдаг.<br />Гол бас зарчим бол хэрэв файл-ын тохиргоо нь via байдлаар тохируулагддаг бол PHP кодоор ижилхэн гүйцэтгэгдэж болдог. Тухайлбал job модульд view.yml файл үүсгэхийн орондuse_stylesheet() helper-ыг ашиглан stylesheet-ыг template-д ашиглаж болно:<br /><?php use_stylesheet(‘main.css’) ?><br />Та мөн энэ helper-ыг ашиглан layout-д stylesheet-ыг глобал-аарinclude хийх боломжтой.<br />Аль аргыг ашиглах нь тухайн байдлаас л хамаарна. View.ymlфайл нь Template-д боломжгүй тохиргоог модулын бүх Action-д зориулж тодорхойлогдох боломжтой бөгөөд тохиргоо нь статик хэлбэртэй байна. Харин нөгөө талаас use_stylesheet() ашиглах нь илүү уян хатан бөгөөд мөн түүнчлэн stylesheet-үүн тохируулалт болон HTML кодууд нэгэн доор байрлана. Jobeet-д бид use_stylesheet() helper-ыг ашиглана. Тиймээс та үүсгэсэнView.yml-ыг устгаад job template-ыг use_stylesheet()-ээр дуудахаар өөрчилнө үү:<br /><!– apps/frontend/modules/job/templates/indexSuccess.php –><br /><?php use_stylesheet(‘jobs.css’) ?><br /><!– apps/frontend/modules/job/templates/showSuccess.php –><br /><?php use_stylesheet(‘job.css’) ?><br />Ижилхэнээр javascript-ын мөн view.yml тохиргооны файлдjavascripts оролт болон template хэсэгт use_javascript() helper-ыг ашиглан javascript-ыг include хийх боломжтой.<br />The Job Homepage<br />3 дахь өдөр харсанчлан job-ын нүүр хуудас нь job модулын indexaction-аар үүсдэг. Index action нь хуудсын Controller хэсэг бөгөөд template-тэй холбогддог, IndexSucces.php бол View-ын хэсэг.<br />apps/<br />frontend/<br />modules/<br />job/<br />actions/<br />actions.class.php<br />templates/<br />indexSuccess.php<br />The Action<br />Action бүр класын method (функц)-ыг төлөөлдөг. Job нүүр хуудасны хувьд класс нь jobActions (модулын нэр залгаад Actions) ба method нь executeIndex() (execute залгаад action-ны нэр). Энд өгөгдлийн баазаас бүх ажлын байрны жагсаалтыг гаргаж ирнэ.<br />// apps/frontend/modules/job/actions/actions.class.php<br />class jobActions extends sfActions<br />{<br />public function executeIndex(sfWebRequest $request)<br />{<br />$this->jobeet_job_list = Doctrine::getTable(‘JobeetJob’)<br />->createQuery(‘a’)<br />->execute();<br />}<br />// …<br />}<br />Кодыг нарийвчилж үзвэл: executeIndex() функц (Controller) бүх ажлын байрны мэдээллийг авах хүсэлтийг үүсгэхийн тулд JobeetJob хүснэгтийг дуудна. Энэ jobeet_job_list руу объектыг дамжуулах JobeetJob объектын Doctrine_Collection –г буцаана.<br />Бүх гарах объектууд автоматаар template (view)  рүү дамжигдана. Controller-оос  View рүү өгөгдөл дамжуулахыг харахын тулд шинийг үүсгэж үзэцгээе:<br />public function executeFooBar(sfWebRequest $request)<br />{<br />$this->foo = ‘bar’;<br />$this->bar = array(‘bar’, ‘baz’);<br />}<br />Энэ код нь $foo ба $bar хувьсагчдыг template-с холбогдохуйц болгоно.<br />The Template<br />Ерөнхийдөө template-ын нэр action-ны нэртэй холбогдсон байна(action-ны нэр залгаад Success).<br />indexSuccess.php template нь бүх ажлын байрны HTMLхүснэгтийг үүсгэнэ. Дараах бидний одоо ашиглах код:<br /><!– apps/frontend/modules/job/templates/indexSuccess.php –><br /><?php use_stylesheet(‘jobs.css’) ?><h1>Job List</h1><table><thead><tr><th>Id</th><th>Category</th><th>Type</th><!– more columns here –><th>Created at</th><th>Updated at</th></tr></thead><tbody><?php foreach ($jobeet_job_list as $jobeet_job): ?><tr><td><a href=”<?php echo url_for(‘job/show?id=’.$jobeet_job->getId())?>”><?php echo $jobeet_job->getId() ?></a></td><td><?php echo $jobeet_job->getCategoryId() ?></td><td><?php echo $jobeet_job->getType() ?></td><!– more columns here –><td><?php echo $jobeet_job->getCreatedAt() ?></td><td><?php echo $jobeet_job->getUpdatedAt() ?></td></tr><?php endforeach; ?></tbody></table><a href=”<?php echo url_for(‘job/new’) ?>”>New</a><br />Template кодонд foreach нь job объектын жагсаалт ба job бүрт давтагдан багана бүрийн утгыг гаргана. Баганы утгыг авах нь тун энгийн бөгөөд get-ээр эхлээд camelCase-д баганы нэрийг залгаж (жишээ нь getCreatedAt method бол created_at баганых)холбогдох method-ыг дуудна.<br />Дээрх кодоо цэвэрлээд боломжтой багануудын утгуудыг харуулъя.<br /><!– apps/frontend/modules/job/templates/indexSuccess.php –><br /><?php use_stylesheet(‘jobs.css’) ?><div><table><?php foreach ($jobeet_job_list as $i => $job): ?><tr><td><?php echo $job->getLocation() ?></td><td><a href=”<?php echo url_for(‘job/show?id=’.$job->getId()) ?>”><?php echo $job->getPosition() ?></a></td><td><?php echo $job->getCompany() ?></td></tr><?php endforeach; ?></table></div><br />Template –д байгаа url_for функц бол symfony-ын helper бөгөөд маргааш бид үүнийг ярих болно.<br />The Job Page Template<br />Одоо job хуудсын template-ыг өөрчилцгөөе.  showSuccess.phpфайлыг нээгээд дараах кодоор контентыг засварлана уу.<br /><!– apps/frontend/modules/job/templates/showSuccess.php –><br /><?php use_stylesheet(‘job.css’) ?><?php use_helper(‘Text’) ?><div><h1><?php echo $job->getCompany() ?></h1><h2><?php echo $job->getLocation() ?></h2><h3><?php echo $job->getPosition() ?><small> – <?php echo $job->getType() ?></small></h3><?php if ($job->getLogo()): ?><div><a href=”<?php echo $job->getUrl() ?>”><img src=”http://www.symfony-project.org/uploads/jobs/<?php echo$job->getLogo() ?>”alt=”<?php echo $job->getCompany() ?> logo” /></a></div><?php endif; ?><div><?php echo simple_format_text($job->getDescription()) ?></div><h4>How to apply?</h4><p><?php echo $job->getHowToApply() ?></p><div><small>posted on <?php echo$job->getDateTimeObject(‘created_at’)->format(‘m/d/Y’) ?></small></div><div style=”padding: 20px 0″><a href=”<?php echo url_for(‘job/edit?id=’.$job->getId()) ?>”>Edit</a></div></div><br />Энэ template-д action-аас дамжигдах $job хувьсагч нь job-ын мэдээллийг харуулна. Бид template рүү дамжигдах $jobeet_job-ыг $job болгож өөрчилсөн болохоор, show action-д та мөн энэ өөрчлөлтыг хийх хэрэгтэй ( Энд хувьсагч 2 удаа давтагдсан байгааг анхаараарай).<br />// apps/frontend/modules/job/actions/actions.class.php<br />public function executeShow(sfWebRequest $request)<br />{<br />$this->job = Doctrine::getTable(‘JobeetJob’)-><br />find($request->getParameter(‘id’));<br />$this->forward404Unless($this->job);<br />}<br />Date баганын утга PHP-ын DateTime объект болсоныг анзаарсан байх. Бид created_at баганыг timestamp-аар тодорхойлсон болохоор, та getDateTimeObject method-ыг ашиглан баганын утгыг DateTime объект руу хөрвүүлэх боломжтой ба мөн format method-г ашиглан  эхний аргументэд фоматын загварыг өгч дуудаж ашиглах боломжтой.<br />$job->getDateTimeObject(‘created_at’)->format(‘m/d/Y’);<br />Job description нь simple_format_text() helper-ыг хэрэглэн дамжих утгыг засварлаж жишээ нь <br /> -ыг ашиглан HTML руу форматлаж байна. Энэ helper нь Text Group-д багтах бөгөөдdefault үед дуудагдаагүй бид use_helper helper-ыг ашиглан дуудаж өгсөн болно.<br />Slots<br />Яг одоо бүх хуудасны гарчигууд layout-ны <title> тэг-ээр тодорхойлогдож байгаа.<br /><title>Jobeet – Your best job board</title><br />Харин job хуудсын хувьд бид илүү хэрэгтэй мэдээлэл болох компани нэр, ажлын байр зэргийг гаргамаар байна.<br />Symfony-д дэлгэцэд харагдах layout нь template –ээс хамаарч байгаа үед та slot-ыг тодорхойлох шаардлагатай:<br />Slot-ыг layout-д нэмсэнээр гарчигийг динамик болгож байна.<br />// apps/frontend/templates/layout.php<br /><title><?php include_slot(‘title’) ?></title><br />Slot бүр нэртэйгээр (title) тодорхойлогдох ба include_slot() helper-ыг ашиглан дэлгэцэнд гарна.<br />Одоо, showSuccess.php template-ын эхэнд slot() helper-ыг тодорхойлж job хуудасны slot- ыг тодорхойлъё:<br />// apps/frontend/modules/job/templates/showSuccess.php<br /><?php slot(<br />‘title’,<br />sprintf(‘%s is looking for a %s’, $job->getCompany(),<br />$job->getPosition()))<br />?><br />Хэрэв гарчиг нь бүрэн гүйцэт бол slot helper-ыг блок кодоор мөн ашиглаж болдог.<br />// apps/frontend/modules/job/templates/showSuccess.php<br /><?php slot(‘title’) ?><br /><?php echo sprintf(‘%s is looking for a %s’, $job->getCompany(),<br />$job->getPosition()) ?><br /><?php end_slot(); ?><br />Нүүр хуудас зэрэг зарим хуудасны хувьд бид ерөнхий гарчиг оноох шаардлагатай. Ижил гарчиг template бүрт давтан өгөхийн оронд бид default гарчгийг layout-д тодорхойлж өгч болно.<br />// apps/frontend/templates/layout.php<br /><title><br /><?php include_slot(‘title’, ‘Jobeet – Your best job board’) ?><br /></title><br />Include_slot() method-ын 2 дахь аргумент нь slotтодорхойлогдоогүй үед дуудагдах default утга. Хэрэв default утга нь урт эсвэл зарим HTML tag агуулсан бол дараах байдлаар тодорхойлж мөн болно:<br />// apps/frontend/templates/layout.php<br /><title><br /><?php if (!include_slot(‘title’)): ?><br />Jobeet – Your best job board<br /><?php endif; ?><br /></title><br />Slot тодорхойлогдсон бол include_slot() helper true утгыг буцаана. Тиймээс template-д та гарчгын slot-ын утгыг тодорхойлсон бол тэр нь хэрэглэгдэнэ, үгүй бол default гарчиг нь хэрэглэгдэнэ.<br />Бид include_ -аар эхэлсэн хэд хэдэн helper-ыг авч үзлээ. Эдгээрhelper-үүд HTML код буцаах ба ихэнх үед get_ helper агуулгыг буцааж байна.<br /><?php include_slot(‘title’) ?><br /><?php echo get_slot(‘title’) ?><br /><?php include_stylesheets() ?><br /><?php echo get_stylesheets() ?><br />The Job Page Action<br />Job хуудас show action-аар үүсэж, job модулын executeShow()method-д тодорхойлогдоно.<br />class jobActions extends sfActions<br />{<br />public function executeShow(sfWebRequest $request)<br />{<br />$this->job = Doctrine::getTable(‘JobeetJob’)-><br />find($request->getParameter(‘id’));<br />$this->forward404Unless($this->job);<br />}<br />// …<br />}<br />Index action дээрх шиг, JobeetJob table класс job-ыг гаргахад хэрэглэгдэх ба энэ удаад find() method-г хэрэглэнэ.  Энэ method-ын параметер нь job-ын цор ганц (unique) ялгагч primary keyбайна. Дараагын хэсэгт яагаад $request->getParameter(‘id’)гэсэн мөр job primary key-ыг буцаадгыг тайлбарлана.<br />Хэрэв job өгөгдлийн баазад байхгүй бол бид хэрэглэгчдэдforward404Unless() method-ын  404 хуудсыг хэвлэнэ. Эхний утгыг Boolean-аар авах ба үнэн биш бол хийгдэх үйлдлийг зогсооно.Forward method Action-ны үйлдлийг шууд тэр дор нь зогсоогоодsfError404Exception –г шиднэ. Араас нь ямар нэгэн утга буцаах шаардлагагүй.<br />Хэрэглэгчдэд харагдах exception бүр prod болон dev орчиноос хамаараад өөр өөрөөр хэвлэгдэнэ.<br />Jobeet вэбсайтаа production server-рүү deploy хийхээс өмнө таdefault 404 хуудсыг хэрхэн өөрчлөхыг сурч авна.<br />“forward” method-ын бүлэг<br />forward404Unless үнэндээ дараахтай тэнцүү:<br />$this->forward404If(!$this->job);<br />Энэ нь мөн дараахтай тэнцүү:<br />if (!$this->job)<br />{<br />$this->forward404();<br />}<br />forward404() method бол $this->forward(‘default’, ’404′); -ынshortcut н юм.<br />Forward() method ижил application-ны өөр Action руу заадаг: өмнөх жишээн дээр default модулын 404 action руу заасан.<br />The Request and the Response  (хүсэлт ба хариу)<br />Хэрэв та /job юмуу /job/show/id/1 гэсэн хаягаар хандвал сервэртэй харьцах харилцааг үүсгэнэ. Хандалт нь хүсэлтийгилгээж сервер хариуг буцааж илгээнэ.<br />Бид symfony хүсэлтийг sfWebRequest объектод агуулдгийг өмнө нь харсан (executeShow method –ыг хар).   Мөн symfony объект хандалтад framework болохоор хариу (response) мөнsfWebResponse классын объект. Та хариу (response) объекттойaction дээр $this->getResponse() гэж дуудан холбогдох боломжтой.<br />Эдгээр объектууд PHP функцууд болон PHP глобал хувьсагчууд харьцах маш олон боломжит method-г агуулдаг.<br />Яагаад symfony өмнөх PHP функционалуудыг бүрхдэг вэ? Нэгдүгээрт<br />Symfony-ын method-ууд PHP ижил method- оос хамаагүй хүчирхэг. Мөн хэрэв та application-г тест хийвэл хүсэлт ба хариу(request Ба response) объекттой ажиллахад глобал хувьсагч эсвэл  хэтэрхий түвэгтэй PHP функцууд болох header()функцуудыг бодвол илүү  энгийн байдаг.<br />The Request (Хүсэлт)<br />sfWebRequest класс ~$_SERVER~, ~$_COOKIE~, ~$_GET~, ~$_POST~, болон<br />~$_FILES~ PHP глобал array-уудыг агуулдаг:<br />Method-ын нэр PHP –ын тэнцүү утга<br />getMethod() $_SERVER['REQUEST_METHOD']<br />getUri() $_SERVER['REQUEST_URI']<br />getReferer() $_SERVER['HTTP_REFERER']<br />getHost() $_SERVER['HTTP_HOST']<br />getLanguages() $_SERVER['HTTP_ACCEPT_LANGUAGE']<br />Method-ын нэр PHP -ын тэнцүү утга<br />getCharsets() $_SERVER['HTTP_ACCEPT_CHARSET']<br />isXmlHttpRequest() $_SERVER['X_REQUESTED_WITH'] == ‘XMLHttpRequest’<br />getHttpHeader() $_SERVER<br />getCookie() $_COOKIE<br />isSecure() $_SERVER['HTTPS']<br />getFiles() $_FILES<br />getGetParameter() $_GET<br />getPostParameter() $_POST<br />getUrlParameter() $_SERVER['PATH_INFO']<br />getRemoteAddress() $_SERVER['REMOTE_ADDR']<br />Бид өмнө нь getParameter() method –г ашиглаж хүсэлтийн параметртэй холбогдож байсан. Энэ $_GET эсвэл $_POST эсвэл PATH_INFO глобал хувьсагчуудын утгыг буцаадаг.<br />Хэрэв та яг аль хувьсагчаас утга ирж байгаас мэдэхийг хүсвэл та getGetParameter(), getPostParameter(), болон getUrlParameter() method-уудыг ашиглах хэрэгтэй.<br />ХЭрэв та action-г тодорхой нэг HTTP method-р хязгаарлагдмал байлгахыг хүсвэл тухайлбал хэрэв та форм-аас ирсэн утгаPOST-р илгээгдсэнийг мэдэхийг хүсвэл, та isMethod() method-ыг ашиглаж болно: $this->forwardUnless($request->isMethod(‘POST’));.<br />The Response (Хариу)<br />sfWebResponse класс header()  болон serawcookie() PHP method-уудыг агуулдаг.<br />Method-ын нэр PHP –ын тэнцүү утга<br />setCookie() setrawcookie()<br />setStatusCode() header()<br />setHttpHeader() header()<br />setContentType() header()<br />addVaryHttpHeader() header()<br />addCacheControlHttpHeader() header()<br />Мэдээж, sfWebResponse класс мөн response-ын агуулгыг оноож өгч болдог (senContent болон браузер руу хариуг буцаах send()).<br />Өнөөдрийн эхний хэсэгт бид stylesheet болон JavaScript –үүдийгview.yml болон template-д хэрхэн зохицуулж өгөхийг харсан. Эцэст нь хоёулаа response-ын объектын  addStylesheet()  болонaddJavascript() method-уудыг ашигладаг.<br />The sfAction/ http://www.symfony-project.org/api/1_4/sfAction/ , sfRequest/ http://www.symfony-project.org/api/1_4/sfRequest/ ,болон<br />sfResponse/ http://www.symfony-project.org/api/1_4/sfResponse/классууд өөр олон method-уудыг тодорхойлдог. API-ын хавтас-д зочилж бүх symfony классуудыг мэдэж авахдаа бүү эргэлз.<br />Маргааш болтол баяртай.<br />Өнөөдөр бид symfony-д ашиглагддаг зарим загварчлалын хэв шинжийг авч үзлээ.  Одоо project –ын бүтэц илүү ойлгомжтой болсон гэдэгт найдаж байна. Бид мөн layout –д гаргах template-үүд болон template файлуудыг авч үзсэн. Бид мөн slot-ууд болонaction-уудын ачаар тэдгээрийг багахан динамик болгосон.<br />Маргааш бид өнөөдөр ашигласан url_for() helper-ын талаар илүү сурна мөн дэд framework болох routing-ын талаар үзнэ.<br />