Spille symfoni 1.4

I gar undersokte vi hvordan symfoni forenkler databehandlingen ved a trekke ut forskjellene mellom databasemotorer og ved a konvertere relasjonselementene til fine objektorienterte klasser. Vi har ogsa spilt med L re for a beskrive databaseskjemaet, opprette tabellene, og fylle databasen med noen innledende data.

I dag skal vi tilpasse den grunnleggende jobbmodulen vi opprettet tidligere. Arbeidsmodulen har allerede all koden vi trenger for Jobeet:

En side for a liste alle jobber En side for a opprette en ny jobb En side for a oppdatere en eksisterende jobb En side for a slette en jobb.

Selv om koden er klar til a bli brukt som det, vil vi refactor maler for a matche n rmere Jobeet mockups.

MVC-arkitekturen.

Hvis du er vant til a utvikle PHP-nettsteder uten rammeverk, bruker du sannsynligvis den ene PHP-filen per HTML-sideparadigma. Disse PHP-filene inneholder trolig den samme typen struktur: Initialisering og global konfigurasjon, forretningslogikk relatert til den forespurte siden, databaseoppforinger henter, og til slutt HTML-kode som bygger siden.

Du kan bruke en templerende motor for a skille logikken fra HTML. Kanskje du bruker et databasekstraksjonslag for a skille mellommodellinteraksjon fra forretningslogikk. Men det meste av tiden slutter du med mye kode som er et mareritt a opprettholde. Det var raskt a bygge, men over tid er det vanskeligere a gjore endringer, spesielt fordi ingen unntatt du forstar hvordan den er bygget og hvordan den fungerer.

Som med alle problemer er det gode losninger. For webutvikling er den vanligste losningen for a organisere koden din i dag MVC-monsteret. Kort sagt, definerer MVC-designmonsteret en mate a organisere koden din i henhold til sin natur. Dette monsteret separerer koden i tre lag:

Modelllaget definerer forretningslogikken (databasen tilhorer dette laget). Du vet allerede at symfony lagrer alle klasser og filer relatert til modellen i lib / model / katalogen.

Visningen er hva brukeren samhandler med (en malmotor er en del av dette laget). I symfony er View-laget hovedsakelig laget av PHP-maler. De lagres i ulike maler / kataloger som vi vil se senere i disse linjene.

Kontrolleren er et stykke kode som kaller modellen for a fa noen data som den overgar til visningen for gjengivelse til klienten. Da vi installerte symfony i begynnelsen av denne boken, sa vi at alle foresporsler blir styrt av frontkontrollere (index.php og frontend_dev.php). Disse frontkontrollerne delegerer det virkelige arbeidet til handlinger. Som vi sa tidligere, er disse handlingene logisk gruppert i moduler.

I dag bruker vi mockupen som er definert i dag 2 for a tilpasse hjemmesiden og jobbsiden. Vi vil ogsa gjore dem dynamiske. Underveis vil vi finjustere mange ting i mange forskjellige filer for a demonstrere symfony katalogstrukturen og maten a skille kode mellom lagene.

Oppsettet.

Forst, hvis du ser n rmere pa mockupene, vil du legge merke til at mye av hver side ser det samme ut. Du vet allerede at kodeduplisering er darlig, enten vi snakker om HTML- eller PHP-kode, sa vi ma finne en mate a forhindre at disse vanlige visningselementene forer til i kod duplisering.

En mate a lose problemet pa er a definere en overskrift og en bunntekst og inkludere dem i hver mal:

Men her har ikke overskriften og footer-filene gyldig HTML. Det ma v re en bedre mate. I stedet for a gjenoppfinne hjulet, vil vi bruke et annet monster for a lose dette problemet: dekoratormonsteret. Dekoratormonsteret loser problemet pa den andre siden: Malen er dekorert etter at innholdet er gjengitt av en global mal, kalt et layout i symfony:

Standardoppsettet for et program kalles layout.php og kan finnes i appene / frontend / maler / katalog. Denne katalogen inneholder alle de globale malene for et program.

Bytt standard symfony layout med folgende kode:

En symfonymal er bare en ren PHP-fil. I oppsettmalen ser du samtaler til PHP-funksjoner og referanser til PHP-variabler. $ sf_content er den mest interessante variabelen: Den er definert av selve rammen og inneholder HTML generert av handlingen.

Hvis du surfer pa jobbmodulen (http: //www.jobeet.com.localhost/frontend_dev.php/job), vil du se at alle handlinger na er dekorert av oppsettet.

Stilarkene, bildene og java skriptene.

Siden denne oppl ringen ikke handler om webdesign, har vi allerede utarbeidet alle nodvendige ressurser som vi skal bruke for Jobeet: Last ned bildefilene arkivet og legg dem inn i web / arv / bilder / katalog; last ned arkivarkivet arkivfilene og legg dem inn i web / css / katalog.

I oppsettet har vi tatt med en favicon. Du kan laste ned Jobeet en og legge den under web / katalog.

Som standard har genereringsprosjektet opprettet tre kataloger for prosjektets eiendeler: web / arv / bilder / for bilder, web /

/ for stilark, og web / js / for JavaScripts. Dette er en av de mange konvensjonene som er definert av symfony, men du kan selvfolgelig lagre dem andre steder under nettet / katalogen.

Den stakkars leseren har lagt merke til at selv om main.css-filen ikke er nevnt hvor som helst i standardoppsettet, er den definitivt til stede i den genererte HTML-en. Men ikke de andre. Hvordan er dette mulig?

Stylesheet-filen er inkludert i funksjonen call_stylesheets () () som finnes i oppsettet & lt; head & gt; stikkord. Funksjonen include_stylesheets () kalles en hjelper. En hjelper er en funksjon, definert av symfony, som kan ta parametere og returnerer HTML-kode. Mesteparten av tiden er hjelpere tidsbesparende, de pakker kodeneseddeler som ofte brukes i maler. Include_stylesheets () hjelper genererer & lt; link & gt; koder for stilark.

Men hvordan vet hjelperen hvilke stilark som skal inkluderes?

Visningslaget kan konfigureres ved a redigere visningsfilen view.yml i programmet. Her er standard-en som genereres av generasjonen: app-oppgave:

View.yml-filen konfigurerer standardinnstillingene for alle maler i applikasjonen. For eksempel definerer stilarkoppforingen en rekke stilarkfiler som skal inkluderes for hver side av programmet (inkluderingen er utfort av help_stylesheets () -hjelperen).

I konfigurasjonsfilen default view.yml er den refererte filen main.css, og ikke /css/main.css. Faktisk er begge definisjonene ekvivalente som symfoni prefikser relative baner med /

Hvis mange filer er definert, vil symfony inneholde dem i samme rekkefolge som definisjonen:

Du kan ogsa endre medietattributtet og utelate .css-suffikset:

Denne konfigurasjonen blir gjengitt som:

Konfigurasjonsfilen view.yml definerer ogsa standardoppsettet som brukes av programmet. Som standard er navnet layout, og sa symboliserer symfoni hver side med layout.php-filen. Du kan ogsa deaktivere dekorasjonsprosessen helt ved a bytte ut has_layout-oppforingen til falsk.

Det fungerer som det er, men jobs.css-filen er bare nodvendig for hjemmesiden, og job.css-filen er bare nodvendig for jobbsiden. Konfigurasjonsfilen view.yml kan tilpasses pa basis av hver modul. Endre stilarktasten i applikasjonsvisningen.yml-filen for a bare inneholde main.css-filen:

For a tilpasse visningen for jobbmodulen, opprett en view.yml-fil i appene / frontend / moduler / jobb / config / katalog:

Under indexSuccess og showSuccess-seksjonene (de er malnavnene som er knyttet til indeks- og visningsaksjonene, som vi vil se senere), kan du tilpasse hvilken som helst oppforing som er funnet under standardavsnittet i soknadsvisningen.yml. Alle spesifikke oppforinger slas sammen med programkonfigurasjonen. Du kan ogsa definere noen konfigurasjon for alle handlinger av en modul med den spesielle alle delen.

Konfigurasjonsprinsipper i symfoni.

For mange symfony-konfigurasjonsfiler kan samme innstilling defineres pa forskjellige nivaer:

Standardkonfigurasjonen ligger i rammen Den globale konfigurasjonen for prosjektet (i config /) Den lokale konfigurasjonen for et program (i apps / APP / config /) Den lokale konfigurasjonen er begrenset til en modul (i apper / APP / moduler / MODUL / config /)

Ved kjoretid kombinerer konfigurasjonssystemet alle verdiene fra de forskjellige filene hvis de eksisterer og caches resultatet for bedre ytelse.

Som en tommelfingerregel, nar noe kan konfigureres via en konfigurasjonsfil, kan det samme oppnas med PHP-kode. I stedet for a lage en view.yml-fil for jobbmodulen kan du for eksempel bruke help_stylesheet () -hjelperen til a inkludere et stilark fra en mal:

Du kan ogsa bruke denne hjelperen i oppsettet for a inkludere et stilark globalt.

A velge mellom en metode eller den andre er virkelig et sporsmal om smak. View.yml-filen gir en mate a definere ting for alle handlinger av en modul, noe som ikke er mulig i en mal, men konfigurasjonen er ganske statisk. Pa den annen side er bruken av help_stylesheet () hjelperen mer fleksibel, og i tillegg er alt pa samme sted: stilarkdefinisjonen og HTML-koden. For Jobeet vil vi bruke help_stylesheet () -hjelpen, slik at du kan fjerne visningen.yml vi nettopp har opprettet og oppdatert jobbmaler med use_stylesheet () samtaler:

Symmetrisk, JavaScript-konfigurasjonen gjores via javascripts-oppforingen i view.yml-konfigurasjonsfilen, og help_javascript () -hjelperen definerer JavaScript-filer for a inkludere for en mal.

Jobb Hjemmesiden.

Som vist i dag 3, blir jobbsiden generert av indeksvirksomheten til jobbmodulen. Indeks-handlingen er Controller-delen av siden og tilhorende mal, indexSuccess.php, er View-delen:

Handlingen.

Hver handling er representert ved en metode i en klasse. For jobbsiden er klassen jobActions (navnet pa modulen suffiks av Actions), og metoden er executeIndex () (kjor suffixed med navnet pa handlingen). Den henter alle jobber fra databasen:

La oss ta en n rmere titt pa koden: executeIndex () -metoden (kontrolleren) kaller tabellen JobeetJob for a lage et sok for a hente alle jobbene. Den returnerer en Doctrine_Collection av JobeetJob objekter som er tilordnet jobeet_jobs objektegenskapen. Alle slike objektegenskaper sendes deretter automatisk til malen (visningen). For a sende data fra Controller til View, bare opprett en ny egenskap:

Denne koden vil gjore $ foo- og $ bar-variabler tilgjengelige i malen.

Malen.

Som standard er malnavnet knyttet til en handling utledet av symfony takket v re en konvensjon (handlingsnavnet er suffiks av suksess).

IndexSuccess.php-malgen genererer et HTML-tabell for alle jobbene. Her er den nav rende malekoden:

I malekoden forloser det gjennom listen over jobbobjekter ($ jobeet_jobs), og for hver jobb blir hver kolonneverdi utgang. Husk at a fa tilgang til en kolonneverdi er sa enkelt som a kalle en tilgangsmetode som navnet begynner med, og kolonnenavnet for camelCased (for eksempel metoden getCreatedAt () for kolonnen created_at).

La oss rydde opp dette litt for bare a vise et undersett av de tilgjengelige kolonnene:

Funksjonen url_for () i denne mal er en symfonihjelp som vi skal diskutere i morgen.

Maskinen for jobbside.

La oss na tilpasse malen pa jobbsiden. Apne showSuccess.php-filen og erstatt innholdet med folgende kode:

Denne malen bruker $ jobbvariabelen som ble sendt av handlingen for a vise jobbinformasjonen. Som vi har omdopt variabelen som er sendt til malen fra $ jobeet_job til $ job, ma du ogsa gjore denne endringen i show-handlingen (v r forsiktig, det er to forekomster av variabelen):

Legg merke til at datakolonnene kan konverteres til PHP DateTime-objekteksempler. Nar vi har definert kolonnen created_at som tidsstempel, kan du konvertere kolonnev rdien til en DateTime-objekt ved a bruke metoden getDateTimeObject () og deretter kalle formatet () -metoden som tar et datoformatmonster som det forste argumentet:

Stillingsbeskrivelsen bruker simple_format_text () hjelperen til a formatere den som HTML, ved a erstatte vognretur med & lt; br / & gt; for eksempel. Siden denne hjelperen tilhorer teksthjelpegruppen, som ikke er lastet som standard, har vi lastet det manuelt ved hjelp av help_helper () -hjelpen.

For oyeblikket er tittelen pa alle sidene definert i & lt; title & gt; merket av oppsettet:

Men for jobb siden, onsker vi a gi mer nyttig informasjon, som firmanavnet og stillingen.

I symfony, nar en sone i oppsettet avhenger av hvilken mal som skal vises, ma du definere et spor:

Legg til et spor til oppsettet slik at tittelen kan v re dynamisk:

Hvert spor er definert av et navn (tittel) og kan vises ved hjelp av include_slot () hjelperen. Na, i begynnelsen av showSuccess.php-malen, bruker du sporet () -hjelpen til a definere innholdet i sporet for jobbsiden:

Hvis tittelen er kompleks a generere, kan spalten () hjelperen ogsa brukes med en blokk med kode:

For noen sider, som hjemmesiden, trenger vi bare en generisk tittel. I stedet for a gjenta samme tittel igjen og igjen i maler, kan vi definere en standardtittel i oppsettet:

Det andre argumentet for metoden include_slot () er standardverdien for sporet hvis den ikke er definert. Hvis standardverdien er lengre eller har noen HTML-koder, kan du ogsa definere den som i folgende kode:

Hjelpen include_slot () returnerer sant hvis sporet er definert. Sa, nar du definerer tittelfeltinnholdet i en mal, blir det brukt; Hvis ikke, brukes standard tittelen.

Vi har allerede sett ganske mange hjelpere som begynner med include_. Disse hjelperne sender HTML-en og har i de fleste tilfeller en get_-hjelpepartner for a bare returnere innholdet:

Job side-handlingen.

Arbeidsiden genereres av show-handlingen, definert i executeShow () -metoden til jobbmodulen:

Som i indeksaksjonen brukes JobeetJob-tabellklassen til a hente en jobb, denne gangen ved a bruke metoden find (). Parameteren til denne metoden er den unike identifikatoren for en jobb, den prim re nokkelen. Det neste avsnittet forklarer hvorfor $ request- & gt; getParameter (‘id’) -oppstillingen returnerer prim rnokkelen for jobben.

Hvis jobben ikke eksisterer i databasen, onsker vi a videresende brukeren til en 404-side, noe som akkurat hva fremover404Unless () -metoden gjor. Det tar en boolsk som sitt forste argument, og med mindre det er sant, stopper den nav rende gjennomforingsstrommen. Som fremdriftsmetoder stopper utforelsen av handlingen med en gang ved a kaste en sfError404Exception, trenger du ikke a returnere etterpa.

Nar det gjelder unntak, er siden som vises til brukeren annerledes i prodemiljoet og i dev-miljoet:

For du distribuerer Jobeet-nettstedet til produksjonsserveren, l rer du hvordan du tilpasser standard 404-siden.

«Fremover» Metoder Familie.

Forover404Unlos samtalen er faktisk ekvivalent med:

som ogsa tilsvarer:

Fremgangsmaten for forward404 () er bare en snarvei for:

Fremover () -metoden videresendes til en annen handling av samme soknad; i forrige eksempel, til 404-handlingen til standardmodulen. Standardmodulen er kombinert med symfony og gir standardhandlinger for a gjengi 404, sikre og innloggingssider.

Foresporselen og svaret.

Nar du blar til / jobben / jobben / visningen / id / 1 sider i nettleseren din, starter du en rundtur med webserveren. Nettleseren sender en foresporsel, og serveren sender tilbake et svar.

Vi har allerede sett at symfonien inkapsulerer foresporselen i et sfWebRequest-objekt (se metoden for executeShow () -metoden). Og som symfoni er et objektorientert rammeverk, er responsen ogsa et objekt av klasse sfWebResponse. Du kan fa tilgang til responsobjektet i en handling ved a ringe $ this- & gt; getResponse ().

Disse objektene gir mange praktiske metoder for a fa tilgang til informasjon fra PHP-funksjoner og PHP globale variabler.

Hvorfor pakker eksisterende symfoni eksisterende PHP-funksjoner? For det forste fordi symfony-metodene er kraftigere enn deres PHP-motpart. Da, da du tester et program, er det mye enklere a simulere en foresporsel eller et responsobjekt enn a prove a flappe med globale variabler eller arbeide med PHP-funksjoner som header () som gjor for mye magi bak scenen.

Foresporselen.

Klassen sfWebRequest bryter inn $ _SERVER, $ _COOKIE, $ _GET, $ _POST og $ _FILES PHP globale arrays:

Vi har allerede apnet foresporselsparametere ved a bruke metoden getParameter (). Den returnerer en verdi fra den globale variabelen $ _GET eller $ _POST, eller fra PATH_INFO-variabelen.

Hvis du vil sikre at en foresporselsparameter kommer fra en bestemt av disse variablene, ma du bruke metodene getGetParameter (), getPostParameter () og getUrlParameter ().

Nar du vil begrense en handling for en bestemt HTTP-metode, for eksempel nar du vil sikre at et skjema er sendt som en POST, kan du bruke metoden isMethod (): $ this-> forwardUnless ($ request- & gt; isMethod ( ‘POST’)); .

Responsen.

Klassen sfWebResponse wraps header () og setrawcookie () PHP metoder:

Selvfolgelig gir sfWebResponse-klassen ogsa en mate a angi innholdet pa svaret (setContent ()) og sende svaret til nettleseren (send ()).

Tidligere i dag sa vi hvordan man handterer stilark og JavaScripts i bade view.yml-filen og i maler. Til slutt bruker begge teknikkene respons-objektet addStylesheet () og addJavascript () -metodene.

SfAction, sfRequest og sfResponse klassene gir mange andre nyttige metoder. Ikke nol med a bla gjennom API-dokumentasjonen for a l re mer om alle sympfony-interne klasser.

Siste tanker.

I dag har vi beskrevet noen designmonstre som brukes av symfony. Forhapentligvis gjor prosjektkatalogstrukturen na mer fornuftig. Vi har spilt med maler ved a manipulere layout og malfiler. Vi har ogsa gjort dem litt mer dynamiske takket v re slots og handlinger.

I morgen vil vi v re dedikert til den url_for () hjelperen vi har brukt her, og ruting-underrammen knyttet til den.

Nyheter fra Symfony bloggen.

En uke med symfoni # 579 (29. januar – 4. februar 2018) 4. februar 2018 Nytt i Symfony 4.1: Fa containerparametere som en tjeneste 1. februar 2018 A lage SensioLabs Koble til mer inkluderende 30. januar 2018.

Pa nyhetene.

Symfony 3 sertifisering na tilgjengelig i 4000 sentre rundt om i verden!


Hello! Do you want to play in the most honest casino? We gathered it for you. Push here now!