Laravel Tutorial για αρχάριους
⚡ Έξυπνη Σύνοψη
Το Laravel είναι ένα πλαίσιο PHP MVC ανοιχτού κώδικα που δημιουργήθηκε από τον Taylor Otwell για την γρήγορη και καθαρή δημιουργία εφαρμογών ιστού. Αυτό το σεμινάριο εξηγεί τι είναι το Laravel, πώς να το εγκαταστήσετε με το Composer και δημιουργεί μια λειτουργική εφαρμογή μεταφόρτωσης αρχείων χρησιμοποιώντας διαδρομές, ελεγκτές, επικύρωση αιτημάτων φόρμας και πρότυπα Blade.

Τι είναι η Laravel;
Laravel είναι ένα πλαίσιο MVC web ανοιχτού κώδικα για PHP. Το Laravel είναι ένα ισχυρό πλαίσιο που παρέχει εύκολη ανάπτυξη διαδικτυακών εφαρμογών PHP με χαρακτηριστικά όπως ένα αρθρωτό σύστημα συσκευασίας με έναν αποκλειστικό διαχειριστή εξαρτήσεων, πρόσβαση σε σχεσιακές βάσεις δεδομένων και άλλα βοηθητικά προγράμματα για ανάπτυξη και συντήρηση εφαρμογών.
Το Laravel δημιουργήθηκε από τον Taylor Otwell. Από την αρχική του κυκλοφορία τον Ιούνιο του 2011 (έκδοση 1), έχει γίνει σταθερά όλο και πιο δημοφιλές στον τομέα του PHP-framework της βιομηχανίας ανάπτυξης ιστοσελίδων. Μεγάλο μέρος αυτής της δημοτικότητας μπορεί να αποδοθεί στα πολλά χαρακτηριστικά που είναι προσανατολισμένα στον προγραμματιστή και τα οποία διαθέτει από προεπιλογή.
Γιατί Laravel;
Περίπου το 2000, τα περισσότερα Κώδικας PHP ήταν διαδικαστικό και θα μπορούσε να βρεθεί με τη μορφή «σεναρίων» που θα είχαν ένα μπλεγμένο χάος από κώδικα σπαγγέτι. Ακόμα και οι πιο απλές σελίδες δεν είχαν διαχωρισμός των ανησυχιών, και έτσι ήταν αρκετά εύκολο για μια εφαρμογή να εξελιχθεί γρήγορα σε έναν εφιάλτη συντήρησης. Ο κόσμος χρειαζόταν κάτι καλύτερο. Παρουσιάζουμε την έκδοση 5 της PHP και μια ποικιλία πλαισίων PHP που προσπαθούν να προσφέρουν κάποια απαραίτητη δομή και καλύτερες λύσεις σε διάφορα προβλήματα εφαρμογών ιστού.
Από τότε έχουμε δει πολλά frameworks να κυκλοφορούν, τα οποία άνοιξαν τον δρόμο για τα δημοφιλή frameworks που χρησιμοποιούνται σήμερα. Σήμερα, τα τρία κορυφαία (κατά τη γνώμη μας) θα ήταν το Zend Framework, το Symfony και φυσικά το Laravel. Παρόλο που καθένα από αυτά τα frameworks βασίζεται σε παρόμοιες αρχές και στοχεύει στην επίλυση (βασικά) των ίδιων κοινών προβλημάτων, οι βασικές τους διαφορές έγκεινται στις υλοποιήσεις τους. Το καθένα έχει τις δικές του ιδιορρυθμίες σχετικά με τον τρόπο επίλυσης προβλημάτων. Όταν κοιτάξετε τον κώδικα που παράγεται από το καθένα από αυτά, θα δείτε ότι υπάρχει μια αρκετά σταθερή γραμμή που τα χωρίζει μεταξύ τους. Κατά την ταπεινή μας γνώμη, το framework Laravel είναι το καλύτερο.
Μάθετε περισσότερα σχετικά με το διαφορά μεταξύ Laravel και CodeIgniter.
Πώς να κατεβάσετε και να εγκαταστήσετε το Laravel με το Composer
Σημείωση: Αυτό το σεμινάριο γράφτηκε για το Laravel 5.8, αλλά οι έννοιες δρομολόγησης, ελεγκτή, αιτήματος και Blade παραμένουν οι ίδιες στις τρέχουσες εκδόσεις. Από το 2026, η τελευταία έκδοση είναι το Laravel 13 (κυκλοφόρησε τον Μάρτιο του 2026), το οποίο απαιτεί PHP 8.3 ή νεότερη έκδοση, ενώ το Laravel 12 απαιτεί PHP 8.2.
Σημείωση: Θεωρείται δεδομένο ότι έχετε ήδη εγκατεστημένο ένα αντίγραφο της PHP στο τοπικό σας σύστημα. Εάν όχι, μπορείτε να διαβάσετε πώς να το εγκαταστήσετε. εδώ.
Το Composer είναι ταυτόχρονα διαχειριστής πακέτων και εξαρτήσεων. Για να το εγκαταστήσετε, ανοίξτε ένα τερματικό και ένα cd σε έναν νέο κατάλογο. Εκτελέστε αυτήν την εντολή:
curl -Ss getcomposer.org/installer | php
Τα αποτελέσματα αυτής της εντολής θα μοιάζουν με αυτό:
Σημείωση: Για πιο αναλυτικές οδηγίες σχετικά με την εγκατάσταση του Laravel, ανατρέξτε στην τεκμηρίωση του Laravel. εδώ.
Θα το δείτε να κατεβάζει και να μεταγλωττίζει το σκριπτ composer.phar, το οποίο χρησιμοποιούμε για την εγκατάσταση του Laravel. Παρόλο που υπάρχουν πολλοί τρόποι για να ρυθμίσετε μια νέα εφαρμογή Laravel, θα το κάνουμε μέσω του σκριπτ Laravel composer. Για να εγκαταστήσετε αυτό το σκριπτ, εκτελέστε:
composer global require laravel/installer
Το οποίο θα μοιάζει κάπως έτσι:
Αυτό θα κατεβάσει και θα εγκαταστήσει όλα τα ίδια τα αρχεία framework καθώς και όλες τις εξαρτήσεις που απαιτεί. Τα πακέτα θα αποθηκευτούν στον κατάλογο προμηθευτών. Μόλις ολοκληρωθεί η λήψη και η εγκατάστασή τους, είναι τόσο εύκολο όσο η εκτέλεση της ακόλουθης εντολής:
laravel new uploadApp
Θα δείτε κάτι σαν την ακόλουθη έξοδο:
Το Composer εγκαθιστά όλα τα πακέτα που χρειάζεται το Laravel για να εκτελεστεί. Μπορεί να χρειαστούν μερικά λεπτά, οπότε να είστε υπομονετικοί. Αφού ολοκληρωθεί, εκτελέστε μια εντολή ls -al για να δείτε τι εγκαταστάθηκε.
Ακολουθεί μια σύντομη ανάλυση των καταλόγων σε μια κοινή εφαρμογή Laravel:
- app/ : Αυτός είναι ο φάκελος προέλευσης όπου βρίσκεται ο κώδικας της εφαρμογής μας. Όλοι οι ελεγκτές, οι πολιτικές και τα μοντέλα βρίσκονται μέσα σε αυτόν τον φάκελο.
- bootstrap/ : Περιέχει το σενάριο εκκίνησης της εφαρμογής και μερικά αρχεία αντιστοίχισης κλάσεων.
- config/ : Περιέχει τα αρχεία διαμόρφωσης της εφαρμογής. Αυτά συνήθως δεν τροποποιούνται απευθείας, αλλά βασίζονται στις τιμές που έχουν οριστεί στο αρχείο .env (environment) στη ρίζα της εφαρμογής.
- βάση δεδομένων/ : Περιέχει τα αρχεία της βάσης δεδομένων, συμπεριλαμβανομένων των μετεγκαταστάσεων, των seeds και των test factories.
- δημόσιο/ : Δημόσια προσβάσιμος φάκελος που περιέχει μεταγλωττισμένα στοιχεία και, φυσικά, ένα αρχείο index.php.
- πόροι/ : Περιέχει στοιχεία front-end όπως JavaΑρχεία σεναρίων, αρχεία γλώσσας, αρχεία CSS/SASS και όλα τα πρότυπα που χρησιμοποιούνται στην εφαρμογή (που ονομάζονται πρότυπα blade).
- διαδρομές/ : Όλες οι διαδρομές στην εφαρμογή βρίσκονται εδώ μέσα. Υπάρχουν μερικά διαφορετικά «πεδία» διαδρομών, αλλά αυτό στο οποίο θα επικεντρωθούμε είναι το αρχείο web.php.
- αποθήκευση/ : Όλα τα προσωρινά αρχεία προσωρινής μνήμης που χρησιμοποιούνται από την εφαρμογή, τα αρχεία περιόδου λειτουργίας, τα μεταγλωττισμένα σενάρια προβολής και τα αρχεία καταγραφής.
- τεστ/ : Περιέχει αρχεία δοκιμών για την εφαρμογή, όπως δοκιμές μονάδας και λειτουργικές δοκιμές.
- Προμηθευτή/ : Όλα τα πακέτα εξαρτήσεων εγκαταστάθηκαν με τον composer.
Τώρα, ας δημιουργήσουμε την υπόλοιπη εφαρμογή και ας την εκτελέσουμε με μια ειδική εντολή artisan (για να γλιτώσουμε την ταλαιπωρία της εγκατάστασης και της ρύθμισης παραμέτρων ενός διακομιστή ιστού όπως ο Apache ή ο nginx). Το αρχείο .env περιέχει όλες τις τιμές ρύθμισης παραμέτρων που χρησιμοποιούν τα αρχεία στον κατάλογο /config για τη ρύθμιση παραμέτρων της εφαρμογής.
Σχεδιασμός εφαρμογής: Μια γρήγορη ανάλυση των απαιτήσεών μας
Σε αυτό το διαδικτυακό σεμινάριο Laravel, θα δημιουργήσουμε μια πολύ απλή εφαρμογή που θα κάνει μόνο δύο πράγματα:
- χειρίζονται μεταφορτώσεις αρχείων από μια φόρμα ιστού
- εμφανίστε τα αρχεία που ανεβάσατε προηγουμένως σε διαφορετική σελίδα.
Για αυτό το έργο, η εφαρμογή μας θα είναι μόνο για εγγραφή, που σημαίνει ότι ο χρήστης μπορεί μόνο να γράφει αρχεία και να βλέπει τη λίστα των αρχείων που έχει ανεβάσει. Αυτή η εφαρμογή είναι εξαιρετικά βασική, αλλά θα πρέπει να χρησιμεύσει ως καλή πρακτική για να ξεκινήσετε να αναπτύσσετε τις δεξιότητες και τις γνώσεις σας στο Laravel. Σημειώστε ότι, για λόγους συντομίας, έχουμε αποκλείσει οποιαδήποτε μοντελοποίηση βάσεων δεδομένων, μετεγκαταστάσεις και έλεγχο ταυτότητας, αλλά σε μια εφαρμογή πραγματικού κόσμου, αυτά είναι πρόσθετα πράγματα που θα πρέπει να λάβετε υπόψη.
Ακολουθεί μια λίστα με τα στοιχεία που θα χρειαστούμε για να λειτουργήσει η εφαρμογή όπως αναμένεται:
- A Διαδρομή που θα επιτρέπει στον έξω κόσμο (διαδίκτυο) να χρησιμοποιεί την εφαρμογή, καθώς και θα καθορίζει το τελικό σημείο που θα δείχνει εκεί που βρίσκεται η λογική για την αποθήκευση του μεταφορτωμένου αρχείου.
- A ελεγκτής που χειρίζεται τη ροή αιτήματος-απόκρισης.
- A πρότυπο που θα χρησιμοποιηθεί για την εμφάνιση μιας λίστας με τα αρχεία που έχουν μεταφορτωθεί προηγουμένως και της ίδιας της φόρμας μεταφόρτωσης.
- A ζητήσει που θα χρησιμοποιήσει ο υπεύθυνος επεξεργασίας για την επικύρωση των δεδομένων που διαβιβάζονται από τη διαδικτυακή φόρμα.
Τι είναι μια διαδρομή;
Μια διαδρομή στο Laravel είναι βασικά ένα τελικό σημείο που καθορίζεται από ένα URI που λειτουργεί ως "δείκτης" σε κάποια λειτουργικότητα που προσφέρεται από την εφαρμογή. Συνηθέστερα, μια διαδρομή απλώς δείχνει σε μια μέθοδο σε έναν ελεγκτή και υπαγορεύει επίσης ποιες μέθοδοι HTTP είναι σε θέση να προσεγγίσουν αυτό το URI. Μια διαδρομή δεν σημαίνει πάντα μια μέθοδο ελεγκτή. Θα μπορούσε απλώς να μεταβιβάσει την εκτέλεση της εφαρμογής σε μια καθορισμένη συνάρτηση Closure ή ανώνυμη συνάρτηση.
Γιατί να χρησιμοποιήσετε μια Διαδρομή;
Οι διαδρομές αποθηκεύονται μέσα σε αρχεία κάτω από το φάκελο /routes μέσα στον ριζικό κατάλογο του έργου. Από προεπιλογή, υπάρχουν μερικά διαφορετικά αρχεία που αντιστοιχούν στις διαφορετικές "πλευρές" της εφαρμογής (οι "πλευρές" προέρχονται από τη μεθοδολογία της εξαγωνικής αρχιτεκτονικής). Περιλαμβάνουν:
- web.php: οι δημόσιες διαδρομές που βασίζονται σε "πρόγραμμα περιήγησης". Αυτές είναι οι πιο συνηθισμένες και είναι αυτές που επηρεάζονται από το πρόγραμμα περιήγησης ιστού. Εκτελούνται μέσω της ομάδας ενδιάμεσου λογισμικού ιστού και περιέχουν επίσης δυνατότητες για Προστασία CSRF (το οποίο βοηθά στην άμυνα ενάντια σε κακόβουλες επιθέσεις που βασίζονται σε φόρμες) και γενικά περιέχουν ένα βαθμό «κατάστασης» (με αυτό εννοούμε ότι χρησιμοποιούν συνεδρίες).
- api.php: διαδρομές που αντιστοιχούν σε μια ομάδα API και επομένως έχουν ενεργοποιημένο το middleware API από προεπιλογή. Αυτές οι διαδρομές είναι χωρίς κατάσταση και δεν έχουν συνεδρίες ή μνήμη cross-application (ένα αίτημα δεν μοιράζεται δεδομένα ή μνήμη με κανένα άλλο αίτημα· κάθε ένα είναι αυτοενθυλακωμένο).
- console.php: αυτές οι διαδρομές αντιστοιχούν σε προσαρμοσμένες εντολές artisan που έχετε δημιουργήσει για την εφαρμογή σας.
- channels.php: καταχωρεί διαδρομές για μετάδοση συμβάντων.
Το βασικό αρχείο που πρέπει να μας απασχολήσει αυτή τη στιγμή είναι αυτό που αφορά το πρόγραμμα περιήγησης, το web.php. Υπάρχει ήδη μία διαδρομή που έχει οριστεί από προεπιλογή, η οποία είναι αυτή που πατάτε δεξιά κατά την πλοήγηση στη ρίζα ιστού της εφαρμογής σας (η ρίζα ιστού βρίσκεται στον δημόσιο κατάλογο). Θα χρειαστούμε τρεις διαφορετικές διαδρομές για να λειτουργήσει η εφαρμογή μεταφόρτωσης:
- /upload: αυτό θα είναι το URI της κύριας σελίδας που εμφανίζει τη φόρμα ιστού μας για την αποστολή αρχείων.
- /process: εδώ θα δημοσιεύει η φόρμα που βρίσκεται στο URI /upload τα δεδομένα που υποβλήθηκαν από τη φόρμα (η «ενέργεια» της φόρμας).
- /list: αυτό θα εμφανίσει όλα τα αρχεία που έχουν μεταφορτωθεί στον ιστότοπο.
Σημείωση: Το τελικό σημείο /list ενδέχεται να μην είναι απαραίτητο εάν επιθυμούσαμε να βάλουμε όλη τη λογική εμφάνισης της φόρμας μεταφόρτωσης και της λίστας αρχείων σε μία μόνο σελίδα. Ωστόσο, προς το παρόν τα κρατήσαμε ξεχωριστά για να προσθέσουμε λίγο περισσότερο περιεχόμενο στο θέμα που εξετάζουμε.
//inside routes/web.php
Route::get('/upload', 'UploadController@upload')->name('upload');
Route::get('/download', 'UploadController@download')->name('download');
Route::post('/process', 'UploadController@process')->name('process');
Route::get('/list', 'UploadController@list')->name('list');
Σε αυτό το σεμινάριο για το πλαίσιο Laravel, για κάθε επιθυμητή διαδρομή, θα την αναφέρουμε ρητά στο αρχείο διαδρομών web.php χρησιμοποιώντας μία από τις διαθέσιμες μεθόδους αιτήματος που αφορούν συγκεκριμένα HTTP (get(), post(), put(), delete(), patch() ή options()). Για μια ανάλυση καθεμίας από αυτές, ελέγξτε αυτό έξω. Αυτό που κάνουν αυτές οι μέθοδοι είναι να καθορίζουν ποια ρήματα HTTP επιτρέπεται να έχουν πρόσβαση σε αυτήν τη δεδομένη διαδρομή. Εάν χρειάζεστε μια διαδρομή που να μπορεί να δέχεται περισσότερα από ένα ρήματα HTTP (κάτι που θα μπορούσε να συμβεί εάν χρησιμοποιείτε μία μόνο σελίδα για να εμφανίσετε τα αρχικά δεδομένα και να δημοσιεύσετε δεδομένα φόρμας που έχουν υποβληθεί), θα μπορούσατε να χρησιμοποιήσετε τη μέθοδο Route::any().
Το δεύτερο όρισμα και στις δύο μεθόδους Route::get() και Route::post() (και σε οποιαδήποτε άλλη μέθοδο που σχετίζεται με το ρήμα HTTP στην πρόσοψη της διαδρομής) είναι το όνομα ενός συγκεκριμένου ελεγκτή και η μέθοδος που βρίσκεται μέσα σε αυτόν τον ελεγκτή, η οποία εκτελείται όταν επιτευχθεί το τελικό σημείο της διαδρομής με το επιτρεπόμενο αίτημα HTTP (GET, POST, PATCH, κ.λπ.). Χρησιμοποιούμε το UploadController για όλες τις διαδρομές και τις έχουμε καθορίσει με τον ακόλουθο τρόπο:
Η τελευταία μέθοδος που καλούμε σε κάθε διαδρομή είναι η συνάρτηση name(), η οποία δέχεται μια μόνο συμβολοσειρά ως όρισμα και χρησιμοποιείται για να «επισημάνει» σε μια συγκεκριμένη διαδρομή ένα όνομα που είναι εύκολο να θυμάται κανείς (στην περίπτωσή μας, upload, process και list). Μπορεί να μην φαίνεται και τόσο καλό χαρακτηριστικό να δίνουμε σε κάθε διαδρομή το δικό της όνομα όταν η URL έχει ακριβώς το ίδιο όνομα, αλλά είναι πραγματικά χρήσιμο όταν έχετε μια συγκεκριμένη διαδρομή όπως /users/profile/dashboard/config, την οποία θα ήταν πιο εύκολο να θυμάστε ως profile-admin ή user-config.
Σημείωση για τις προσόψεις:
- Οι προσόψεις παρέχουν μια «στατική» διεπαφή σε κλάσεις που είναι διαθέσιμες στο service container της εφαρμογής.
- Παρέχουν μια συνοπτική, αξιομνημόνευτη σύνταξη που σας επιτρέπει να χρησιμοποιείτε τις δυνατότητες του Laravel χωρίς να θυμάστε μεγάλα ονόματα κλάσεων που πρέπει να εγχυθούν ή να ρυθμιστούν με μη αυτόματο τρόπο.
Στους παραπάνω ορισμούς διαδρομής, χρησιμοποιούμε την πρόσοψη Route αντί να δημιουργήσουμε χειροκίνητα ένα νέο αντικείμενο Illuminate/Routing/Router και να καλέσουμε τις αντίστοιχες μεθόδους σε αυτό το αντικείμενο. Είναι απλώς μια συντόμευση που αποθηκεύει typingΟι προσόψεις χρησιμοποιούνται ευρέως σε όλο το πλαίσιο Laravel. Μπορείτε και πρέπει να εξοικειωθείτε περισσότερο με αυτές. Μπορείτε να βρείτε τα έγγραφα για τις Προσόψεις. εδώ.
Τι είναι ο ελεγκτής;
Ένας ελεγκτής είναι το "C" στην αρχιτεκτονική "MVC" (Model-View-Controller), στο οποίο βασίζεται η Laravel. Η δουλειά ενός ελεγκτή μπορεί να συνοψιστεί σε αυτόν τον απλό ορισμό: Λαμβάνει το αίτημα από τον πελάτη και επιστρέφει μια απάντηση στον πελάτη. Αυτός είναι ο βασικός ορισμός και είναι επίσης η ελάχιστη απαίτηση οποιουδήποτε δεδομένου ελεγκτή. Αυτό που κάνει μεταξύ αυτών των δύο πραγμάτων θεωρείται γενικά η «ενέργεια» του ελεγκτή (ή η «υλοποίηση της διαδρομής»). Λειτουργεί ως το δεύτερο σημείο εισόδου στην εφαρμογή (το πρώτο είναι το αίτημα) για τον πελάτη, ο οποίος στέλνει το φορτίο αιτήματος (στο οποίο θα αναφερθούμε στη συνέχεια) στην εφαρμογή, αναμένοντας κάποιο είδος απόκρισης (με τη μορφή σελίδας επιτυχίας, ανακατεύθυνσης, σελίδας σφάλματος ή οποιουδήποτε άλλου είδους απόκρισης HTTP).
Ένας ελεγκτής κάνει (ουσιαστικά) το ίδιο πράγμα με έναν ορισμό διαδρομής με μια ανώνυμη συνάρτηση που ορίζεται ως «ενέργεια» όταν επιτυγχάνεται αυτή η διαδρομή. Η διαφορά είναι ότι ένας ελεγκτής ανταποκρίνεται καλά στον διαχωρισμό των ζητημάτων, ενώ μια διαδρομή ορίζεται σύμφωνα με την πραγματική URL ορισμός, που ουσιαστικά σημαίνει ότι συνδέουμε το URI που έχει εκχωρηθεί στη διαδρομή με την υλοποίηση της διαδρομής ή τον κώδικα που εκτελείται όταν επιτευχθεί η συγκεκριμένη διαδρομή.
Για παράδειγμα, τα ακόλουθα δύο κομμάτια κώδικα θα επιτύχουν το ίδιο πράγμα:
Παράδειγμα #1: Ορισμός και υλοποίηση διαδρομής μέσα σε μια κλήση μεμονωμένης μεθόδου (στο αρχείο διαδρομών web.php)
//inside routes/web.php
<?php
Route::get('/hello-world', function(Request $request) {
$name = $request->name;
return response()->make("<h1>Hello World! This is ".$name, 200);
});
Παράδειγμα #2: Ο ορισμός της διαδρομής βρίσκεται μέσα στο routes/web.php, αλλά η υλοποίησή της βρίσκεται μέσα στην κλάση /app/Http/Controllers/HelloWorldController
//inside routes/web.php
<?php
Route::get('/hello-world', 'HelloWorldController@index')->name('hello-world');
------------------------------------------------------------------------------------
//inside app/Http/Controllers/HelloWorldController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HelloWorldController extends Controller
{
public function index(Request $request)
{
$name = $request->name;
return response()->make("<h1>Hello World! This is ".$name, 200);
}
}
Αν και το παράδειγμα Laravel #2 φαίνεται να απαιτεί πολύ περισσότερη δουλειά (κάτι που δεν είναι, απλώς λίγο περισσότερος κώδικας), δείτε τα οφέλη που αποκομίζουμε τοποθετώντας τη λογική ενέργειας για τη δεδομένη διαδρομή "hello-world" μέσα σε έναν ελεγκτή αντί για τον ορισμό της διαδρομής ως συνάρτηση επανάκλησης:
- Η λογική μας είναι σαφώς χωρισμένη στη δική της κλάση (διαχωρισμός των ενδιαφερόντων).
- Ο ελεγκτής μας έχει ρυθμιστεί για επέκταση αργότερα, εάν χρειαστεί να προσθέσουμε επιπλέον δυνατότητες. Ας υποθέσουμε ότι θέλαμε να προσθέσουμε μια λειτουργία "αντίο-κόσμο". Σε αυτήν την περίπτωση, θα μετονομάζαμε τον ελεγκτή σε πιο γενικό "HelloController" και στη συνέχεια θα ορίζαμε δύο ξεχωριστές μεθόδους, Γειά σου() και αντιο σας(). Θα χρειαστεί επίσης να ορίσουμε δύο ξεχωριστές διαδρομές που χαρτογράφησαν το /Γειά σου και / αντιο σας Τα URI στην κατάλληλη μέθοδο στον ελεγκτή. Αυτό είναι επιθυμητό σε σύγκριση με την αύξηση του όγκου ενός αρχείου διαδρομών με την υλοποίηση κάθε διαδρομής να ορίζεται ως συναρτήσεις επανάκλησης.
- Η Laravel έχει την ενσωματωμένη δυνατότητα να αποθηκεύει προσωρινά όλους τους ορισμούς διαδρομής στην εφαρμογή, έτσι ώστε να επιταχύνει το χρόνο που χρειάζεται για να βρεθεί μια δεδομένη διαδρομή (αυξάνει την απόδοση της εφαρμογής). ωστόσο, Θα μπορείτε να το εκμεταλλευτείτε μόνο εάν όλες οι καθορισμένες διαδρομές σας μέσα στην εφαρμογή έχουν διαμορφωθεί χρησιμοποιώντας χάρτη ειδικά για τον ελεγκτή.pings (βλ. Παράδειγμα #2 παραπάνω).
Ας εκτελέσουμε αυτήν την εντολή που θα δημιουργήσει έναν νέο ελεγκτή για εμάς.
// ...inside the project's root directory: php artisan make:controller UploadController
Ουσιαστικά, αυτό που κάνει αυτή η εντολή είναι να δημιουργήσει ένα stub για έναν ελεγκτή με το όνομα "UploadController" μέσα στον κύριο κατάλογο ελεγκτή στη διεύθυνση /app/Http/Controllers/UploadController.php. Μη διστάσετε να ανοίξετε αυτό το αρχείο και να ρίξετε μια ματιά. Είναι πολύ απλό επειδή είναι μόνο μια περιορισμένη έκδοση του ελεγκτή, με τη σωστή διαδρομή χώρου ονομάτων και τις απαιτούμενες κλάσεις από τις οποίες εκτείνεται.
Δημιουργία του αιτήματος
Πριν προχωρήσουμε σε αυτό το σεμινάριο PHP Laravel και κάνουμε μερικές αλλαγές στο δημιουργημένο stub του UploadController, θα ήταν πιο λογικό να δημιουργήσουμε πρώτα την κλάση request. Αυτό συμβαίνει επειδή η μέθοδος controller που χειρίζεται το αίτημα πρέπει να πληκτρολογήσει το αντικείμενο request στην υπογραφή της, επιτρέποντάς της να επικυρώσει αυτόματα τα εισερχόμενα δεδομένα φόρμας (όπως καθορίζεται στη μέθοδο rules()· περισσότερα για αυτό αργότερα). Προς το παρόν, ας χρησιμοποιήσουμε ξανά την εντολή artisan για να δημιουργήσουμε το stub request μας:
php artisan make:request UploadFileRequest
Αυτή η εντολή θα δημιουργήσει ένα αρχείο με όνομα UploadFileRequest μέσα στο app/Http/Requests/UploadFileRequest. Ανοίξτε το stub και ρίξτε μια ματιά. Θα το βρείτε πολύ απλό, καθώς περιέχει μόνο δύο μεθόδους, την authorize() και την rules().
Δημιουργία της Λογικής Επικύρωσης
Ας τροποποιήσουμε το stub του αιτήματος ώστε να ανταποκρίνεται στις ανάγκες της εφαρμογής μας. Τροποποιήστε το αρχείο έτσι ώστε να μοιάζει με αυτό:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UploadFileRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'fileName' => 'required|string',
'userFile' => 'required|file'
];
}
}
Δεν υπάρχουν πολλές αλλαγές, αλλά παρατηρήστε ότι η μέθοδος authorize() επιστρέφει πλέον true αντί για false. Αυτή η μέθοδος αποφασίζει εάν θα επιτρέψει ή όχι την εισαγωγή του αιτήματος στην εφαρμογή. Εάν οριστεί σε false, εμποδίζει την εισαγωγή του αιτήματος στο σύστημα. Αυτό θα ήταν ένα πολύ βολικό σημείο για να τεθούν έλεγχοι εξουσιοδότησης στον χρήστη ή σε οποιαδήποτε άλλη λογική που μπορεί να αποφασίσει εάν το αίτημα μπορεί να προωθηθεί στον ελεγκτή. Προς το παρόν, επιστρέφουμε απλώς true εδώ για να επιτρέψουμε σε οτιδήποτε να χρησιμοποιήσει το αίτημα.
Η άλλη μέθοδος, η rules(), είναι αυτή όπου μπαίνει σε εφαρμογή όλη η μαγεία όσον αφορά την επικύρωση. Η ιδέα είναι απλή: επιστρέψτε έναν πίνακα που περιέχει ένα σύνολο κανόνων με τη μορφή:
'formFieldName' => 'constraints this field has separated by pipe characters (|)'
Υπάρχουν πολλοί διαφορετικοί περιορισμοί επικύρωσης που υποστηρίζονται από τη Laravel αμέσως. Για μια πλήρη λίστα με αυτά, ανατρέξτε στην ηλεκτρονική τεκμηρίωση εδώΓια την εφαρμογή μεταφόρτωσης, θα υπάρχουν δύο πεδία που θα διαβιβάζονται μέσω ενός αιτήματος POST από μια φόρμα στο front end. Η παράμετρος fileName πρέπει να περιλαμβάνεται μέσα στο σώμα της φόρμας (δηλαδή απαιτείται) και χρησιμοποιείται ως το όνομα αρχείου με το οποίο θα αποθηκεύσουμε το αρχείο στον χώρο αποθήκευσης (αυτό γίνεται στον ελεγκτή· θα το δούμε λίγο αργότερα). Επίσης, καθορίζουμε ότι το όνομα του αρχείου πρέπει να είναι συμβολοσειρά προσθέτοντας έναν χαρακτήρα καθέτου (|) και τη λέξη 'συμβολοσειρά'. Οι περιορισμοί οριοθετούνται πάντα από καθέτους, επιτρέποντάς σας να καθορίσετε τυχόν πρόσθετα κριτήρια για το δεδομένο πεδίο σε μία μόνο γραμμή.
Η δεύτερη παράμετρος, userFile, είναι το πραγματικό αρχείο που ανεβάζει ο χρήστης από μια φόρμα σε μια ιστοσελίδα. Απαιτείται επίσης το userFile και πρέπει να είναι αρχείο. Σημείωση: Αν περιμέναμε το μεταφορτωμένο αρχείο να είναι εικόνα, τότε θα χρησιμοποιούσαμε τον περιορισμό εικόνας, ο οποίος θα περιόριζε τους τύπους αρχείων που γίνονται δεκτοί ως ένας από τους δημοφιλείς τύπους εικόνας (jpeg, png, bmp, gif ή svg). Δεδομένου ότι θέλουμε να επιτρέψουμε στον χρήστη να μεταφορτώσει οποιονδήποτε τύπο αρχείου, θα μείνουμε απλώς στον περιορισμό επικύρωσης αρχείου.
Αυτό είναι περίπου όλο το περιεχόμενο του αντικειμένου αιτήματος. Η κύρια λειτουργία του είναι απλώς να διατηρεί το αποδεκτό σύνολο κριτηρίων (περιορισμών) που πρέπει να ικανοποιούν οι παράμετροι του σώματος της φόρμας για να προχωρήσουν βαθύτερα στην εφαρμογή. Ένα άλλο πράγμα που πρέπει να σημειωθεί είναι ότι αυτά τα δύο πεδία (userFile και fileName) πρέπει επίσης να καθοριστούν μέσα στον κώδικα HTML με τη μορφή πεδίων εισόδου (με το όνομα πεδίου να αντιστοιχεί στο όνομα μέσα στο αντικείμενο αιτήματος).
Μπορεί να αναρωτιέστε: αυτό ορίζει τα χαρακτηριστικά του τι πρέπει να περιέχει ένα αίτημα φόρμας, αλλά πού γίνεται ο πραγματικός έλεγχος αυτών των περιορισμών; Θα το εξετάσουμε στη συνέχεια.
Τροποποίηση του ελεγκτή
Ανοίξτε την εφαρμογή/Http/Controllers/UploadController και κάντε τις ακόλουθες αλλαγές σε αυτήν:
<?php
namespace App\Http\Controllers;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Http\Request;
use App\Http\Requests\UploadFileRequest; //our new request class
use Illuminate\Support\Facades\Storage;
class UploadController extends Controller
{
/**
* This is the method that will simply list all the files uploaded by name and provide a
* link to each one so they may be downloaded
*
* @param $request : A standard form request object
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws BindingResolutionException
*/
public function list(Request $request)
{
$uploads = Storage::allFiles('uploads');
return view('list', ['files' => $uploads]);
}
/**
* @param $file
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
* @throws BindingResolutionException
*/
public function download($file)
{
return response()->download(storage_path('app/'.$file));
}
/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws BindingResolutionException
*/
public function upload()
{
return view('upload');
}
/**
* This method will handle the file uploads. Notice that the parameter's typehint
* is the exact request class we generated in the last step. There is a reason for this!
*
* @param $request : The special form request for our upload application
* @return array|\Illuminate\Http\UploadedFile|\Illuminate\Http\UploadedFile[]|null
* @throws BindingResolutionException
*/
public function process(UploadFileRequest $request)
{
//At this point, the parameters passed into the $request (from form) are
//valid--they satisfy each of the conditions inside the rules() method
$filename = $request->fileName; //parameters have already been validated
$file = $request->file('userFile'); //so we don't need any additional isset()
$extension = $file->getClientOriginalExtension(); //grab the file extension
$saveAs = $filename . "." . $extension; //filename to save file under
$file->storeAs('uploads', $saveAs, 'local'); //save the file to local folder
return response()->json(['success' => true]); //return a success message
}
}
Επομένως, πρόκειται για μια αρκετά απλή προσέγγιση για την αποθήκευση των μεταφορτωμένων αρχείων στο δίσκο. Ακολουθεί μια ανάλυση της μεθόδου process() παραπάνω:
- Πληκτρολογήστε υπόδειξη στην κλάση αιτήματος στη μέθοδο ελεγκτή που εκτελεί την κύρια λειτουργία, ώστε να μπορούμε να επικυρώσουμε αυτόματα τα εισερχόμενα δεδομένα.
- Αποσπάστε το αρχείο από το (πλέον επικυρωμένο) αντικείμενο αιτήματος μέσα στη μέθοδο ελεγκτή.
- Αφαιρέστε το όνομα αρχείου από το αίτημα.
- Δημιουργήστε το τελικό όνομα αρχείου που θα χρησιμοποιηθεί για την αποθήκευση του αρχείου κάτω από. Η μέθοδος getClientOriginalExtension() απλώς αρπάζει την αρχική επέκταση του μεταφορτωμένου αρχείου.
- Αποθηκεύστε το αρχείο στο τοπικό σύστημα αρχείων χρησιμοποιώντας τη μέθοδο storeAs(), περνώντας στην ονομασμένη διαδρομή μέσα στον κατάλογο /storage ως το 1ο όρισμα και το όνομα αρχείου για να το αποθηκεύσετε ως δεύτερο.
- Επιστρέψτε μια απόκριση JSON που υποδεικνύει ότι το αίτημα ήταν επιτυχές.
Το πρότυπο λεπίδας
Το τελευταίο σημαντικό κομμάτι αυτού του παζλ είναι το πρότυπο blade, το οποίο θα περιέχει όλα τα HTML, CSS και JavaΣκριπτ για την απλή εφαρμογή μας. Ορίστε ο κώδικας. Θα τον εξηγήσουμε αργότερα.
<body>
<h1>Upload a file</h1>
<form id="uploadForm" name="uploadForm" action="{{route('process')}}" enctype="multipart/form-data">
@csrf
<label for="fileName">File Name:</label>
<input type="text" name="fileName" id="fileName" required /><br />
<label for="userFile">Select a File</label>
<input type="file" name="userFile" id="userFile" required />
<button type="submit" name="submit">Submit</button>
</form>
<h2 id="success" style="color:green;display:none">Successfully uploaded file</h2>
<h2 id="error" style="color:red;display:none">Error Submitting File</h2>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$('#uploadForm').on('submit', function(e) {
e.preventDefault();
var form = $(this);
var url = form.attr('action');
$.ajax({
url: url,
type: "POST",
data: new FormData(this),
processData: false,
contentType: false,
dataType: "JSON",
success: function(data) {
$("#fileName").val("");
$("#userFile").val("");
}
}).done(function() {
$('#success').css('display', 'block');
window.setTimeout(()=>($("#success").css('display', 'none')), 5000);
}).fail(function() {
$('#error').css('display', 'block');
window.setTimeout(()=>($("#error").css('display', 'none')), 5000);
});
});
</script>
</body>
</html>
Εδώ είναι τι μας /μεταφόρτωση η σελίδα μοιάζει με:
Αυτό είναι ένα πολύ τυπικό παράδειγμα ενός αρχείου blade που περιέχει μια φόρμα HTML και JavaScript/jQuery για την προσθήκη ασύγχρονης λειτουργικότητας (ώστε η σελίδα να μην ανανεώνεται). Υπάρχει ένα βασικό ετικέτα χωρίς χαρακτηριστικό method (το οποίο θα εξηγήσουμε σε λίγο) και με ένα χαρακτηριστικό curious action με την τιμή {{route('process')}}. Στο blade, αυτό είναι γνωστό ως Οδηγίας. Μια οδηγία είναι απλώς ένα φανταχτερό όνομα για μια συνάρτηση. Είναι συναρτήσεις ειδικές για πρότυπα blade που εκτελούν διαφορετικές λειτουργίες που είναι κοινές για την κατασκευή ιστοσελίδων και εφαρμογών ιστού. Για καλύτερη κατανόηση όλων των χρήσιμων πραγμάτων που μπορεί να κάνει το blade, ανατρέξτε στα έγγραφα. εδώΣτην παραπάνω περίπτωση, χρησιμοποιούμε την οδηγία route για να δημιουργήσουμε ένα URL για την υποβολή της φόρμας μας.
Θυμηθείτε ότι ορίσαμε τις διαδρομές μας νωρίτερα στην εφαρμογή μέσα στο αρχείο web.php, καθορίζοντας ένα εύκολο στην απομνημόνευση όνομα για καθεμία από αυτές. Η οδηγία {{route()}} δέχεται το όνομα μιας διαδρομής, το αναζητά μέσα στη λίστα διαδρομών που αποθηκεύονται εσωτερικά στην προσωρινή μνήμη και δημιουργεί ένα πλήρες URL με βάση τον ορισμό αυτής της διαδρομής στο αρχείο web.php. Για την πρώτη περίπτωση, καθορίζουμε ότι θέλουμε η φόρμα να στείλει τα υποβληθέντα δεδομένα της στο /process URL της εφαρμογής μας, η οποία ορίζεται ως ΜΕΤΑ διαδρομή.
Το επόμενο πράγμα που ίσως έχετε παρατηρήσει είναι η ετικέτα @csrf ακριβώς κάτω από την ετικέτα έναρξης της φόρμας. Στο blade, αυτή η ετικέτα δημιουργεί μια παράμετρο _token στη φόρμα, η οποία ελέγχεται μέσα στην εφαρμογή πριν επιτραπεί η επεξεργασία των δεδομένων της φόρμας. Αυτό διασφαλίζει ότι τα δεδομένα μέσα στη φόρμα έχουν έγκυρη προέλευση και αποτρέπει επιθέσεις πλαστογράφησης αιτημάτων μεταξύ ιστοτόπων. Για περισσότερες πληροφορίες σχετικά με αυτό, ανατρέξτε στο docs.
Μετά από αυτό ορίζουμε τη φόρμα μας ως κανονική. Ωστόσο, σημειώστε ότι τα ονόματα των παραμέτρων της φόρμας μας, userFile και fileName, είναι τα ακριβώς το ίδιο όπως ορίζεται μέσα στο αντικείμενο αιτήματός μας. Εάν ξεχάσαμε να συμπεριλάβουμε μια είσοδο για μια δεδομένη παράμετρο που ορίστηκε στο αντικείμενο αιτήματος (ή την γράψαμε λάθος), το αίτημα θα αποτύγχανε και θα επιστρέφονταν σφάλμα, εμποδίζοντας το αρχικό αίτημα φόρμας να χτυπήσει ποτέ τη μέθοδο ελεγκτή που βρίσκεται στο UploadController@process.
Δοκιμάστε το και υποβάλετε μερικά αρχεία στην εφαρμογή χρησιμοποιώντας αυτήν τη φόρμα. Στη συνέχεια, μεταβείτε στο /λίστα σελίδα για να δείτε τα περιεχόμενα του φακέλου μεταφόρτωσης, με τα αρχεία που ανεβάσατε να παρατίθενται σε έναν πίνακα:
Η Μεγαλύτερη Εικόνα
Ας κάνουμε ένα βήμα πίσω και ας δούμε τι έχουμε κάνει σε αυτό το σεμινάριο Laravel.
Αυτό το διάγραμμα απεικονίζει την εφαρμογή όπως έχει αυτή τη στιγμή (εξαιρούνται οι λεπτομέρειες υψηλού επιπέδου):
Θα πρέπει να θυμάστε ότι το αντικείμενο αιτήματος που κατασκευάσαμε στην αρχή αυτού του σεμιναρίου Laravel θα πρέπει να έχει τις ίδιες παραμέτρους που ορίζονται στη μέθοδο κανόνων του όπως και στη φόρμα στο πρότυπο blade (αν όχι, ξαναδιαβάστε την ενότητα "Δημιουργία της Λογικής Επικύρωσης"). Ο χρήστης εισάγει τη φόρμα σε μια ιστοσελίδα που αποδίδεται μέσω της μηχανής προτύπου blade και υποβάλλει τη φόρμα. Ο κώδικας jQuery του προτύπου στο κάτω μέρος σταματά την προεπιλεγμένη υποβολή (η οποία θα ανακατευθύνει αυτόματα σε ξεχωριστή σελίδα), δημιουργεί ένα αίτημα ajax, φορτώνει το αίτημα με τα δεδομένα της φόρμας και το αρχείο που έχει μεταφορτωθεί και στέλνει όλο το περιεχόμενο στο πρώτο επίπεδο της εφαρμογής μας: το αίτημα.
Το αντικείμενο request συμπληρώνεται συσχετίζοντας τις παραμέτρους μέσα στη μέθοδο rules() με τις υποβληθείσες παραμέτρους φόρμας και, στη συνέχεια, επικυρώνει τα δεδομένα σύμφωνα με κάθε καθορισμένο κανόνα. Εάν ικανοποιούνται όλοι οι κανόνες, το αίτημα διαβιβάζεται σε οποιαδήποτε μέθοδο ελεγκτή αντιστοιχεί στις τιμές που ορίζονται στο αρχείο δρομολόγησης web.php. Σε αυτήν την περίπτωση, η μέθοδος process() του UploadController κάνει τη δουλειά. Μόλις φτάσουμε στον ελεγκτή, γνωρίζουμε ήδη ότι το αίτημα πέρασε την επικύρωση, επομένως δεν χρειάζεται να ελέγξουμε ξανά εάν το όνομα αρχείου που δόθηκε είναι, στην πραγματικότητα, μια συμβολοσειρά ή εάν η παράμετρος userFile περιέχει στην πραγματικότητα κάποιο τύπο αρχείου. Μπορούμε να συνεχίσουμε κανονικά.
Στη συνέχεια, η μέθοδος ελεγκτή λαμβάνει τις επικυρωμένες παραμέτρους από το αντικείμενο αιτήματος, δημιουργεί ένα πλήρες όνομα αρχείου συνδυάζοντας την παράμετρο fileName που διαβιβάστηκε με την αρχική επέκταση του userFile, αποθηκεύει το αρχείο μέσα σε έναν κατάλογο στην εφαρμογή μας και, στη συνέχεια, επιστρέφει μια απλή απόκριση με κωδικοποίηση JSON, επαληθεύοντας ότι το αίτημα ήταν επιτυχές. Η απόκριση λαμβάνεται από τη λογική jQuery, η οποία εκτελεί μερικές ακόμη εργασίες που σχετίζονται με το περιβάλλον χρήστη, όπως η εμφάνιση του μηνύματος επιτυχίας (ή σφάλματος) για 5 δευτερόλεπτα, η απόκρυψή του, καθώς και η εκκαθάριση των προηγούμενων καταχωρίσεων φόρμας. Αυτό γίνεται ώστε ο χρήστης να γνωρίζει με βεβαιότητα ότι το αίτημα ήταν επιτυχές και να μπορεί να ανεβάσει ένα άλλο αρχείο, εάν το επιθυμεί.
Επίσης, σημειώστε στο παραπάνω διάγραμμα πού ακριβώς χαράσσεται η γραμμή μεταξύ του πελάτη και του διακομιστή. Αυτή η έννοια είναι απολύτως κρίσιμη για να την κατανοήσετε και θα σας βοηθήσει να λύσετε προβλήματα και ζητήματα που μπορεί να αντιμετωπίσετε στο μέλλον κατά την επεξεργασία, για παράδειγμα, πολλαπλών ασύγχρονων αιτημάτων που μπορούν να προκύψουν οποιαδήποτε στιγμή. Ο διαχωρισμός γίνεται ακριβώς στα όρια του αντικειμένου αιτήματος. Το ίδιο το αντικείμενο αιτήματος μπορεί να θεωρηθεί ως η «πύλη» προς την υπόλοιπη εφαρμογή. Πραγματοποιεί την αρχική επικύρωση και καταγραφή των τιμών φόρμας που διαβιβάζονται από το πρόγραμμα περιήγησης ιστού. Εάν θεωρηθούν έγκυρες, τότε συνεχίζει στον ελεγκτή. Όλα πριν από αυτό βρίσκονται στο μπροστινό μέρος (ο «πελάτης» σημαίνει κυριολεκτικά «στον υπολογιστή του χρήστη»). Η απόκριση επιστρέφεται από την εφαρμογή πίσω στην πλευρά του πελάτη, όπου ο κώδικας jQuery μας περιμένει υπομονετικά την άφιξή του και εκτελεί μερικές απλές εργασίες UI μόλις τη λάβει.
Έχουμε επίσης καλύψει πολλές σημαντικές συχνές ερωτήσεις Ερωτήσεις συνέντευξης που σχετίζονται με τη Laravel και την PHP για φρέσκους αλλά και έμπειρους υποψηφίους για να βρουν τη σωστή δουλειά.







