Project

General

Profile

Δημιουργία API calls » History » Version 3

Yannis Exidaridis, 23/06/2017 16:41

1 1 Yannis Exidaridis
h1. Δημιουργία API calls
2
3 2 Yannis Exidaridis
*Βασικά αρχεία και φάκελοι*
4 1 Yannis Exidaridis
# _app/Http/routes.php_
5
Σε αυτό το αρχείο κάνουμε register τα routes στους αντίστοιχους controllers και τις αντίστοιχες μεθόδους.
6
# _app/Http/Controllers/Api/V1_
7
Σε αυτόν το φάκελο βρίσκονται όλοι οι controllers που αφορούν το API
8
# _app/Http/Controllers/Api/V1/Transformers_
9
Σε αυτόν το φάκελο βρίσκονται οι κλάσεις που είναι υπεύθυνες για τον μετασχηματισμό των ονομάτων των column της βάσης.
10
# _app/Models_
11
Σε αυτόν τον φάκελο βρίσκονται τα Eloquent Models (Laravel ORM)
12
# _app/Repositories_
13 3 Yannis Exidaridis
Σε αυτόν το φάκελο βρίσκονται τα repositories μας (Επειδή στο μέλλον θα θέλουμε τα queries τόσο για το API όσο και για την πλατφόρμα να βρίσκονται σε ένα μέρος, ακολουθούμε το Repository Design Pattern. Με απλά λόγια εδώ υλοποιούνται μέθοδοι που εκτελούν queries είτε χρησιμοποιώντας τα eloquent models είτε με οποιονδήποτε άλλο τρόπο).
14
15
16
*Παράδειγμα Workflow για Courses REST Api*
17
18
Θέλω να δημιουργήσω 2 REST calls
19
* GET api/v1/courses
20
* GET api/v1/courses/{course_code}
21
22
1. Δημιουργώ έναν RESTful controller για τα Courses πληκτρολογώντας 
23
24
@php artisan make:controller Api/V1/CourseController@
25
26
27
2. Κάνω register to resourceful route στο app/Http/routes.php
28
29
@Route::resource('courses', 'Api\V1\CourseController');@
30
31
Το resourceful route κάνει register τα παρακάτω routes
32
33
34
*Verb                Path                             Action    Route Name*
35
GET                /courses                         index      courses.index
36
GET               /courses/create               create     courses.create
37
POST             /courses                          store       courses.store
38
GET             /courses/{course}            show       courses.show
39
GET           /courses/{course}/edit       edit         courses.edit
40
PUT/PATCH /courses/{course}            update    courses.update
41
DELETE   /courses/{courses}             destroy    courses.destroy
42
43
Επειδή τα actions που χρειαζόμαστε είναι μόνο το index και το show διορθώνουμε το route ως εξής:
44
@Route::resource('courses', 'Api\V1\CourseController', ['only' => ['index', 'show']]);@
45
46
Πληκτρολογώντας το παρακάτω μπορώ να δω ποια routes είναι registered:
47
@php artisan route:list@
48
49
3. Δημιουργώ ένα course eloquent model με το παρακάτω
50
51
@php artisan make:model Models/Course@
52
Αν το όνομα του πίνακα που αντιστοιχεί το μοντέλο δεν είναι ο πληθυντικός του ονόματος του μοντέλου (Laravel convention) τότε πρέπει να το δηλώσω ρητά στις ιδιότητες της κλάσης.
53
‘Έτσι στην συγκεκριμένη περίπτωση επειδή ο πίνακας του openeclass δεν ονομάζεται courses αλλά course πρέπει να ανοίξουμε το μοντέλο που μόλις φτιάξαμε και να προσθέσουμε την ιδιότητα
54
@protected $table = 'course';@
55
56
4. Δημιουργώ ένα course repository στον φάκελο app/Repositories
57
58
Αφού δημιουργήσω το _CourseRepository.php_ το ανοίγω και υλοποιώ την _getAllCourses()._ Για να πάρω τα αποτελέσματα χρησιμοποιώ ένα eloquent query.
59
60
_public function getAllCourses($limit) {
61
      return Course::paginate($limit);
62
}
63
_
64
5. Δημιουργώ μια CourseTransformer class 
65
66
Δημιουργώ τον _CourseTransformer.php_ στον φάκελο _app/Http/Controllers/Api/V1/Transformers_ για να μετονομάσω τα πεδία της βάσης πριν τα επιστρέψω στο χρήστη.
67
68
6. Επεξεργάζομαι τον controller μου 
69
70
Επιστρέφω στον _CourseController.php_ που έφτιαξα προηγουμένως και τον επεξεργάζομαι. Για αρχή μπορούμε να διαγράψουμε όλες τις μεθόδους που δεν θα χρησιμοποιήσουμε κρατώντας μόνο την_ index()_ και την _show()_.
71
Κάθε controller μας θα πρέπει να έχει υποχρεωτικά τις παρακάτω ιδιότητες:
72
73
@private $response;
74
   private $courseRepo;@
75
76
Οι οποίες θα αρχικοποιούνται με dependency injection στον constructor ως εξής:
77
public function __construct(Larasponse $response, CourseRepository $courseRepo)
78
{
79
      $this->response = $response;
80
      $this->courseRepo = $courseRepo;
81
}
82
83
84
Η υλοποίηση των μεθόδων _index()_ και _show()_ είναι προφανής. Αυτό που ίσως δεν είναι τόσο προφανές είναι το πώς έρχεται το $course σαν παράμετρος στην index αντί να έρχεται το $course_code. Αυτό γίνεται εξαιτίας των παρακάτω γραμμών στο _routes.php_
85
86
Route::bind('courses', function($value)
87
{
88
    $course = App\Models\Course::where('code', '=', $value)->firstOrFail();
89
    return $course; 
90
});
91
92
_Αυτό το κάνουμε ώστε όταν αργότερα θα υλοποιήσουμε REST calls που θα αφορούν το course να μην χρειάζεται κάθε φορά να γράφουμε το query που θα μας επιστρέψει το course model object  αλλά να το έχουμε διαθέσιμο πάντα ως πρώτη παράμετρο σε κάθε μέθοδο. Μπορείτε να δείτε την υλοποίηση του ρίχνοντας μια ματιά στο AssignmentController.