Visa föregående ämne :: Visa nästa ämne |
Startad av: |
Meddelande |
morre_
Medlem i: 3778 dagar
Status: Offline
#716798
|
Skrivet: 2011-11-19 00:03
Ämne:
|
|
|
Vad menas med lazy-loading, kan du ge ett exempel utifrån din kod?
EDIT: Och, hur gör jag om jag har ett gammalt (typ när du postade ditt mvc först gången) test som jag vill lägga in i ditt nya (enklast)? |
|
|
|
Till toppen på sidan |
|
Saurid


Medlem i: 6067 dagar Från: Perstorp
Status: Offline
#716801
|
Skrivet: 2011-11-19 12:18
Ämne:
|
|
|
morre_ skrev: |
Vad menas med lazy-loading, kan du ge ett exempel utifrån din kod? |
Med lazy-loading menas att klasser laddas in och objekt skapas upp först när de används. Ett exempel är i klassen upmvc_database (upmvc/database.php)- Istället för att skapa upp ett PDO-objekt i konstruktorn så gör jag det vid första anropet till databasen genom metoden getPDO(). Där kontrollerar jag om en PDO-resurs finns lagrad och skapar upp den, annars returnerar jag bara den befintliga. Databasanslutningen skapas alltså inte upp förrän precis innan det används = Lazy loading
morre_ skrev: |
EDIT: Och, hur gör jag om jag har ett gammalt (typ när du postade ditt mvc först gången) test som jag vill lägga in i ditt nya (enklast)? |
Oj, då får jag tänka efter lite...
Första steget är flytta in dina befintliga controller/model/view-mappar till app-mappen (du ska ersätta controller/index.php med din egen).
Sedan gör du sök/ersätt i de filerna enligt: controller_ => app_controller_
Och sök/ersätt: model_ => app_model_
Sedan har även systemet flyttat in i en egen mapp (upmvc), så du får även göra en sök/ersätt på new view() => new upmvc_view().
Och sök/ersätt: new database() => new upmvc_database().
Då känner jag att det borde fungera, om jag inte har glömt något.
Vill du sedan börja använda arv för att slippa att själv skapa upp alla objekt, så kan du läsa mer i manualen. Den hittar du alltid på:
localhost/[din MVC-mapp]/upmvc/manual
Eller så ställer du dina fortsatta frågor här  |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Saurid


Medlem i: 6067 dagar Från: Perstorp
Status: Offline
#717200
|
Skrivet: 2011-11-27 23:17
Ämne:
|
|
|
Har gjort ytterligare en stor uppdatering och har trots allt skippat arvet i controllers och modeller. Istället använder jag en Service Container/Dependency Injection Container - Ett objekt som du kan nå från alla instanser i ramverket och som skapar/lagrar/returnerar systemets objekt när du behöver dem, inklusive dina modeller. Även frontcontrollern i index.php startas via containern.
Containern hämtas med:
1: $container = upmvc_container::get();
|
Det har gjort att jag har kunnat göra om några klasser så att de inte längre är singletons. Beroenden mellan objekt syns redan i konstruktorn.
Jag har gjort om hämtningen av modeller ordentligt i containern (som tidigare gjordes i modellernas förälder). Alla modeller används på samma sätt med:
1: $container->app_model_post->metod();
|
Vyn tex. nås på samma sätt med:
1: $container->view->render('layout');
|
Jag känner att nu har jag ett enhetligt gränssnitt mot alla delar av systemet. Tycker att det fungerar riktigt bra. Tyvärr krävs det en del att uppdatera ett gammalt projekt till det nya, men om man tänker efter lite med sök/ersätt så går det hyffsat snabbt.
Service Containern är för tillfället hårdkodad mot systemet (förutom för modeller), jag kommer förmodligen göra något åt det i framtiden. Konfigurationen (hämta parametrar) kommer jag också med all säkerhet flytta in i containern även den.
Har också fixat en bugg i sessionshanteringen (som uppstod vid förra uppdateringen). Med spl_autoload_register() som autoloader krävs att sessionen startas efter att loadern registrerats. Miss av mig...
Manualen är såklart uppdaterat att reflektera förändringarna.
Svarar som vanligt gärna på frågor i tråden så fort jag får tid! |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Saurid


Medlem i: 6067 dagar Från: Perstorp
Status: Offline
#717231
|
Skrivet: 2011-11-28 22:52
Ämne:
|
|
|
Oj! Det hände något med GitHub igår som gjorde att den viktigaste komponenten, containern, inte laddades upp i uppdateringen. Fixat!
Och så har jag uppdaterat model-objektet att tillåta method chaining
1: // Utan method chaining 2: $container = upmvc_container::get(); 3: $container->database->prepare('SELECT * FROM post'); 4: $container->database->execute(); 5: return $container->database->fetchAll(); 6: 7: // Med method chaining 8: return upmvc_container::get() 9: ->database 10: ->prepare('SELECT * FROM post') 11: ->execute() 12: ->fetchAll();
|
|
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Saurid


Medlem i: 6067 dagar Från: Perstorp
Status: Offline
#718545
|
Skrivet: 2012-01-05 23:33
Ämne:
|
|
|
Följande uppdateringar har gjorts på senare tid:
view::render tar nu fullständiga filnamnet (med .php) som argument. För att göra det hela lite tydligare och ge möjlighet att använda andra ändelser (tex .tpl.php)
container::__clone har satts till privat så att man inte kan klona objektet (endast en instans ska kunna användas).
konfigurationen är nu en del av containern, bl.a. för att slippa använda globala konstanter. Användandet är lite väl "verbose", men fördelarna överväger nackdelarna enligt mig
Router-objektet har jag gjort mer fristående genom att injicera $_GET in i objektet med dependency injection. Containern sköter den biten automatiskt.
Felhanteringen i routern har blivit bättre.
Request::get har fått ett andra argument för att kunna sätta ett defaultvärde att returnera om nyckeln inte finns.
PhpDoc (fil/klass/metod-dokumentationen) har uppdaterats rejält för att bli mer komplett och felfri. Dokumentation av API kan nu göras automatiskt utan att några fel genereras.
Läs mer på github för att se ändringarna i koden:
https://github.com/saurid/Up-MVC/commits/master |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Saurid


Medlem i: 6067 dagar Från: Perstorp
Status: Offline
#719155
|
Skrivet: 2012-01-16 21:43
Ämne:
|
|
|
Har ändrat frontcontrollern så att parametrarna i URL'n skickas till controller som enskilda argument (med hjälp av funktionen call_user_func_array) istället för en array som förut.
Det gör att följande exempel nu fungerar:
URL:
1: http//localhost/Up-MVC/post/show/2012/01/16
|
Och i motsvarande controller:
1: class app_controller_post 2: { 3: // Ta emot parametrarna som argument 4: function show($year, $month, $date) 5: { 6: // Skriver ut det kompletta datumet (2012-01-16) från argumenten 7: echo "$year-$month-$date"; 8: } 9: }
|
En liten ändring som får ett lite större genomslag, men jag känner att detta gör att koden blir mer strikt och tydlig i controller-lagret.  |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Saurid


Medlem i: 6067 dagar Från: Perstorp
Status: Offline
#729641
|
Skrivet: 2013-02-03 00:39
Ämne:
|
|
|
Uppdaterat rejält igen! Har moderniserat genom att börja använda namespaces och closures. Därför kräver koden PHP<=5.3. Största skillnaden mot tidigare versioner är servicecontainern som använder just closures för att sätta upp objektberoenden internt (filen UpMvc/config.php). Vilket även är möjligt för er som användare (förslagsvis i filen App/config.php). Modeller laddas inte längre in automatiskt via containern, utan instansieras via new (så vida du inte väljer att lägga in dem i containern själv).
Pga strul med den förra github repositorien var jag tyvärr tvungen att lägga upp den som en helt ny:
https://github.com/saurid/UpMvc2
Förutom den korta readme'n på github finns en fullständig manual medföljande. Som nu är uppdelad i kapitel med tydligare meny för bättre läsbarhet
Se denna tråden för exempel på användning:
http://www.phpportalen.net/viewtopic.php?t=117004 |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Tarre
Medlem i: 5655 dagar
Status: Offline
#734069
|
Skrivet: 2013-09-07 23:11
Ämne:
|
|
|
Låter du view::render endast ta emot fulla sökvägar eftersom du inte vill kladda med mer kod?
Det känns som detta kan vara smidigt så man slipper skriva långa sökvägar om sidan är stor.
med DIcontainern kan man ju göra något i denna stil
Lägga denna i app/config.php
1: 2: $c->app_view_path = "app/view/"; 3:
|
1: 2: public function render($template,$full_path=false) 3: { 4: if (!is_string($template)) { 5: throw new \InvalidArgumentException(sprintf('%s: Argumentet måste vara en giltig sökväg till en mall', __METHOD__)); 6: } 7: if (!is_file($template)) { 8: throw new \DomainException(sprintf('%s: Mallen/filen "%s" kunde inte hittas', __METHOD__, $template)); 9: } 10: extract($this->vars); 11: ob_start(); 12: 13: if(isset($c = Container::get()->app_view_path) && (!$full_path) ){ 14: $template = $c->app_view_path.$template; 15: } 16: 17: include $template; 18: return ob_get_clean(); 19: } 20:
|
app/view/left_content/recent_forum_posts.php
skrivs
left_content/recent_forum_posts.php
kanske t.om går att göra det i sin view closure som finns i UpMvc/config.php ocn inte röra view.php
Spekulerar bara.
Mvh |
|
|
|
Till toppen på sidan |
|
Saurid


Medlem i: 6067 dagar Från: Perstorp
Status: Offline
#734157
|
Skrivet: 2013-09-14 10:29
Ämne:
|
|
|
Tarre skrev: |
Låter du view::render endast ta emot fulla sökvägar eftersom du inte vill kladda med mer kod? |
Ursäkta att jag inte svarat på så lång tid. Mycket arbete och affärsresa på det, så jag har faktiskt inte varit inne på portalen sedan ett tag tillbaka.
Ja, både och skulle jag nog säga...
Från början hade jag inte fullständiga sökvägar, men jag insåg att det blir tydligare för nybörjare att faktiskt se hela sökvägen. Om man dessutom tar moduler med i beräkningen, där man kan tänkas hämta vyer från en modul till en annan, då blir det lätt komplicerat att hantera.
Att införa en base path med hjälp av containern i viewobjektet är intressant! Men i koden du föreslår så skapar du ett beroende av containern i view, vilket inte är så bra (det har jag försökt undvika så långt det går i kärnan). Däremot skulle man kunna tänka sig att lägga till base path som egenskap som sätts när view-objektet skapas, eller alternativt sätts med en setter direkt efter?
När jag har lite tid över ska jag titta på det. Tack för tipset!  |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Tarre
Medlem i: 5655 dagar
Status: Offline
#734454
|
Skrivet: 2013-10-07 15:15
Ämne:
|
|
|
Svarar lika snabbt. Du har helt rätt med att inte vara beroende av containern i viewobjektet.
Det jag kan tänka mig är att sätta "base_path" variabel med en funktion
1: public function base_path($path=null){ 2: if(is_file($path)){ 3: $this->base_path = $path; 4: }else{ 5: throw new \DomainException(sprintf()); 6: } 7: return $this; 8: }
|
skriver direkt från jobbet, så måste vara kortfattad
och sedan använda detta i controllern
Från:
1: $c->view 2: ->set("header",$c->view->render("app/view/header.php")); 3: ->set("content",$c->view->render("app/view/content.php")); 4: ->set("footer",$c->view->render("app/view/footer.php")); 5: ->render("app2/something/misc/index.php"); 6:
|
Till:
1: $c->view 2: ->base_path("app/view/") 3: ->set("header",$c->view->render("header.php")); 4: ->set("content",$c->view->render("content.php")); 5: ->set("footer",$c->view->render("footer.php")); 6: ->base_path("app2/something/misc/") 7: ->render("misc.php"); 8:
|
det kanske är en smaksak, men jag gillar att ha korta strängar och gärna dela upp så mycket som möjligt |
|
|
|
Till toppen på sidan |
|
Saurid


Medlem i: 6067 dagar Från: Perstorp
Status: Offline
#734524
|
Skrivet: 2013-10-15 21:34
Ämne:
|
|
|
Hepp!
Då har jag lagt till en ny metod i View-klassen: View->setPath($path)
$path ska vara en sträng och är alltså den sökväg du vill använda när render() anropas.
Det gäller att använda en viss försiktighet med den funktionaliteten om View-objektet används genom containern. Eftersom samma View-objekt alltid returneras gäller det att vara medveten om att även samma path kommer att användas!
Därför har jag också lagt till ett andra argument till render(). Om andra argumentet sätts till true, så kringgår du den satta pathen tillfälligt. |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Tarre
Medlem i: 5655 dagar
Status: Offline
#734525
|
Skrivet: 2013-10-16 00:07
Ämne:
|
|
|
Snyggt  |
|
|
|
Till toppen på sidan |
|
Saurid


Medlem i: 6067 dagar Från: Perstorp
Status: Offline
#734575
|
Skrivet: 2013-10-22 20:43
Ämne:
|
|
|
Har uppdaterat Containern, så att man kan använda en del statiska metoder istället för som förut. Det gör att det blir ett lite enklare gränssnitt mot Containern (enligt mig), framförallt när man hämtar enskilda variabler/objekt från den.
Jag har dock sett till att den är helt bakåtkompatibel, så er smak får avgöra vilket gränssnitt ni föredrar att använda er av.
Lite exempel:
På det "vanliga" viset:
1: // Hämta och lagra containern i en variabel 2: $up = UpMvc\Container::get(); 3: 4: // Sätt en ny variabel 5: $up->key = $value; 6: 7: // Hämta/skriv ut en variabel 8: echo $up->key;
|
På det statiska viset:
1: // Använd namespace i filen för att kunna använda containern 2: use UpMvc\Container as Up; 3: 4: // Sätt en ny variabel 5: Up::set('key', $value); 6: 7: // Hämta/skriv ut en variabel 8: echo Up::key();
|
Det kanske inte ser ut som en förenkling, men när man vill hämta enskilda värden från Containern utan att mellanlagra den (tex. utan att skicka in den i en template) så blir det tydligare:
Tidigare:
1: UpMvc\Container::get()->site_path;
|
Möjligt nu (om namespace "UpMvc\Container as Up" används):
|
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
Tarre
Medlem i: 5655 dagar
Status: Offline
#734920
|
Skrivet: 2013-11-18 14:53
Ämne:
|
|
|
blir bara bättre och bättre :D |
|
|
|
Till toppen på sidan |
|
Saurid


Medlem i: 6067 dagar Från: Perstorp
Status: Offline
#734934
|
Skrivet: 2013-11-19 15:19
Ämne:
|
|
|
Tarre skrev: |
blir bara bättre och bättre :D |
Man tackar, man tackar!  |
|
|
_________________ waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp |
Till toppen på sidan |
|
|