PHP Symfony 4 API Platform + React.js Full Stack Masterclass
Have you ever wanted to advance your PHP skills to the next level? Maybe you have some prior PHP experience but you never had a change to work with a framework? Or you are new to PHP at all? It does not matter! You can take this course to give your PHP projects a fresh start! In modern world, sooner or later, as a web developer you will have to create a API and a frontend application in React.JS or any other JS framework out there. It's just a must have these days for any professional web developer!
More
This is where I can help you. Take this course to learn how to create robust APIs in PHP, using Symfony Framework 4 and API Platform. You will not believe how easy and instant it could be! I'll take you step by step during the whole process, from creating your own robust API to making a modern React.JS application using Redux, Redux-Form and all the other tools that you just need to know to get a job these days! You will be creating a Blog application, starting with the API in Symfony API Platform, and then a complete React+Redux frontend app. We will also configure an administration panel for managing the platform. Both Windows and MacOS are supported (I'll show you how to install and configure PHP and Node.js on both)
What will you learn about Symfony and API Platform?
You will learn how to create Symfony controllers and work with routing
You will learn how to represent your database tables as objects in Doctrine
You will see how you can quickly convert your Doctrine model to an API Resource
You will learn how to paginate, filter and sort your collections
You will see how to send an e-mail
You will learn everything about Authentication (user sign-up, sign-in, including account confirmation through e-mail)
You will understand everything about Authorization (User roles, privileges, restricting access)
You will know how to handle file uploads through REST API
You will learn how to log errors
You will learn both unit testing (PHPUnit) and functional testing (Behat)
You will know how to customize and extend the built-in operations that API Platform provide
Data validation and serialization/deserialization
What will you learn about React.js?
How to configure routes for your app using React Router
How to handle state with Redux
How to create great forms using Redux Forms
Communicating with the API using Thunk Middleware
After finishing this course you will be able to confidently create your own complicated APIs in Symfony using API Platform and create a SPA application using React.js!
What you'll learn:
- You will know how to create a robust APIs in Symfony 4 using API Platform
- You will understand the basics of Symfony Framework
- You will know how to create a pretty complicated ReactJS application that works with API Platform (or any API!)
Requirements:
- Any code editor
- Some previous PHP exposure would be very useful (this course does not teach PHP from the very basics!)
- JavaScript basics for the React part
Watch Online PHP Symfony 4 API Platform + React.js Full Stack Masterclass
# | Title | Duration |
---|---|---|
1 | Introduction | 06:46 |
2 | Course outline and how to make most of this course! (PLEASE WATCH!) | 09:29 |
3 | Tools (required/optional) overview | 08:36 |
4 | Installing PHP and Composer on Windows | 05:50 |
5 | Installing PHP and Composer on Mac | 01:52 |
6 | Installing Visual Studio Code | 01:19 |
7 | Namespaces | 04:43 |
8 | Class Fields and Methods | 05:47 |
9 | Method & Field Visibility | 05:14 |
10 | Inheritance | 10:42 |
11 | Abstract Classes | 03:40 |
12 | Interfaces | 11:16 |
13 | Typed Arguments & Function Return Types | 12:29 |
14 | Anonymous Functions (Closures) | 04:49 |
15 | Reflection API (Reverse-Engineer Classes, Methods, Functions) | 05:05 |
16 | Dependency Injection (In Practice) | 05:47 |
17 | Simple Service Container (Hands-On Coding!) | 12:30 |
18 | Service Autowiring Implementation Part 1 | 10:52 |
19 | Service Autowiring Implementation Part 2 | 11:25 |
20 | Annotations and Kernel Part 1 | 08:05 |
21 | Annotations and Kernel Part 2 | 12:41 |
22 | Creating new Symfony project | 01:25 |
23 | Routing annotations in controllers | 02:47 |
24 | Routing - route parameter wildcards | 05:33 |
25 | Routing - default parameter values | 02:24 |
26 | Routing - generating urls using route names | 01:58 |
27 | AbstractController, Request, Response | 04:39 |
28 | Installing ORM, maker, configuring database | 02:10 |
29 | Generating first Entity | 03:17 |
30 | Entity explained | 02:31 |
31 | Migration - modifying database structure | 02:59 |
32 | Persisting entities and serializing data | 05:15 |
33 | Fetching objects using repositories | 03:22 |
34 | ParamConverter - type hinting actions for automatic fetching of entities | 06:00 |
35 | Deleting entities | 03:40 |
36 | Doctrine Fixtures - seeding fake data | 04:52 |
37 | Admin panel introduction - EasyAdmin | 03:15 |
38 | Install API Platform and create the first resource | 06:20 |
39 | Generate User and Comment entity | 02:19 |
40 | ManyToOne relation and migration | 09:13 |
41 | Fixtures with references (for relations) | 05:34 |
42 | Password encoding in fixtures | 04:02 |
43 | Generate fake data in fixtures using Faker | 07:56 |
44 | BlogPost with Comment relation and fixtures | 04:45 |
45 | Built-in API Platform operations | 05:42 |
46 | Disabling operations | 03:13 |
47 | Introduction to serialization/deserialization | 04:34 |
48 | Serialization groups (controlling which properties are serialized) | 02:16 |
49 | EventSubscriber (hashing password) | 06:51 |
50 | Validator and validation constraints | 04:44 |
51 | Validation using regular expressions | 04:30 |
52 | Virtual property (not persisted to database) | 02:58 |
53 | Validating uniqueness of fields (username, email) | 02:03 |
54 | JWT Tokens introduction | 05:26 |
55 | Preparing JWT token library and keys | 03:25 |
56 | Configuring UserProvider | 04:25 |
57 | Firewall configuration | 08:39 |
58 | JSON login configuration and Guard Authentication explained | 06:11 |
59 | Authentication final configuration and first login using JWT token | 05:43 |
60 | Using is_granted() to control access to operations | 02:56 |
61 | BlogPost validation on POST | 06:17 |
62 | Setting author of BlogPost automatically (EventSubscriber) | 08:16 |
63 | Making sure only owner of BlogPost can modify it (PUT) | 06:08 |
64 | Controlling which properties can be changed (no username change) | 06:45 |
65 | Hasing password on User changes (PUT) - with Events | 07:08 |
66 | Comment resource operations (POST/PUT) | 05:09 |
67 | More randomness in fixtures | 07:23 |
68 | Setting author automatically (EventSubscriber) - using generic Interface | 05:59 |
69 | Setting published date automatically (EventSubscriber) | 07:11 |
70 | API subresources | 05:20 |
71 | Controlling how deep relations are serialized | 07:44 |
72 | Embedding Author resource inside BlogPost | 04:10 |
73 | Adding user role field with migration | 05:48 |
74 | User role fixtures | 09:27 |
75 | Defining role hierarchy | 01:41 |
76 | Verifying only users with specific role can POST resources | 09:44 |
77 | Different User view for admins (different serialization of all User entities) | 09:21 |
78 | Verifying only admin can see all User's email | 03:03 |
79 | User can view his full profile (including email and roles) - custom Normalizer | 11:17 |
80 | Verifying only the profile owner can see all properties | 01:26 |
81 | Disabling password hashing for PUT operation | 05:53 |
82 | Configuring custom operation for password reset in User | 02:21 |
83 | Creating custom Action class | 10:32 |
84 | Implementing custom PasswordReset action | 08:36 |
85 | Invalidating JWT tokens after password reset | 11:18 |
86 | User enabled property migration and fixtures | 05:17 |
87 | Implementing UserChecker to verify if account is enabled | 03:51 |
88 | Secure confirmation token generation | 05:43 |
89 | Generating confirmation token when user signs-up | 04:35 |
90 | UserConfirmation custom API Resource | 03:36 |
91 | UserConfirmation EventSubscriber | 06:39 |
92 | Verifying Confirmation Token endpoint | 02:49 |
93 | Install and configure Swift Mailer | 03:50 |
94 | Sending a test e-mail through Gmail | 02:18 |
95 | Refactoring UserConfirmation and Mailer into services | 08:26 |
96 | Traditional (non API) account confirmation route (for e-mail) | 04:57 |
97 | Verifying confirmation link received in e-mail | 02:06 |
98 | Install and configure uploading library | 04:04 |
99 | Image entity with migration and @Uploadable annotation | 05:13 |
100 | API Resource for Image entity | 02:49 |
101 | Implementing custom Action for upload | 05:51 |
102 | Creating Form for file upload | 05:38 |
103 | Assigning Image to BlogPost (ManyToMany relation) | 04:00 |
104 | Verifying assigning Image to BlogPost, embedding Image inside BlogPost | 04:22 |
105 | Configuring default collection sorting order | 03:34 |
106 | Search filter | 06:40 |
107 | Date filter | 04:32 |
108 | Range filter | 02:06 |
109 | Sorting filter | 04:26 |
110 | Filtering by nested properties | 02:04 |
111 | Property filter | 03:00 |
112 | Configuring collection pagination | 06:07 |
113 | Configuring collection pagination part 2 | 04:36 |
114 | Partial pagination (performance gain) | 01:46 |
115 | Empty request body for POST/PUT requests problem | 02:58 |
116 | Handling empty request body | 06:25 |
117 | Fixing validation groups | 01:57 |
118 | Handling business logic exceptions | 03:51 |
119 | Installing Monolog library for application logging | 07:56 |
120 | Defining custom logging channel | 04:32 |
121 | Logging to separate files per channel | 02:42 |
122 | Production configuration for logger explained | 03:39 |
123 | EasyAdmin basic built-in features | 07:02 |
124 | Fixing empty body subscriber for form submittal | 04:18 |
125 | Custom Resource controller, customizing saving and updating an Entity | 08:21 |
126 | Image upload in admin panel | 03:58 |
127 | Custom page for individual BlogPost | 05:27 |
128 | Securing Admin panel area | 06:07 |
129 | Installing PHPUnit and writing first basic unit test | 07:06 |
130 | Testing EventSubscriber static configuration | 04:27 |
131 | Mocks (stubs) Part 1 - Mocking dependencies, Entities | 05:32 |
132 | Mocks (stubs) Part 2 - Mocking dependencies, Entites | 05:10 |
133 | Event class Mock, extracting repeated mock factory code | 03:29 |
134 | Parameters for mocks | 04:50 |
135 | Full test for AuthoredEntitySubscriber | 06:38 |
136 | Data providers in tests (using many data sets in 1 test case) | 04:43 |
137 | Finding potential errors using unit tests (null Token example) | 05:46 |
138 | Installing Behat & all extensions, first suite run | 03:00 |
139 | Configuring Behat | 04:52 |
140 | FeatureContext - creating database schema for each feature | 08:26 |
141 | First blog post test scenario | 05:50 |
142 | Testing protected URLs | 07:05 |
143 | Validating returned JSON using patterns (not matching exact values) | 06:32 |
144 | Looking for errors and issues using functional tests | 03:11 |
145 | Finding a comment problem | 06:28 |
146 | Custom error listener | 13:06 |
147 | Image upload feature | 06:21 |
148 | Working image upload functional test | 02:41 |
149 | Testing assigning Images to BlogPost, full suite run | 04:50 |
150 | Installing node & npm on Windows | 01:19 |
151 | Installing node & npm on MacOS | 01:01 |
152 | Installing dependencies and creating main index.js | 03:06 |
153 | Creating store, using Provider, Router and components | 05:45 |
154 | BlogPostList empty component, App as a container component | 02:41 |
155 | BlogPostContainer, using key for list of elements | 06:19 |
156 | Redux: actions, reducer, mapping state and dispatch to props 1 | 07:02 |
157 | Redux: actions, reducer, mapping state and dispatch to props 2 | 04:36 |
158 | Adding BlogPost (dummy action), Reducer explained | 04:29 |
159 | Making API requests with Superagent | 05:00 |
160 | Thunk Redux Middleware | 09:19 |
161 | Header component (navigation) | 03:31 |
162 | Loading indicator when making API requests | 03:42 |
163 | Formatting BlogPost list, formatting time (timeago.js) | 03:32 |
164 | Route with parameter - individual BlogPost | 04:07 |
165 | Fetching BlogPost from API | 06:28 |
166 | ComponentWillUnmount lifecycle method | 04:42 |
167 | BlogPost component - API changes | 02:44 |
168 | Spinner and Message components (loading state, simple message) | 05:36 |
169 | CommentListContainer component | 10:31 |
170 | CommentList reducer | 03:45 |
171 | Rendering comments | 02:59 |
172 | Introducing redux-form | 02:24 |
173 | Render redux form component | 06:28 |
174 | Adding redux-form reducer | 02:10 |
175 | Submitting Form to an API endpoint | 03:57 |
176 | Storing JWT token in LocalStorage, Token Middleware | 03:15 |
177 | Token Middleware and JWT authentication plugin 1 | 07:11 |
178 | Token Middleware and JWT authentication plugin 2 | 06:06 |
179 | Reading token in App component constructor | 06:30 |
180 | Redux Form submission, handling login errors | 03:14 |
181 | Checking whether user is authenticated (in Header component) | 03:22 |
182 | Fetching user profile through API | 06:20 |
183 | Rendering signed-in username in Header | 07:43 |
184 | Fetching user profile on page refresh | 05:36 |
185 | Create a redux-form for Comment posting | 04:41 |
186 | Redux-form submitting state simulation | 02:27 |
187 | Fully working CommentForm | 04:21 |
188 | Displaying errors in redux-form | 03:43 |
189 | Parsing API errors (validation constraint messages from API) | 04:12 |
190 | Animations - animated comment adding | 05:47 |
191 | Logout functionality (resetting stored JWT token) | 06:20 |
192 | Logging out user when token expires | 05:57 |
193 | Logging out user when he submits an expired token (401) | 03:03 |
194 | Paginator component | 03:47 |
195 | Paginator component - showing current page | 02:47 |
196 | Fetching blog post collection on page change | 07:10 |
197 | Query parameter based pagination (page in route parameter) | 04:34 |
198 | Pagination - previous/next buttons | 09:27 |
199 | Modify API - missing User embedded data on new Comment | 01:48 |
200 | LoadMore component - fetching next comments (different way of pagination) | 08:47 |
201 | Append new comments inside reducer | 02:49 |
202 | Registration form | 05:32 |
203 | Registration action creators and form validation | 10:22 |
204 | ConfirmationToken - modify e-mail to contain token, not only link | 03:15 |
205 | RegistrationContainer - 2 step registration process | 03:52 |
206 | Showing ConfirmationToken form on successful account creation | 05:21 |
207 | Keeping state of registration/confirmation process | 05:17 |
208 | Registration/Confirmation process, with redirect timer | 08:17 |
209 | BlogPost form for creating posts and user permissions | 05:20 |
210 | Functional BlogPost form | 05:14 |
211 | ImageUpload component (styling the file input) | 06:32 |
212 | Uploading images - upload request | 09:50 |
213 | ImageBrowser (preview uploaded images) | 05:05 |
214 | A new reducer for BlogPostForm | 04:06 |
215 | Clear the images when BlogPostForm unmounts | 07:17 |
216 | DELETE operation on Image (API Changes) | 04:11 |
217 | ImageBrowser animations | 03:38 |
218 | Remove button on ImageBrowser | 03:58 |
219 | Remove button on ImageBrowser sending DELETE request | 03:16 |
220 | Locking all buttons during Image upload/removal | 04:47 |