PHP MVC Framework Tutorial

โšก Smart opsummering

PHP MVC Framework-design adskiller applikationsdata og forretningslogik fra prรฆsentation ved hjรฆlp af modeller, visninger og controllere. CodeIgniter gรธr dette mรธnster praktisk, sรฅ PHP-udviklere hurtigere kan bygge sikre og vedligeholdelsesvenlige webapplikationer.

  • ๐Ÿงฉ Mรธnster: MVC opdeler en applikation i Model (data), View (prรฆsentation) og Controller (anmodningshรฅndtering) for at opnรฅ renere kode.
  • ๐Ÿš€ Produktivitet: Frameworks leverer prรฆbyggede biblioteker til databaseadgang, validering og inputrensning, sรฅ teams leverer funktioner hurtigere.
  • ๐Ÿ› ๏ธ Valg: CodeIgniter, CakePHP og Laminas (tidligere Zend) forbliver aktive valg, mens Kohana blev udgรฅet i 2017.
  • ๐Ÿ—„๏ธ Model: In CodeIgniter, modeller udvider CI_Model og bruger Query Builder-metoder til sikre databaseoperationer.
  • ๐ŸŽฎ controller: Controllere udvider CI_Controller, lรฆser brugerinput gennem inputklassen og indlรฆser den korrekte visning.
  • ๐Ÿ“ˆ Indvirkning: Portering af en almindelig PHP poll-applikation viser, hvordan MVC-strukturen reducerer dobbeltarbejde og forenkler langsigtet vedligeholdelse.

PHP MVC Framework

Hvad er PHP MVC framework?

PHP MVC er et applikationsdesignmรธnster, der adskiller applikationsdata og forretningslogik (model) fra prรฆsentationen (visning). MVC stรฅr for Model, View & Controller.

Controlleren formidler mellem modellerne og visningerne.

Tรฆnk pรฅ MVC-designmรธnsteret som en bil og chauffรธr.

Bilen har forruder (udsyn), som fรธreren (controlleren) bruger til at overvรฅge trafikken forude og derefter รธge hastigheden eller bremse (model) afhรฆngigt af, hvad han ser forude.

Lad os derefter se pรฅ, hvorfor et framework bygget pรฅ dette mรธnster er vรฆrd at bruge.

Hvorfor bruge PHP MVC Framework?

PHP MVC-frameworks forenkler arbejdet med komplekse teknologier ved at:

  • Skjul alle de komplekse implementeringsdetaljer
  • Tilvejebringelse af standardmetoder, som vi kan bruge til at bygge vores applikationer
  • ร˜get udviklerproduktivitet, fordi basisimplementeringer af aktiviteter som at oprette forbindelse til databasen og rense brugerinput allerede er delvist implementeret.
  • Fremme af overholdelse af professionelle kodningsstandarder

PHP MVC-designmรธnster

Lad os nu kort diskutere hver komponent i MVC-designmรธnsteret.

Model โ€“ denne del handler om forretningslogikken og applikationsdataene. Den kan bruges til at udfรธre datavalideringer, behandle data og gemme dem. Dataene kan komme fra;

  • flad fil
  • database
  • XML-dokument
  • Andre gyldige datakilder.

controller โ€“ dette er den del, der omhandler brugerens anmodninger om ressourcer fra serveren.

Som eksempel, nรฅr brugeren anmoder om URL โ€ฆ/index.php?products=list, vil controlleren indlรฆse produktmodellen for at hente produktdataene og derefter vise resultaterne i listevisningen.

I en nรธddeskal forbinder controlleren modellerne og visningerne sammen afhรฆngigt af de รธnskede ressourcer.

Views โ€“ denne del omhandler prรฆsentation af dataene for brugeren. Dette er normalt i form af HTML-sider.

Typer af PHP MVC-ramme

At vรฆlge den bedste PHP-ramme er en udfordring.

Du behรธver ikke at skrive din egen ramme for at fรฅ glรฆde af fordelene ved MVC.

Du bรธr kun forsรธge at skabe dit eget MVC-relaterede applikationsdesign for at forstรฅ, hvordan MVC-frameworks fungerer.

Nรฅr du er fortrolig med den mรฅde, MVC-frameworks fungerer pรฅ, bรธr du gรฅ videre til de modne og allerede testede rammer.

Tabellen nedenfor beskriver kort nogle af de populรฆre PHP-frameworks og de funktioner, som hvert framework tilbyder.

Framework Beskrivelse

Codetรฆndsats


Codetรฆndsats


https://codeigniter.com/

Det er et af de mest populรฆre PHP MVC-frameworks, nu i sin fjerde stรธrre version (CodeIgniter 4). Den er let og har en kort indlรฆringskurve. Den har et rigt sรฆt biblioteker, der hjรฆlper med at bygge websteder og applikationer hurtigt. Brugere med begrรฆnset viden om OOP-programmering kan ogsรฅ bruge den. Applikationer bygget med CodeTรฆndingsenhed inkluderer;


kohana


kohana


http://kohanaframework.org

Det er et sikkert og letvรฆgts framework (HMVC) baseret pรฅ hierarkisk modelvisningscontroller. Bemรฆrk: Kohana blev officielt udgรฅet i 2017; dens sidste stabile udgivelse var 3.3.6 (juli 2016). Community fork Koseven fortsatte sin kodebase. Virksomheder, der brugte Kohana, inkluderer;


CakePHP


CakePHP


www.cakephp.org

Den er modelleret efter Ruby on Rails og vedligeholdes fortsat aktivt (version 5.x). Den er kendt for koncepter som softwaredesignmรธnstre, konvention frem for konfiguration, ActiveRecord osv. CakePHP drevne applikationer omfatter;


Zend

https://getlaminas.org/


Zend (nu Laminas)

Det er en kraftfuld ramme, der er;

  • Sikker, pรฅlidelig, hurtig og skalerbar
  • Understรธtter oprettelsen af โ€‹โ€‹webtjenester og API'er.

Det er ideelt til udviklingping forretningsapplikationer. I 2020 overgik Zend Framework til open source Laminas Project. Zend/Laminas-drevne applikationer inkluderer;

  • Pimcore CMS,
  • DotKernel.

Virksomheder, der har brugt Zend-frameworket, inkluderer;

  • BBC
  • Cisco
  • Webex
  • Offers.com

PHP MVC Framework vs. almindelig PHP: Vigtigste forskelle

Hvad รฆndrer et framework egentlig i praksis? Almindelig PHP giver dig fuld frihed, men hvert projekt ender med at genopfinde routing, validering og databaseadgang fra bunden. Et PHP MVC framework standardiserer disse gentagne opgaver, sรฅ din kode forbliver ensartet pรฅ tvรฆrs af projekter og teams.

Aspect Almindelig PHP PHP MVC Framework
Code organisation Blandet HTML, SQL og logik i enkelte filer Opdelt i modeller, visninger og controllere
Adgang til database Hรฅndskrevne forespรธrgsler pรฅ hver side Indbygget forespรธrgselsbygger eller ORM med parameterbinding
Sikkerhed Udvikleren skal huske alle sikkerhedsforanstaltninger Inputfiltrering, XSS og CSRF-beskyttelse inkluderet
Vedligeholdelse ร†ndringer spreder sig uforudsigeligt gennem filer Hvert lag kan รฆndres uafhรฆngigt

๐Ÿ’ก Tip: Byg fรธrst et lille, almindeligt PHP-projekt, ligesom meningsmรฅlingen nedenfor; smerten ved blandet kode gรธr vรฆrdien af โ€‹โ€‹MVC-separation รฅbenlys.

Portering af meningsmรฅlingapplikationen til Codetรฆndsats

I denne tutorial, har vi lavet en PHP-afstemningsapplikation. Her vil vi portere den kode til Codetรฆndsats

  • Hent den nyeste version af CodeTรฆndingsapparat fra deres internet side.
  • ExtracOverfรธr indholdet af den zip-fil til din udviklingsmappe i din webservermappe. Vi bruger ciopinionpoll som mappenavn i denne lektion.
  • Gรฅ til URL http://localhost/ciopinionpoll/

CodeIgniter velkomstside vist efter extracrammerne

CodeIgniter-velkomstsiden ovenfor bekrรฆfter, at frameworket er installeret korrekt. Vi skal nu portere vores meningsmรฅlingsprogram til CodeIgniter. Husk at vores applikation var opdelt i tre hovedkomponenter, nemlig;

  • Frontcontroller โ€“ dette er den del, der reagerer pรฅ URL anmoder om og returnerer den รธnskede side. Denne kode vil blive placeret i controlleren
  • Model โ€“ dette er den kode, der svarer pรฅ dataanmodninger og returnerer de anmodede data. Denne kode vil blive indsat i modellen
  • Visninger โ€“ dette er koden, der er ansvarlig for formatering og visning af dataene. Denne kode vil gรฅ ind i visningen

Indstillinger for databasekonfiguration

Sรฅdan konfigurerer du databaseforbindelsen:

  • Gรฅ til ciopinionpoll-mappen
  • ร…bne database.php filen, der er placeret i mappen application/config.
  • Find fรธlgende kodelinjer

Indstillinger for databasekonfiguration i CodeIgniter database.php-fil

  • Indstil brugernavnet til root
  • Indstil adgangskoden til din lokale vรฆrts root-adgangskode
  • Indstil databasenavnet til opinion_poll. Bemรฆrk, at vi bruger den database, der blev oprettet i den forrige lektion.
  • Gem รฆndringerne og luk filen.

At skabe vores model

Dernรฆst skal vi oprette vores model, der vil udvide CI_Modellen. CI_Modellen er en del af CodeIgniter-biblioteker. Modellen vil vรฆre placeret i application/models opinion_poll_model.php

<?php
class Opinion_poll_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
        $this->load->database();
    }

    public function total_votes()
    {
        $query = $this->db->select('COUNT(choice) as choices_count')->get('js_libraries');
        return $query->row()->choices_count;
    }

    public function get_results()
    {
        $libraries = array("", "JQuery", "MooTools", "YUI Library", "Glow");
        $table_rows = '';

        for ($i = 1; $i < 5; $i++)
        {
            $query = $this->db->select('COUNT(choice) as choices_count')
                              ->where('choice', $i)
                              ->get('js_libraries');

            $table_rows .= "<tr><td>" . $libraries[$i] . " Got:</td><td><b>" . $query->row()->choices_count . "</b> votes</td></tr>";
        }

        return $table_rows;
    }

    public function add_vote($choice)
    {
        $ts = date("Y-m-d H:i:s");
        $data = array('choice' => $choice, 'ts' => $ts);
        $this->db->insert('js_libraries', $data);
    }
}
?>

HER,

  • "class Opinion_poll_model udvider CI_Model..." er vores model, der udvider CI_Model
  • "parent::__construct();" kalder CI_Model-konstruktรธren
  • "$this->load->database();" indlรฆser databasebiblioteket, sรฅ vores applikation kan interagere med databasen
  • "$this->db->" er CodeIgniters aktive registrering. Tjek dette link for mere information om den aktive post.

Oprettelse af vores controller

Lad os nu oprette controlleren. Vi bruger standardindstillingen CodeIgniter-controlleren findes i application/controllers/welcome.php. Erstat dens kildekode med fรธlgende kode.

<?php

if (!defined('BASEPATH'))  exit('No direct script access allowed');

class Welcome extends CI_Controller {

    public function __construct() {

        parent::__construct();

        $this->load->model('opinion_poll_model');

    }

    public function index() {

        if ($this->input->post('submitbutton') && !$this->input->post('vote')) {

            echo "<script>alert('You did not vote!');</script>";

        }

        if ($this->input->post('vote')) {

            $this->opinion_poll_model->add_vote($this->input->post('vote'));

            $data['total_votes'] = $this->opinion_poll_model->total_votes();

            $data['rows'] = $this->opinion_poll_model->get_results();

            $this->load->view('results', $data);

        } else {

            $this->load->view('opinion_poll_form');

        }

    }

}

/* End of file welcome.php */

/* Location: ./application/controllers/welcome.php */
?>

HER,

  • "if (!defined('BASEPATH')) exit('Ingen direkte scriptadgang tilladt');" sikrer, at brugerne ikke fรฅr direkte adgang til controllerklassen
  • "class Welcome udvider CI_Controller..." vores controller udvider CI_Controller-klassen
  • "public function __construct()" kalder CI_Controllers klassekonstruktรธrmetode og indlรฆser vores Opinion_poll_model-model
  • โ€œpublic function index()โ€ฆโ€ er den funktion, der knytter sig til index.php. Den bruger CodeIgniters inputklasse for at kontrollere, om en stemme er blevet indsendt, tilfรธje den til databasen og derefter vise resultaterne. Hvis post-arrayet for inputklassen er tomt, indlรฆses afstemningssiden.
  • "$this->input->post('โ€ฆ')" er CodeIgniter-inputklasse, der henter indholdet af den globale variabel $_POST.
  • "$this->opinion_poll_model->add_vote($this->input->post('vote'))" kalder modellens add_vote metode til at tilfรธje stemmen til databasen.

Oprettelse af vores synspunkter

Husk fra det forrige eksempel, at vi havde to HTML-sider, en til afstemninger og den anden til resultater. Vi vil bruge den samme HTML-kode med minimale รฆndringer til at oprette vores views. Opret fรธlgende filer i mappen application/views

opinion_poll_form.php
<html>
<head>
    <title>
        JavaScript Libraries - Opinion Poll
    </title>
</head>

<body>
    <h2>JavaScript Libraries - Opinion Poll</h2>
    <p><b>What is your favorite JavaScript Library?</b></p>
    <form method="POST" action="index.php">
        <p>
            <input type="radio" name="vote" value="1" /> JQuery
            <br />
            <input type="radio" name="vote" value="2" /> MooTools
            <br />
            <input type="radio" name="vote" value="3" /> YUI Library
            <br />
            <input type="radio" name="vote" value="4" /> Glow </p>
        <p>
            <input type="submit" name="submitbutton" value="OK" />
        </p>
    </form>
</body>
</html>

Lad os nu oprette resultatsiden results.php

<html>
    <head>
        <title>JavaScript Libraries - Opinion Poll Results</title>
    </head>
    <body>

        <h2>JavaScript Libraries - Opinion Poll Results</h2>

        <p><b>What is your favorite JavaScript Library?</b></p>

        <p><b><?php echo $total_votes; ?></b> people have thus far taken part in this poll:</p>

        <p><table><tr><td>

            <?php print($rows); ?>

        </tr></td></table></p>

        <p><a href="#">Return to voting page</a></p>
</body>
</html>

Tester vores applikation

Hvis du antager, at rodmappen pรฅ din applikation er ciopinionpoll, skal du gรฅ til http://localhost/ciopinionpoll/

Meningsmรฅlingsformular udleveret af CodeTรฆndingsapplikation

Afstemningssiden ovenfor kommer fra vores opinion_poll_form-visning. Klik pรฅ OK uden at vรฆlge en mulighed, og du vil se fรธlgende advarselsmeddelelse

Valideringsadvarselsmeddelelse vises, nรฅr der ikke er valgt nogen stemme

Stem pรฅ dit yndlingsbibliotek, og klik derefter pรฅ OK. Du vil se fรธlgende resultatside.

Meningsmรฅlingsresultatside, der viser antallet af stemmer pr. JavaScriptbibliotek

Dette bekrรฆfter, at de tre lag arbejder sammen: controlleren modtog afstemningen, modellen gemte og talte den, og visningen viste totalerne.

Ofte Stillede Spรธrgsmรฅl

HMVC (Hierarchical Model View Controller) organiserer en applikation i uafhรฆngige MVC-triader, der kan kalde hinanden. Frameworks som f.eks. kohana populariserede HMVC, fordi det hjรฆlper med at modularisere store applikationer.

Ja. Laravel er i รธjeblikket det mest populรฆre PHP MVC-framework. Det fรธlger den samme Model-View-Controller-adskillelse, som er beskrevet her, og tilfรธjer vรฆrktรธjer som Eloquent ORM- og Blade-skabelonerne.

Ja. Vรฆrktรธjer som GitHub Copilot kan scaffolde modeller, controllere og visninger fra prompts. Du bรธr stadig gennemgรฅ genereret kode for sikkerhedsproblemer sรฅsom unescaped output og SQL-injektion.

Nej. AI-assistenter fremskynder skrivning af kode, men frameworks leverer stadig den testede struktur, sikkerhedsstandarder og konventioner, der sikrer, at applikationer vedligeholdes. De to fungerer bedst sammen.

Nej. Codetรฆndsats er brugervenlig for udviklere med begrรฆnset erfaring med objektorienteret programmering. Kendskab til klasser, metoder og grundlรฆggende arv er nok til at fรธlge dens model- og controllermรธnstre.

Opsummer dette indlรฆg med: