Opplæring i PHP MVC Framework

⚡ Smart oppsummering

PHP MVC Framework-design skiller applikasjonsdata og forretningslogikk fra presentasjon ved hjelp av modeller, visninger og kontrollere. CodeIgniter gjør dette mønsteret praktisk, slik at PHP-utviklere kan bygge sikre og vedlikeholdbare webapplikasjoner raskere.

  • 🧩 Mønster: MVC deler en applikasjon inn i Model (data), View (presentasjon) og Controller (forespørselshåndtering) for renere kode.
  • 🚀 Produktivitet: Rammeverk leverer forhåndsbygde biblioteker for databasetilgang, validering og sanering av inndata, slik at team leverer funksjoner raskere.
  • 🛠️ Alternativer: CodeIgniter, CakePHP og Laminas (tidligere Zend) er fortsatt aktive valg, mens Kohana ble avviklet i 2017.
  • 🗄️ Modell: In CodeIgniter, modeller utvider CI_Model og bruker Query Builder-metoder for sikre databaseoperasjoner.
  • 🎮 Controller: Kontrollere utvider CI_Controller, leser brukerinndata gjennom input-klassen og laster inn riktig visning.
  • 📈 Innvirkning: Portering av en vanlig PHP-avstemningsapplikasjon viser hvordan MVC-strukturen reduserer duplisering og forenkler langsiktig vedlikehold.

PHP MVC-rammeverk

Hva er PHP MVC-rammeverket?

PHP MVC er et applikasjonsdesignmønster som skiller applikasjonsdata og forretningslogikk (modell) fra presentasjonen (visning). MVC står for Model, View & Controller.

Kontrolleren formidler mellom modellene og visningene.

Tenk på MVC-designmønsteret som en bil og sjåfør.

Bilen har frontruter (visning) som føreren (kontrolløren) bruker til å overvåke trafikken foran, og deretter øke hastigheten eller bremse (modell) avhengig av hva han ser foran.

La oss deretter se hvorfor et rammeverk bygget på dette mønsteret er verdt å bruke.

Hvorfor bruke PHP MVC Framework?

PHP MVC-rammeverk forenkler arbeidet med komplekse teknologier ved å:

  • Skjuler alle de komplekse implementeringsdetaljene
  • Tilbyr standardmetoder som vi kan bruke til å bygge applikasjonene våre
  • Øker utviklerproduktiviteten, fordi basisimplementeringer av aktiviteter som å koble til databasen og rengjøre brukerinput allerede er delvis implementert.
  • Oppmuntre til overholdelse av profesjonelle kodestandarder

PHP MVC-designmønster

La oss nå kort diskutere hver komponent i MVC-designmønsteret.

Modell – denne delen er opptatt av forretningslogikken og applikasjonsdataene. Den kan brukes til å utføre datavalidering, behandle data og lagre den. Dataene kan komme fra;

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

controller – dette er delen som omhandler brukerens forespørsler om ressurser fra serveren.

Som et eksempel, når brukeren ber om URL …/index.php?products=list, vil kontrolleren laste inn produktmodellen for å hente produktdataene, og deretter vise resultatene i listevisningen.

I et nøtteskall kobler kontrolleren modellene og visningene sammen avhengig av de forespurte ressursene.

Visninger – denne delen omhandler presentasjon av dataene for brukeren. Dette er vanligvis i form av HTML-sider.

Typer PHP MVC-rammeverk

Å velge det beste PHP-rammeverket er en utfordring.

Du trenger ikke å skrive ditt eget rammeverk for å dra nytte av fordelene med MVC.

Du bør bare prøve å lage din egen MVC-relaterte applikasjonsdesign for å forstå hvordan MVC-rammeverk fungerer.

Når du er komfortabel med måten MVC-rammeverk fungerer på, bør du gå videre til de modne og allerede testede rammeverkene.

Tabellen nedenfor beskriver kort noen av de populære PHP-rammeverkene og funksjonene som hvert rammeverk tilbyr.

Rammeverk Tekniske beskrivelser

CodeTenner


CodeTenner


https://codeigniter.com/

Det er et av de mest populære PHP MVC-rammeverkene, nå i sin fjerde hovedversjon (CodeIgniter 4). Den er lett og har en kort læringskurve. Den har et rikt sett med biblioteker som hjelper med å bygge nettsteder og applikasjoner raskt. Brukere med begrenset kunnskap om OOP-programmering kan også bruke den. Applikasjoner bygget med CodeTennapparat inkluderer;


kohana


kohana


http://kohanaframework.org

Det er et sikkert og lett rammeverk for hierarkisk modellvisningskontroller (HMVC). OBS: Kohana ble offisielt avviklet i 2017; den siste stabile utgivelsen var 3.3.6 (juli 2016). Community fork Koseven fortsatte sin kodebase. Selskaper som brukte Kohana inkluderer;


CakePHP


CakePHP


www.cakephp.org

Den er modellert etter Ruby on Rails og vedlikeholdes aktivt (versjon 5.x). Den er kjent for konsepter som programvaredesignmønstre, konvensjon over konfigurasjon, ActiveRecord osv. CakePHP drevne applikasjoner inkluderer;


Zend

https://getlaminas.org/


Zend (nå Laminas)

Det er et kraftig rammeverk som er;

  • Sikker, pålitelig, rask og skalerbar
  • Støtter opprettelse av webtjenester og API-er.

Det er ideelt for utviklingping forretningsapplikasjoner. I 2020 gikk Zend Framework over til Laminas Project med åpen kildekode. Zend/Laminas-drevne applikasjoner inkluderer;

  • Pimcore CMS,
  • DotKernel.

Selskaper som har brukt Zend-rammeverket inkluderer;

  • BBC
  • Cisco
  • WebEx
  • Offers.com

PHP MVC Framework vs. vanlig PHP: Viktige forskjeller

Hva endrer egentlig et rammeverk i praksis? Vanlig PHP gir deg full frihet, men hvert prosjekt ender opp med å gjenoppfinne ruting, validering og databasetilgang fra bunnen av. Et PHP MVC-rammeverk standardiserer disse repeterende oppgavene, slik at koden din forblir konsistent på tvers av prosjekter og team.

Aspekt Vanlig PHP PHP MVC-rammeverk
Code organisasjon Blandet HTML, SQL og logikk i enkeltfiler Delt inn i modeller, visninger og kontrollere
Databasetilgang Håndskrevne spørsmål på hver side Innebygd spørrebygger eller ORM med parameterbinding
Trygghet Utvikleren må huske alle sikkerhetstiltak Inkludert inndatafiltrering, XSS og CSRF-beskyttelse
Vedlikehold Endringer sprer seg uforutsigbart gjennom filer Hvert lag kan endres uavhengig

👍 Tips: Bygg først et lite, enkelt PHP-prosjekt, som meningsmålingen nedenfor. Problemet med blandet kode gjør verdien av MVC-separasjon åpenbar.

Portering av meningsmålingsapplikasjonen til CodeTenner

I dette tutorial, opprettet vi et PHP-avstemningsprogram. Her vil vi portere den koden til CodeTenner

  • Last ned den siste versjonen av CodeTennapparat fra deres nettside.
  • ExtracLast innholdet i den zippede filen til utviklingskatalogen din i webserverkatalogen din. Vi bruker ciopinionpoll som mappenavn i denne leksjonen.
  • Bla til URL http://localhost/ciopinionpoll/

CodeIgniter velkomstside vist etter extracå sette rammeverket

Ocuco CodeIgniter-velkomstsiden ovenfor bekrefter at rammeverket er riktig installert. Vi skal nå portere meningsmålingsapplikasjonen vår til CodeIgniter. Husk at applikasjonen vår var delt inn i tre hovedkomponenter, nemlig;

  • Frontkontroller – dette er delen som reagerer på URL forespør og returnerer den forespurte siden. Denne koden går inn i kontrolleren
  • Modell – dette er koden som svarer på dataforespørsler og returnerer de forespurte dataene. Denne koden vil bli lagt inn i modellen
  • Visninger – dette er koden som er ansvarlig for formatering og visning av dataene. Denne koden vil gå inn i visningen

Databasekonfigurasjonsinnstillinger

Slik konfigurerer du databasetilkoblingen:

  • Bla til ciopinionpoll-mappen
  • Åpne database.php filen som ligger i application/config-katalogen.
  • Finn følgende kodelinjer

Konfigurasjonsinnstillinger for databasen i CodeIgniter database.php-fil

  • Sett brukernavnet til root
  • Sett passordet til ditt lokale verts root-passord
  • Sett databasenavnet til opinion_poll. Merk at vi skal bruke databasen som ble opprettet i forrige leksjon.
  • Lagre endringene og lukk filen.

Skaper vår modell

Deretter skal vi lage modellen vår som vil utvide CI_Model. CI_Model er en del av CodeIgniter-biblioteker. Modellen vil bli plassert 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 utvider CI_Model..." er vår modell som utvider CI_Model
  • «parent::__construct();» kaller CI_Model-konstruktøren
  • "$this->load->database();" laster databasebiblioteket slik at applikasjonen vår kan samhandle med databasen
  • «$this->db->» er CodeIgniters aktive historikk. Sjekk dette. link for mer informasjon om den aktive posten.

Opprette kontrolleren vår

La oss nå lage kontrolleren. Vi bruker standardverdien CodeIgniter-kontrolleren ligger i application/controllers/welcome.php. Erstatt kildekoden 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 skripttilgang tillatt');" sikrer at brukere ikke får direkte tilgang til kontrollerklassen
  • "class Welcome utvider CI_Controller..." vår kontroller utvider CI_Controller-klassen
  • «public function __construct()» kaller CI_Controllers klassekonstruktørmetode og laster inn vår Opinion_poll_model-modell
  • «public function index()…» er funksjonen som er tilordnet index.php. Den bruker CodeIgniters input-klasse for å sjekke om en stemme er sendt inn, legge den til i databasen og deretter vise resultatene. Hvis post-arrayet til input-klassen er tomt, laster den inn stemmesiden.
  • «$this->input->post('…')» er CodeIgniter-inputklasse som henter innholdet i den globale variabelen $_POST.
  • "$this->opinion_poll_model->add_vote($this->input->post('vote'))" kaller modellens add_vote-metode for å legge stemmen inn i databasen.

Skaper våre synspunkter

Husk fra forrige eksempel at vi hadde to HTML-sider, én for avstemninger og én for resultater. Vi bruker den samme HTML-koden med minimale endringer for å lage visningene våre. Opprett 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>

La oss nå lage 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>

Testing av søknaden vår

Forutsatt at rotkatalogen til applikasjonen din er ciopinionpoll, bla til http://localhost/ciopinionpoll/

Stemmeskjema for meningsmålinger levert av CodeTennapplikasjon

Avstemningssiden ovenfor kommer fra vår opinion_poll_form-visning. Klikk på OK uten å velge et alternativ, så vil du se følgende varselmelding.

Valideringsvarselmelding vises når ingen stemme er valgt

Stem på favorittbiblioteket ditt, og klikk deretter på OK. Du vil se følgende resultatside.

Resultatsiden for meningsmålinger som viser antall stemmer per JavaSkriptbibliotek

Dette bekrefter at de tre lagene fungerer sammen: kontrolleren mottok avstemningen, modellen lagret og telte den, og visningen viste totalene.

Spørsmål og svar

HMVC (Hierarchical Model View Controller) organiserer en applikasjon i uavhengige MVC-triader som kan kalle hverandre. Rammeverk som kohana populariserte HMVC fordi det hjelper med å modularisere store applikasjoner.

Ja. Laravel er for tiden det mest populære PHP MVC-rammeverket. Det følger den samme Model-View-Controller-separasjonen som er beskrevet her, og legger til verktøy som Eloquent ORM- og Blade-malene.

Ja. Verktøy som GitHub Copilot kan stillase modeller, kontrollere og visninger fra ledetekster. Du bør fortsatt gjennomgå generert kode for sikkerhetsproblemer som uescapet utdata og SQL-injeksjon.

Nei. AI-assistenter fremskynder skriving av kode, men rammeverk gir fortsatt den testede strukturen, sikkerhetsstandardene og konvensjonene som gjør at applikasjoner kan vedlikeholdes. De to fungerer best sammen.

Nei. CodeTenner er brukervennlig for utviklere med begrenset erfaring med objektorientert programmering. Det er nok å kjenne til klasser, metoder og grunnleggende arv for å følge modellen og kontrollermønstrene.

Oppsummer dette innlegget med: