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
Saurid
Moderator



Medlem i: 5637 dagar
Från: Perstorp
Status: Offline



#711799
Inlägg Skrivet: 2011-08-16 20:00      Ämne: Citera

Sawny skrev:
Hur funkar det? Surprised
Aldrig sätt förut.

Enkelt förklarat så kan man väl säga att det som returneras från första metodanropet används för nästa. I detta fallet så returnerar jag view-objektet i set(), det vill säga $this. Och eftersom objektet returneras så kan jag använda det returnerade objektet för att göra nästa metodanrop. Och så fortsätter det ända tills den sista av dem. Smile

Frågan är om du blev något klokare av det där? Wink

En lite längre förklaring:
http://www.talkphp.com/advanced-php-programming/1163-php5-method-chaining.html
 

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



Medlem i: 5225 dagar

Status: Offline



#711839
Inlägg Skrivet: 2011-08-17 13:46      Ämne: Citera

Fint Saurid!
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
intedinmamma



Medlem i: 3753 dagar
Från: Göteborg
Status: Offline



#711840
Inlägg Skrivet: 2011-08-17 13:47      Ämne: Citera

I metoden så returnerar man $this, vilket gör att man kan fortsätta anropa metoder från objektet. Det fungerar såklart att returnera andra objekt också, och anropa deras metoder.
PHP:
1:
 $user->getLatestPost()->getTopic()->close() 
(fiktivt scenario som inte är helt orimligt)

En grej som skulle kunna vara smidig i view-klassen är att kunna mata in en array med alla värden.
PHP:
1:
 $view->set(array(
2:
   'title' => $item[0]['name'],
3:
   'cart' => $cart,
4:
   'categories' => $categories,
5:
   'categorycount' => count($categories),
6:
   'item' => $item[0],
7:
   'content' => $view->render('item')
8:
)); 
 

_________________
Statistiskt sett? Kanske.
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5637 dagar
Från: Perstorp
Status: Offline



#711854
Inlägg Skrivet: 2011-08-17 17:58      Ämne: Citera

intedinmamma skrev:
En grej som skulle kunna vara smidig i view-klassen är att kunna mata in en array med alla värden.

Absolut! Det är inte omöjligt att det kommer i en senare version. Men det innebär faktiskt lite logik med tanke på hur själva view fungerar och jag vill hålla det så enkelt som möjligt. Så just nu får det vara som det är Smile
 

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



Medlem i: 3375 dagar
Från: Stockholm
Status: Offline



#711856
Inlägg Skrivet: 2011-08-17 18:04      Ämne: Citera

Jag såg nyss detta ramverk och undrar om jag kan bygga mitt eget utifrån MVC utan att använda klasshantering eftersom jag inte alls förstår mig på det.

Det lär bli ett normalstort ramverk som inkluderar sidhantering, nyhetsfunktion, medlemshantering m.m och jag undrar om jag absolut måste lära mig använda klasser för att skapa ett bra ramverk?
 

_________________
William
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
marabou
Administratör



Medlem i: 5523 dagar
Från: Sveriges framsida
Status: Offline



#711857
Inlägg Skrivet: 2011-08-17 18:16      Ämne: Citera

MVC utan klasser/objekt kan nog inte bli "äkta" mvc. Alternativet är att använda endast funktioner och inkludera filer, men då tappar du en stor del av fördelarna med mvc.
 

_________________
"Never argue with stupid people. They will bring you down to their level and beat you with experience."
- Mark Twain
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Shueazz



Medlem i: 3375 dagar
Från: Stockholm
Status: Offline



#711859
Inlägg Skrivet: 2011-08-17 18:22      Ämne: Citera

marabou skrev:
MVC utan klasser/objekt kan nog inte bli "äkta" mvc. Alternativet är att använda endast funktioner och inkludera filer, men då tappar du en stor del av fördelarna med mvc.


Okej, men om vi vänder på det då? Måste man bygga på MVC för att använda klasser? Eller går det, men är onödigt utan MVC?
 

_________________
William
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
marabou
Administratör



Medlem i: 5523 dagar
Från: Sveriges framsida
Status: Offline



#711860
Inlägg Skrivet: 2011-08-17 18:36      Ämne: Citera

Shueazz skrev:
Okej, men om vi vänder på det då? Måste man bygga på MVC för att använda klasser? Eller går det, men är onödigt utan MVC?

Ojoj, du har SÅÅÅ mycket nytta av objektorientering, även om du aldrig kommer använda MVC.
Jag tycker du bör läsa på om objektorienterad php först, innan du ger dig på mvc. När du väl lärt dig lite om objekt så kommer du aldrig vilja vara utan dem Smile

Nu börjar tråden spåra ur. Vi får hålla oss till ämnet, som är att diskutera Waeke up MVC. Vill du veta mer om MVC och objektorientering i allmänhet finns det flera trådar i "Diskutera webutveckling" du kan läsa eller kanske starta en ny tråd
 

_________________
"Never argue with stupid people. They will bring you down to their level and beat you with experience."
- Mark Twain
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Tarre



Medlem i: 5225 dagar

Status: Offline



#711862
Inlägg Skrivet: 2011-08-17 20:15      Ämne: Citera

och här finns det en ganska simpel lättläst introduktion

http://www.webbdesign.info/server_side_sprak/php/objektorientering.html
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5637 dagar
Från: Perstorp
Status: Offline



#711900
Inlägg Skrivet: 2011-08-18 20:45      Ämne: Citera

Dagens tips! (för den lite mer avancerade användaren)

Man kan simulera en enkel modul/plugin-hantering om man behöver.



Om du antar att din modul ska heta guestbook. Lägg då upp mappar med namnet guestbook i de tre mapparna model, view och controller. Lägg alla filer som är specifika för din modul där.



Namnge dina controllers och dina models enligt mappstrukturen, där du byter ut snedstreck till underscore. Exempel:
Filen post.php med classnamn controller_guestbook_post
Filen post.php med classnamn model_guestbook_post



För att nå controllern i exemplet ovan från webbläsarens adressfält använder du:
/guestbook_post/show/10

Då kommer Waeke Up MVC att automatiskt:
läsa in filen filen controller/guestbook/post.php
skapa en instans (objekt) av controllern controller_guestbook_post
anropa metoden show() med parametern 10 (i en array som första argument)



För att använda din model i controllern så gör du som vanligt när du skapar objekt:
PHP:
1:
 $guestbook = new model_guestbook_post(); 


Och för att rendrera en template i din guestbook-modul gör du det också enligt mappstrukturen:
PHP:
1:
 $view = new view();
2:
echo $view->render('guestbook/showpost'); 

Då rendrerar Waeke Up MVC templatefilen /view/guestbook/showpost.php



Exempel på detta kommer att ges i admin-delen av shopen...
 

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



Medlem i: 5637 dagar
Från: Perstorp
Status: Offline



#711990
Inlägg Skrivet: 2011-08-20 08:40      Ämne: Citera

Hepp! Jag har efter lite rannsakande kommit fram till att jag har siktat under målet med mitt MVC. Det går helt enkelt inte så bra att visa fördelarna med ett MVC utan att använda objektorientering och arv. Jag har därför uppdaterat koden en aning så att den även stödjer arv.

Se följande exempel nedan:

Exempel på en model (post)
PHP:
1:
 
2:
// barnet model_post ärver föräldern model
3:
class model_post extends model
4:
{
5:
   public function getById($id)
6:
   {
7:
      // databasobjektet nås med hjälp av $this->db
8:
      $this->db->prepare('SELECT post FROM post WHERE id = :id');
9:
      $this->db->execute(array(':id' => $id));
10:
      return $this->db->fetchAll();
11:
   }
12:


Exempel på en controller (post) som använder view-objektet och en model (post)
PHP:
1:
 
2:
// barnet controller_post ärver föräldern controller
3:
class controller_post extends controller
4:
{
5:
   public function show($params)
6:
   {
7:
      // dina modeller nås genom $this->model->[model-namn]
8:
      // lazy-loading används, dvs modellen post laddas in och instansieras första gången du använder den
9:
      $post $this->model->post->getById($param[0]);
10:
      
11:
      // view nås med $this->view
12:
      $this->view->set('post'$post);
13:
      echo $this->view->render('layout');
14:
   }
15:


Om du behöver en konstruktor i dina classer, se då till att anropa förälderns konstruktor också, annars kommer PHP att generera ett fatal error om du försöker använda förälderns egenskaper.
PHP:
1:
 
2:
// om du behöver använda en konstruktor i din model eller controller
3:
class controller_post extends controller
4:
{
5:
   public __construct()
6:
   {
7:
      // kör förälderns konstruktor
8:
      parent::__construct();
9:
      
10:
      // fortsätt med din kontrollers konstruktor
11:
      
12:
   }
13:


Lägg märke till att ni inte behöver använda arv om ni inte vill, ni kan fortfarande köra utan. Men fördelarna borde vara uppenbara?
 

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



Medlem i: 5225 dagar

Status: Offline



#712683
Inlägg Skrivet: 2011-09-04 22:54      Ämne: Citera

jag får error505 när jag testar att använda "mvc:t?" i min rot.

root/hemsida1/controller/index.php

PHP:
1:
 
2:
class controller_index extends upmvc_controller
3:
{
4:
   public function index()
5:
   {
6:
      
7:
      $this->view->set('title''Hem')
8:
                 ->set('content''hejsan hallå');
9:
          
10:
      echo $this->view->render('test');
11:
   }
12:
}
13:
 

root/hemsida1/view/test.php

PHP:
1:
<title><?=$title;?></title>
2:
 
3:
<p><?=$content;?></p>


i roten visas ändå dokumentationen utan problem
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5637 dagar
Från: Perstorp
Status: Offline



#712697
Inlägg Skrivet: 2011-09-05 10:26      Ämne: Citera

Om jag fattat det rätt så har har du nu börjat använda en funktionalitet som inte är dokumenterad ännu - moduler. Säkerligen för att du inte riktigt förstått hur routingen fungerar. I ditt fall tolkas hemsida1/ som en modul, allt som inte ligger i app/ är en modul. Men du kan ändå få detta att fungera.

MVC't fungerar som så att alla klassnamn ska döpas enligt din mapp-struktur relativt index.php i roten. Så eftersom du lagt upp en modul som heter hemsida1 och i den lägger controllers så ska du döpa dem enligt hemsida1/controller/index, fast byta ut / mot _ . Så din controller blir:

PHP:
1:
 class hemsida1_controller_index extends upmvc_controller
2:
{
3:
   public function index()
4:
   {
5:
      
6:
      $this->view->set('title''Hem')
7:
                 ->set('content''hejsan hallå');
8:
          
9:
      echo $this->view->render('hemsida1/view/test');
10:
   }
11:


Samma sak gäller med dina vyer. De hämtas relativt index.php i roten, fast här byter du inte ut några tecken utan vyn hämtas från 'hemsida/view/test' som du ser ovan.

URL'en till controllern blir:
http://localhost/waeke-up-mvc/hemsida1/

EDIT:
Jag arbetar på att förbättra dokumentationen, så att den blir mer komplett och lättfattlig...
 

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



Medlem i: 5225 dagar

Status: Offline



#712700
Inlägg Skrivet: 2011-09-05 11:29      Ämne: Citera

Jaha nu börjar saker och ting klarna!

Tack för hjälpen. Verkligen guld att du gjort det här!
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5637 dagar
Från: Perstorp
Status: Offline



#712702
Inlägg Skrivet: 2011-09-05 11:39      Ämne: Citera

Tarre skrev:
Jaha nu börjar saker och ting klarna!
Tack för hjälpen. Verkligen guld att du gjort det här!

Gott! Bara ställ fler frågor om det dyker upp, så ska jag försöka förklara Smile

EDIT:
Modul-hanteringen jag nämnde i mitt svar idag ska inte blandas ihop med det jag skrev för någon månad sedan. Jag har uppdaterat frontcontrollern och .htaccess så att det stödjer moduler på ett effektivare sätt sedan dess.

Kort förklarat så fungerar den så här:

Om första delen av ex. routen /hemsida1/post/show/1, dvs "hemsida1", är en mapp så antas det vara en modul i Up MVC. Isåfall skapas en instans (objekt) av klassen hemsida1_controller_post i filen hemsida1/controller/post.php i och metoden show() körs med "1" i argumentarrayen.

Om ett modulnamn utelämnas, /post/show/1 , så körs allt från defaultmappen app/. Dvs. en instans av klassen app_controller_post i filen app/controller/post.php skapas och metoden show() anropas (med "1" i arrayen av argument).

Med tanke på hur det fungerar så kan alltså inte en modul finnas med samma namn som en controller i app/. Då kan du inte anropa controllern med samma namn.
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud :: Bandcamp
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