Panelen



Forumnavigering
Senast inloggade
RSS
Sponsorer
Artiklar > PHP

CakePHP - Routing och Model, View, Controller

Förkunskaper

  • Grundläggande html  och PHP och veta vad OOP är.
  • Läst artikeln, CakePHP - Installation och konfiguration.

Verktyg som behövs

  • Databasen, cakephp (Vi skapade den i förra artikeln)
  • Någon form av databashanterare som phpMyAdmin eller MySQL Query Browser
  • En kodeditor eller anteckningar.


Inledning
I den förra artikeln så gick jag igenom installation och konfiguration av CakePHP.
Den här artikeln kommer gå igenom vad Model, View och Controller är för något. Jag kommer inte
att göra någon större djupdykning, utan mest visa hur dessa delar hänger ihop med varandra.
Så starta din kodeditor och öppna upp my_first_cake projektet så kan vi börja.


Konfigurera routing.
Det första vi ska göra är att konfigurera sökvägarna till våra controllers.
det gör man i filen routes.php, som finns i app/config/routes.php

Öppna filen routes.php och scrolla ner till dessa kodrader.

<?php 
/**
 * Here, we are connecting '/' (base path) to controller called 'Pages',
 * its action called 'display', and we pass a param to select the view file
 * to use (in this case, /app/views/pages/home.ctp)...
 */
    Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
/**
 * ...and connect the rest of 'Pages' controller's urls.
 */
    Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
?>


Ändra kodraderna till detta
<?php
/**
 * Here, we are connecting '/' (base path) to controller called 'Pages',
 * its action called 'display', and we pass a param to select the view file
 * to use (in this case, /app/views/pages/home.ctp)...
 */
    Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
/**
 * ...and connect the rest of 'Pages' controller's urls.
 */
    Router::connect('/:controller/:action/*');
?>


Den första kodraden talar om vilken controller + action som ska vara startsidan.
Andra kodraden kopplar vi in resten av sökvägarna.


Model
En model har hand om logiken för data. Modellen representerar en datakälla.
En datakälla kan vara vad som helst, till 99% av fallen är datakällan en databastabell.

Vi ska skapa en Model som heter Users. Model filerna ska ligga under app/models.
Skapa en ny fil i app/models, som heter user.php och skriv/kopiera in denna kod och spara.
<?php
/**
 * Users model
 * Handles data logic for users table
 */
class User extends AppModel {}
?>


Om man inte har skapat modellen, eller döpt den fel så skapar cakephp den automatiskt.
I detta fall skulle vi inte behöva skapa någon modell, då vi kommer följa cakephps regler.

Nu ska vi skapa tabellen som är kopplad till Users modellen.
Öppna din databashanterare och kopiera in denna sqlkod och skapa tabellen.
CREATE TABLE users (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(10),
    password VARCHAR(64)
);


Sen måste vi ju naturligtvis fylla våran tabell med data.
Efter du skapat tabellen kör du denna sqlfråga för att fylla tabellen med tre användare.
INSERT INTO users (username) VALUES('Kalle'),('Lisa'),('Börje');


password
Här lagras användarens lösenordet.
I denna artikel kommer vi inte att använda password-fältet alls.
Att password är 64 tecken lång är för att den ska klara av sha1 hashning.


Controller
Controllern tar hand om applikationslogiken. Vi ska skapa två controllers en för statiska sidor
och en som är kopplad till users modellen.

Controller filerna hittar man under app/controllers.
Skapa en fil i app/controllers, som heter pages_controller.php och skriv/kopiera in denna kod.
<?php
/**
 * Pages Controller
 * Static content controller
 *
 * controllers/pages_controller.php
 */
class PagesController extends AppController {
/**
 * This controller does not use a model
 */
    public $uses = array();
/**
 * beforeFilter
 */
    function beforeFilter() {
        parent::beforeFilter();
    }
/**
 * index
 * Default startpage for website
 * views/pages/index.ctp
 */
    function index() {
        $this->pageTitle = 'Startsidan';
    }
// End Of Controller
}
?>


Skapa en fil i app/controllers, som heter users_controller.php och skriv/kopiera in denna kod.
<?php
/**
 * User Controller
 * controllers/users_controller.php
 */
class UsersController extends AppController {
/**
 * index
 * Startpage for controller
 */
    function index() {
        $this->pageTitle = 'Användare';
       
        // Create an view variable and store result from find query.
        $this->set('users', $this->User->find('all'));
    }
// End Of Controller
}
?>


Controllern, Users laddar automatiskt in modellen User åt oss.

i index funktionen finns det en kodrad som ser ut så här
$this->set('users', $this->User->find('all'));

Den koden skapar en vy-variabel (view variable) som lagrar ett rekordset av find queryn.

$this->User->find('all');

Denna kod skapar en sqlfråga som ser ut så här.
SELECT User.username, User.password FROM users AS User;


Vad vi då får tillbaka är en array som ser ut så här och som vy-variabeln kommer innehålla.
array(
    [0] => array(
        'User' => array(
            'id' => 1,
            'username' => 'Kalle'
         )
    ),
    [1] => array(
        'User' => array(
            'id' => 2,
            'username' => 'Lisa'
        )
    ),
    [2] => array(
        'User' => array(
            'id' => 3,
            'username' => 'Börje'
        )
    )
)



View
En vy är det användaren ser, själva pressentationen. Det är här controllern får användarinputen ifrån.
Vi har hitils inte skapat några vyer för våra controller actions (funktionerna i controllern).
Det är därför cakephp klagar på att view saknas när man besöker sidan.

Första vi ska göra är att skapa mappar i view mappen, för våra controllers.
Skapa två mappar som heter pages och users i app/views.

Skapa en fil som heter index.ctp i app/views/pages. Skapa ytterligare en index.ctp fil, fast i users mappen.
Så nu har du skapat view filer för index metoden för varje controller.

Skriv/kopiera in dessa koder till respektive index.ctp

app/views/pages/index.ctp
<h2><?php echo $this->pageTitle; ?></h2>
<p><?php echo $html->link('Till anv&auml;ndarlistan', array('controller' => 'users', 'action' => 'index'), null, null, false); ?></p>


app/views/users/index.ctp
<h2><?php echo $this->pageTitle; ?></h2>

<ul>
<?php foreach($users as $user) : ?>
<li><?php echo $user['User']['username']; ?></li>
<?php endforeach; ?>
</ul>

<br />

<p><?php echo $html->link('Till startsidan', array('controller' => 'pages', 'action' => 'index'), null, null, false); ?></p>

 

Nu när allt är klart så testkör vi koden genom att gå till http://localhost/my_first_cake
Om allt fungerar som det ska, så ska du se en sida med titeln "Startsidan" och en länk till användarlistan.
Klicka på länken och du ska komma till en sida som listar dom tre användarna vi sparade i tabellen, users.

Skapades: 2009-11-09 13:16:34
Skribent: chrillemeter
Lästs 1725 gånger
Betyg: 0 (totalt 5 röster)

Kommentarer

Hultin sa den 10 november 2009 kl 08:05:
Mycket intressant läsning. Uppskattar verkligen att du tydligt markerat sökvägar, hoppas jag lärt mig något av detta nu!
chrillemeter sa den 10 november 2009 kl 22:29:
Nästkommande artiklar kommer jag skriva lite mer om varje del jag gått igenom i denna artikel.
Kul att det är någon som kommenterar och tycker artiklarna är bra :) Det gör att man tycker det är värt att fortsätta skriva...
pbf sa den 11 november 2009 kl 16:51:
Men varför i hela friden ger dem inte upp spaghettikod? Det jag undviker mest av allt och PHP älskar det. Pypan säger jag ;)
Verkar vara en bra artikel i övrigt.
chrillemeter sa den 11 november 2009 kl 17:14:
@pbf: Spagettikod? det är det då inte. CakePHP är riktigt bra strukturerat och php är grymt.
pbf sa den 12 november 2009 kl 17:55:
Det är väl Du som har skrivit artikeln? Titta på sista kodstycket i artikeln, är inte det spaghetti-kod?
chrillemeter sa den 12 november 2009 kl 18:51:
Tycker det inte är spaggetikod alls. det är phps templatespråk, så man slipper en massa brackets här och var hela tiden.

Visst går det att skriva allt med php i view filerna med. Men det skulle bli väldigt rörigt och oläsbart.
Timmie sa den 15 november 2009 kl 02:55:
Har aldrig satt mig in i PHP och kommer troligtvis aldrig göra det heller men det var en riktigt bra artikel! Samma struktur som ASP.NET MVC som jag älskar.
PBF: Förstår vad du menar, reagerade också på samma sätt när ASP.NET MVC kom ut (likadant tänk) men man vänjer sig efter ett tag. Det är långt ifrån ASP spagetti koden som vi var vana vid förut.
Hultin sa den 15 november 2009 kl 05:38:
Plus, spaghettikod eller inte, så är det ju inte det artiklen handlar om, ni _får_ göra på andra sätt om så önskas
chrillemeter sa den 15 november 2009 kl 14:09:
Exakt, det går att enbart använda CakePHP också, om man så vill.
Finns funktioner som genererar tabellceller och headers av arrayer osv.
Triskis sa den 19 december 2010 kl 11:06:
Super! Lite mer förklaring på koden i pages_controller annars var den helt perfekt :)
chrillemeter sa den 19 december 2010 kl 14:11:
Denna artikel kommer skrivas om, då det har ändrats en del i CakePHP efter version 1.3 kom ut.
© Copyright 2007-2009 Shadi Domat | Version 3.0 | Sidkarta | Policy