Μοτίβα σχεδίασης MVC από την αρχή. MVC για τον Ιστό: δεν θα μπορούσε να είναι πιο απλό. Διαγράμματα UML του παιχνιδιού Minesweeper

Κατά τη γνώμη μου, απολύτως κάθε προγραμματιστής, και όχι μόνο ένας προγραμματιστής, θα πρέπει να γνωρίζει το MVC για να εξασφαλίσει την καλύτερη επεκτασιμότητα του έργου.

Το MVC δεν είναι μόνο μια αρχιτεκτονική λογισμικού, αλλά και μια ιδέα ανάπτυξης. Δεν λέω ότι αυτό το άρθρο θα σας πει όλα τα μυστικά του MVC, αλλά σίγουρα μπορείτε να πάρετε μια αρχική κατανόηση. Και μετά http://pogugli.com/?74600

Η έννοια του MVC (Model-View-Controller) αναφέρεται πολύ συχνά στον κόσμο του web προγραμματισμού τα τελευταία χρόνια. Όλοι όσοι συνδέονται με οποιονδήποτε τρόπο με την ανάπτυξη εφαρμογών Ιστού έχουν συναντήσει αυτό το αρκτικόλεξο με τον ένα ή τον άλλο τρόπο. Σήμερα θα καταλάβουμε τι είναι η έννοια MVC και γιατί έγινε δημοφιλής.

Αρχαία ιστορία

Το MVC δεν είναι ένα μοτίβο έργου, είναι ένα μοτίβο σχεδιασμού που περιγράφει τον τρόπο κατασκευής της δομής της εφαρμογής μας, τις ευθύνες και την αλληλεπίδραση καθενός από τα μέρη αυτής της δομής.

Περιγράφηκε για πρώτη φορά το 1979, φυσικά, για ένα διαφορετικό περιβάλλον. Δεν υπήρχε η έννοια της διαδικτυακής εφαρμογής τότε. Ο Tim Berners Lee έσπειρε τους σπόρους του World Wide Web (WWW) στις αρχές της δεκαετίας του '90 και άλλαξε τον κόσμο για πάντα. Το πρότυπο που χρησιμοποιούμε σήμερα είναι μια προσαρμογή του αρχικού προτύπου για την ανάπτυξη ιστού.

Η άγρια ​​δημοτικότητα αυτής της δομής σε εφαρμογές web οφειλόταν στη συμπερίληψή της σε δύο περιβάλλοντα ανάπτυξης που έγιναν πολύ δημοφιλή: το Struts και το Ruby on Rails. Αυτά τα δύο περιβάλλοντα ανάπτυξης έθεσαν το δρόμο για εκατοντάδες περιβάλλοντα ανάπτυξης που δημιουργήθηκαν αργότερα.

MVC για εφαρμογές web

Η ιδέα πίσω από το μοτίβο σχεδιασμού MVC είναι πολύ απλή: πρέπει να διαχωρίσουμε σαφώς τις ευθύνες για τις διάφορες λειτουργίες στις εφαρμογές μας:

Η εφαρμογή χωρίζεται σε τρία κύρια στοιχεία, καθένα από τα οποία είναι υπεύθυνο για διαφορετικές εργασίες. Ας δούμε αναλυτικά τα εξαρτήματα χρησιμοποιώντας ένα παράδειγμα.

Ελεγκτής

Ο ελεγκτής διαχειρίζεται αιτήματα χρήστη (λαμβάνονται ως αιτήματα HTTP GET ή POST όταν ο χρήστης κάνει κλικ σε στοιχεία διεπαφής για να εκτελέσει διάφορες ενέργειες). Η κύρια λειτουργία του είναι να καλεί και να συντονίζει τη δράση των απαραίτητων πόρων και αντικειμένων που απαιτούνται για την εκτέλεση ενεργειών που καθορίζονται από τον χρήστη. Συνήθως, ο ελεγκτής καλεί το κατάλληλο μοντέλο για την εργασία και επιλέγει την κατάλληλη προβολή.

Μοντέλο

Ένα μοντέλο είναι τα δεδομένα και οι κανόνες που χρησιμοποιούνται για τη λειτουργία των δεδομένων που αντιπροσωπεύουν την έννοια για τον έλεγχο μιας εφαρμογής. Σε κάθε εφαρμογή, ολόκληρη η δομή μοντελοποιείται ως δεδομένα που επεξεργάζονται με συγκεκριμένο τρόπο. Τι είναι ένας χρήστης για μια εφαρμογή - μήνυμα ή βιβλίο; Μόνο δεδομένα που πρέπει να υποβληθούν σε επεξεργασία σύμφωνα με κανόνες (η ημερομηνία δεν μπορεί να δείχνει στο μέλλον, το email πρέπει να είναι σε συγκεκριμένη μορφή, το όνομα δεν μπορεί να είναι μεγαλύτερο από X χαρακτήρες κ.λπ.).

Το μοντέλο δίνει στον ελεγκτή μια αναπαράσταση των δεδομένων που έχει ζητήσει ο χρήστης (μήνυμα, σελίδα βιβλίου, άλμπουμ φωτογραφιών κ.λπ.). Το μοντέλο δεδομένων θα είναι το ίδιο ανεξάρτητα από το πώς θέλουμε να το παρουσιάσουμε στον χρήστη. Επομένως, επιλέγουμε οποιαδήποτε διαθέσιμη προβολή για την εμφάνιση των δεδομένων.

Το μοντέλο περιέχει το πιο σημαντικό μέρος της λογικής της εφαρμογής μας, τη λογική που λύνει το πρόβλημα που αντιμετωπίζουμε (φόρουμ, κατάστημα, τράπεζα κ.λπ.). Ο ελεγκτής περιέχει βασικά την οργανωτική λογική για την ίδια την εφαρμογή (όπως και το housekeeping).

Θέα

Μια προβολή παρέχει διαφορετικούς τρόπους αναπαράστασης των δεδομένων που λαμβάνονται από το μοντέλο. Μπορεί να είναι ένα πρότυπο που είναι γεμάτο με δεδομένα. Μπορεί να υπάρχουν πολλοί διαφορετικοί τύποι και ο ελεγκτής επιλέγει ποιος είναι ο καταλληλότερος για την τρέχουσα κατάσταση.

Μια εφαρμογή Ιστού αποτελείται συνήθως από ένα σύνολο ελεγκτών, μοντέλων και προβολών. Ο ελεγκτής μπορεί να σχεδιαστεί ως κύριος ελεγκτής που λαμβάνει όλα τα αιτήματα και καλεί άλλους ελεγκτές να εκτελέσουν ενέργειες ανάλογα με την κατάσταση.

Ας δούμε ένα παράδειγμα

Ας πούμε ότι πρέπει να αναπτύξουμε ένα ηλεκτρονικό βιβλιοπωλείο. Ο χρήστης μπορεί να εκτελέσει τις ακόλουθες ενέργειες: προβολή βιβλίων, εγγραφή, αγορά, προσθήκη στοιχείων στην τρέχουσα παραγγελία, δημιουργία ή διαγραφή βιβλίων (αν είναι διαχειριστής). Ας δούμε τι συμβαίνει όταν ένας χρήστης κάνει κλικ σε μια κατηγορία φαντασίαγια να δείτε τους τίτλους των βιβλίων που είναι διαθέσιμα στο κατάστημά μας.

Έχουμε ένα συγκεκριμένο ελεγκτή για να χειριζόμαστε όλες τις ενέργειες που σχετίζονται με βιβλία (προβολή, επεξεργασία, δημιουργία κ.λπ.). Ας το ονομάσουμε books_controller.phpστο παράδειγμά μας. Χρειαζόμαστε επίσης ένα μοντέλο όπως book_model.php, το οποίο επεξεργάζεται τα δεδομένα και τη λογική που σχετίζονται με ένα αντικείμενο καταστήματος. Συμπερασματικά, χρειαζόμαστε πολλές προβολές για την αναπαράσταση των δεδομένων, όπως μια λίστα βιβλίων, μια σελίδα επεξεργασίας και ούτω καθεξής.

Το παρακάτω σχήμα δείχνει πώς γίνεται η επεξεργασία του αιτήματος ενός χρήστη για προβολή μιας λίστας βιβλίων για ένα θέμα φαντασία:

Ο ελεγκτής (books_controller.php) λαμβάνει το αίτημα χρήστη (αίτημα HTTP GET ή POST). Μπορούμε να δημιουργήσουμε έναν κεντρικό ελεγκτή, για παράδειγμα index.php, ο οποίος λαμβάνει το αίτημα και καλεί το books_controller.php.

Ο ελεγκτής ελέγχει το αίτημα και τις παραμέτρους και στη συνέχεια καλεί το μοντέλο(book_model.php), ζητώνταςέχει μια λίστα με διαθέσιμα βιβλία για το θέμα φαντασία.

Το μοντέλο λαμβάνει δεδομένα από τη βάση δεδομένων (ή άλλη πηγή που αποθηκεύει πληροφορίες), εφαρμόζει φίλτρα και την απαραίτητη λογική και, στη συνέχεια, επιστρέφει δεδομένα που αντιπροσωπεύουν μια λίστα βιβλίων.

Ο ελεγκτής χρησιμοποιεί την κατάλληλη προβολή για να παρουσιάσει δεδομένα στον χρήστη. Εάν το αίτημα προέρχεται από κινητό τηλέφωνο, χρησιμοποιείται η προβολή κινητού τηλεφώνου. εάν ο χρήστης χρησιμοποιεί ένα συγκεκριμένο σχέδιο διεπαφής, τότε επιλέγεται η αντίστοιχη προβολή και ούτω καθεξής.

Ποια είναι τα πλεονεκτήματα;

Το πιο προφανές όφελος που έχουμε από τη χρήση της έννοιας MVC είναι ο σαφής διαχωρισμός της λογικής παρουσίασης (διεπαφή χρήστη) και της λογικής της εφαρμογής.

Η υποστήριξη διαφορετικών τύπων χρηστών που χρησιμοποιούν διαφορετικούς τύπους συσκευών είναι μια κοινή πρόκληση στις μέρες μας. Η παρεχόμενη διεπαφή θα πρέπει να είναι διαφορετική εάν το αίτημα προέρχεται από προσωπικό υπολογιστή ή από κινητό τηλέφωνο. Το μοντέλο επιστρέφει τα ίδια δεδομένα, η μόνη διαφορά είναι ότι ο ελεγκτής επιλέγει διαφορετικές προβολές για την έξοδο των δεδομένων.

Εκτός από την απομόνωση των προβολών από τη λογική της εφαρμογής, η ιδέα MVC μειώνει σημαντικά την πολυπλοκότητα μεγάλων εφαρμογών. Ο κώδικας είναι πολύ πιο δομημένος, καθιστώντας ευκολότερη τη συντήρηση, τη δοκιμή και την επαναχρησιμοποίηση λύσεων.

Γιατί να χρησιμοποιήσετε το εργασιακό περιβάλλον;

Όταν χρησιμοποιείτε τον πάγκο εργασίας, η βασική δομή MVC είναι ήδη προετοιμασμένη και το μόνο που έχετε να κάνετε είναι να επεκτείνετε τη δομή τοποθετώντας τα αρχεία σας στους κατάλληλους καταλόγους ώστε να ταιριάζουν με το μοτίβο MVC. Επιπλέον, θα έχετε ένα σύνολο χαρακτηριστικών που είναι ήδη γραμμένα και δοκιμασμένα.

Ας δούμε το cakePHP ως παράδειγμα πάγκου εργασίας MVC. Μετά την εγκατάσταση θα έχετε τρεις κύριους καταλόγους:

  • κέικ/
  • πωλητές/

Ο φάκελος της εφαρμογής είναι όπου βρίσκονται τα αρχεία σας. Αυτό είναι το μέρος για να αναπτύξετε το μέρος της εφαρμογής σας.

Ο φάκελος κέικ περιέχει τα αρχεία cakePHP (λειτουργικότητα πάγκου εργασίας).

Ο φάκελος προμηθευτών χρησιμοποιείται για την αποθήκευση βιβλιοθηκών PHP τρίτων.

Ο χώρος εργασίας σας (κατάλογος εφαρμογών) έχει την ακόλουθη δομή:

  • app/
    • config/
    • ελεγκτές/
    • μικρός λοβός/
    • μοντέλα/
    • πρόσθετα/
    • τεστ/
    • πωλητές/
    • προβολές/
    • webroot/

Πρέπει να τοποθετήσετε τους ελεγκτές σας στον κατάλογο ελεγκτών, τα μοντέλα σας στον κατάλογο μοντέλων και τις προβολές σας στον κατάλογο προβολών!

Μόλις αρχίσετε να χρησιμοποιείτε τον πάγκο εργασίας, θα καταστεί αμέσως σαφές πού βρίσκεται σχεδόν κάθε τμήμα της εφαρμογής σας που πρέπει να δημιουργηθεί ή να τροποποιηθεί. Αυτή η οργάνωση από μόνη της απλοποιεί σε μεγάλο βαθμό τη διαδικασία ανάπτυξης και διατήρησης μιας εφαρμογής.

Χρησιμοποιώντας τον πάγκο εργασίας για το παράδειγμά μας

Δεδομένου ότι αυτό το σεμινάριο δεν προορίζεται να δείξει τη διαδικασία δημιουργίας μιας εφαρμογής χρησιμοποιώντας το cakePHP, θα εμφανίσουμε μόνο τον κώδικα για το μοντέλο, τον ελεγκτή και την προβολή με σχόλια σχετικά με τα οφέλη από τη χρήση του πάγκου εργασίας MVC. Ο κώδικας είναι σκόπιμα απλοποιημένος και ακατάλληλος για χρήση σε πραγματική εφαρμογή.

Θυμηθείτε, κοιτούσαμε ένα βιβλιοπωλείο και έναν περίεργο χρήστη που ήθελε να δει μια πλήρη λίστα βιβλίων για το θέμα φαντασία. Ο ελεγκτής έλαβε το αίτημα του χρήστη και συντόνισε τις απαραίτητες ενέργειες.

Έτσι, μόλις ο χρήστης κάνει κλικ στο κουμπί, το πρόγραμμα περιήγησης ζητά τη δεδομένη διεύθυνση url:

1 www.ourstore.com/books/list/fantasy

Το CakePHP μορφοποιεί τη διεύθυνση URL χρησιμοποιώντας ένα μοτίβο /controller/action/param1/param2, Οπου δράσηείναι μια συνάρτηση που καλείται από τον ελεγκτή. Στην παλιά κλασική μορφή, το url θα μοιάζει με αυτό:

1 www.ourstore.com/books_controller.php?action=list&category=fantasy
Ελεγκτής

Στο περιβάλλον εργασίας cakePHP, ο ελεγκτής μας θα μοιάζει με αυτό:

1

Απλό, έτσι δεν είναι; Αυτός ο ελεγκτής θα αποθηκευτεί ως books_controller.phpκαι δημοσιεύτηκε στο /app/controllers. Περιέχει μια λίστα συναρτήσεων που εκτελούν τις ενέργειες για το παράδειγμά μας, καθώς και άλλες λειτουργίες για την εκτέλεση λειτουργιών που σχετίζονται με βιβλία (προσθήκη νέου βιβλίου, διαγραφή βιβλίου κ.λπ.).

Το εργασιακό περιβάλλον μας παρέχει πολλές έτοιμες λύσεις και αρκεί να δημιουργήσουμε μια λίστα με βιβλία. Υπάρχει μια βασική κλάση που ήδη ορίζει τη βασική λειτουργικότητα του ελεγκτή, επομένως πρέπει να κληρονομήσετε τις ιδιότητες και τις λειτουργίες αυτής της κλάσης ( AppControllerείναι ο κληρονόμος Ελεγκτής).

Το μόνο που έχετε να κάνετε στη λίστα ενεργειών είναι να καλέσετε το μοντέλο για να λάβετε τα δεδομένα και στη συνέχεια να επιλέξετε μια προβολή για να τα παρουσιάσετε στον χρήστη. Να πώς γίνεται.

αυτό->Βιβλίο- αυτό είναι το μοντέλο μας και μέρος του κώδικα:

1 $this ->Book->findAllByCategory($category)

λέει στο μοντέλο να επιστρέψει μια λίστα βιβλίων για το επιλεγμένο θέμα (θα εξετάσουμε το μοντέλο αργότερα).

Μέθοδος σειράστη γραμμή:

1 $this ->set("books" , $this ->Book->findAllByCategory($category));

Ο ελεγκτής μεταβιβάζει δεδομένα στην προβολή. Μεταβλητός βιβλίααποδέχεται τα δεδομένα που επιστρέφονται από το μοντέλο και τα καθιστά διαθέσιμα στην προβολή.

Τώρα το μόνο που μένει είναι να εμφανιστεί η προβολή, αλλά αυτή η λειτουργία γίνεται αυτόματα στο cakePHP αν χρησιμοποιήσουμε την προεπιλεγμένη προβολή. Εάν θέλουμε να χρησιμοποιήσουμε διαφορετικό τύπο, πρέπει να καλέσουμε ρητά τη μέθοδο καθιστώ.

Μοντέλο

Το μοντέλο είναι ακόμα πιο απλό:

1

Γιατί είναι άδειο; Επειδή κληρονομείται από μια βασική κλάση που παρέχει την απαιτούμενη λειτουργικότητα και πρέπει να χρησιμοποιήσουμε τη σύμβαση ονομασίας του CakePHP για να έχουμε το χρόνο εκτέλεσης να χειρίζεται αυτόματα όλες τις άλλες εργασίες. Για παράδειγμα, το cakePHP γνωρίζει με βάση το όνομά του ότι χρησιμοποιείται αυτό το μοντέλο BooksController, και ότι έχει πρόσβαση σε έναν πίνακα βάσης δεδομένων που ονομάζεται βιβλία.

Με αυτόν τον ορισμό, θα έχουμε ένα μοντέλο που μπορεί μόνο να διαβάσει, να διαγράψει ή να αποθηκεύσει δεδομένα στη βάση δεδομένων.

Αποθηκεύστε τον κωδικό ως βιβλίο.phpσε φάκελο /app/models.

Θέα

Το μόνο που χρειάζεται να κάνουμε τώρα είναι να δημιουργήσουμε μια προβολή (τουλάχιστον μία) για τη λίστα ενεργειών. Η προβολή θα έχει κώδικα HTML και λίγες (όσο το δυνατόν λιγότερες) γραμμές κώδικα PHP για να περιηγηθούν στη σειρά των βιβλίων που παρέχει το μοντέλο.

1

Ονομα
Συγγραφέας
Τιμή











Όπως μπορείτε να δείτε, η προβολή δεν δημιουργεί μια πλήρη σελίδα, αλλά μόνο ένα τμήμα HTML (ένας πίνακας σε αυτήν την περίπτωση). Επειδή το CakePHP παρέχει έναν άλλο τρόπο για να ορίσετε ένα πρότυπο σελίδας και η προβολή εισάγεται σε αυτό το πρότυπο. Ο πάγκος εργασίας μας παρέχει επίσης ορισμένα βοηθητικά αντικείμενα για την εκτέλεση κοινών εργασιών κατά τη δημιουργία τμημάτων μιας σελίδας HTML (εισαγωγή φορμών, συνδέσμων, Ajax ή JavaScript).

Αποθηκεύστε την προβολή ως λίστα.ctp(η λίστα είναι το όνομα της ενέργειας και το ctp σημαίνει το πρότυπο CakePHP) στον φάκελο /app/views/books(επειδή είναι μια προβολή για μια ενέργεια ελεγκτή).

Έτσι εκτελούνται και τα τρία στοιχεία χρησιμοποιώντας τον πάγκο εργασίας CakePHP!

Η αρχή MVC στον προγραμματισμό ιστού (Model - View - Controller, Model - View (View) - Controller) είναι μια από τις πιο επιτυχημένες ιδέες σήμερα. Η αρχή MVC είναι διαισθητική με την πρώτη ματιά, αλλά όχι πολύ απλή όταν εμβαθύνουμε. Πρώτα ας δούμε σε τι προορίζεται.

Η αρχή MVC σας επιτρέπει να διαχωρίσετε την εφαρμογή της λογικής εφαρμογής, την εμφάνιση (γραφική διεπαφή, GUI) και την αλληλεπίδραση με τον χρήστη.

Αυτό έχει ως αποτέλεσμα πιο δομημένο κώδικα, επιτρέπει σε πιο εξειδικευμένους ανθρώπους να εργαστούν στο έργο, διευκολύνει τη συντήρηση του κώδικα και τον καθιστά πιο λογικό και κατανοητό. Μια αλλαγή σε ένα στοιχείο έχει ελάχιστο αντίκτυπο στα άλλα. Μπορείτε να συνδέσετε διαφορετικούς τύπους και διαφορετικούς ελεγκτές σε ένα μοντέλο.

Από την άλλη πλευρά, αυτό απαιτεί μεγαλύτερη απόδοση των μηχανών εκτέλεσης, αλλά πρόσφατα αυτό δεν ήταν μεγάλο πρόβλημα - οι ολοένα και πιο περίπλοκες λύσεις προγραμματισμού απαιτούν υποστήριξη και το κόστος υποστήριξης θα υπερβαίνει κατά πολύ το κόστος του πιο ισχυρού σύγχρονου εξοπλισμού.

Η αρχή MVC χρησιμοποιείται σχεδόν από όλα τα σύγχρονα πλαίσια.

Ας ρίξουμε μια πιο προσεκτική ματιά στα εξαρτήματα.

Μοντέλο- περιέχει το λεγόμενο «business logic» - η επεξεργασία και η επαλήθευση δεδομένων, η πρόσβαση σε βάσεις δεδομένων, αντιπροσωπεύει την εσωτερική δομή του συστήματος. Το μοντέλο δεν πρέπει να αλληλεπιδρά άμεσα με τον χρήστη.

Θέαπεριγράφει την εμφάνιση της εφαρμογής.

Ελεγκτής- ο συνδετικός κρίκος μεταξύ του μοντέλου και της προβολής, λαμβάνει δεδομένα από τον χρήστη, τα μεταφέρει στο μοντέλο, λαμβάνει το επεξεργασμένο αποτέλεσμα και το μεταφέρει στην προβολή.

Η σχέση φαίνεται στο διάγραμμα:

Πηγή εικόνας: http://www.wikipedia.org Απαιτήσεις στοιχείων:

Μοντέλα:

  • πρέπει να περιέχει ιδιότητες που αντιπροσωπεύουν συγκεκριμένα δεδομένα·
  • πρέπει να περιλαμβάνει επιχειρηματική λογική (για παράδειγμα, κανόνες επικύρωσης) για να διασφαλίζεται ότι τα δεδομένα πληρούν τις απαιτήσεις·
  • μπορεί να περιέχει κώδικα για εργασία με δεδομένα.
Αναπαράσταση:
  • θα πρέπει κυρίως να περιέχει σήμανση όπως HTML και απλό κώδικα PHP που χρησιμοποιείται για τη διέλευση, τη μορφοποίηση και την εμφάνιση δεδομένων.
  • δεν πρέπει να έχει άμεση πρόσβαση στη βάση δεδομένων. Αυτό πρέπει να κάνουν τα μοντέλα.
  • δεν πρέπει να έχει απευθείας πρόσβαση στις $_GET , $_POST και άλλες μεταβλητές που λαμβάνονται από το αίτημα χρήστη. Αυτή η εργασία πρέπει να εκτελεστεί από τον ελεγκτή. Οι προβολές θα πρέπει να χρησιμοποιούνται μόνο για τη μορφοποίηση των δεδομένων που λαμβάνονται από τον ελεγκτή και το μοντέλο.
  • μπορεί να έχει άμεση πρόσβαση στις ιδιότητες και τις μεθόδους του ελεγκτή ή των μοντέλων. Ωστόσο, αυτό πρέπει να γίνεται μόνο για σκοπούς εμφάνισης δεδομένων.
Ελεγκτές:
  • μπορεί να έχει πρόσβαση στις $_GET , $_POST και σε άλλες μεταβλητές PHP που λαμβάνονται από το αίτημα χρήστη.
  • μπορεί να δημιουργήσει και να διαχειριστεί περιπτώσεις μοντέλων. Για παράδειγμα, σε μια τυπική ενέργεια ενημέρωσης μοντέλου, ο ελεγκτής μπορεί πρώτα να δημιουργήσει μια παρουσία του μοντέλου, στη συνέχεια να τη συμπληρώσει με δεδομένα από το $_POST και, εάν το μοντέλο αποθηκευτεί επιτυχώς, να ανακατευθύνει το πρόγραμμα περιήγησης του χρήστη στη σελίδα του μοντέλου που δημιουργήθηκε. Αξίζει να σημειωθεί ότι η αποθήκευση του ίδιου του μοντέλου θα πρέπει να υλοποιηθεί στην κατηγορία μοντέλου, όχι στον ελεγκτή.
  • δεν πρέπει να περιέχει ερωτήματα SQL. Είναι καλύτερα να τα κρατάτε σε μοντέλα.
  • δεν πρέπει να περιέχει HTML ή άλλη σήμανση. Αξίζει να το βάλετε σε παρουσίαση.
(Οι απαιτήσεις λαμβάνονται από εδώ: http://yiiframework.ru/doc/guide/ru/basics.best-practices)

Εκτός από την ιδέα του MVC, υπάρχουν πολλά άλλα, για παράδειγμα MOVE (Models, O Operations, V iews and E vents) - κάπως σαν την εξέλιξη του MVC (από εδώ: http://habrahabr.ru/post/ 147038/), αλλά αυτές οι έννοιες λιγότερο κοινές.

Πολλοί άνθρωποι αρχίζουν να γράφουν ένα έργο για να δουλέψουν με μία μόνο εργασία, χωρίς να σημαίνει ότι μπορεί να εξελιχθεί σε ένα σύστημα διαχείρισης πολλών χρηστών, για παράδειγμα, περιεχόμενο ή, Θεός φυλάξοι, παραγωγή. Και όλα φαίνονται υπέροχα και ωραία, όλα λειτουργούν, μέχρι να αρχίσετε να καταλαβαίνετε ότι ο κώδικας που γράφεται αποτελείται εξ ολοκλήρου από δεκανίκια και σκληρό κώδικα. Ο κώδικας αναμειγνύεται με διάταξη, ερωτήματα και δεκανίκια, μερικές φορές ακόμη και μη αναγνώσιμο. Προκύπτει ένα πιεστικό πρόβλημα: όταν προσθέτετε νέες δυνατότητες, πρέπει να εργάζεστε με αυτόν τον κώδικα για πολύ καιρό, να θυμάστε "τι γράφτηκε εκεί;" και καταριέσαι τον εαυτό σου στο παρελθόν.

Μπορεί να έχετε ακούσει ακόμη και για μοτίβα σχεδίασης και ακόμη και να έχετε ξεφυλλίσει αυτά τα υπέροχα βιβλία:

  • E. Gamma, R. Helm, R. Johnson, J. Vlissides «Αντικειμενοστρεφείς τεχνικές σχεδίασης. Σχεδιαστικά πρότυπα";
  • M. Fowler "Αρχιτεκτονική των Εφαρμογών Λογισμικού Επιχειρήσεων."
Και πολλοί, απτόητοι από τα τεράστια εγχειρίδια και τεκμηρίωση, προσπάθησαν να μελετήσουν οποιοδήποτε από τα σύγχρονα πλαίσια και, αντιμέτωποι με την πολυπλοκότητα της κατανόησης (λόγω της παρουσίας πολλών αρχιτεκτονικών εννοιών έξυπνα διασυνδεδεμένων), ανέβασαν τη μελέτη και τη χρήση σύγχρονων εργαλείων σε ένα καταφύγιο."

Αυτό το άρθρο θα είναι χρήσιμο κυρίως για αρχάριους. Σε κάθε περίπτωση, ελπίζω ότι σε λίγες ώρες θα είστε σε θέση να πάρετε μια ιδέα για την εφαρμογή του μοτίβου MVC, το οποίο βασίζεται σε όλα τα σύγχρονα πλαίσια web, και επίσης να πάρετε «τροφή» για περαιτέρω προβληματισμό σχετικά με το «πώς να Κάνε το." Στο τέλος του άρθρου υπάρχει μια επιλογή από χρήσιμους συνδέσμους που θα σας βοηθήσουν επίσης να κατανοήσετε από τι αποτελούνται τα πλαίσια web (εκτός από το MVC) και πώς λειτουργούν.

Οι έμπειροι προγραμματιστές PHP είναι απίθανο να βρουν κάτι νέο για τον εαυτό τους σε αυτό το άρθρο, αλλά τα σχόλια και τα σχόλιά τους στο κύριο κείμενο θα ήταν πολύ χρήσιμα! Επειδή Χωρίς θεωρία, η πράξη είναι αδύνατη, και χωρίς πρακτική, η θεωρία είναι άχρηστη, τότε πρώτα θα υπάρξει λίγη θεωρία και μετά θα προχωρήσουμε στην πράξη. Εάν είστε ήδη εξοικειωμένοι με την έννοια του MVC, μπορείτε να παραλείψετε το τμήμα της θεωρίας και να πάτε κατευθείαν στην πράξη.

1. Θεωρία Το μοτίβο MVC περιγράφει έναν απλό τρόπο δομής μιας εφαρμογής, σκοπός του οποίου είναι να διαχωρίσει την επιχειρηματική λογική από τη διεπαφή χρήστη. Ως αποτέλεσμα, η εφαρμογή είναι ευκολότερη στην κλίμακα, τη δοκιμή, τη συντήρηση και, φυσικά, την εφαρμογή.

Ας δούμε το εννοιολογικό διάγραμμα του μοτίβου MVC (κατά τη γνώμη μου, αυτό είναι το πιο επιτυχημένο διάγραμμα που έχω δει):

Στην αρχιτεκτονική MVC, το μοντέλο παρέχει τα δεδομένα και τους κανόνες επιχειρηματικής λογικής, η προβολή είναι υπεύθυνη για τη διεπαφή χρήστη και ο ελεγκτής παρέχει αλληλεπίδραση μεταξύ του μοντέλου και της προβολής.

Μια τυπική ροή μιας εφαρμογής MVC μπορεί να περιγραφεί ως εξής:

  • Όταν ένας χρήστης επισκέπτεται έναν πόρο Ιστού, το σενάριο προετοιμασίας δημιουργεί μια παρουσία της εφαρμογής και την εκκινεί για εκτέλεση.
    Αυτό εμφανίζει μια προβολή, ας πούμε, της κύριας σελίδας του ιστότοπου.
  • Η εφαρμογή λαμβάνει ένα αίτημα από τον χρήστη και καθορίζει τον ελεγκτή και την ενέργεια που ζητήθηκε. Στην περίπτωση της κύριας σελίδας, εκτελείται η προεπιλεγμένη ενέργεια ( δείκτης).
  • Η εφαρμογή εγκαινιάζει τον ελεγκτή και εκτελεί τη μέθοδο δράσης,
    το οποίο, για παράδειγμα, περιέχει κλήσεις μοντέλων που διαβάζουν πληροφορίες από τη βάση δεδομένων.
  • Μετά από αυτό, η ενέργεια δημιουργεί μια προβολή με τα δεδομένα που λαμβάνονται από το μοντέλο και εμφανίζει το αποτέλεσμα στον χρήστη.
  • Μοντέλο - περιέχει την επιχειρησιακή λογική της εφαρμογής και περιλαμβάνει μεθόδους δειγματοληψίας (αυτές μπορεί να είναι μέθοδοι ORM), επεξεργασίας (για παράδειγμα, κανόνες επικύρωσης) και παροχή συγκεκριμένων δεδομένων, που συχνά την καθιστούν πολύ πυκνή, κάτι που είναι φυσιολογικό.
    Το μοντέλο δεν πρέπει να αλληλεπιδρά άμεσα με τον χρήστη. Όλες οι μεταβλητές που σχετίζονται με το αίτημα χρήστη πρέπει να υποβάλλονται σε επεξεργασία στον ελεγκτή.
    Το μοντέλο δεν πρέπει να δημιουργεί HTML ή άλλο κώδικα εμφάνισης που μπορεί να αλλάξει ανάλογα με τις ανάγκες του χρήστη. Αυτός ο κώδικας θα πρέπει να υποβάλλεται σε επεξεργασία σε προβολές.
    Το ίδιο μοντέλο, για παράδειγμα: το μοντέλο ελέγχου ταυτότητας χρήστη μπορεί να χρησιμοποιηθεί τόσο στο χρήστη όσο και στο διαχειριστικό τμήμα της εφαρμογής. Σε αυτήν την περίπτωση, μπορείτε να μετακινήσετε τον γενικό κώδικα σε μια ξεχωριστή κλάση και να κληρονομήσετε από αυτήν, ορίζοντας μεθόδους για συγκεκριμένες υπο-εφαρμογές στους απογόνους του.

    Προβολή - χρησιμοποιείται για τον καθορισμό της εξωτερικής εμφάνισης των δεδομένων που λαμβάνονται από τον ελεγκτή και το μοντέλο.
    Οι προβολές περιέχουν σήμανση HTML και μικρά ένθετα κώδικα PHP για διέλευση, μορφοποίηση και εμφάνιση δεδομένων.
    Δεν πρέπει να έχει άμεση πρόσβαση στη βάση δεδομένων. Αυτό πρέπει να κάνουν τα μοντέλα.
    Δεν πρέπει να λειτουργεί με δεδομένα που λαμβάνονται από αίτημα χρήστη. Αυτή η εργασία πρέπει να εκτελεστεί από τον ελεγκτή.
    Μπορεί να έχει άμεση πρόσβαση στις ιδιότητες και τις μεθόδους ενός ελεγκτή ή μοντέλων για τη λήψη δεδομένων έτοιμα για έξοδο.
    Οι προβολές συνήθως χωρίζονται σε ένα κοινό πρότυπο, το οποίο περιέχει σήμανση κοινή για όλες τις σελίδες (για παράδειγμα, μια κεφαλίδα και ένα υποσέλιδο) και τμήματα του προτύπου που χρησιμοποιούνται για την εμφάνιση δεδομένων εξόδου από το μοντέλο ή την εμφάνιση φορμών εισαγωγής δεδομένων.

    Ο ελεγκτής είναι η κόλλα που συνδέει μοντέλα, όψεις και άλλα εξαρτήματα σε μια εφαρμογή εργασίας. Ο ελεγκτής είναι υπεύθυνος για την επεξεργασία των αιτημάτων των χρηστών. Ο ελεγκτής δεν πρέπει να περιέχει ερωτήματα SQL. Είναι καλύτερα να τα κρατάτε σε μοντέλα. Ο ελεγκτής δεν πρέπει να περιέχει HTML ή άλλη σήμανση. Αξίζει να το δεις.
    Σε μια καλά σχεδιασμένη εφαρμογή MVC, οι ελεγκτές είναι συνήθως πολύ λεπτοί και περιέχουν μόνο μερικές δεκάδες γραμμές κώδικα. Δεν μπορούμε να πούμε το ίδιο για τους Stupid Fat Controllers (SFC) στο CMS Joomla. Η λογική του ελεγκτή είναι αρκετά τυπική και το μεγαλύτερο μέρος της μεταφέρεται στις βασικές κλάσεις.
    Τα μοντέλα, αντίθετα, είναι πολύ παχιά και περιέχουν το μεγαλύτερο μέρος του κώδικα που σχετίζεται με την επεξεργασία δεδομένων, επειδή η δομή δεδομένων και η επιχειρηματική λογική που περιέχονται σε αυτό είναι συνήθως αρκετά συγκεκριμένα για μια συγκεκριμένη εφαρμογή.

    1.1. Μπροστινός ελεγκτής και ελεγκτής σελίδας Στις περισσότερες περιπτώσεις, η αλληλεπίδραση του χρήστη με μια εφαρμογή web πραγματοποιείται κάνοντας κλικ σε συνδέσμους. Κοιτάξτε τώρα στη γραμμή διευθύνσεων του προγράμματος περιήγησής σας - λάβατε αυτό το κείμενο από αυτόν τον σύνδεσμο. Άλλοι σύνδεσμοι, όπως αυτοί στη δεξιά πλευρά αυτής της σελίδας, θα σας παρέχουν διαφορετικό περιεχόμενο. Έτσι, ο σύνδεσμος αντιπροσωπεύει μια συγκεκριμένη εντολή στην εφαρμογή web.

    Ελπίζω να έχετε ήδη παρατηρήσει ότι διαφορετικοί ιστότοποι μπορούν να έχουν εντελώς διαφορετικές μορφές για την κατασκευή της γραμμής διευθύνσεων. Κάθε μορφή μπορεί να εμφανίσει την αρχιτεκτονική μιας διαδικτυακής εφαρμογής. Αν και αυτό δεν συμβαίνει πάντα, στις περισσότερες περιπτώσεις είναι ξεκάθαρο γεγονός.

    Ας εξετάσουμε δύο επιλογές για τη γραμμή διευθύνσεων, οι οποίες εμφανίζουν κάποιο κείμενο και ένα προφίλ χρήστη.

    Κατά προσέγγιση κωδικός επεξεργασίας σε αυτήν την περίπτωση:
    switch($_GET["action"]) ( case "about" : require_once("about.php"); // "About Us" αλλαγή σελίδας; case "contacts" : require_once("contacts.php"); // Αλλαγή σελίδας "Επαφές", περίπτωση "feedback" : require_once("feedback.php"); // Αλλαγή σελίδας "Σχόλια", προεπιλογή: require_once("page404.php"); // αλλαγή σελίδας "404"; )
    Νομίζω ότι σχεδόν όλοι το έχουν ξανακάνει αυτό.

    Χρησιμοποιώντας μια μηχανή δρομολόγησης URL, μπορείτε να διαμορφώσετε την εφαρμογή σας ώστε να δέχεται αιτήματα όπως αυτό για να εμφανίζει τις ίδιες πληροφορίες:
    http://www.example.com/contacts/feedback

    Εδώ οι επαφές αντιπροσωπεύουν τον ελεγκτή και η ανάδραση είναι η μέθοδος του ελεγκτή επαφών που εμφανίζει τη φόρμα σχολίων κ.λπ. Θα επανέλθουμε σε αυτό το θέμα στο πρακτικό μέρος.

    Αξίζει επίσης να γνωρίζετε ότι οι δρομολογητές πολλών πλαισίων ιστού σάς επιτρέπουν να δημιουργείτε προσαρμοσμένες διαδρομές URL (καθορίστε τι σημαίνει κάθε τμήμα της διεύθυνσης URL) και κανόνες για την επεξεργασία τους.
    Τώρα έχουμε αρκετές θεωρητικές γνώσεις για να προχωρήσουμε στην πράξη.

    2. Εξάσκηση Αρχικά, ας δημιουργήσουμε την ακόλουθη δομή αρχείου και φακέλου:


    Κοιτάζοντας μπροστά, θα πω ότι οι βασικές κλάσεις Model, View και Controller θα αποθηκευτούν στον βασικό φάκελο.
    Τα παιδιά τους θα αποθηκευτούν στους καταλόγους ελεγκτών, μοντέλων και προβολών. Το αρχείο index.php είναι το σημείο εισόδου στην εφαρμογή. Το αρχείο bootstrap.php ξεκινά τη φόρτωση της εφαρμογής, συνδέοντας όλες τις απαραίτητες μονάδες κ.λπ.

    Θα πάμε διαδοχικά. Ας ανοίξουμε το αρχείο index.php και ας το συμπληρώσουμε με τον ακόλουθο κώδικα:
    ini_set("display_errors", 1); require_once "application/bootstrap.php";
    Δεν πρέπει να υπάρχουν ερωτήσεις εδώ.

    Στη συνέχεια, ας πάμε αμέσως στο αρχείο bootstrap.php:
    require_once "core/model.php"; require_once "core/view.php"; require_once "core/controller.php"; require_once "core/route.php"; Διαδρομή::start(); //εκκίνηση του δρομολογητή
    Οι τρεις πρώτες γραμμές θα περιλαμβάνουν αρχεία πυρήνα που δεν υπάρχουν επί του παρόντος. Οι τελευταίες γραμμές περιλαμβάνουν το αρχείο με την κλάση του δρομολογητή και το εκκινούν για εκτέλεση καλώντας τη μέθοδο στατικής εκκίνησης.

    2.1. Εφαρμογή ενός δρομολογητή URL Προς το παρόν, ας αποκλίνουμε από την υλοποίηση του μοτίβου MVC και ας εστιάσουμε στη δρομολόγηση. Το πρώτο βήμα που πρέπει να κάνουμε είναι να γράψουμε τον ακόλουθο κώδικα στο .htaccess:
    RewriteEngine σε RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule .* index.php [L]
    Αυτός ο κώδικας θα ανακατευθύνει όλη την επεξεργασία της σελίδας στο index.php, που είναι αυτό που χρειαζόμαστε. Θυμάστε στο πρώτο μέρος που λέγαμε για το Front Controller;!

    Θα τοποθετήσουμε τη δρομολόγηση σε ένα ξεχωριστό αρχείο route.php στον κεντρικό κατάλογο. Σε αυτό το αρχείο θα περιγράψουμε την κλάση Route, η οποία θα εκτελέσει μεθόδους ελεγκτή, οι οποίες με τη σειρά τους θα δημιουργήσουν την προβολή σελίδας.

    Περιεχόμενα του αρχείου route.php

    class Route ( στατική συνάρτηση start() ( // ελεγκτής και προεπιλεγμένη ενέργεια $controller_name = "Main"; $action_name = "index"; $routes = explode("/", $_SERVER["REQUEST_URI"]); // λήψη το όνομα του ελεγκτή if (!empty($routes)) ( $controller_name = $routes; ) // λάβετε το όνομα της ενέργειας εάν (!empty($routes)) ( $action_name = $routes; ) // προσθέστε προθέματα $model_name = " Model_".$controller_name; $controller_name = "Controller_".$controller_name; $action_name = "action_".$action_name; // συνδέστε το αρχείο με την κλάση μοντέλου (μπορεί να μην υπάρχει αρχείο μοντέλου) $model_file = strtolower ($model_name). ".php"; $model_path = "application/models/".$model_file; if(file_exists($model_path)) (συμπεριλάβετε το "application/models/".$model_file; ) // συνδέστε το αρχείο με την κλάση ελεγκτή $controller_file = strtolower ($controller_name)..php"; $controller_path = "application/controllers/".$controller_file; if(file_exists($controller_path)) (περιλαμβάνει "application/controllers/".$controller_file; ) else ( /* θα ήταν σωστό να βάλουμε μια εξαίρεση εδώ, αλλά για να απλοποιήσουμε τα πράγματα, θα ανακατευθυνθούμε αμέσως στη σελίδα 404 */ Route::ErrorPage404(); ) // δημιουργήστε έναν ελεγκτή $controller = νέο $controller_name ; $action = $action_name; if(method_exists($controller, $action)) ( // καλέστε την ενέργεια του ελεγκτή $controller->$action(); ) αλλιώς ( // εδώ θα ήταν επίσης πιο συνετό να βάλετε μια εξαίρεση Route::ErrorPage404(); ) ) συνάρτηση ErrorPage404( ) ( $host = "http://".$_SERVER["HTTP_HOST"]."/"; header("HTTP/1.1 404 Not Found"); header("Status: 404 Not Found") ; header(" Location:".$host."404"); ) )


    Σημειώνω ότι η τάξη εφαρμόζει πολύ απλοποιημένη λογική (παρά τον ογκώδες κώδικα) και μπορεί να έχει ακόμη και προβλήματα ασφαλείας. Αυτό έγινε σκόπιμα γιατί... Η σύνταξη μιας ολοκληρωμένης τάξης δρομολόγησης αξίζει τουλάχιστον ένα ξεχωριστό άρθρο. Ας δούμε τα βασικά σημεία...

    Το στοιχείο καθολικού πίνακα $_SERVER["REQUEST_URI"] περιέχει την πλήρη διεύθυνση με την οποία επικοινώνησε ο χρήστης.
    Για παράδειγμα: example.ru/contacts/feedback

    Χρησιμοποιώντας τη λειτουργία εκραγείΗ διεύθυνση χωρίζεται σε στοιχεία. Ως αποτέλεσμα, παίρνουμε το όνομα του ελεγκτή, για το παράδειγμα που δίνεται, αυτός είναι ελεγκτής επαφέςκαι το όνομα της δράσης, στην περίπτωσή μας - ανατροφοδότηση.

    Στη συνέχεια, το αρχείο μοντέλου (το μοντέλο μπορεί να λείπει) και το αρχείο ελεγκτή, εάν υπάρχει, συνδέονται και, τέλος, δημιουργείται μια παρουσία του ελεγκτή και καλείται η ενέργεια, ξανά, εάν περιγράφηκε στην κλάση ελεγκτή.

    Έτσι, όταν πηγαίνετε, για παράδειγμα, στη διεύθυνση:
    παράδειγμα.com/portfolio
    ή
    παράδειγμα.com/portfolio/index
    Ο δρομολογητής θα εκτελέσει τις ακόλουθες ενέργειες:

  • θα περιλαμβάνει το αρχείο model_portfolio.php από το φάκελο models, που περιέχει την κλάση Model_Portfolio.
  • θα περιλαμβάνει το αρχείο controller_portfolio.php από τον φάκελο ελεγκτών, που περιέχει την κλάση Controller_Portfolio.
  • θα δημιουργήσει μια παρουσία της κλάσης Controller_Portfolio και θα καλέσει την προεπιλεγμένη ενέργεια - action_index, που περιγράφεται σε αυτήν.
  • Εάν ο χρήστης προσπαθήσει να αποκτήσει πρόσβαση στη διεύθυνση ενός ανύπαρκτου ελεγκτή, για παράδειγμα:
    παράδειγμα.com/ufo
    τότε θα ανακατευθυνθεί στη σελίδα «404»:
    example.com/404
    Το ίδιο θα συμβεί αν ο χρήστης αποκτήσει πρόσβαση σε μια ενέργεια που δεν περιγράφεται στον ελεγκτή.2.2. Ας επιστρέψουμε στην υλοποίηση MVC Ας πάμε στον βασικό φάκελο και ας προσθέσουμε τρία ακόμη αρχεία στο αρχείο route.php: model.php, view.php και controller.php


    Να σας υπενθυμίσω ότι θα περιέχουν βασικές κλάσεις, τις οποίες τώρα θα αρχίσουμε να γράφουμε.

    Περιεχόμενα του αρχείου model.php
    Μοντέλο κλάσης ( δημόσια συνάρτηση get_data() ( ) )
    Η κλάση μοντέλου περιέχει μια ενιαία κενή μέθοδο ανάκτησης δεδομένων, η οποία θα παρακαμφθεί σε κλάσεις καταγωγής. Όταν δημιουργήσουμε τάξεις απογόνων, όλα θα γίνουν πιο ξεκάθαρα.

    Περιεχόμενα του αρχείου view.php
    class View ( //public $template_view; // εδώ μπορείτε να καθορίσετε την προεπιλεγμένη γενική προβολή. συνάρτηση δημιουργία ($content_view, $template_view, $data = null) ( /* if(is_array($data)) ( // μετατροπή πίνακα στοιχεία σε μεταβλητές extract($data); ) */ περιλαμβάνει "application/views/".$template_view; ) )
    Δεν είναι δύσκολο να μαντέψει κανείς ότι η μέθοδος παράγωπροορίζεται να σχηματίσει άποψη. Οι ακόλουθες παράμετροι μεταβιβάζονται σε αυτό:

  • $content_file - προβολές που εμφανίζουν περιεχόμενο σελίδας.
  • $template_file - πρότυπο κοινό για όλες τις σελίδες.
  • Το $data είναι ένας πίνακας που περιέχει στοιχεία περιεχομένου σελίδας. Συνήθως συμπληρώνεται στο μοντέλο.
  • Η συνάρτηση συμπερίληψης συνδέει δυναμικά ένα γενικό πρότυπο (προβολή) εντός του οποίου θα ενσωματωθεί η προβολή
    για να εμφανίσετε το περιεχόμενο μιας συγκεκριμένης σελίδας.

    Στην περίπτωσή μας, το γενικό πρότυπο θα περιέχει κεφαλίδα, μενού, πλαϊνή γραμμή και υποσέλιδο και το περιεχόμενο της σελίδας θα περιέχεται σε ξεχωριστή φόρμα. Και πάλι, αυτό γίνεται για απλότητα.

    Περιεχόμενα του αρχείου controller.php
    Ελεγκτής κλάσης ( public $model; public $view; function __construct() ( $this->view = new View(); ) function action_index() ( ) )
    Μέθοδος δράση_ευρετήριο- αυτή είναι μια ενέργεια που καλείται από προεπιλογή· θα την παρακάμψουμε κατά την υλοποίηση κλάσεων καταγωγής.

    2.3. Υλοποίηση των κλάσεων decendant Model και Controller, δημιουργία του View "s Τώρα η διασκέδαση ξεκινά! Ο ιστότοπος της επαγγελματικής μας κάρτας θα αποτελείται από τις ακόλουθες σελίδες:
  • Σπίτι
  • Υπηρεσίες
  • Χαρτοφυλάκιο
  • Επαφές
  • Και επίσης - η σελίδα "404".
  • Κάθε σελίδα έχει το δικό της χειριστήριο από το φάκελο ελεγκτών και μια προβολή από το φάκελο προβολές. Ορισμένες σελίδες ενδέχεται να χρησιμοποιούν ένα μοντέλο ή μοντέλα από το φάκελο μοντέλα.


    Στο προηγούμενο σχήμα, το αρχείο template_view.php επισημαίνεται ξεχωριστά - αυτό είναι ένα πρότυπο που περιέχει σήμανση κοινή για όλες τις σελίδες. Στην απλούστερη περίπτωση θα μπορούσε να μοιάζει με αυτό:
    Σπίτι
    Για να δώσουμε στον ιστότοπο μια εμφανή εμφάνιση, δημιουργούμε ένα πρότυπο CSS και το ενσωματώνουμε στον ιστότοπό μας αλλάζοντας τη δομή της σήμανσης HTML και συνδέοντας αρχεία CSS και JavaScript:

    Στο τέλος του άρθρου, στην ενότητα «Αποτέλεσμα», υπάρχει ένας σύνδεσμος προς ένα αποθετήριο GitHub με ένα έργο στο οποίο έχουν γίνει βήματα για την ενσωμάτωση ενός απλού προτύπου.

    2.3.1. Δημιουργία της κύριας σελίδας Ας ξεκινήσουμε με τον ελεγκτή controller_main.php , εδώ είναι ο κώδικάς του:
    Η κλάση Controller_Main επεκτείνει τον Ελεγκτή ( συνάρτηση action_index() ( $this->view->generate("main_view.php", "template_view.php"); ) )
    Στη μέθοδο παράγωμεταβιβάζονται μια παρουσία της κλάσης View, τα ονόματα των αρχείων του γενικού προτύπου και η προβολή με το περιεχόμενο της σελίδας.
    Εκτός από την ενέργεια ευρετηρίου, ο ελεγκτής μπορεί φυσικά να περιέχει και άλλες ενέργειες.

    Ελέγξαμε νωρίτερα το αρχείο γενικής προβολής. Εξετάστε το αρχείο περιεχομένου main_view.php:
    Καλως ΗΡΘΑΤΕ!

    Η OLOLOSHA TEAM είναι μια ομάδα κορυφαίων ειδικών στον τομέα της ανάπτυξης ιστοσελίδων με πολυετή εμπειρία στη συλλογή μεξικανικών μάσκες, χάλκινων και πέτρινων αγαλμάτων από την Ινδία και την Κεϋλάνη, ανάγλυφα και γλυπτά που δημιουργήθηκαν από δασκάλους της Ισημερινής Αφρικής πέντε ή έξι αιώνες πριν...


    Αυτό περιέχει απλή σήμανση χωρίς κλήσεις PHP.
    Για να εμφανίσετε την κύρια σελίδα, μπορείτε να χρησιμοποιήσετε μία από τις ακόλουθες διευθύνσεις:

    Θα εξετάσουμε ένα παράδειγμα χρησιμοποιώντας μια προβολή που εμφανίζει δεδομένα που λαμβάνονται από το παρακάτω μοντέλο.

    2.3.2. Δημιουργία σελίδας "Χαρτοφυλακίου" Στην περίπτωσή μας, η σελίδα "Χαρτοφυλακίου" είναι η μόνη σελίδα που χρησιμοποιεί το μοντέλο.
    Το μοντέλο συνήθως περιλαμβάνει μεθόδους δειγματοληψίας δεδομένων, για παράδειγμα:
  • μεθόδους εγγενών βιβλιοθηκών pgsql ή mysql.
  • μεθόδους βιβλιοθηκών που εφαρμόζουν αφαίρεση δεδομένων. Για παράδειγμα, μέθοδοι της βιβλιοθήκης PEAR MDB2.
  • Μέθοδοι ORM.
  • μέθοδοι εργασίας με NoSQL.
  • και τα λοιπά.
  • Για λόγους απλότητας, δεν θα χρησιμοποιήσουμε ερωτήματα SQL ή δηλώσεις ORM εδώ. Αντίθετα, θα μιμηθούν πραγματικά δεδομένα και θα επιστρέψουμε αμέσως μια σειρά αποτελεσμάτων.
    Τοποθετήστε το αρχείο μοντέλου model_portfolio.php στο φάκελο models. Ιδού το περιεχόμενό του:
    class Model_Portfolio επεκτείνει το μοντέλο ( δημόσια συνάρτηση get_data() ( return array(array("Year" => "2012", "Site" => "http://DunkelBeer.ru", "Description" => "Διαφημιστικός ιστότοπος του μαύρη μπύρα Dunkel από τον γερμανικό κατασκευαστή Löwenbraü που παράγεται στη Ρωσία από την εταιρεία ζυθοποιίας "SUN InBev."), array("Year" => "2012", "Site" => "http://ZopoMobile.ru", "Περιγραφή " => "Κατάλογος στη ρωσική γλώσσα κινεζικών τηλεφώνων από τη Zopo με βάση το λειτουργικό σύστημα Android και αξεσουάρ για αυτά."), // todo); ) )

    Η κλάση ελεγκτή μοντέλου περιέχεται στο αρχείο controller_portfolio.php, εδώ είναι ο κώδικάς της:
    class Controller_Portfolio επεκτείνει τον Ελεγκτή ( συνάρτηση __construct() ( $this->model = new Model_Portfolio(); $this->view = new View(); ) function action_index() ( $data = $this->model->get_data( ); $this->view->generate("portfolio_view.php", "template_view.php", $data); ) )
    Σε μια μεταβλητή δεδομέναγράφεται ο πίνακας που επιστρέφεται από τη μέθοδο get_dataπου εξετάσαμε νωρίτερα.
    Αυτή η μεταβλητή μεταβιβάζεται στη συνέχεια ως παράμετρος μεθόδου παράγω, το οποίο περιέχει επίσης: το όνομα του αρχείου με το γενικό πρότυπο και το όνομα του αρχείου που περιέχει την προβολή με το περιεχόμενο της σελίδας.

    Η προβολή που περιέχει το περιεχόμενο της σελίδας βρίσκεται στο αρχείο portfolio_view.php.
    Χαρτοφυλάκιο

    Όλα τα έργα στον παρακάτω πίνακα είναι εικονικά, επομένως μην προσπαθήσετε καν να ακολουθήσετε τους συνδέσμους που παρέχονται.
    ΕτοςΕργοΠεριγραφή


    Όλα είναι απλά εδώ, η προβολή εμφανίζει τα δεδομένα που λαμβάνονται από το μοντέλο.

    2.3.3. Δημιουργία των υπόλοιπων σελίδων Οι υπόλοιπες σελίδες δημιουργούνται με τον ίδιο τρόπο. Ο κώδικάς τους είναι διαθέσιμος στο αποθετήριο GitHub, σύνδεσμος προς τον οποίο παρέχεται στο τέλος του άρθρου, στην ενότητα «Αποτέλεσμα».3. Αποτέλεσμα Δείτε τι συνέβη τελικά:

    Στιγμιότυπο οθόνης του προκύπτοντος ιστότοπου επαγγελματικών καρτών



    Σύνδεσμος GitHub: https://github.com/vitalyswipe/tinymvc/zipball/v0.1

    Αλλά σε αυτήν την έκδοση σκιαγράφησα τις ακόλουθες κατηγορίες (και τους αντίστοιχους τύπους τους):

    • Controller_Login στην οποία δημιουργείται μια προβολή με μια φόρμα για την εισαγωγή στοιχείων σύνδεσης και κωδικού πρόσβασης, μετά τη συμπλήρωση της οποίας εκτελείται η διαδικασία ελέγχου ταυτότητας και, εάν είναι επιτυχής, ο χρήστης ανακατευθύνεται στον πίνακα διαχείρισης.
    • Contorller_Admin με μια ενέργεια ευρετηρίου που ελέγχει αν ο χρήστης ήταν προηγουμένως εξουσιοδοτημένος στον ιστότοπο ως διαχειριστής (εάν ναι, εμφανίζεται η προβολή του πίνακα διαχειριστή) και μια ενέργεια αποσύνδεσης για αποσύνδεση.
    Ο έλεγχος ταυτότητας και η εξουσιοδότηση είναι ένα διαφορετικό θέμα, επομένως δεν συζητείται εδώ, αλλά παρέχεται μόνο ο σύνδεσμος που δίνεται παραπάνω, ώστε να έχετε κάτι από το οποίο να ξεκινήσετε.4. Συμπέρασμα Το μοτίβο MVC χρησιμοποιείται ως αρχιτεκτονική βάση σε πολλά πλαίσια και CMS που δημιουργήθηκαν προκειμένου να είναι δυνατή η ανάπτυξη ποιοτικά πιο σύνθετων λύσεων σε συντομότερο χρονικό διάστημα. Αυτό κατέστη δυνατό αυξάνοντας το επίπεδο της αφαίρεσης, καθώς υπάρχει ένα όριο στην πολυπλοκότητα των δομών με τις οποίες μπορεί να λειτουργήσει ο ανθρώπινος εγκέφαλος.

    Ωστόσο, η χρήση πλαισίων ιστού όπως το Yii ή το Kohana, που αποτελούνται από αρκετές εκατοντάδες αρχεία, κατά την ανάπτυξη απλών εφαρμογών ιστού (για παράδειγμα, τοποθεσίες επαγγελματικών καρτών) δεν είναι πάντα σκόπιμο. Τώρα μπορούμε να δημιουργήσουμε ένα όμορφο μοντέλο MVC για να μην αναμιγνύουμε κώδικα Php, Html, CSS και JavaScript σε ένα αρχείο.

    Αυτό το άρθρο είναι περισσότερο ένα σημείο εκκίνησης για την εκμάθηση CMF παρά ένα παράδειγμα για κάτι πραγματικά σωστό που μπορείτε να χρησιμοποιήσετε ως βάση για την εφαρμογή Ιστού σας. Ίσως μάλιστα να σας ενέπνευσε και ήδη σκέφτεστε να γράψετε το δικό σας microframework ή CMS με βάση το MVC. Αλλά, προτού επανεφεύρετε τον επόμενο τροχό με «μπλάκτζακ και πόρνες», σκεφτείτε ξανά: ίσως θα ήταν πιο λογικό να κατευθύνετε τις προσπάθειές σας στην ανάπτυξη και τη βοήθεια της κοινότητας ενός ήδη υπάρχοντος έργου;!

    P.S.: Το άρθρο ξαναγράφτηκε λαμβάνοντας υπόψη κάποια σχόλια που είχαν μείνει στα σχόλια. Η κριτική αποδείχθηκε πολύ χρήσιμη. Κρίνοντας από την απάντηση: σχόλια, PM και τον αριθμό των χρηστών που πρόσθεσαν την ανάρτηση στα αγαπημένα, η ιδέα της σύνταξης αυτής της ανάρτησης αποδείχθηκε ότι δεν ήταν τόσο κακή. Δυστυχώς, δεν είναι δυνατόν να ληφθούν υπόψη όλες οι επιθυμίες και να γραφτούν όλο και πιο αναλυτικά λόγω έλλειψης χρόνου... αλλά ίσως αυτά τα μυστηριώδη άτομα που καταψήφισαν την αρχική έκδοση να το κάνουν αυτό. Καλή τύχη με τα έργα σας!

    5. Μια επιλογή χρήσιμων συνδέσμων για το θέμα Το άρθρο αγγίζει πολύ συχνά το θέμα των πλαισίων ιστού - αυτό είναι ένα πολύ ευρύ θέμα, επειδή ακόμη και τα μικροπλαίσια αποτελούνται από πολλά στοιχεία έξυπνα διασυνδεδεμένα και θα χρειαζόταν περισσότερα από ένα άρθρα για να μιλήσουμε γι' αυτά συστατικά. Ωστόσο, αποφάσισα να παρουσιάσω εδώ μια μικρή επιλογή από συνδέσμους (τους οποίους ακολούθησα γράφοντας αυτό το άρθρο) που με τον ένα ή τον άλλο τρόπο σχετίζονται με το θέμα των πλαισίων.

    Ετικέτες: Προσθήκη ετικετών

    Πολλοί άνθρωποι αρχίζουν να γράφουν ένα έργο για να δουλέψουν με μία μόνο εργασία, χωρίς να σημαίνει ότι μπορεί να εξελιχθεί σε ένα σύστημα διαχείρισης πολλών χρηστών, για παράδειγμα, περιεχόμενο ή, Θεός φυλάξοι, παραγωγή. Και όλα φαίνονται υπέροχα και ωραία, όλα λειτουργούν, μέχρι να αρχίσετε να καταλαβαίνετε ότι ο κώδικας που γράφεται αποτελείται εξ ολοκλήρου από δεκανίκια και σκληρό κώδικα. Ο κώδικας αναμειγνύεται με διάταξη, ερωτήματα και δεκανίκια, μερικές φορές ακόμη και μη αναγνώσιμο. Προκύπτει ένα πιεστικό πρόβλημα: όταν προσθέτετε νέες δυνατότητες, πρέπει να εργάζεστε με αυτόν τον κώδικα για πολύ καιρό, να θυμάστε "τι γράφτηκε εκεί;" και καταριέσαι τον εαυτό σου στο παρελθόν.

    Μπορεί να έχετε ακούσει ακόμη και για μοτίβα σχεδίασης και ακόμη και να έχετε ξεφυλλίσει αυτά τα υπέροχα βιβλία:

    • E. Gamma, R. Helm, R. Johnson, J. Vlissides «Αντικειμενοστρεφείς τεχνικές σχεδίασης. Σχεδιαστικά πρότυπα";
    • M. Fowler "Αρχιτεκτονική των Εφαρμογών Λογισμικού Επιχειρήσεων."
    Και πολλοί, απτόητοι από τα τεράστια εγχειρίδια και τεκμηρίωση, προσπάθησαν να μελετήσουν οποιοδήποτε από τα σύγχρονα πλαίσια και, αντιμέτωποι με την πολυπλοκότητα της κατανόησης (λόγω της παρουσίας πολλών αρχιτεκτονικών εννοιών έξυπνα διασυνδεδεμένων), ανέβασαν τη μελέτη και τη χρήση σύγχρονων εργαλείων σε ένα καταφύγιο."

    Αυτό το άρθρο θα είναι χρήσιμο κυρίως για αρχάριους. Σε κάθε περίπτωση, ελπίζω ότι σε λίγες ώρες θα είστε σε θέση να πάρετε μια ιδέα για την εφαρμογή του μοτίβου MVC, το οποίο βασίζεται σε όλα τα σύγχρονα πλαίσια web, και επίσης να πάρετε «τροφή» για περαιτέρω προβληματισμό σχετικά με το «πώς να Κάνε το." Στο τέλος του άρθρου υπάρχει μια επιλογή από χρήσιμους συνδέσμους που θα σας βοηθήσουν επίσης να κατανοήσετε από τι αποτελούνται τα πλαίσια web (εκτός από το MVC) και πώς λειτουργούν.

    Οι έμπειροι προγραμματιστές PHP είναι απίθανο να βρουν κάτι νέο για τον εαυτό τους σε αυτό το άρθρο, αλλά τα σχόλια και τα σχόλιά τους στο κύριο κείμενο θα ήταν πολύ χρήσιμα! Επειδή Χωρίς θεωρία, η πράξη είναι αδύνατη, και χωρίς πρακτική, η θεωρία είναι άχρηστη, τότε πρώτα θα υπάρξει λίγη θεωρία και μετά θα προχωρήσουμε στην πράξη. Εάν είστε ήδη εξοικειωμένοι με την έννοια του MVC, μπορείτε να παραλείψετε το τμήμα της θεωρίας και να πάτε κατευθείαν στην πράξη.

    1. Θεωρία Το μοτίβο MVC περιγράφει έναν απλό τρόπο δομής μιας εφαρμογής, σκοπός του οποίου είναι να διαχωρίσει την επιχειρηματική λογική από τη διεπαφή χρήστη. Ως αποτέλεσμα, η εφαρμογή είναι ευκολότερη στην κλίμακα, τη δοκιμή, τη συντήρηση και, φυσικά, την εφαρμογή.

    Ας δούμε το εννοιολογικό διάγραμμα του μοτίβου MVC (κατά τη γνώμη μου, αυτό είναι το πιο επιτυχημένο διάγραμμα που έχω δει):

    Στην αρχιτεκτονική MVC, το μοντέλο παρέχει τα δεδομένα και τους κανόνες επιχειρηματικής λογικής, η προβολή είναι υπεύθυνη για τη διεπαφή χρήστη και ο ελεγκτής παρέχει αλληλεπίδραση μεταξύ του μοντέλου και της προβολής.

    Μια τυπική ροή μιας εφαρμογής MVC μπορεί να περιγραφεί ως εξής:

  • Όταν ένας χρήστης επισκέπτεται έναν πόρο Ιστού, το σενάριο προετοιμασίας δημιουργεί μια παρουσία της εφαρμογής και την εκκινεί για εκτέλεση.
    Αυτό εμφανίζει μια προβολή, ας πούμε, της κύριας σελίδας του ιστότοπου.
  • Η εφαρμογή λαμβάνει ένα αίτημα από τον χρήστη και καθορίζει τον ελεγκτή και την ενέργεια που ζητήθηκε. Στην περίπτωση της κύριας σελίδας, εκτελείται η προεπιλεγμένη ενέργεια ( δείκτης).
  • Η εφαρμογή εγκαινιάζει τον ελεγκτή και εκτελεί τη μέθοδο δράσης,
    το οποίο, για παράδειγμα, περιέχει κλήσεις μοντέλων που διαβάζουν πληροφορίες από τη βάση δεδομένων.
  • Μετά από αυτό, η ενέργεια δημιουργεί μια προβολή με τα δεδομένα που λαμβάνονται από το μοντέλο και εμφανίζει το αποτέλεσμα στον χρήστη.
  • Μοντέλο - περιέχει την επιχειρησιακή λογική της εφαρμογής και περιλαμβάνει μεθόδους για ανάκτηση (αυτές μπορεί να είναι μέθοδοι ORM), επεξεργασία (για παράδειγμα, κανόνες επικύρωσης) και παροχή συγκεκριμένων δεδομένων, που συχνά την καθιστούν πολύ πυκνή, κάτι που είναι φυσιολογικό.
    Το μοντέλο δεν πρέπει να αλληλεπιδρά άμεσα με τον χρήστη. Όλες οι μεταβλητές που σχετίζονται με το αίτημα χρήστη πρέπει να υποβάλλονται σε επεξεργασία στον ελεγκτή.
    Το μοντέλο δεν πρέπει να δημιουργεί HTML ή άλλο κώδικα εμφάνισης που μπορεί να αλλάξει ανάλογα με τις ανάγκες του χρήστη. Αυτός ο κώδικας θα πρέπει να υποβάλλεται σε επεξεργασία σε προβολές.
    Το ίδιο μοντέλο, για παράδειγμα: το μοντέλο ελέγχου ταυτότητας χρήστη μπορεί να χρησιμοποιηθεί τόσο στο χρήστη όσο και στο διαχειριστικό τμήμα της εφαρμογής. Σε αυτήν την περίπτωση, μπορείτε να μετακινήσετε τον γενικό κώδικα σε μια ξεχωριστή κλάση και να κληρονομήσετε από αυτήν, ορίζοντας μεθόδους για συγκεκριμένες υπο-εφαρμογές στους απογόνους του.

    Προβολή - χρησιμοποιείται για τον καθορισμό της εξωτερικής εμφάνισης των δεδομένων που λαμβάνονται από τον ελεγκτή και το μοντέλο.
    Οι προβολές περιέχουν σήμανση HTML και μικρά ένθετα κώδικα PHP για διέλευση, μορφοποίηση και εμφάνιση δεδομένων.
    Δεν πρέπει να έχει άμεση πρόσβαση στη βάση δεδομένων. Αυτό πρέπει να κάνουν τα μοντέλα.
    Δεν πρέπει να λειτουργεί με δεδομένα που λαμβάνονται από αίτημα χρήστη. Αυτή η εργασία πρέπει να εκτελεστεί από τον ελεγκτή.
    Μπορεί να έχει άμεση πρόσβαση στις ιδιότητες και τις μεθόδους ενός ελεγκτή ή μοντέλων για τη λήψη δεδομένων έτοιμα για έξοδο.
    Οι προβολές συνήθως χωρίζονται σε ένα κοινό πρότυπο, το οποίο περιέχει σήμανση κοινή για όλες τις σελίδες (για παράδειγμα, μια κεφαλίδα και ένα υποσέλιδο) και τμήματα του προτύπου που χρησιμοποιούνται για την εμφάνιση δεδομένων εξόδου από το μοντέλο ή την εμφάνιση φορμών εισαγωγής δεδομένων.

    Ο ελεγκτής είναι η κόλλα που συνδέει μοντέλα, όψεις και άλλα εξαρτήματα σε μια εφαρμογή εργασίας. Ο ελεγκτής είναι υπεύθυνος για την επεξεργασία των αιτημάτων των χρηστών. Ο ελεγκτής δεν πρέπει να περιέχει ερωτήματα SQL. Είναι καλύτερα να τα κρατάτε σε μοντέλα. Ο ελεγκτής δεν πρέπει να περιέχει HTML ή άλλη σήμανση. Αξίζει να το δεις.
    Σε μια καλά σχεδιασμένη εφαρμογή MVC, οι ελεγκτές είναι συνήθως πολύ λεπτοί και περιέχουν μόνο μερικές δεκάδες γραμμές κώδικα. Δεν μπορούμε να πούμε το ίδιο για τους Stupid Fat Controllers (SFC) στο CMS Joomla. Η λογική του ελεγκτή είναι αρκετά τυπική και το μεγαλύτερο μέρος της μεταφέρεται στις βασικές κλάσεις.
    Τα μοντέλα, αντίθετα, είναι πολύ παχιά και περιέχουν το μεγαλύτερο μέρος του κώδικα που σχετίζεται με την επεξεργασία δεδομένων, επειδή η δομή δεδομένων και η επιχειρηματική λογική που περιέχονται σε αυτό είναι συνήθως αρκετά συγκεκριμένα για μια συγκεκριμένη εφαρμογή.

    1.1. Μπροστινός ελεγκτής και ελεγκτής σελίδας Στις περισσότερες περιπτώσεις, η αλληλεπίδραση του χρήστη με μια εφαρμογή web πραγματοποιείται κάνοντας κλικ σε συνδέσμους. Κοιτάξτε τώρα στη γραμμή διευθύνσεων του προγράμματος περιήγησής σας - λάβατε αυτό το κείμενο από αυτόν τον σύνδεσμο. Άλλοι σύνδεσμοι, όπως αυτοί στη δεξιά πλευρά αυτής της σελίδας, θα σας παρέχουν διαφορετικό περιεχόμενο. Έτσι, ο σύνδεσμος αντιπροσωπεύει μια συγκεκριμένη εντολή στην εφαρμογή web.

    Ελπίζω να έχετε ήδη παρατηρήσει ότι διαφορετικοί ιστότοποι μπορούν να έχουν εντελώς διαφορετικές μορφές για την κατασκευή της γραμμής διευθύνσεων. Κάθε μορφή μπορεί να εμφανίσει την αρχιτεκτονική μιας διαδικτυακής εφαρμογής. Αν και αυτό δεν συμβαίνει πάντα, στις περισσότερες περιπτώσεις είναι ξεκάθαρο γεγονός.

    Ας εξετάσουμε δύο επιλογές για τη γραμμή διευθύνσεων, οι οποίες εμφανίζουν κάποιο κείμενο και ένα προφίλ χρήστη.

    Πρώτη επιλογή:

  • www.example.com/article.php?id=3
  • www.example.com/user.php?id=4
  • Εδώ, κάθε σενάριο είναι υπεύθυνο για την εκτέλεση μιας συγκεκριμένης εντολής.

    Δεύτερη επιλογή:

  • www.example.com/index.php?article=3
  • www.example.com/index.php?user=4
  • Και εδώ όλες οι κλήσεις γίνονται σε ένα σενάριο index.php.

    Μπορείτε να δείτε την προσέγγιση πολλαπλών σημείων επαφής στα φόρουμ phpBB. Το φόρουμ προβάλλεται μέσω του σεναρίου viewforum.php, το θέμα προβάλλεται μέσω του viewtopic.php κ.λπ. Η δεύτερη προσέγγιση, στην οποία έχει πρόσβαση μέσω ενός ενιαίου φυσικού αρχείου σεναρίου, μπορεί να φανεί στο αγαπημένο μου CMS MODX, όπου όλες οι κλήσεις περνούν από το index.php.

    Αυτές οι δύο προσεγγίσεις είναι τελείως διαφορετικές. Η πρώτη είναι τυπική για το μοτίβο του ελεγκτή σελίδας και η δεύτερη προσέγγιση υλοποιείται από το μοτίβο του μπροστινού ελεγκτή. Ο ελεγκτής σελίδας είναι καλός για ιστότοπους με αρκετά απλή λογική. Με τη σειρά του, ο ελεγκτής αιτημάτων ενοποιεί όλες τις δραστηριότητες επεξεργασίας αιτημάτων σε ένα μέρος, γεγονός που του δίνει πρόσθετες δυνατότητες που μπορούν να σας επιτρέψουν να υλοποιήσετε πιο σύνθετες εργασίες από αυτές που συνήθως επιλύει ο ελεγκτής σελίδας. Δεν θα μπω σε λεπτομέρειες για την υλοποίηση του ελεγκτή σελίδας, αλλά θα πω μόνο ότι στο πρακτικό μέρος, θα αναπτυχθεί ο ελεγκτής αιτημάτων (κάτι παρόμοιο).

    1.2. Δρομολόγηση URL Η δρομολόγηση URL σάς επιτρέπει να διαμορφώσετε την εφαρμογή σας ώστε να δέχεται αιτήματα από διευθύνσεις URL που δεν αντιστοιχούν σε πραγματικά αρχεία εφαρμογής και να χρησιμοποιείτε CNC που έχουν σημασιολογική σημασία για τους χρήστες και προτιμώνται για βελτιστοποίηση μηχανών αναζήτησης.

    Για παράδειγμα, για μια κανονική σελίδα που εμφανίζει μια φόρμα επικοινωνίας, η διεύθυνση URL μπορεί να μοιάζει με αυτό:
    http://www.example.com/contacts.php?action=feedback

    Κατά προσέγγιση κωδικός επεξεργασίας σε αυτήν την περίπτωση:
    switch ($_GET ["action" ]) ( case "about" : require_once ("about.php" ); // "About Us" αλλαγή σελίδας ; case "contacts" : require_once ("contacts.php" ); // αλλαγή σελίδας "Επαφές" ; περίπτωση "feedback" : require_once ("feedback.php" ); // Διακοπή σελίδας "Σχόλια" ; προεπιλογή : require_once ("page404.php" ); // σελίδα "404" αλλαγή ; )
    Νομίζω ότι σχεδόν όλοι το έχουν ξανακάνει αυτό.

    Χρησιμοποιώντας μια μηχανή δρομολόγησης URL, μπορείτε να διαμορφώσετε την εφαρμογή σας ώστε να δέχεται αιτήματα όπως αυτό για να εμφανίζει τις ίδιες πληροφορίες:
    http://www.example.com/contacts/feedback

    Εδώ οι επαφές αντιπροσωπεύουν τον ελεγκτή και η ανάδραση είναι η μέθοδος του ελεγκτή επαφών που εμφανίζει τη φόρμα σχολίων κ.λπ. Θα επανέλθουμε σε αυτό το θέμα στο πρακτικό μέρος.

    Αξίζει επίσης να γνωρίζετε ότι οι δρομολογητές πολλών πλαισίων ιστού σάς επιτρέπουν να δημιουργείτε προσαρμοσμένες διαδρομές URL (καθορίστε τι σημαίνει κάθε τμήμα της διεύθυνσης URL) και κανόνες για την επεξεργασία τους.
    Τώρα έχουμε αρκετές θεωρητικές γνώσεις για να προχωρήσουμε στην πράξη.

    2. Εξάσκηση Αρχικά, ας δημιουργήσουμε την ακόλουθη δομή αρχείου και φακέλου:

    Κοιτάζοντας μπροστά, θα πω ότι οι βασικές κλάσεις Model, View και Controller θα αποθηκευτούν στον βασικό φάκελο.
    Τα παιδιά τους θα αποθηκευτούν στους καταλόγους ελεγκτών, μοντέλων και προβολών. Το αρχείο index.php είναι το σημείο εισόδου στην εφαρμογή. Το αρχείο bootstrap.php ξεκινά τη φόρτωση της εφαρμογής, συνδέοντας όλες τις απαραίτητες μονάδες κ.λπ.

    Θα πάμε διαδοχικά. Ας ανοίξουμε το αρχείο index.php και ας το συμπληρώσουμε με τον ακόλουθο κώδικα:
    ini_set("display_errors" , 1 ); require_once "application/bootstrap.php" ;
    Δεν πρέπει να υπάρχουν ερωτήσεις εδώ.

    Στη συνέχεια, ας πάμε αμέσως στο αρχείο bootstrap.php:
    require_once "core/model.php" ; require_once "core/view.php" ; require_once "core/controller.php" ; require_once "core/route.php" ; Διαδρομή::start(); //εκκίνηση του δρομολογητή
    Οι τρεις πρώτες γραμμές θα περιλαμβάνουν αρχεία πυρήνα που δεν υπάρχουν επί του παρόντος. Οι τελευταίες γραμμές περιλαμβάνουν το αρχείο με την κλάση του δρομολογητή και το εκκινούν για εκτέλεση καλώντας τη μέθοδο στατικής εκκίνησης.

    2.1. Εφαρμογή ενός δρομολογητή URL Προς το παρόν, ας αποκλίνουμε από την υλοποίηση του μοτίβου MVC και ας εστιάσουμε στη δρομολόγηση. Το πρώτο βήμα που πρέπει να κάνουμε είναι να γράψουμε τον ακόλουθο κώδικα στο .htaccess:
    RewriteEngine σε RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule .* index.php [L]
    Αυτός ο κώδικας θα ανακατευθύνει όλη την επεξεργασία της σελίδας στο index.php, που είναι αυτό που χρειαζόμαστε. Θυμάστε στο πρώτο μέρος που λέγαμε για το Front Controller;!

    Θα τοποθετήσουμε τη δρομολόγηση σε ένα ξεχωριστό αρχείο route.php στον κεντρικό κατάλογο. Σε αυτό το αρχείο θα περιγράψουμε την κλάση Route, η οποία θα εκτελέσει μεθόδους ελεγκτή, οι οποίες με τη σειρά τους θα δημιουργήσουν την προβολή σελίδας.

    Περιεχόμενα του αρχείου route.php

    class Route ( static function start () ( // controller and default action $controller_name = "Main" ; $action_name = "index" ; $routes = explode("/" , $_SERVER ["REQUEST_URI" ]); // λήψη το όνομα του ελεγκτή if (!empty ($routes )) ( $controller_name = $routes ; ) // λάβετε το όνομα της ενέργειας εάν (!empty ($routes )) ( $action_name = $routes ; ) // προσθέστε προθέματα $model_name = " Model_" .$controller_name ; $controller_name = "Controller_" .$controller_name ; $action_name = "action_" .$action_name ; // συνδέστε το αρχείο με την κλάση μοντέλου (μπορεί να μην υπάρχει αρχείο μοντέλου) $model_file = strtolower ($model_name ). με την κλάση ελεγκτή $controller_file = strtolower ($controller_name).php" ; $controller_path = "application/controllers/" .$controller_file ; if (file_exists($controller_path )) ( περιλαμβάνει "application/controllers/" .$controller_e ) else ( /* θα ήταν σωστό να βάλουμε μια εξαίρεση εδώ, αλλά για να απλοποιήσουμε τα πράγματα, θα ανακατευθυνθούμε αμέσως στη σελίδα 404 */ Route::ErrorPage404(); ) // δημιουργήστε έναν ελεγκτή $controller = νέο $controller_name ; $action = $action_name ; if (method_exists($controller , $action )) ( // καλέστε την ενέργεια του ελεγκτή $controller ->$action (); ) αλλιώς ( // εδώ θα ήταν επίσης πιο συνετό να βάλετε μια εξαίρεση Route::ErrorPage404(); ) ) συνάρτηση ErrorPage404 ( ) ( $host = "http://" .$_SERVER ["HTTP_HOST" ]."/" ; header("HTTP/1.1 404 Not Found" ); header("Status: 404 Not Found" ) ; header(" Τοποθεσία:" .$host ."404" ); ) )


    Σημειώνω ότι η τάξη εφαρμόζει πολύ απλοποιημένη λογική (παρά τον ογκώδες κώδικα) και μπορεί να έχει ακόμη και προβλήματα ασφαλείας. Αυτό έγινε σκόπιμα γιατί... Η σύνταξη μιας ολοκληρωμένης τάξης δρομολόγησης αξίζει τουλάχιστον ένα ξεχωριστό άρθρο. Ας δούμε τα βασικά σημεία...

    Το στοιχείο καθολικού πίνακα $_SERVER["REQUEST_URI"] περιέχει την πλήρη διεύθυνση με την οποία επικοινώνησε ο χρήστης.
    Για παράδειγμα: example.ru/contacts/feedback

    Χρησιμοποιώντας τη λειτουργία εκραγείΗ διεύθυνση χωρίζεται σε στοιχεία. Ως αποτέλεσμα, παίρνουμε το όνομα του ελεγκτή, για το παράδειγμα που δίνεται, αυτός είναι ελεγκτής επαφέςκαι το όνομα της δράσης, στην περίπτωσή μας - ανατροφοδότηση.

    Στη συνέχεια, το αρχείο μοντέλου (το μοντέλο μπορεί να λείπει) και το αρχείο ελεγκτή, εάν υπάρχει, συνδέονται και, τέλος, δημιουργείται μια παρουσία του ελεγκτή και καλείται η ενέργεια, ξανά, εάν περιγράφηκε στην κλάση ελεγκτή.

    Έτσι, όταν πηγαίνετε, για παράδειγμα, στη διεύθυνση:
    παράδειγμα.com/portfolio
    ή
    παράδειγμα.com/portfolio/index
    Ο δρομολογητής θα εκτελέσει τις ακόλουθες ενέργειες:

  • θα περιλαμβάνει το αρχείο model_portfolio.php από το φάκελο models, που περιέχει την κλάση Model_Portfolio.
  • θα περιλαμβάνει το αρχείο controller_portfolio.php από τον φάκελο ελεγκτών, που περιέχει την κλάση Controller_Portfolio.
  • θα δημιουργήσει μια παρουσία της κλάσης Controller_Portfolio και θα καλέσει την προεπιλεγμένη ενέργεια, action_index, που περιγράφεται σε αυτήν.
  • Εάν ο χρήστης προσπαθήσει να αποκτήσει πρόσβαση στη διεύθυνση ενός ανύπαρκτου ελεγκτή, για παράδειγμα:
    παράδειγμα.com/ufo
    τότε θα ανακατευθυνθεί στη σελίδα «404»:
    example.com/404
    Το ίδιο θα συμβεί αν ο χρήστης αποκτήσει πρόσβαση σε μια ενέργεια που δεν περιγράφεται στον ελεγκτή.2.2. Ας επιστρέψουμε στην υλοποίηση MVC. Ας πάμε στον βασικό φάκελο και ας προσθέσουμε τρία ακόμη αρχεία στο αρχείο route.php: model.php, view.php και controller.php

    Να σας υπενθυμίσω ότι θα περιέχουν βασικές κλάσεις, τις οποίες τώρα θα αρχίσουμε να γράφουμε.

    Περιεχόμενα του αρχείου model.php
    Model class (δημόσια συνάρτηση get_data ( ) ( ) )
    Η κλάση μοντέλου περιέχει μια ενιαία κενή μέθοδο ανάκτησης δεδομένων, η οποία θα παρακαμφθεί σε κλάσεις καταγωγής. Όταν δημιουργήσουμε τάξεις απογόνων, όλα θα γίνουν πιο ξεκάθαρα.

    Περιεχόμενα του αρχείου view.php
    class View ( //public $template_view; // εδώ μπορείτε να καθορίσετε την προεπιλεγμένη γενική προβολή. Συνάρτηση δημιουργίας ($content_view , $template_view , $data = null) ( /* if(is_array($data)) ( // μετατροπή πίνακα στοιχεία σε μεταβλητές extract($data); ) */ περιλαμβάνει "application/views/" .$template_view ; ) )
    Δεν είναι δύσκολο να μαντέψει κανείς ότι η μέθοδος παράγωπροορίζεται να σχηματίσει άποψη. Οι ακόλουθες παράμετροι μεταβιβάζονται σε αυτό:

  • $content_file - προβολές που εμφανίζουν περιεχόμενο σελίδας.
  • $template_file — πρότυπο κοινό για όλες τις σελίδες.
  • Το $data είναι ένας πίνακας που περιέχει στοιχεία περιεχομένου σελίδας. Συνήθως συμπληρώνεται στο μοντέλο.
  • Η συνάρτηση συμπερίληψης συνδέει δυναμικά ένα γενικό πρότυπο (προβολή) εντός του οποίου θα ενσωματωθεί η προβολή
    για να εμφανίσετε το περιεχόμενο μιας συγκεκριμένης σελίδας.

    Στην περίπτωσή μας, το γενικό πρότυπο θα περιέχει κεφαλίδα, μενού, πλαϊνή γραμμή και υποσέλιδο και το περιεχόμενο της σελίδας θα περιέχεται σε ξεχωριστή φόρμα. Και πάλι, αυτό γίνεται για απλότητα.

    Περιεχόμενα του αρχείου controller.php
    Ελεγκτής κλάσης ( public $model ; public $view ; function __construct () ( $this ->view = new View(); ) ) )
    Μέθοδος δράση_ευρετήριο- αυτή είναι η ενέργεια που καλείται από προεπιλογή· θα την παρακάμψουμε κατά την υλοποίηση κλάσεων καταγωγής.

    2.3. Υλοποίηση των κατηγοριών απογόνων Μοντέλο και Ελεγκτής, δημιουργία Προβολών Τώρα αρχίζει η διασκέδαση! Ο ιστότοπος της επαγγελματικής μας κάρτας θα αποτελείται από τις ακόλουθες σελίδες:
  • Σπίτι
  • Υπηρεσίες
  • Χαρτοφυλάκιο
  • Επαφές
  • Και επίσης - η σελίδα "404".
  • Κάθε σελίδα έχει το δικό της χειριστήριο από το φάκελο ελεγκτών και μια προβολή από το φάκελο προβολές. Ορισμένες σελίδες ενδέχεται να χρησιμοποιούν ένα μοντέλο ή μοντέλα από το φάκελο μοντέλα.

    Στο προηγούμενο σχήμα, το αρχείο template_view.php επισημαίνεται ξεχωριστά - αυτό είναι ένα πρότυπο που περιέχει σήμανση κοινή για όλες τις σελίδες. Στην απλούστερη περίπτωση θα μπορούσε να μοιάζει με αυτό:
    Σπίτι
    Για να δώσουμε στον ιστότοπο μια εμφανή εμφάνιση, δημιουργούμε ένα πρότυπο CSS και το ενσωματώνουμε στον ιστότοπό μας αλλάζοντας τη δομή της σήμανσης HTML και συνδέοντας αρχεία CSS και JavaScript:

    Στο τέλος του άρθρου, στην ενότητα «Αποτέλεσμα», υπάρχει ένας σύνδεσμος προς ένα αποθετήριο GitHub με ένα έργο στο οποίο έχουν γίνει βήματα για την ενσωμάτωση ενός απλού προτύπου.

    2.3.1. Δημιουργία της κύριας σελίδας Ας ξεκινήσουμε με τον ελεγκτή controller_main.php , εδώ είναι ο κώδικάς του:
    Η κλάση Controller_Main επεκτείνει τον Ελεγκτή ( συνάρτηση action_index () ( $this ->view->generate("main_view.php" , "template_view.php"); ) )
    Στη μέθοδο παράγωμεταβιβάζονται μια παρουσία της κλάσης View, τα ονόματα των αρχείων του γενικού προτύπου και η προβολή με το περιεχόμενο της σελίδας.
    Εκτός από την ενέργεια ευρετηρίου, ο ελεγκτής μπορεί φυσικά να περιέχει και άλλες ενέργειες.

    Ελέγξαμε νωρίτερα το αρχείο γενικής προβολής. Εξετάστε το αρχείο περιεχομένου main_view.php:
    Καλως ΗΡΘΑΤΕ! Η OLOLOSHA TEAM είναι μια ομάδα κορυφαίων ειδικών στον τομέα της ανάπτυξης ιστοσελίδων με πολυετή εμπειρία στη συλλογή μεξικανικών μάσκες, χάλκινων και πέτρινων αγαλμάτων από την Ινδία και την Κεϋλάνη, ανάγλυφα και γλυπτά που δημιουργήθηκαν από δασκάλους της Ισημερινής Αφρικής πέντε ή έξι αιώνες πριν...
    Αυτό περιέχει απλή σήμανση χωρίς κλήσεις PHP.
    Για να εμφανίσετε την κύρια σελίδα, μπορείτε να χρησιμοποιήσετε μία από τις ακόλουθες διευθύνσεις: