Up MVC: Minimalistiskt OO MVC för utbildningssyfte

PHPportalen Forum Index » Tips och Trix
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget Gå till sida Föregående  1, 2, 3, 4, 5, 6  Nästa
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
morre_



Medlem i: 3104 dagar

Status: Offline



#716798
Inlägg Skrivet: 2011-11-19 00:03      Ämne: Citera

Vad menas med lazy-loading, kan du ge ett exempel utifrån din kod? Smile

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
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5393 dagar
Från: Karlshamn
Status: Offline



#716801
Inlägg Skrivet: 2011-11-19 12:18      Ämne: Citera

morre_ skrev:
Vad menas med lazy-loading, kan du ge ett exempel utifrån din kod? Smile

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 Smile

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 Very Happy
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Saurid
Moderator



Medlem i: 5393 dagar
Från: Karlshamn
Status: Offline



#717200
Inlägg Skrivet: 2011-11-27 23:17      Ämne: Citera

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:
PHP:
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:
PHP:
1:
 $container->app_model_post->metod(); 


Vyn tex. nås på samma sätt med:
PHP:
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. Smile

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. Smile
Svarar som vanligt gärna på frågor i tråden så fort jag får tid!
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Saurid
Moderator



Medlem i: 5393 dagar
Från: Karlshamn
Status: Offline



#717231
Inlägg Skrivet: 2011-11-28 22:52      Ämne: Citera

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 Smile
PHP:
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
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Saurid
Moderator



Medlem i: 5393 dagar
Från: Karlshamn
Status: Offline



#718545
Inlägg Skrivet: 2012-01-05 23:33      Ämne: Citera

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: Smile
https://github.com/saurid/Up-MVC/commits/master
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Saurid
Moderator



Medlem i: 5393 dagar
Från: Karlshamn
Status: Offline



#719155
Inlägg Skrivet: 2012-01-16 21:43      Ämne: Citera

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:
KOD:
1:
http//localhost/Up-MVC/post/show/2012/01/16


Och i motsvarande controller:
PHP:
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. Smile
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Saurid
Moderator



Medlem i: 5393 dagar
Från: Karlshamn
Status: Offline



#729641
Inlägg Skrivet: 2013-02-03 00:39      Ämne: Citera

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 Smile

Se denna tråden för exempel på användning:
http://www.phpportalen.net/viewtopic.php?t=117004
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Tarre



Medlem i: 4981 dagar

Status: Offline



#734069
Inlägg Skrivet: 2013-09-07 23:11      Ämne: Citera

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
PHP:
1:
 
2:
$c->app_view_path "app/view/";
3:
 


PHP:
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 &quot;%s&quot; 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
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5393 dagar
Från: Karlshamn
Status: Offline



#734157
Inlägg Skrivet: 2013-09-14 10:29      Ämne: Citera

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! Smile
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Tarre



Medlem i: 4981 dagar

Status: Offline



#734454
Inlägg Skrivet: 2013-10-07 15:15      Ämne: Citera

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

PHP:
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:
PHP:
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:
PHP:
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
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5393 dagar
Från: Karlshamn
Status: Offline



#734524
Inlägg Skrivet: 2013-10-15 21:34      Ämne: Citera

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
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Tarre



Medlem i: 4981 dagar

Status: Offline



#734525
Inlägg Skrivet: 2013-10-16 00:07      Ämne: Citera

Snyggt Smile
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5393 dagar
Från: Karlshamn
Status: Offline



#734575
Inlägg Skrivet: 2013-10-22 20:43      Ämne: Citera

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:
PHP:
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:
PHP:
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:
PHP:
1:
 UpMvc\Container::get()->site_path


Möjligt nu (om namespace "UpMvc\Container as Up" används):
PHP:
1:
 Up::site_path(); 
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Tarre



Medlem i: 4981 dagar

Status: Offline



#734920
Inlägg Skrivet: 2013-11-18 14:53      Ämne: Citera

blir bara bättre och bättre :D
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5393 dagar
Från: Karlshamn
Status: Offline



#734934
Inlägg Skrivet: 2013-11-19 15:19      Ämne: Citera

Tarre skrev:
blir bara bättre och bättre :D

Man tackar, man tackar! Smile
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget Gå till sida Föregående  1, 2, 3, 4, 5, 6  Nästa
PHPportalen Forum Index » Tips och Trix
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic