Tutorial PHP MVC Framework

โšก Rezumat inteligent

Designul framework-ului PHP MVC separฤƒ datele aplicaศ›iei ศ™i logica de business de prezentare, utilizรขnd modele, vizualizฤƒri ศ™i controlere. CodeIgniter face acest model practic, permiศ›รขnd dezvoltatorilor PHP sฤƒ construiascฤƒ mai rapid aplicaศ›ii web sigure ศ™i uศ™or de รฎntreศ›inut.

  • ๐Ÿงฉ Model: MVC รฎmparte o aplicaศ›ie รฎn Model (date), View (prezentare) ศ™i Controller (gestionarea cererilor) pentru un cod mai curat.
  • ๐Ÿš€ Productivitate: Framework-urile includ biblioteci predefinite pentru accesul la baze de date, validare ศ™i igienizarea datelor de intrare, astfel รฎncรขt echipele sฤƒ livreze funcศ›ii mai rapid.
  • ๐Ÿ› ๏ธ Opศ›iuni: CodeIgniter, CakePHP ศ™i Laminas (fostul Zend) rฤƒmรขn opศ›iuni active, รฎn timp ce Kohana a fost รฎntreruptฤƒ รฎn 2017.
  • ๐Ÿ—„๏ธ Model: In CodeIgniter, modelele extind CI_Model ศ™i utilizeazฤƒ metodele Query Builder pentru operaศ›iuni sigure cu baza de date.
  • ๐ŸŽฎ Controlor: Controlerele extind CI_Controller, citesc input-ul utilizatorului prin clasa input ศ™i รฎncarcฤƒ vizualizarea corectฤƒ.
  • ๐Ÿ“ˆ Impact: Portarea unei aplicaศ›ii PHP simple de sondaje aratฤƒ cum structura MVC reduce duplicarea ศ™i simplificฤƒ mentenanศ›a pe termen lung.

Framework-ul PHP MVC

Ce este cadrul PHP MVC?

PHP MVC este un model de proiectare a aplicaศ›iei care separฤƒ datele aplicaศ›iei ศ™i logica de afaceri (modelul) de prezentare (vizualizare). MVC รฎnseamnฤƒ Model, View & Controller.

Controlerul mediazฤƒ รฎntre modele ศ™i vederi.

Gรขndiศ›i-vฤƒ la modelul de design MVC ca la o maศ™inฤƒ ศ™i la ศ™ofer.

Maศ™ina are parbrize (vizualizare) pe care ศ™oferul (controlorul) le foloseศ™te pentru a monitoriza traficul din faศ›ฤƒ, apoi accelereazฤƒ sau frรขneazฤƒ (modelul) รฎn funcศ›ie de ceea ce vede รฎn faศ›ฤƒ.

รŽn continuare, sฤƒ vedem de ce meritฤƒ utilizat un framework construit pe acest model.

De ce sฤƒ folosiศ›i PHP MVC Framework?

Framework-urile PHP MVC simplificฤƒ lucrul cu tehnologii complexe prin:

  • Ascunderea tuturor detaliilor complexe de implementare
  • Furnizarea de metode standard pe care le putem folosi pentru a construi aplicaศ›iile noastre
  • Creศ™terea productivitฤƒศ›ii dezvoltatorilor, deoarece implementฤƒrile de bazฤƒ ale unor activitฤƒศ›i precum conectarea la baza de date ศ™i curฤƒศ›area datelor introduse de utilizatori sunt deja parศ›ial implementate
  • รŽncurajarea respectฤƒrii standardelor profesionale de codare

Model de proiectare PHP MVC

Sฤƒ discutฤƒm acum pe scurt fiecare componentฤƒ a modelului de proiectare MVC.

Model โ€“ aceastฤƒ parte se referฤƒ la logica afacerii ศ™i datele aplicaศ›iei. Poate fi folosit pentru a efectua validฤƒri de date, a procesa date ศ™i a le stoca. Datele pot proveni de la;

  • fiศ™ier plat
  • Baza de date
  • document XML
  • Alte surse de date valide.

operator de date cu caracter personal, โ€“ aceasta este partea care se ocupฤƒ de cererile utilizatorului pentru resurse de la server.

De exemplu, atunci cรขnd utilizatorul solicitฤƒ URL โ€ฆ/index.php?products=list, controlerul va รฎncฤƒrca modelul de produse pentru a recupera datele despre produse, apoi va afiศ™a rezultatele รฎn vizualizarea listฤƒ.

Pe scurt, controlerul leagฤƒ modelele ศ™i vederile รฎmpreunฤƒ รฎn funcศ›ie de resursele solicitate.

Vizualizฤƒri โ€“ aceastฤƒ parte se ocupฤƒ de prezentarea datelor cฤƒtre utilizator. Aceasta se face de obicei sub formฤƒ de pagini HTML.

Tipuri de framework PHP MVC

Selectarea celui mai bun cadru PHP este o provocare.

Nu trebuie sฤƒ vฤƒ scrieศ›i propriul cadru pentru a beneficia de avantajele MVC.

Ar trebui sฤƒ รฎncercaศ›i sฤƒ vฤƒ creaศ›i propriul design de aplicaศ›ie legat de MVC pentru a รฎnศ›elege cum funcศ›ioneazฤƒ cadrele MVC.

Odatฤƒ ce vฤƒ simศ›iศ›i confortabil cu modul รฎn care funcศ›ioneazฤƒ cadrele MVC, ar trebui sฤƒ treceศ›i la cadrele mature ศ™i deja testate.

Tabelul de mai jos descrie pe scurt cรขteva dintre framework-urile PHP populare ศ™i caracteristicile pe care le oferฤƒ fiecare framework.

Cadru Descriere

Codeigniter


Codeigniter


https://codeigniter.com/

Este unul dintre cele mai populare framework-uri PHP MVC, acum la a patra versiune majorฤƒ (CodeIgniter 4). Este uศ™or ศ™i are o curbฤƒ de รฎnvฤƒศ›are scurtฤƒ. Are un set bogat de biblioteci care ajutฤƒ la construirea rapidฤƒ a site-urilor web ศ™i a aplicaศ›iilor. De asemenea, รฎl pot folosi utilizatorii cu cunoศ™tinศ›e limitate de programare OOP. Aplicaศ›iile construite cu CodeAprinzฤƒtorul include;


kohana


kohana


http://kohanaframework.org

Este un framework uศ™or ศ™i sigur, de tip Hierarchical Model View Controller (HMVC). Notฤƒ: Kohana a fost oficial รฎntrerupt รฎn 2017; ultima sa versiune stabilฤƒ a fost 3.3.6 (iulie 2016). Furca comunitarฤƒ Koseven ศ™i-a continuat baza de cod. Companiile care au folosit Kohana includ:


CakePHP


CakePHP


www.cakephp.org

Este modelat dupฤƒ Ruby on Rails ศ™i este รฎntreศ›inut activ (versiunea 5.x). Este cunoscut pentru concepte precum modele de proiectare software, convenศ›ii asupra configurฤƒrii, ActiveRecord etc. CakePHP aplicaศ›iile alimentate includ;


Zend

https://getlaminas.org/


Zend (acum Laminas)

Este un cadru puternic care este;

  • Securizat, fiabil, rapid ศ™i scalabil
  • Suportฤƒ crearea de servicii web ศ™i API-uri.

Este ideal pentru dezvoltareping aplicaศ›ii de business. รŽn 2020, Zend Framework a trecut la proiectul open source Laminas. Aplicaศ›iile bazate pe Zend/Laminas includ:

  • Pimcore CMS,
  • DotKernel.

Companiile care au utilizat framework-ul Zend includ:

  • BBC
  • Cisco
  • WebEx
  • Oferte.com

Framework-ul PHP MVC vs. PHP simplu: Diferenศ›e cheie

Ce schimbฤƒ de fapt un framework รฎn practicฤƒ? PHP-ul simplu รฎศ›i oferฤƒ libertate completฤƒ, dar fiecare proiect ajunge sฤƒ reinventeze rutarea, validarea ศ™i accesul la baza de date de la zero. Un framework PHP MVC standardizeazฤƒ aceste sarcini repetitive, astfel รฎncรขt codul tฤƒu rฤƒmรขne consistent รฎn toate proiectele ศ™i echipele.

Aspect PHP simplu Framework-ul PHP MVC
Code organizaศ›ie HTML, SQL ศ™i logicฤƒ mixte รฎn fiศ™iere individuale Separat รฎn modele, vizualizฤƒri ศ™i controlere
Acces la baza de date Interogฤƒri scrise de mรขnฤƒ pe fiecare paginฤƒ Constructor de interogฤƒri รฎncorporat sau ORM cu legare de parametri
Securitate Dezvoltatorul trebuie sฤƒ ศ›inฤƒ cont de fiecare mฤƒsurฤƒ de siguranศ›ฤƒ Filtrare de intrare, protecศ›ie XSS ศ™i CSRF incluse
Mentenanศ›ฤƒ Modificฤƒrile se propagฤƒ imprevizibil prin fiศ™iere Fiecare strat se poate schimba independent

๐Ÿ‘ Sfat: Construieศ™te mai รฎntรขi un mic proiect PHP simplu, precum sondajul de opinie de mai jos; dificultฤƒศ›ile aduse de codul mixt fac evidentฤƒ valoarea separฤƒrii MVC.

Portarea aplicaศ›iei de sondaje de opinie cฤƒtre Codeigniter

รŽn acest tutorial, am creat o aplicaศ›ie de sondaje PHP. Aici, vom porta codul respectiv la Codeigniter

  • Descฤƒrcare ultima versiune de CodeAprinzฤƒtor de la al lor site-ul web.
  • ExtracTransferaศ›i conศ›inutul fiศ™ierului arhivat รฎn directorul de dezvoltare din directorul serverului web. Vom folosi ciopinionpoll ca nume de folder รฎn aceastฤƒ lecศ›ie.
  • Navigaศ›i la URL http://localhost/ciopinionpoll/

CodePagina de bun venit a Igniter afiศ™atฤƒ dupฤƒ extracting cadrului

CodePagina de bun venit a Igniter de mai sus confirmฤƒ cฤƒ framework-ul este instalat corect. Acum vom porta aplicaศ›ia noastrฤƒ de sondaje de opinie la CodeIgniter. Reamintim cฤƒ aplicaศ›ia noastrฤƒ a fost รฎmpฤƒrศ›itฤƒ รฎn trei componente majore, ศ™i anume;

  • Controler frontal โ€“ aceasta este partea care rฤƒspunde la URL solicitฤƒ ศ™i returneazฤƒ pagina solicitatฤƒ. Acest cod va intra รฎn controler
  • Model โ€“ acesta este codul care rฤƒspunde la solicitฤƒrile de date ศ™i returneazฤƒ datele solicitate. Acest cod va fi introdus รฎn model
  • Vizualizฤƒri โ€“ acesta este codul responsabil pentru formatarea ศ™i afiศ™area datelor. Acest cod va intra รฎn vizualizare

Setฤƒri de configurare a bazei de date

Pentru a configura conexiunea la baza de date:

  • Navigaศ›i la folderul ciopinionpoll
  • Deschideศ›i baza de date.php fiศ™ierul situat รฎn directorul application/config.
  • Localizaศ›i urmฤƒtoarele linii de cod

Setฤƒrile de configurare a bazei de date รฎn CodeFiศ™ierul Igniter database.php

  • Setaศ›i numele de utilizator la root
  • Setaศ›i parola la parola de root localhost
  • Setaศ›i numele bazei de date la opinion_poll. Reศ›ineศ›i cฤƒ vom folosi baza de date creatฤƒ รฎn lecศ›ia anterioarฤƒ.
  • Salvaศ›i modificฤƒrile ศ™i รฎnchideศ›i fiศ™ierul.

Crearea modelului nostru

รŽn continuare, vom crea modelul nostru care va extinde CI_Model. CI_Model face parte din CodeBibliotecile Igniter. Modelul va fi localizat รฎn application/models opinie_sondaj_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);
    }
}
?>

AICI,

  • โ€žclasa Opinion_poll_model extinde CI_Model...โ€ este modelul nostru care extinde CI_Model
  • โ€žparent::__construct();โ€ apeleazฤƒ constructorul CI_Model
  • โ€ž$this->load->database();โ€ รฎncarcฤƒ biblioteca bazei de date, astfel รฎncรขt aplicaศ›ia noastrฤƒ sฤƒ poatฤƒ interacศ›iona cu baza de date
  • โ€ž$this->db->โ€ este CodeรŽnregistrarea activฤƒ a lui Igniter. Verificaศ›i asta. legฤƒturฤƒ pentru mai multe informaศ›ii despre รฎnregistrarea activฤƒ.

Crearea controlerului nostru

Sฤƒ creฤƒm acum controlerul. Vom folosi setฤƒrile implicite CodeControlerul Igniter se aflฤƒ รฎn application/controllers/welcome.php. รŽnlocuiศ›i codul sฤƒu sursฤƒ cu urmฤƒtorul cod.

<?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 */
?>

AICI,

  • โ€žif (!defined('BASEPATH')) exit('Nu este permis accesul direct la script');โ€ se asigurฤƒ cฤƒ utilizatorii nu acceseazฤƒ direct clasa de controler
  • โ€žclasa Bun venit extinde CI_Controller...โ€ controlerul nostru extinde clasa CI_Controller
  • โ€žpublic function __construct()โ€ apeleazฤƒ metoda constructorului de clasฤƒ a CI_Controller ศ™i รฎncarcฤƒ modelul nostru Opinion_poll_model
  • โ€žpublic function index()โ€ฆโ€ este funcศ›ia care se mapeazฤƒ la index.php. Aceasta foloseศ™te CodeClasa de intrare a Igniter verificฤƒ dacฤƒ un vot a fost trimis, รฎl adaugฤƒ รฎn baza de date ศ™i apoi afiศ™eazฤƒ rezultatele. Dacฤƒ matricea post a clasei de intrare este goalฤƒ, รฎncarcฤƒ pagina de vot.
  • โ€ž$this->input->post('โ€ฆ')โ€ este CodeClasa de intrare Igniter care preia conศ›inutul variabilei globale $_POST.
  • โ€ž$this->opinion_poll_model->add_vote($this->input->post('vote'))โ€ apeleazฤƒ metoda add_vote a modelului pentru a adฤƒuga votul รฎn baza de date.

Crearea vederilor noastre

Reamintim din exemplul anterior cฤƒ aveam douฤƒ pagini HTML, una pentru vot ศ™i cealaltฤƒ pentru rezultate. Vom folosi acelaศ™i cod HTML cu modificฤƒri minime pentru a crea view-urile noastre. Creaศ›i urmฤƒtoarele fiศ™iere รฎn directorul 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>

Sฤƒ creฤƒm acum pagina de rezultate 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>

Testarea aplicaศ›iei noastre

Presupunรขnd cฤƒ directorul rฤƒdฤƒcinฤƒ al aplicaศ›iei dvs. este ciopinionpoll, navigaศ›i la http://localhost/ciopinionpoll/

Formular de vot pentru sondajul de opinie furnizat de CodeAplicaศ›ie aprinzฤƒtor

Pagina de vot de mai sus provine din vizualizarea noastrฤƒ opinion_poll_form. Faceศ›i clic pe OK fฤƒrฤƒ a selecta o opศ›iune ศ™i veศ›i vedea urmฤƒtorul mesaj de alertฤƒ.

Mesaj de alertฤƒ de validare afiศ™at atunci cรขnd nu este selectat niciun vot

Votaศ›i pentru biblioteca preferatฤƒ, apoi faceศ›i clic pe OK. Veศ›i vedea urmฤƒtoarea paginฤƒ cu rezultate

Pagina cu rezultatele sondajului de opinie care aratฤƒ numฤƒrul de voturi pe JavaBibliotecฤƒ de scripturi

Aceasta confirmฤƒ cฤƒ cele trei straturi funcศ›ioneazฤƒ รฎmpreunฤƒ: controlerul a primit votul, modelul l-a stocat ศ™i l-a numฤƒrat, iar vizualizarea a afiศ™at totalurile.

รŽntrebฤƒri frecvente

HMVC (Hierarchical Model View Controller - Controlor de vizualizare model ierarhic) organizeazฤƒ o aplicaศ›ie รฎn triade MVC independente care se pot apela reciproc. Framework-uri precum kohana a popularizat HMVC deoarece ajutฤƒ la modularizarea aplicaศ›iilor mari.

Da. Laravel este รฎn prezent cel mai popular framework PHP MVC. Urmeazฤƒ aceeaศ™i separare Model-View-Controller descrisฤƒ aici, adฤƒugรขnd instrumente precum ศ™abloanele Eloquent ORM ศ™i Blade.

Da. Instrumente ca Copilotul GitHub poate structura modele, controlere ศ™i vizualizฤƒri din prompturi. Ar trebui sฤƒ revizuiศ›i รฎn continuare codul generat pentru probleme de securitate, cum ar fi ieศ™irea fฤƒrฤƒ coduri de evadare ศ™i injecศ›ia SQL.

Nu. Asistenศ›ii inteligenศ›i artificiali accelereazฤƒ scrierea codului, dar framework-urile oferฤƒ รฎn continuare structura testatฤƒ, setฤƒrile implicite de securitate ศ™i convenศ›iile care menศ›in aplicaศ›iile uศ™or de รฎntreศ›inut. Cele douฤƒ funcศ›ioneazฤƒ cel mai bine รฎmpreunฤƒ.

Nu. Codeigniter este prietenos cu dezvoltatorii cu experienศ›ฤƒ limitatฤƒ รฎn programarea orientatฤƒ pe obiecte. Cunoaศ™terea claselor, metodelor ศ™i a elementelor de bazฤƒ ale moศ™tenirii este suficientฤƒ pentru a urmฤƒri modelul ศ™i tiparele de controler.

Rezumaศ›i aceastฤƒ postare cu: