Μάθημα : ΣΧΕΔΙΑΣΜΟΣ ΚΑΙ ΑΝΑΠΤΥΞΗ ΔΙΑΔΙΚΤΥΑΚΩΝ ΕΦΑΡΜΟΓΩΝ - Γ'ΕΠΑΛ
Κωδικός : S151119
S151119 - ΑΝΔΡΕΑΣ ΧΑΤΖΗΑΓΑΠΙΟΥ
Ενότητες μαθήματος
-
Εμφάνιση όλων των ενοτήτων
-
Ενότητα 1η - Εισαγωγή στο διαδίκτυο
-
Ενότητα 2η - Κυβερνοασφάλεια
-
Ενότητα 3η - Hacking basics
-
Ενότητα 4η - Εισαγωγή στην PHP
-
Ενότητα 5η - Τύποι δεδομένων και Σχόλια
-
Ενότητα 6η - Επιπλέον ασκήσεις στην PHP
-
Ενότητα 7η - Δομή Επιλογής (if statements)
-
Ενότητα 8η - Δομή Επανάληψης (while/for statements)
-
Project 1 - Guestbook
1/11/23 -
Project 1: Βιβλίο επισκεπτών
-
Σελίδες HTML-PHP
-
HTML φορμες
-
Προετοιμασία περιβάλλοντος για εκτέλεση PHP, MYSQL
-
Άσκηση 1: Εισαγωγή χρηστών στην βάση
-
Άσκηση 2 - Εμφάνιση χρηστών (list_users.php)
-
Άσκηση 3 - Ενημέρωση χρήστη (update_user.php)
-
Άσκηση 4 - Διαγραφή χρήστη (delete_user.php)
-
Project 2 - Bootstrap - index.php
-
Project 3 - Persons με Bootstrap - index.php
-
Project 4 - Students με Laravel
-
Ενότητα 1η - Εισαγωγή στο διαδίκτυο
Project 4 - Students με Laravel
1. Κάντε Remix το κώδικα ώστε να τον αντιγράψετε σε δικό σας λογαριασμό.
2. Μετέτρεψε το CRUD σου σε Laravel δομή
Από:
- list.php
- insert.php
- process_insert.php
- update.php
- process_update.php
- delete.php
Σε Laravel:
Routes (routes/web.php)
👉 Αυτό σου φτιάχνει αυτόματα:
- index (list)
- create (form insert)
- store (process insert)
- edit (form update)
- update (process update)
- destroy (delete)
3. Controller (όλη η λογική μαζί)
myapp/app/Http/Controllers/StudentController.php
Παράδειγμα:
public function index() {
$students = Student::all();
return view('students.index', compact('students'));
}
public function store(Request $request) {
Student::create($request->all());
return redirect()->route('students.index');
}
public function update(Request $request, $id) {
$student = Student::findOrFail($id);
$student->update($request->all());
return redirect()->route('students.index');
}
public function destroy($id) {
Student::destroy($id);
return redirect()->route('students.index');
}
4. Model (αντικαθιστά τα raw SQL)
myapp/app/Models/Student.php
protected $fillable = ['name', 'email'];
}
👉 Αυτό αντικαθιστά:
UPDATE ...
DELETE ...
5. Views (Blade αντί για plain HTML)
myapp/resources/views/index.blade.php
myapp/resources/views/create.blade.php
myapp/resources/views/edit.blade.php
Παράδειγμα:
@foreach ($students as $student)
{{ $student->name }}
@endforeach
README
Η ροή που ακολουθεί το Laravel ονομάζεται MVC (Model-View-Controller). Είναι μια οργανωμένη «αλυσίδα παραγωγής» όπου κάθε αρχείο έχει έναν πολύ συγκεκριμένο ρόλο.
Ας δούμε πώς κινείται μια αίτηση (π.χ. όταν πατάς το κουμπί "Update") μέσα στο σύστημα:
1. Η Διαδρομή μιας Αίτησης (Request Flow)
-
Η Είσοδος (Public/index.php): Κάθε αίτηση μπαίνει πρώτα από αυτό το αρχείο. Είναι ο "τροχονόμος" που εκκινεί το framework.
-
Το Τηλεφωνικό Κέντρο (routes/web.php): Η αίτηση φτάνει εδώ. Το Laravel κοιτάζει τη διεύθυνση (URL) και τη μέθοδο (GET, POST, PUT, DELETE). Αν βρει αντιστοιχία, π.χ.
Route::put('/students/{id}', ...), στέλνει την αίτηση στον ανάλογο Controller. -
Ο Εγκέφαλος (app/Http/Controllers/StudentController.php): * Εδώ εκτελείται η λογική. Ο Controller "μιλάει" στο Model για να κάνει την εργασία στη βάση.
-
Για παράδειγμα, η μέθοδος
updateλαμβάνει τα δεδομένα ($request) και την ταυτότητα του μαθητή ($id).
-
-
Ο Διαχειριστής Δεδομένων (app/Models/Student.php): Ο Controller καλεί το Model (π.χ.
Student::create()). Το Model αναλαμβάνει να επικοινωνήσει με τη βάση δεδομένων (SQLite/PostgreSQL) χωρίς εσύ να γράψεις ούτε μια γραμμή SQL κώδικα. -
Η Παρουσίαση (resources/views/index.blade.php): Μόλις τελειώσει η δουλειά, ο Controller αποφασίζει πού θα σε στείλει. Είτε "σερβίρει" μια σελίδα (View) είτε δίνει εντολή στον browser να πάει σε άλλη διεύθυνση (
redirect('/')).
Γιατί το Laravel υπερέχει από την "Απλή PHP"
Σε ένα απλό σύστημα PHP με μεμονωμένα αρχεία .php που περιέχουν διάσπαρτο κώδικα HTML και SQL, τα προβλήματα εμφανίζονται γρήγορα. Να γιατί το Laravel είναι καλύτερο:
-
Ασφάλεια από "Script Kiddies" (SQL Injection): Στην απλή PHP πρέπει να καθαρίζεις χειροκίνητα κάθε input. Το Laravel χρησιμοποιεί το Eloquent ORM, το οποίο προστατεύει αυτόματα τη βάση σου από επιθέσεις SQL Injection.
-
Προστασία CSRF: Αν ξεχάσεις το
@csrfστην απλή PHP, η φόρμα σου είναι ευάλωτη. Το Laravel αρνείται να δεχτεί δεδομένα από "ξένες" πηγές αν δεν υπάρχει το κατάλληλο token. -
Καθαρός Κώδικας (Separation of Concerns): Στην απλή PHP, η SQL, η HTML και η λογική είναι στο ίδιο αρχείο («μακαρονάδα»). Στο Laravel, η εμφάνιση είναι στα Views, η λογική στους Controllers και η βάση στα Models. Έτσι, αν θέλεις να αλλάξεις το design, δεν κινδυνεύεις να χαλάσεις τη βάση δεδομένων.
-
Διαχείριση URLs (Routing): Στην απλή PHP, τα URLs σου είναι
student_edit.php?id=5. Στο Laravel έχεις όμορφα, "φιλικά" URLs όπως/students/5/edit, τα οποία βοηθούν και στο SEO. -
Ετοιμοπαράδοτα Εργαλεία: Το Laravel σου δίνει έτοιμα συστήματα για Authentication (Login/Register), Validation (έλεγχο αν το email είναι έγκυρο) και Migrations (διαχείριση της δομής της βάσης), που στην απλή PHP θα έπρεπε να γράψεις από το μηδέν.
-
Συντηρησιμότητα: Αν μετά από 6 μήνες θέλεις να αλλάξεις κάτι, στο Laravel ξέρεις ακριβώς πού να πάς. Στην απλή PHP, πρέπει να ψάξεις σε δεκάδες αρχεία για να βρεις πού γίνεται η σύνδεση με τη βάση ή πού κλείνει ένα
<div>.

Tutorials
https://www.launchidea.in/blog/laravel/understanding-laravel-models
https://www.w3schools.in/laravel/
Ερωτήσεις αυτοαξιολόγησης
Εργασία για το σπίτι
Φύλλο Εργασίας 1: Βελτίωση Εφαρμογής CRUD στο Laravel (Blade & Bootstrap)
Σκοπός της άσκησης: Μέχρι τώρα, στην απλή PHP, γράφαμε τον βασικό κορμό της HTML (<html>, <head>, <body>) σε κάθε αρχείο ξεχωριστά. Στο Laravel, χρησιμοποιούμε τη μηχανή Blade για να φτιάξουμε ένα κεντρικό "καλούπι" (Layout) και να το χρησιμοποιούμε παντού! Επιπλέον, θα κάνουμε την εφαρμογή μας να φαίνεται επαγγελματική προσθέτοντας το framework Bootstrap.
Στο project σας έχετε ήδη 3 αρχεία (views): index.blade.php, create.blade.php, και edit.blade.php.
Ερώτημα 1ο: Δημιουργία και Χρήση ενός Γενικού Layout (Καλούπι)
Στόχος: Να δημιουργήσετε ένα κεντρικό αρχείο διάταξης (Layout) για να μην επαναλαμβάνετε τον βασικό κώδικα HTML σε κάθε σελίδα.
Οδηγίες (Βήμα-Βήμα):
-
Δημιουργία του Layout:
-
Μέσα στον φάκελο
resources/views/του Laravel project σας, δημιουργήστε ένα νέο αρχείο και ονομάστε τοlayout.blade.php.
-
-
Συγγραφή του βασικού HTML:
-
Ανοίξτε το
layout.blade.phpκαι γράψτε τον βασικό σκελετό μιας ιστοσελίδας (HTML5). -
Στο σημείο όπου θέλετε να εμφανίζεται το περιεχόμενο της κάθε ξεχωριστής σελίδας (π.χ. οι φόρμες ή η λίστα των μαθητών), θα χρησιμοποιήσετε την εντολή
@yieldτου Blade.
Αντιγράψτε τον παρακάτω κώδικα στο
layout.blade.php:HTML<!DOCTYPE html> <html lang="el"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Εφαρμογή Μαθητών</title> </head> <body> <!-- Εδώ θα μπαίνει δυναμικά το περιεχόμενο από τα άλλα αρχεία! --> @yield('content') </body> </html> -
-
Σύνδεση των υπόλοιπων αρχείων με το Layout:
-
Τώρα πρέπει να πούμε στα αρχεία μας (
create,edit,index) να "κληρονομήσουν" αυτό το Layout. -
Ανοίξτε το αρχείο
create.blade.php(Προσθήκη Μαθητή) και μετατρέψτε το ολόκληρο ώστε να μοιάζει έτσι:
Blade@extends('layout') @section('content') <h1>Add Student</h1> <form method="POST" action="/students"> @csrf Name: <input type="text" name="name"><br> Email: <input type="text" name="email"><br> <button type="submit">Save</button> </form> @endsection -
Τι πρέπει να κάνετε: Αφού εφαρμόσετε τα παραπάνω στο create.blade.php, κάντε ακριβώς το ίδιο (δηλαδή χρησιμοποιήστε τα @extends('layout') και @section('content')...@endsection) και στα αρχεία edit.blade.php και index.blade.php, περικλείοντας όλο τον υπάρχοντα κώδικά τους μέσα στο @section.
Ερώτημα 2ο: Μορφοποίηση με Bootstrap
Στόχος: Να ομορφύνουμε το περιβάλλον χρήστη (UI) χρησιμοποιώντας έτοιμες κλάσεις CSS από το Bootstrap, χωρίς να γράψουμε δικό μας CSS. Το μαγικό εδώ είναι ότι θα το προσθέσουμε μόνο στο Layout και θα εφαρμοστεί παντού!
Οδηγίες (Βήμα-Βήμα):
-
Εισαγωγή του Bootstrap στο Layout:
-
Ανοίξτε το αρχείο
layout.blade.phpπου φτιάξατε στο 1ο ερώτημα. -
Μέσα στην ετικέτα
<head>, κάτω από το<title>, επικολλήστε το παρακάτω link για να φορτώσετε το Bootstrap μέσω διαδικτύου (CDN):
HTML<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> -
-
Στοίχιση περιεχομένου:
-
Για να μην είναι τα πάντα κολλημένα αριστερά στην οθόνη, τυλίξτε το
@yield('content')μέσα στοlayout.blade.phpμε έναdivπου έχει την κλάσηcontainer(μια έτοιμη κλάση του Bootstrap):
HTML<div class="container mt-5"> @yield('content') </div>(Σημείωση: Το
mt-5σημαίνει Margin Top 5, δίνει δηλαδή λίγο κενό από το πάνω μέρος της οθόνης). -
-
Ομορφύνοντας τα κουμπιά και τις φόρμες (Παράδειγμα):
-
Ανοίξτε το
create.blade.php. Προσθέστε έτοιμες κλάσεις του Bootstrap σταinputκαι σταbuttonγια να αλλάξουν εμφάνιση. -
Η φόρμα σας στο
create.blade.phpμπορεί να γίνει κάπως έτσι:
Blade<form method="POST" action="/students"> @csrf <div class="mb-3"> <label class="form-label">Name:</label> <input type="text" name="name" class="form-control"> </div> <div class="mb-3"> <label class="form-label">Email:</label> <input type="text" name="email" class="form-control"> </div> <button type="submit" class="btn btn-primary">Save</button> </form> -
Τι πρέπει να κάνετε: Εφαρμόστε παρόμοιες αλλαγές (κλάσεις btn btn-primary για το Update, btn btn-danger για το Delete, και form-control για τα input) στο αρχείο edit.blade.php. Στο index.blade.php, κάντε το κουμπί του "Add Student" να μοιάζει με πραγματικό κουμπί προσθέτοντας στην ετικέτα <a> την κλάση class="btn btn-success".
Φύλλο Εργασίας 2: Επέκταση Δεδομένων & Λογική στα Views (Blade)
Σκοπός της άσκησης: Σε αυτό το εργαστήριο θα δούμε πώς μπορούμε να προσθέσουμε μια νέα πληροφορία (ένα νέο πεδίο) στο σύστημά μας, κατανοώντας τη διαδρομή που κάνουν τα δεδομένα στο Laravel: από τη Βάση Δεδομένων, στο Μοντέλο και τελικά στην Οθόνη μας (View). Στο τέλος, θα χρησιμοποιήσουμε δομές επιλογής (if-else) απευθείας μέσα στην HTML μας χάρη στο Blade!
Ερώτημα 1ο: Προσθήκη του πεδίου "Βαθμός" (Grade)
Στόχος: Να προσθέσετε το πεδίο grade (ακέραιος αριθμός) σε κάθε μαθητή. Για να γίνει αυτό σωστά στο Laravel, πρέπει να ενημερώσουμε 4 διαφορετικά σημεία.
Οδηγίες:
-
Ενημέρωση της Βάσης Δεδομένων (Migrations):
-
Πηγαίνετε στον φάκελο
database/migrations/και βρείτε το αρχείο (myapp/database/migrations/2026_04_21_111504_create_students_table.php) που τελειώνει σε_create_students_table.php. -
Μέσα στη συνάρτηση
up(), προσθέστε τη γραμμή για τον βαθμό κάτω από το email:PHP$table->string('email'); $table->integer('grade')->nullable(); // ΝΕΑ ΓΡΑΜΜΗ (το nullable επιτρέπει να είναι κενό αρχικά) -
Ανοίξτε το τερματικό σας (Terminal) και τρέξτε την εντολή:
php artisan migrate:fresh(Προσοχή: Αυτό θα διαγράψει τα παλιά δεδομένα και θα ξαναφτιάξει τους πίνακες από την αρχή με το νέο πεδίο).
-
-
Ενημέρωση του Μοντέλου (Model):
-
Ανοίξτε το
app/Models/Student.php. -
Προσθέστε το
'grade'στον πίνακα$fillable. Αυτό λέει στο Laravel "επιτρέπω στον χρήστη να αποθηκεύσει μαζικά και τον βαθμό" (είναι μέτρο ασφαλείας).PHPprotected $fillable = ['name', 'email', 'grade'];
-
-
Ενημέρωση των Φορμών (Views - Create & Edit):
-
Ανοίξτε το
resources/views/create.blade.php. Προσθέστε ένα νέο πεδίο (input) για τον βαθμό, όπως ακριβώς κάνατε για το Όνομα και το Email:Blade<div class="mb-3"> <label class="form-label">Grade:</label> <input type="number" name="grade" class="form-control" min="0" max="20"> </div> -
Κάντε το ίδιο και στο
resources/views/edit.blade.php, φροντίζοντας να τυπώσετε την υπάρχουσα τιμή του βαθμού στοvalue:Blade<div class="mb-3"> <label class="form-label">Grade:</label> <input type="number" name="grade" value="{{ $student->grade }}" class="form-control" min="0" max="20"> </div>
-
-
Ενημέρωση του Controller (ΔΕΝ ΑΠΑΙΤΕΙΤΑΙ):
-
Ανοίξτε το (myapp/app/Http/Controllers/StudentController.php)
StudentController.phpσας και επιβεβαιώστε ότι αποθηκεύονται τα δεδομένα χρησιμοποιώντας το$request->all().Είστε έτοιμοι! Δεν χρειάζεται να αλλάξετε τίποτα. Το Laravel θα δει το νέο πεδίο στη φόρμα και θα το αποθηκεύσει αυτόματα επειδή το βάλατε στο$fillable.
-
Δοκιμή: Ανοίξτε τον browser, πατήστε "Add Student" και δοκιμάστε να αποθηκεύσετε έναν μαθητή με βαθμό!
Ερώτημα 2ο: Challenge - Έξυπνη Εμφάνιση με Blade Conditions
Στόχος: Στο αρχείο index.blade.php βλέπουμε τη λίστα με όλους τους μαθητές. Θέλουμε το σύστημα να μας δείχνει δίπλα στο όνομά τους έναν χαρακτηρισμό, ο οποίος θα αλλάζει αυτόματα ανάλογα με τον βαθμό τους!
Οδηγίες Challenge:
Ανοίξτε το αρχείο resources/views/index.blade.php. Εκεί που εμφανίζετε τα στοιχεία του μαθητή μέσα στη λούπα @foreach, θέλω να προσθέσετε τη λογική του Blade.
Στο Blade, η δομή ελέγχου if γράφεται πολύ απλά, βάζοντας ένα @ μπροστά, χωρίς να χρειαζόμαστε τα <?php ... ?>:
@if(ΣΥΝΘΗΚΗ 1)
<!-- HTML Κώδικας -->
@elseif(ΣΥΝΘΗΚΗ 2)
<!-- HTML Κώδικας -->
@else
<!-- HTML Κώδικας -->
@endif
Τι πρέπει να φτιάξετε: Χρησιμοποιήστε το $student->grade για να φτιάξετε την εξής λογική:
-
Αν ο βαθμός είναι μεγαλύτερος ή ίσος του 18, να τυπώνεται δίπλα η λέξη "Άριστα" με πράσινο χρώμα.
-
Αλλιώς, αν ο βαθμός είναι μεγαλύτερος ή ίσος του 10, να τυπώνεται "Προάγεται" με μπλε χρώμα.
-
Αλλιώς (για βαθμούς κάτω του 10), να τυπώνεται "Απορρίπτεται" με κόκκινο χρώμα.
(Hint: Για τα χρώματα, μπορείτε να βάλετε τη λέξη μέσα σε ένα <span> χρησιμοποιώντας τις κλάσεις του Bootstrap που μάθαμε στο προηγούμενο μάθημα, π.χ. <span class="badge bg-success">Άριστα</span>, <span class="badge bg-primary">, <span class="badge bg-danger">).