Sampuli za wanaoanza: MVC vs MVP vs MVVM. Sheria za jumla za kuchagua muundo. Uchaguzi wa viungo muhimu kwenye somo

Vidhibiti

Kila ombi linalokuja kwenye programu huchakatwa na mtawala. Kidhibiti kinaweza kushughulikia ombi kiholela mradi halivuki mpaka wa uwajibikaji wa mtazamo wa modeli. Hii ina maana kwamba vidhibiti havipaswi kuwa na au kuhifadhi data, wala havipaswi kuzalisha violesura vya mtumiaji.

Katika Mfumo wa MVC wa ASP.NET, vidhibiti ni madarasa ya NET ambayo yana mantiki inayohitajika ili kuchakata ombi. Jukumu la mtawala ni kujumuisha mantiki ya programu. Kwa maneno mengine, watawala wana jukumu la kushughulikia maombi yanayoingia na kufanya shughuli kwenye mfano eneo la somo na kuchagua maoni ya kuibua kwa mtumiaji.

Sampuli ya Maombi

Kwa madhumuni ya hili na makala zinazofuata tutaunda mradi mpya MVC iliyopewa jina ControllersAndActions kwa kutumia kiolezo Tupu, ikiteua kisanduku cha kuteua cha MVC chini ya Ongeza folda na marejeleo ya msingi, na mradi wa kupima kitengo unaoitwa ControllersAndActions.Tests. Majaribio ya vipimo utakayounda hayahitaji utekelezwaji wa mzaha, kwa hivyo hutahitaji kusakinisha kifurushi cha Moq, lakini utahitaji kusakinisha kifurushi cha MVC ili majaribio yaweze kufikia madarasa ya vidhibiti msingi.

Katika dirisha la koni ya Kidhibiti cha Kifurushi cha Visual Studio NuGet, ingiza amri ifuatayo:

Sakinisha-Kifurushi Microsoft.Aspnet.Mvc -toleo 5.0.0 -jina la mradi ControllersAndActions.Tests

Baada ya kuunda mradi, chagua Sifa za ControllersAndActions kutoka kwa menyu ya Mradi katika Visual Studio, kwenye kisanduku cha mazungumzo kinachofungua, nenda kwenye kichupo cha Wavuti na uangalie kitufe cha redio cha Ukurasa Maalum ( Ukurasa mahususi) katika kitengo cha Kitendo cha Anza. Hakuna haja ya kuingiza thamani yoyote - chagua tu kitufe cha redio.

Dhana ya mtawala

Umeona hali za matumizi ya vidhibiti katika takriban makala yote ya awali ya ASP.NET MVC. Ni wakati wa kuangalia nyuma ya pazia.

Kuunda kidhibiti kwa kutumia kiolesura cha IController

Katika Mfumo wa MVC, madarasa ya kidhibiti lazima yatekeleze kiolesura cha IController kutoka kwa nafasi ya majina Mfumo.Web.Mvc inavyoonyeshwa katika mfano hapa chini:

Kwa kutumia System.Web.Routing; nafasi ya jina System.Web.Mvc ( kiolesura cha umma IController ( utupu Tekeleza(RequestContext requestContext); ) )

Ili kupata ufafanuzi wa kiolesura hiki, unahitaji kupakua msimbo wa chanzo wa Mfumo wa MVC, ambao ni muhimu sana kwa kubaini utendakazi wa ndani wa zana za mfumo.

Kama unaweza kuona, interface ya IController ni rahisi sana. Yake pekee Tekeleza () mbinu Huitwa wakati ombi limetumwa kwa darasa hili la kidhibiti. Mfumo wa MVC unaonyesha ni darasa gani ombi linalenga kwa kusoma thamani ya mali ya kidhibiti inayotokana na data ya uelekezaji, au kupitia madarasa maalum ya uelekezaji.

Unaweza kuunda madarasa ya kidhibiti kwa kutekeleza kiolesura cha IController, lakini kwa kuwa kiolesura hiki ni cha kiwango cha chini, utahitaji kufanya kazi nyingi ili kuishia na chochote muhimu. Hata hivyo, kiolesura cha IController ni muhimu kwa kuonyesha uendeshaji wa vidhibiti na kwa kusudi hili faili mpya ya darasa inayoitwa BasicController.cs imeundwa kwenye folda ya Controllers, yaliyomo ambayo yanaonyeshwa katika mfano hapa chini:

Kwa kutumia System.Web.Mvc; kwa kutumia System.Web.Routing; namespace ControllersAndActions.Controllers ( darasa la umma BasicController: IController ( public void Execute (RequestContext requestContext) ( string controller = (string)requestContext.RouteData.Values["controller"]; string action = (string)requestContext.RouteData.Values["action) "]; requestContext.HttpContext.Response.Write(string.Format("Mdhibiti: (0), Mbinu ya Utekelezaji: (1)", kidhibiti, kitendo)); ) ) )

Mbinu ya Tekeleza() ya kiolesura cha IController hupitishwa kitu cha RequestContext, ambacho hutoa taarifa kuhusu ombi la sasa na njia inayolingana nalo (na husababisha kidhibiti kilichotolewa kuitwa kushughulikia ombi hilo). Darasa la OmbiContext linafafanua mali mbili, zilizoelezewa kwenye jedwali hapa chini:

Kitu cha HttpContextBase hutoa ufikiaji wa seti ya vitu vinavyoelezea ombi la sasa, linaloitwa vitu vya muktadha; tutarudi kwao baadaye. Kitu cha RouteData kinaelezea njia. Sifa muhimu za darasa la RouteData zimeorodheshwa kwenye jedwali hapa chini:

Makala ya Kusanidi Mfumo wa Uelekezaji yalionyesha jinsi ya kutumia aina za RouteBase na IRouteHandler kusanidi mfumo wa uelekezaji. Katika mfano unaozingatiwa, kwa kutumia Mali ya Maadili, maadili ya kidhibiti na vijiti vya sehemu ya hatua hupatikana, ambayo huandikwa kwa majibu.

Sehemu ya tatizo la kuunda vidhibiti maalum ni ukosefu wa ufikiaji wa vipengele kama vile maoni. Hii ina maana kwamba unapaswa kufanya kazi kwa kiwango cha chini, ambacho kinaelezea uandishi wa maudhui moja kwa moja kwa kukabiliana na mteja. Mali HttpContextBase.Response hurejesha kitu cha HttpResponseBase ambacho hukuruhusu kusanidi na kuongeza maudhui kwenye jibu la kutumwa kwa mteja. Hii ni hatua nyingine ya mawasiliano kati ya jukwaa la ASP.NET na Mfumo wa MVC.

Ukiendesha programu na kwenda kwa URL kama /Basic/Index, kidhibiti maalum kitatoa matokeo yaliyoonyeshwa kwenye takwimu hapa chini:

Utekelezaji wa kiolesura cha IController hukuruhusu kuunda darasa ambalo Mfumo wa MVC unatambua kama kidhibiti na kutuma maombi kwake, bila vikwazo vyovyote kuhusu jinsi ombi linachakatwa au jibu gani linalotolewa kwa ajili yake. Hii mfano mzuri kwa sababu inaonyesha jinsi Mfumo wa MVC unavyoweza kupanuka hata kwa vizuizi muhimu vya ujenzi kama vidhibiti, lakini kuandika. maombi magumu kwa njia hii inaweza kujaa matatizo makubwa.

Madarasa yenye majina yanayoishia kwa Msingi

Mfumo wa MVC unategemea mfumo wa ASP.NET kushughulikia maombi, ambayo inaleta maana sana kwa sababu... jukwaa hili ni utekelezaji uliothibitishwa na wenye vipengele vingi ambao unaunganishwa kwa uthabiti na seva ya programu ya IIS. Shida ni kwamba madarasa ambayo ASP.NET hutumia kutoa habari ya ombi hayafai kwa upimaji wa kitengo, faida kuu ya kutumia Mfumo wa MVC.

Microsoft iliamua kuanzisha uwezo wa majaribio huku ikidumisha uoanifu na maombi yaliyopo Fomu za Wavuti za ASP.NET, kwa hivyo matokeo yalikuwa Madarasa ya msingi. Madarasa haya yanaitwa hivyo kwa sababu yana majina sawa na madarasa ya msingi ya mfumo wa ASP.NET, ikifuatiwa na neno Base.

Kwa mfano, mfumo wa ASP.NET hutoa taarifa za muktadha kuhusu ombi la sasa na idadi ya huduma muhimu za utumaji kupitia kitu cha HttpContext. Darasa lake la Msingi linalolingana ni HttpContextBase, mfano ambao hupitishwa kwa Njia ya Execute() iliyofafanuliwa katika kiolesura cha IController (madarasa mengine ya Msingi yataonyeshwa katika mifano ifuatayo). Madarasa ya asili na ya Msingi yanafafanua mali na mbinu sawa, lakini madarasa ya Msingi daima abstract, ambayo inamaanisha ni rahisi kutumia kwa upimaji wa kitengo.

Wakati mwingine utaishia na mfano wa mojawapo ya madarasa ya awali ya ASP.NET, kama vile HttpContext. Katika kesi hii, unahitaji kuunda darasa la Msingi la kirafiki la MVC sawa na HttpContextBase. Hii inafanywa kwa kutumia moja ya Madarasa ya Wrapper, ambayo yana majina sawa na madarasa ya asili, iliyoambatanishwa na neno Wrapper, kwa mfano HttpContextWrapper. Madarasa ya kukunja hutoka kwa madarasa ya Msingi na yana wajenzi wanaokubali mifano ya madarasa asili:

Madarasa asili, Madarasa ya Msingi, na Madarasa ya Kukunja yamefafanuliwa katika nafasi ya majina ya System.Web, kwa hivyo mfumo wa ASP.NET unaweza kuauni Mfumo wa MVC na programu za zamani. Maombi ya wavuti Fomu.

Kuunda kidhibiti kwa kurithi kutoka kwa darasa la Kidhibiti

Kama inavyoonyeshwa katika mfano uliopita, Mfumo wa MVC unaruhusu ubinafsishaji na upanuzi usio na kikomo. Ili kutoa aina yoyote inayotaka ya usindikaji wa hoja na uzalishaji wa matokeo, unaweza kutekeleza kiolesura cha IController. Je, hupendi mbinu za utekelezaji? Je, hutaki kuwa na wasiwasi kuhusu maoni yaliyotolewa? Katika kesi hii, unaweza kuchukua mambo kwa mikono yako mwenyewe na kutekeleza njia bora, ya haraka na ya kifahari zaidi ya kushughulikia maombi. Vinginevyo, unaweza kuchukua fursa ya zana zinazotolewa na timu ya Mfumo wa MVC katika Microsoft na kurithi vidhibiti vyako kutoka kwa darasa la System.Web.Mvc.Controller.

Darasa la Kidhibiti hutoa usaidizi wa kuchakata ombi ambao unajulikana kwa wasanidi programu wengi wa MVC. Ilitumika katika mifano yote iliyojadiliwa katika makala zilizopita. Darasa la Mdhibiti hutoa tatu njia muhimu ambazo zimefafanuliwa hapa chini:

Mbinu za vitendo

Tabia ya kidhibiti imeenea kwa njia nyingi (badala ya kutekelezwa katika fomu njia pekee Tekeleza ()). Kila mbinu ya kitendo imechorwa kwa URL inayolingana na inaitwa na vigezo vilivyopatikana kutoka kwa ombi linaloingia.

Matokeo ya vitendo

Unaweza kurudisha kitu kinachoelezea matokeo ya kitendo (kama vile kutoa mwonekano au kuelekeza upya kwa URL nyingine au mbinu ya kitendo) na kisha kukichakata kwa njia yoyote unayotaka. Kutenganisha kati ya kubainisha matokeo na kuyatekeleza hurahisisha upimaji wa kitengo.

Vichujio

Tabia inayoweza kutumika tena (kama vile uthibitishaji) inaweza kuambatanishwa kama vichujio na kisha kila kipengele cha tabia ya kidhibiti na mbinu za utekelezaji kinaweza kuwekewa alama ya sifa katika msimbo wa chanzo.

Isipokuwa unashughulika na hitaji maalum, mbinu bora ya kuunda vidhibiti ni kuzipata kutoka kwa darasa la Mdhibiti, ambayo ndivyo Visual Studio hufanya, kama unavyoweza kutarajia, inapounda. darasa jipya kwa kujibu kipengee cha menyu Ongeza --> Kiunzi (Ongeza --> Kiolezo).

Mfano hapa chini unaonyesha nambari mtawala rahisi inayoitwa DerivedController, iliyoundwa kwa njia sawa. Inatolewa kwa kutumia MVC 5 Controller - Empty chaguo na kadhaa mabadiliko rahisi, iliyokusudiwa kuweka mali ya ViewBag na kuchagua mwonekano:

Kutumia Mfumo; kwa kutumia System.Web; kwa kutumia System.Web.Mvc; nafasi ya majina ControllersAndActions.Controllers ( class ya umma DerivedController: Controller ( public ActionResult Index() ( ViewBag.Message = "Hujambo kutoka kwa kidhibiti DerivedController action method Index"; return View("MyView"); ) )

Darasa la Mdhibiti pia hutoa mawasiliano na mfumo wa mtazamo wa Razor. Katika mfano huu, tunarudisha matokeo ya simu kwa View() njia, ambayo hupitishwa kama kigezo jina la mtazamo wa kumpa mteja. Ili kuunda mtazamo huu, unda Maoni ya folda / Iliyotokana, bofya juu yake bonyeza kulia panya na uchague ndani menyu ya muktadha kipengee Ongeza --> MVC 5 Tazama Ukurasa (Wembe) (Ongeza --> Ukurasa wa Mtazamo wa MVC 5 (Wembe)). Bainisha jina MyView.cshtml na ubofye Sawa ili kuunda faili ya kutazama.

Lete yaliyomo kwenye faili kulingana na mfano:

@( ViewBag.Title = "Index"; } MyView Сообщение от контроллера: « @ViewBag.Message »!}

Baada ya kuendesha programu na kuelekea kwa URL ya kutazama /Inayotokana/Index, njia hii ya kitendo inaitwa na MyView inatolewa:

Urithi kutoka kwa darasa la Mdhibiti husababisha hitaji la kutekeleza mbinu za vitendo, kupokea ingizo lolote linalohitajika ili kushughulikia ombi na kutoa jibu linalofaa. Makala zifuatazo zinaeleza njia nyingi za kufanya hivyo.

Watu wengi huanza kuandika mradi wa kufanya kazi na kazi moja, haimaanishi kwamba inaweza kukua katika mfumo wa usimamizi wa watumiaji wengi, kwa mfano, maudhui au, Hasha, uzalishaji. Na kila kitu kinaonekana kuwa kizuri na kizuri, kila kitu kinafanya kazi, hadi unapoanza kuelewa kuwa msimbo ulioandikwa unajumuisha magongo na kanuni ngumu. Nambari hiyo imechanganywa na mpangilio, maswali na vigongo, wakati mwingine hata haisomeki. Shida kubwa inatokea: unapoongeza vipengee vipya, lazima uangalie nambari hii kwa muda mrefu sana, ukikumbuka "ni nini kiliandikwa hapo?" na kujilaani huko nyuma.

Huenda hata umesikia kuhusu miundo ya kubuni na hata kupitia vitabu hivi vya ajabu:

  • E. Gamma, R. Helm, R. Johnson, J. Vlissides “Mbinu za Malengo muundo ulioelekezwa. Miundo ya Kubuni";
  • M. Fowler "Usanifu wa Programu za Biashara za Biashara."
Na wengi, bila kuogopa na miongozo mikubwa na nyaraka, walijaribu kusoma mifumo yoyote ya kisasa na, wanakabiliwa na ugumu wa uelewa (kwa sababu ya uwepo wa dhana nyingi za usanifu zilizounganishwa kwa ujanja), waliacha kusoma na kutumia. zana za kisasa "kwenye burner ya nyuma."

Makala hii itakuwa muhimu hasa kwa Kompyuta. Walakini, natumai kuwa katika masaa kadhaa unaweza kupata wazo Utekelezaji wa MVC muundo ambao ni msingi wa mifumo yote ya kisasa ya wavuti, na pia pata "chakula" kwa kutafakari zaidi juu ya "jinsi ya kuifanya." Mwishoni mwa kifungu kuna uteuzi viungo muhimu, ambayo pia itakusaidia kuelewa mifumo ya wavuti inajumuisha (kando na MVC) na jinsi inavyofanya kazi.

Watengenezaji wa programu za PHP walio na msimu hawawezi kupata chochote kipya kwao wenyewe katika nakala hii, lakini maoni na maoni yao juu ya maandishi kuu yangesaidia sana! Kwa sababu Bila nadharia, mazoezi haiwezekani, na bila mazoezi, nadharia haina maana, basi kwanza kutakuwa na nadharia kidogo, na kisha tutaendelea kufanya mazoezi. Ikiwa tayari unafahamu dhana ya MVC, unaweza kuruka sehemu ya nadharia na kwenda moja kwa moja kwenye mazoezi.

1. Nadharia Mchoro wa MVC unaelezea njia rahisi ya kuunda programu, ambayo madhumuni yake ni kutenganisha mantiki ya biashara kutoka kwa kiolesura cha mtumiaji. Matokeo yake, maombi ni rahisi kupima, kupima, kudumisha na, bila shaka, kutekeleza.

Wacha tuangalie mchoro wa dhana ya muundo wa MVC (kwa maoni yangu, huu ndio mchoro uliofanikiwa zaidi ambao nimeona):

Katika usanifu Mfano wa MVC hutoa data na sheria za mantiki ya biashara, mtazamo unawajibika kwa kiolesura cha mtumiaji, na mtawala hutoa mwingiliano kati ya mtindo na mtazamo.

Mtiririko wa kawaida wa programu ya MVC unaweza kuelezewa kama ifuatavyo:

  • Mtumiaji anapotembelea rasilimali ya wavuti, hati ya uanzishaji huunda mfano wa programu na kuizindua kwa utekelezaji.
    Hii inaonyesha mtazamo, sema ukurasa wa nyumbani tovuti.
  • Programu hupokea ombi kutoka kwa mtumiaji na huamua mtawala na hatua iliyoombwa. Kwa upande wa ukurasa kuu, kitendo chaguo-msingi kinafanywa ( index).
  • Programu inasisitiza kidhibiti na inaendesha njia ya kitendo,
    ambayo, kwa mfano, ina simu za modeli zinazosoma habari kutoka kwa hifadhidata.
  • Baada ya hayo, hatua huunda mtazamo na data iliyopatikana kutoka kwa mfano na inaonyesha matokeo kwa mtumiaji.
  • Mfano - ina mantiki ya biashara ya maombi na inajumuisha mbinu za sampuli (hizi zinaweza kuwa njia za ORM), usindikaji (kwa mfano, sheria za uthibitishaji) na kutoa data maalum, ambayo mara nyingi hufanya kuwa nene sana, ambayo ni ya kawaida kabisa.
    Mfano haupaswi kuingiliana moja kwa moja na mtumiaji. Vigezo vyote vinavyohusiana na ombi la mtumiaji lazima vichakatwa kwenye kidhibiti.
    Muundo haufai kutoa HTML au msimbo mwingine wa kuonyesha ambao unaweza kubadilika kulingana na mahitaji ya mtumiaji. Nambari kama hiyo inapaswa kuchakatwa katika maoni.
    Mfano sawa, kwa mfano: mfano wa uthibitishaji wa mtumiaji unaweza kutumika katika sehemu zote za mtumiaji na za utawala za programu. Katika kesi hii, inaweza kuchukuliwa kanuni ya jumla katika darasa tofauti na kurithi kutoka kwayo, akifafanua njia maalum za maombi madogo katika vizazi vyake.

    Tazama - inayotumika kubainisha onyesho la nje la data iliyopokelewa kutoka kwa kidhibiti na modeli.
    Mionekano ina lebo ya HTML na vichochezi vidogo vya msimbo wa PHP ili kupitisha, umbizo na kuonyesha data.
    Haipaswi kufikia hifadhidata moja kwa moja. Hivi ndivyo mifano inapaswa kufanya.
    Haipaswi kufanya kazi na data iliyopatikana kutoka kwa ombi la mtumiaji. Kazi hii lazima ifanywe na mtawala.
    Inaweza kufikia moja kwa moja sifa na mbinu za kidhibiti au miundo ili kupata data iliyo tayari kutoa.
    Mionekano kwa kawaida hugawanywa katika kiolezo cha kawaida, chenye alama za kawaida kwa kurasa zote (kwa mfano, kichwa na kijachini) na sehemu za kiolezo ambazo hutumika kuonyesha matokeo ya data kutoka kwa modeli au kuonyesha fomu za kuingiza data.

    Kidhibiti ni gundi inayounganisha mifano, maoni na vipengele vingine ndani maombi ya kazi. Kidhibiti kinawajibika kushughulikia maombi ya mtumiaji. Kidhibiti haipaswi kuwa na hoja za SQL. Ni bora kuwaweka katika mifano. Kidhibiti haipaswi kuwa na HTML au alama nyingine. Inafaa kuileta kwa mtazamo.
    Katika programu iliyoundwa vizuri ya MVC, vidhibiti kwa kawaida ni vyembamba sana na huwa na mistari michache tu ya msimbo. Sawa haiwezi kusemwa kuhusu Vidhibiti vya Mafuta vya Kijinga (SFC) katika CMS Joomla. Mantiki ya mtawala ni ya kawaida kabisa na nyingi hufanywa ndani madarasa ya msingi.
    Mifano, kinyume chake, ni nene sana na zina kanuni nyingi zinazohusiana na usindikaji wa data, kwa sababu muundo wa data na mantiki ya biashara iliyomo ndani yake kwa kawaida ni mahususi kwa programu mahususi.

    1.1. Kidhibiti cha Mbele na Kidhibiti cha Ukurasa Mara nyingi, mwingiliano wa mtumiaji na programu ya wavuti hutokea kwa kubofya viungo. Angalia sasa upau wa anwani wa kivinjari chako - ulipokea maandishi haya kutoka kwa kiungo hiki. Viungo vingine, kama vile vilivyo upande wa kulia wa ukurasa huu, vitakupa maudhui tofauti. Kwa hivyo, kiungo kinawakilisha amri maalum kwa programu ya wavuti.

    Natumai tayari umegundua kuwa tovuti tofauti zinaweza kuwa kamili miundo tofauti ujenzi upau wa anwani. Kila fomati inaweza kuonyesha usanifu wa programu ya wavuti. Ingawa hii sio wakati wote, katika hali nyingi ni ukweli wazi.

    Wacha tuchunguze chaguzi mbili za upau wa anwani, ambao unaonyesha maandishi na wasifu wa mtumiaji.

    Takriban msimbo wa usindikaji katika kesi hii:
    switch($_GET["action"]) ( kesi "kuhusu" : require_once("about.php"); // mapumziko ya ukurasa wa "Kuhusu Sisi"; kesi "contacts" : require_once("contacts.php"); // Uvunjaji wa ukurasa wa "Anwani"; kisa "maoni" : require_once("feedback.php"); // mapumziko ya ukurasa wa "Maoni"; chaguo-msingi: require_once("page404.php"); // ukurasa wa "404" mapumziko;)
    Nadhani karibu kila mtu amefanya hivi hapo awali.

    Kwa kutumia injini ya kuelekeza ya URL, unaweza kusanidi programu yako ili kukubali maombi kama haya ili kuonyesha taarifa sawa:
    http://www.example.com/contacts/feedback

    Hapa anwani zinawakilisha kidhibiti na maoni ni njia ya kidhibiti cha anwani inayoonyesha fomu maoni na kadhalika. Tutarudi kwenye suala hili katika sehemu ya vitendo.

    Inafaa pia kujua kuwa vipanga njia vingi vya mifumo ya wavuti hukuruhusu kuunda kiholela Njia za URL(onyesha maana ya kila sehemu ya URL) na sheria za kuzichakata.
    Sasa tuna maarifa ya kutosha ya kinadharia ya kuendelea na mazoezi.

    2. Fanya mazoezi Kwanza, hebu tuunde muundo unaofuata faili na folda:


    Kuangalia mbele, nitasema kwamba madarasa ya msingi Model, View na Controller itahifadhiwa kwenye folda ya msingi.
    Watoto wao watahifadhiwa katika vidhibiti, miundo na saraka za kutazama. Faili ya index.php ndiyo sehemu ya kuingilia kwenye programu. Faili ya bootstrap.php inaanzisha upakiaji wa programu, kuunganisha modules zote muhimu, nk.

    Tutaenda kwa mfululizo; Hebu tufungue faili ya index.php na tuijaze na msimbo ufuatao:
    ini_set("makosa_ya_maonyesho", 1); inahitaji_mara moja "application/bootstrap.php";
    Hapapaswi kuwa na maswali yoyote.

    Ifuatayo, wacha tuende mara moja kwenye faili ya bootstrap.php:
    inahitaji_mara moja "core/model.php"; inahitaji_mara moja "msingi/view.php"; inahitaji_mara moja "core/controller.php"; inahitaji_mara moja "core/rout.php"; Njia ::anza (); // anza kipanga njia
    Mistari mitatu ya kwanza itajumuisha faili za kernel ambazo hazipo kwa sasa. Mistari ya mwisho unganisha faili na darasa la router na uzindue kwa utekelezaji kwa kupiga simu mbinu tuli kuanza.

    2.1. Utekelezaji wa Kipanga njia cha URL Kwa sasa, hebu tugeuke kutoka kwa utekelezaji wa muundo wa MVC na tuzingatie uelekezaji. Hatua ya kwanza tunayohitaji kufanya ni kuandika nambari ifuatayo katika .htaccess:
    RewriteEngine On RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule .* index.php [L]
    Nambari hii itaelekeza uchakataji wote wa ukurasa kwa index.php, ambayo ndiyo tunayohitaji. Unakumbuka sehemu ya kwanza tuliongelea Front Controller?!

    Tutaweka njia katika faili tofauti route.php katika saraka ya msingi. Katika faili hii tutaelezea darasa la Njia, ambalo litaendesha mbinu za mtawala, ambazo zitazalisha mtazamo wa ukurasa.

    Yaliyomo kwenye faili ya route.php

    Njia ya darasa ( kazi tuli start() ( // kidhibiti na kitendo chaguo-msingi $controller_name = "Main"; $action_name = "index"; $routes = kulipuka("/", $_SERVER["REQUEST_URI"]); // pata jina la kidhibiti ikiwa (!tupu($routes)) ( $controller_name = $routes; ) // pata jina la kitendo ikiwa (!tupu($routes)) ( $action_name = $routes; ) // ongeza viambishi awali $model_name = " Model_".$controller_name; $controller_name = "Controller_".$controller_name; $action_name = "action_".$action_name; // kuunganisha faili na darasa la kielelezo (huenda kusiwe na faili ya kielelezo) $model_file = strtolower ($model_name). ".php"; $model_path = "application/models/".$model_file; if(file_exists($model_path)) ( jumuisha "application/models/".$model_file; ) // unganisha faili na darasa la kidhibiti $controller_file = strtolower ($controller_name) ) else ( /* itakuwa sahihi kutupa ubaguzi hapa, lakini ili kurahisisha mambo, tutaelekeza mara moja kwenye ukurasa wa 404 */ Route::ErrorPage404(); ) // kuunda kidhibiti $controller = new $controller_name ; $action = $action_name; if(method_exists($controller, $action)) ( // piga hatua ya kidhibiti $controller->$action(); ) vinginevyo ( // hapa itakuwa busara pia kutupa Njia ya ubaguzi::ErrorPage404(); ) ) kosa la kaziPage404( ) ( $host = "http://".$_SERVER["HTTP_HOST"]."/"; kichwa("HTTP/1.1 404 Haijapatikana"); kichwa("Hali: 404 Haijapatikana") ; kichwa(" Mahali:"".$host."404"); ) )


    Ninagundua kuwa darasa hutumia mantiki iliyorahisishwa sana (licha ya nambari kubwa) na inaweza kuwa na shida za usalama. Hii ilifanyika kwa makusudi, kwa sababu ... kuandika darasa kamili la uelekezaji kunastahili angalau nakala tofauti. Hebu tuangalie mambo makuu...

    Kipengele cha safu ya kimataifa $_SERVER["REQUEST_URI"] kina anwani kamili ambayo mtumiaji aliwasiliana nayo.
    Kwa mfano: example.ru/contacts/feedback

    Kwa kutumia kipengele kulipuka Anwani imegawanywa katika vipengele. Matokeo yake, tunapata jina la mtawala, kwa mfano uliotolewa, hii ni mtawala wawasiliani na jina la kitendo, kwa upande wetu - maoni.

    Ifuatayo, faili ya mfano (mfano unaweza kukosa) na faili ya mtawala, ikiwa ipo, imeunganishwa na hatimaye, mfano wa mtawala huundwa na hatua inaitwa, tena, ikiwa ilielezwa katika darasa la mtawala.

    Kwa hivyo, unapoenda, kwa mfano, anwani:
    example.com/portfolio
    au
    example.com/portfolio/index
    Router itafanya vitendo vifuatavyo:

  • itajumuisha faili ya model_portfolio.php kutoka kwa folda ya mifano, iliyo na darasa la Model_Portfolio;
  • itajumuisha faili ya controller_portfolio.php kutoka kwa folda ya vidhibiti, iliyo na darasa la Controller_Portfolio;
  • itaunda mfano wa darasa la Controller_Portfolio na kupiga hatua ya chaguo-msingi - action_index, iliyoelezwa ndani yake.
  • Ikiwa mtumiaji anajaribu kufikia anwani ya kidhibiti ambacho hakipo, kwa mfano:
    example.com/ufo
    kisha ataelekezwa kwenye ukurasa wa "404":
    mfano.com/404
    Kitu kimoja kitatokea ikiwa mtumiaji atapata kitendo ambacho hakijaelezewa katika kidhibiti.2.2. Hebu turudi kwenye utekelezaji wa MVC Hebu tuende kwenye folda ya msingi na kuongeza faili tatu zaidi kwenye faili ya route.php: model.php, view.php na controller.php


    Acha nikukumbushe kuwa zitakuwa na madarasa ya msingi, ambayo sasa tutaanza kuandika.

    Yaliyomo kwenye faili ya model.php
    darasa Model ( kazi ya umma get_data() ( ) )
    Darasa la mfano lina mbinu tupu ya kuleta data, ambayo itabatilishwa katika aina za vizazi. Tunapounda madarasa ya kizazi kila kitu kitakuwa wazi zaidi.

    Yaliyomo kwenye faili ya view.php
    class View ( //public $template_view; // hapa unaweza kubainisha mwonekano chaguomsingi wa jumla. kazi tengeneza($content_view, $template_view, $data = null) ( /* if(is_array($data)) ( // badilisha safu vipengee katika vigeu dondoo($data); ) */ ni pamoja na "application/views/".$template_view; ) )
    Si vigumu nadhani kwamba mbinu kuzalisha iliyokusudiwa kuunda mtazamo. Vigezo vifuatavyo vinapitishwa kwake:

  • $ content_file - maoni yanayoonyesha maudhui ya ukurasa;
  • $template_file - template ya kawaida kwa kurasa zote;
  • $data ni safu iliyo na vipengele vya maudhui ya ukurasa. Kawaida kujazwa katika mfano.
  • Jumuisha chaguo za kukokotoa huunganisha kiolezo cha jumla (mwonekano) ambamo mwonekano utapachikwa
    ili kuonyesha maudhui ya ukurasa maalum.

    Kwa upande wetu, kiolezo cha jumla kitakuwa na kichwa, menyu, utepe na kijachini, na maudhui ya ukurasa yatakuwa katika fomu tofauti. Tena, hii inafanywa kwa urahisi.

    Yaliyomo kwenye faili ya controller.php
    class Controller ( public $model; public $view; function __construct() ( $this->view = new View(); ) function_index() ( ) )
    Njia kielezo_kitendo- hii ni hatua inayoitwa kwa chaguo-msingi; tutaibatilisha wakati wa kutekeleza madarasa ya kizazi.

    2.3. Utekelezaji wa madarasa ya kizazi Mfano na Kidhibiti, uundaji wa View "s Sasa furaha inaanza! Tovuti yetu ya kadi ya biashara itakuwa na kurasa zifuatazo:
  • nyumbani
  • Huduma
  • Kwingineko
  • Anwani
  • Na pia - ukurasa wa "404".
  • Kila ukurasa una kidhibiti chake kutoka kwa folda ya vidhibiti na mtazamo kutoka kwa folda ya maoni. Baadhi ya kurasa zinaweza kutumia kielelezo au vielelezo kutoka kwa folda za vielelezo.


    Katika takwimu iliyotangulia, faili template_view.php imeangaziwa kando - hii ni kiolezo kilicho na alama za kawaida kwa kurasa zote. Katika kesi rahisi zaidi, inaweza kuonekana kama hii:
    nyumbani
    Ili kuipa tovuti mwonekano mzuri, tunaunda kiolezo cha CSS na kukiunganisha kwenye tovuti yetu kwa kubadilisha muundo wa alama za HTML na Viunganisho vya CSS na faili za JavaScript:

    Mwishoni mwa kifungu, katika sehemu ya "Matokeo", kuna kiunga cha hazina ya GitHub na mradi ambao hatua zimechukuliwa ili kuunganisha kiolezo rahisi.

    2.3.1. Kuunda ukurasa mkuu Wacha tuanze na kidhibiti controller_main.php , hapa kuna msimbo wake:
    class Controller_Main huongeza Kidhibiti ( kazi action_index() ( $this->view->generate("main_view.php", "template_view.php"); ) )
    Katika mbinu kuzalisha mfano wa darasa la Tazama, majina ya faili za kiolezo cha jumla na mwonekano na yaliyomo kwenye ukurasa hupitishwa.
    Mbali na hatua ya faharisi, mtawala bila shaka anaweza kuwa na vitendo vingine.

    Faili na mtazamo wa jumla tuliangalia mapema. Zingatia faili ya maudhui main_view.php:
    Karibu!

    OLOLOSHA TEAM ni timu ya wataalamu wa daraja la kwanza katika uwanja wa ukuzaji tovuti wenye uzoefu wa miaka mingi katika kukusanya vinyago vya Mexico, sanamu za shaba na mawe kutoka India na Ceylon, picha za asili na sanamu zilizoundwa na mabwana wa Equatorial Africa karne tano au sita. iliyopita...


    Hii ina alama rahisi bila simu zozote za PHP.
    Ili kuonyesha ukurasa mkuu, unaweza kutumia mojawapo ya anwani zifuatazo:

    Tutazingatia mfano kwa kutumia mtazamo unaoonyesha data iliyopatikana kutoka kwa mfano hapa chini.

    2.3.2. Unda ukurasa wa "Portfolio" Kwa upande wetu, ukurasa wa "Portfolio" ndio ukurasa pekee unaotumia mfano.
    Mfano kawaida hujumuisha njia za sampuli za data, kwa mfano:
  • njia za maktaba za asili za pgsql au mysql;
  • njia za maktaba zinazotumia uondoaji wa data. Kwa mfano, mbinu za maktaba ya PEAR MDB2;
  • njia za ORM;
  • njia za kufanya kazi na NoSQL;
  • na nk.
  • Kwa urahisi, hatutatumia hoja za SQL au taarifa za ORM hapa. Badala yake, tutaiga data halisi na kurudisha mara moja safu ya matokeo.
    Weka faili ya kielelezo model_portfolio.php kwenye folda ya vielelezo. Hapa kuna yaliyomo:
    class Model_Portfolio inapanua Mfano ( chaguo la kukokotoa la umma get_data() ( safu ya urejeshaji("Mwaka" => "2012", "Site" => "http://DunkelBeer.ru", "Maelezo" => "Tovuti ya utangazaji ya bia ya giza ya Dunkel kutoka kwa mtengenezaji wa Ujerumani Löwenbraü inayozalishwa nchini Urusi na kampuni ya kutengeneza pombe "SUN InBev."), safu("Mwaka" => "2012", "Site" => "http://ZopoMobile.ru", "Maelezo " => "Katalogi ya lugha ya Kirusi Simu za Kichina Kampuni ya Zopo inaendelea Android msingi OS na vifaa vyao."), // todo); ))

    Darasa la kidhibiti cha kielelezo liko katika faili ya controller_portfolio.php, hapa kuna msimbo wake:
    class Controller_Portfolio huongeza Kidhibiti ( kazi __construct() ( $this->model = new Model_Portfolio(); $this->view = new View(); ) function_index() ( $data = $this->model->get_data( ); $this->view->generate("portfolio_view.php", "template_view.php", $data); ) )
    Kwa kutofautiana data safu iliyorejeshwa na njia imeandikwa pata_data ambayo tuliangalia hapo awali.
    Tofauti hii basi hupitishwa kama kigezo cha njia kuzalisha, ambayo pia ina: jina la faili yenye template ya jumla na jina la faili iliyo na mtazamo na maudhui ya ukurasa.

    Mwonekano ulio na maudhui ya ukurasa uko kwenye faili ya portfolio_view.php.
    Kwingineko

    Miradi yote kwenye jedwali ifuatayo ni ya uwongo, kwa hivyo usijaribu hata kufuata viungo vilivyotolewa.
    MwakaMradiMaelezo


    Kila kitu ni rahisi hapa, mtazamo unaonyesha data iliyopatikana kutoka kwa mfano.

    2.3.3. Kuunda kurasa zilizobaki Kurasa zilizobaki zinaundwa kwa njia ile ile. Nambari yao inapatikana katika hazina ya GitHub, kiungo ambacho hutolewa mwishoni mwa makala, katika sehemu ya "Matokeo".3. Matokeo Haya ndiyo yaliyotokea mwishoni:

    Picha ya skrini ya tovuti ya kadi ya biashara inayotokana



    Kiungo cha GitHub: https://github.com/vitalyswipe/tinymvc/zipball/v0.1

    Lakini katika toleo hili nilichora madarasa yafuatayo (na aina zao zinazolingana):

    • Controller_Login ambayo mtazamo huzalishwa kwa fomu ya kuingia kuingia na nenosiri, baada ya kujaza ambayo utaratibu wa uthibitishaji unafanywa na, ikiwa imefanikiwa, mtumiaji anaelekezwa kwenye jopo la admin.
    • Contorller_Admin na kitendo cha faharasa ambacho hukagua ikiwa mtumiaji aliidhinishwa hapo awali kwenye tovuti kama msimamizi (ikiwa ni hivyo, mwonekano wa paneli ya msimamizi unaonyeshwa) na kitendo cha kuondoka kwa kuondoka.
    Uthibitishaji na uidhinishaji ni mada tofauti, kwa hivyo haijajadiliwa hapa, lakini ni kiunga kilichotolewa hapo juu tu ambacho kimetolewa ili uwe na kitu cha kuanzia.4. Hitimisho Mchoro wa MVC unatumika kama msingi wa usanifu katika mifumo mingi na CMS ambazo ziliundwa ili kuweza kukuza ubora wa juu. ufumbuzi tata kwa zaidi muda mfupi. Hii iliwezekana kwa kuongeza kiwango cha uondoaji, kwani kuna kikomo cha ugumu wa miundo ambayo ubongo wa mwanadamu unaweza kufanya kazi nayo.

    Lakini, kutumia mifumo ya wavuti kama vile Yii au Kohana, inayojumuisha faili mia kadhaa, wakati wa kuunda programu rahisi za wavuti (kwa mfano, tovuti za kadi za biashara) haifai kila wakati. Sasa tunaweza kuunda kielelezo kizuri cha MVC ili tusichanganye Php, Html, CSS na msimbo wa JavaScript katika faili moja.

    Nakala hii ni sehemu ya kuanzia ya kujifunza CMF kuliko mfano wa kitu sahihi ambacho unaweza kutumia kama msingi wa programu yako ya wavuti. Labda ilikuhimiza na tayari unafikiria kuandika muundo wako mdogo au CMS kulingana na MVC. Lakini, kabla ya kurejesha gurudumu linalofuata na "blackjack na makahaba," fikiria tena: labda itakuwa busara zaidi kuelekeza juhudi zako kwa maendeleo na kusaidia jamii ya mradi uliopo tayari?!

    P.S.: Nakala hiyo iliandikwa upya kwa kuzingatia maoni kadhaa yaliyoachwa kwenye maoni. Ukosoaji uligeuka kuwa muhimu sana. Kwa kuzingatia jibu: maoni, PM na idadi ya watumiaji walioongeza chapisho kwenye vipendwa, wazo la kuandika chapisho hili liligeuka kuwa sio mbaya sana. Kwa bahati mbaya, haiwezekani kuzingatia matakwa yote na kuandika zaidi na kwa undani zaidi kutokana na ukosefu wa muda ... lakini labda wale watu wa ajabu ambao walipunguza toleo la awali watafanya hivyo. Bahati nzuri na miradi yako!

    5. Uteuzi wa viungo muhimu juu ya mada Nakala mara nyingi inagusa mada ya mifumo ya wavuti - hii ni mada pana sana, kwa sababu hata miundo midogo ina sehemu nyingi zilizounganishwa kwa ujanja na itachukua zaidi ya nakala moja kuzungumza juu ya haya. vipengele. Hata hivyo, niliamua kuwasilisha hapa uteuzi mdogo wa viungo (ambavyo nilifuata wakati wa kuandika makala hii) ambayo kwa namna moja au nyingine yanahusiana na mada ya mifumo.

    Lebo: Ongeza vitambulisho

    Muundo wa Model-View-Controller (MVC) uliogunduliwa mwishoni mwa miaka ya 1970, ni muundo wa usanifu. programu, kazi kuu ambayo ni kutenganisha kazi za kufanya kazi na data kutoka kwa uwasilishaji wao. Kinadharia, programu ya MVC iliyoundwa vizuri itaruhusu watengenezaji wa mbele na wa nyuma wasiingiliane na maeneo ya uwajibikaji ya kila mmoja wakati wa kazi yao, ambayo ni kwamba, msanidi programu hatahitaji kujua chochote kuhusu "jikoni" ya mwenzake wa nyuma na kinyume chake.

    Ingawa MVC awali iliundwa kwa ajili ya maendeleo ya programu ya eneo-kazi, imebadilishwa kwa kazi za kisasa na ni maarufu sana kati ya watengenezaji wa wavuti, kwani kwa sababu ya mgawanyiko wa majukumu imewezekana kuunda wazi zaidi, tayari kutumia. tumia tena kanuni. Mchoro wa MVC husababisha mifumo safi na ya kawaida inayoruhusu wasanidi programu kufanya mabadiliko kwa msimbo uliopo kwa haraka sana.

    Katika makala hii tutaangalia kanuni za msingi MVC, kuanzia na kufafanua muundo na kuendelea kuitumia kwa mfano mdogo. Nakala hii itakuwa muhimu kwa wale ambao hawajawahi kukutana na muundo huu maishani, na pia, labda, kwa wale ambao wanataka kuharakisha ufahamu wao wa MVC.

    Kuelewa MVC

    Kama ilivyoelezwa tayari, jina la muundo linatokana na ufupisho wa maneno matatu: Mfano (mfano), Tazama (mtazamo) na Mdhibiti (mtawala). Kwa kifupi, kanuni ya uendeshaji wa muundo inaweza kuonyeshwa kwa mchoro mmoja (unaweza kupatikana kwenye Wikipedia):

    Mchoro huu unaonyesha wazi mtiririko unidirectional wa habari katika muundo na pia inaelezea majukumu ya kila sehemu.

    Mfano

    Mfano huo hutumiwa kupata na kuendesha data. Katika hali nyingi, modeli ndiyo inayotumiwa kufikia hifadhi ya data (kama vile hifadhidata). Mfano hutoa kiolesura cha kutafuta data, kuunda, kurekebisha, na kuifuta kutoka kwa hifadhi. Katika muktadha wa muundo wa MVC, mfano ni mpatanishi kati ya mtazamo na mtawala.

    Kipengele muhimu sana cha modeli ni kwamba kitaalam haina ufahamu wa kile kinachotokea na data kwenye kidhibiti na mtazamo. Muundo haupaswi kamwe kufanya au kusubiri maombi yoyote kwa/kutoka kwa vipengele vingine vya muundo.

    Walakini, kumbuka kila wakati kuwa mfano sio tu lango la hifadhidata au mfumo mwingine ambao haufanyi chochote isipokuwa kuhamisha data na kurudi. Mfano ni kama lango la data. Mfano ni katika hali nyingi sehemu ngumu zaidi ya mfumo, kwa sehemu kutokana na ukweli kwamba mfano yenyewe ni kiungo cha kuunganisha kwa sehemu nyingine zote.

    Utendaji

    Mtazamo ni mahali ambapo data iliyopokelewa kutoka kwa modeli hutolewa katika fomu sahihi. Katika programu za kawaida za wavuti zilizotengenezwa kwa kutumia muundo wa MVC, mwonekano ni sehemu ya mfumo ambapo msimbo wa HTML unatolewa. Mtazamo pia unawajibika kupokea vitendo kutoka kwa mtumiaji ili kuzituma kwa kidhibiti. Kwa mfano, mwonekano unaonyesha kitufe ndani kiolesura cha mtumiaji, na baada ya kubonyeza husababisha hatua ya mtawala inayolingana.

    Kuna baadhi ya maoni potofu kuhusu madhumuni ya mtazamo, hasa miongoni mwa watengenezaji wavuti ambao wanaanza tu kuunda programu zao kwa kutumia MVC. Moja ya sheria za kawaida zilizovunjwa ni kwamba mtazamo haupaswi kuwasiliana na mfano kwa njia yoyote, na data zote zilizopokelewa na mtazamo lazima zitoke tu kutoka kwa mtawala. Katika mazoezi, watengenezaji mara nyingi hupuuza dhana hii, ambayo ni msingi wa muundo wa MVC. Nakala ya Fabio Cevasco inaonyesha mbinu hii ya kutatanisha kwa MVC kwa kutumia CakePHP, mojawapo ya mifumo mingi isiyo ya kawaida ya MVC:

    Ni muhimu sana kuelewa kwamba ili kupata usanifu sahihi wa MVC, haipaswi kuwa na mwingiliano wowote wa moja kwa moja kati ya maoni na mifano. Mantiki yote ya kubadilishana data kati yao lazima itekelezwe katika vidhibiti.

    Zaidi ya hayo, kuna maoni potofu ya kawaida kwamba mtazamo ni faili ya kiolezo tu. Kama Tom Butler alivyobaini, dhana hii potofu ni kubwa kutokana na ukweli kwamba watengenezaji wengi hawaelewi muundo wa MVC tangu mwanzo, baada ya hapo wanaanza kumwaga "ujuzi" huu zaidi kwa umati wa watengenezaji wa novice. Kwa kweli, mtazamo ni zaidi ya kiolezo tu, lakini mifumo mingi iliyojengwa juu ya muundo wa MVC imepotosha dhana ya mtazamo kiasi kwamba hakuna anayejali ikiwa programu zao ni sahihi kulingana na muundo wa MVC.

    Jambo lingine muhimu ni kwamba mtazamo haufanyi kazi na data "safi" kutoka kwa mtawala, yaani, mtawala hafanyi kazi na mtazamo bila kupitisha mfano. Wakati wa mwingiliano kati ya mtawala na mtazamo, mfano unapaswa kuwa kati yao daima.

    Kidhibiti

    Kidhibiti ni sehemu ya mwisho ya kifurushi cha MVC. Kazi ya mtawala ni kupokea data kutoka kwa mtumiaji na kuendesha mfano. Ni kidhibiti, na ni hicho tu, ambacho ni sehemu ya mfumo inayoingiliana na mtumiaji.

    Kwa kifupi, kidhibiti kinaweza kuelezewa kama mkusanyaji wa habari ambaye hupitisha kwa mfano kwa usindikaji na uhifadhi. Haipaswi kufanya chochote na data, lakini tu kuwa na uwezo wa kupokea kutoka kwa mtumiaji. Mdhibiti anahusishwa na mtazamo mmoja na mfano mmoja, hivyo kuandaa mtiririko wa data unidirectional, kudhibiti katika kila hatua.

    Ni muhimu kukumbuka kuwa mtawala huanza tu kazi yake kama matokeo ya mwingiliano wa mtumiaji na mtazamo, ambayo huita kazi ya mtawala inayolingana. Makosa ya kawaida kati ya watengenezaji ni kuona kidhibiti kama lango kati ya mtazamo na modeli. Matokeo yake, mtawala amepewa kazi hizo ambazo zinapaswa kufanywa na mtazamo (kwa njia, hii ndio ambapo wazo kwamba mtazamo ni faili ya template tu inatoka). Zaidi ya hayo, watu wengi hutupa kabisa mantiki yote ya usindikaji wa data, wakisahau kuhusu kile ambacho kielelezo kinakusudiwa katika muundo wa MVC.

    MVC katika PHP

    Ninapendekeza kujaribu kutekeleza hapo juu katika programu ndogo. Wacha tuanze kwa kuunda modeli, tazama na madarasa ya mtawala: