|
53 | 53 | real, running features whose only job is to show you where your own code goes. |
54 | 54 | </p> |
55 | 55 | <div class="hero-ctas"> |
56 | | - <a class="btn btn-primary" href="https://docs.dotkernel.org/frontend/" target="_blank" rel="noopener"> |
| 56 | + <a class="btn btn-primary" href="https://docs.dotkernel.org/frontend-documentation/" target="_blank" rel="noopener"> |
57 | 57 | <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg> |
58 | 58 | Read the docs |
59 | 59 | </a> |
|
169 | 169 | </div> |
170 | 170 | <div class="traits"> |
171 | 171 | <div class="trait"> |
172 | | - <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/success-50.svg') }}" alt="User accounts, from register to unregister" loading="lazy"> |
173 | | - <p>User accounts, from register to unregister</p> |
| 172 | + <img class="icon icon-lg" decoding="async" src="{{ asset('images/app/content/success-50.svg') }}" alt="User accounts, from registration to account deletion" loading="lazy"> |
| 173 | + <p>User accounts, from registration to account deletion</p> |
174 | 174 | </div> |
175 | 175 |
|
176 | 176 | <div class="trait"> |
|
208 | 208 | </div> |
209 | 209 | <p class="lede">The whole account lifecycle, already routed.</p> |
210 | 210 | <p class="desc"> |
211 | | - Login, registration and account management, including avatar upload, password change and |
212 | | - unregistering. Password reset and account activation emails are part of the flow, which is why |
213 | | - the skeleton stores a name and an email address and nothing more. |
| 211 | + Login, registration and account management, including activation, password reset, avatar upload, |
| 212 | + profile details, password change and account deletion. Password reset and account activation |
| 213 | + emails are part of the flow, which is why the only personal details on a user profile are a name |
| 214 | + and an email address. |
214 | 215 | </p> |
215 | 216 | </div> |
216 | 217 |
|
|
246 | 247 | </div> |
247 | 248 | <p class="lede">A public form that does not become a spam relay.</p> |
248 | 249 | <p class="desc"> |
249 | | - The contact form uses Google reCAPTCHA, with the site and secret keys read from local |
250 | | - configuration and the message recipients - <code>to</code> and any number of |
251 | | - <code>cc</code> addresses - configured alongside them. Whitelist <code>localhost</code> while |
252 | | - developing, and take it out again for production. |
| 250 | + The contact form uses score-based Google reCAPTCHA, with the site key, secret key and score |
| 251 | + threshold read from local configuration, and the message recipients - <code>to</code>, |
| 252 | + <code>cc</code> and <code>bcc</code> addresses - configured alongside them. The contact page will |
| 253 | + not render until the keys are set; whitelist <code>localhost</code> while developing, and take it |
| 254 | + out again for production. |
253 | 255 | </p> |
254 | 256 | </div> |
255 | 257 |
|
|
294 | 296 | <div class="card-top"> |
295 | 297 | <div><span class="kicker">Delivery . HTTP</span><h3>Headers & CORS</h3></div> |
296 | 298 | </div> |
297 | | - <p class="lede">Response headers declared per route.</p> |
| 299 | + <p class="lede">Response headers declared globally or per route.</p> |
298 | 300 | <p class="desc"> |
299 | | - <code>dot-response-header</code> sets custom headers per route from |
| 301 | + <code>dot-response-header</code> sets custom headers for all routes or for individual routes from |
300 | 302 | <code>response-header.global.php</code>, while <code>mezzio-cors</code> handles origins, headers |
301 | 303 | and cookies from <code>cors.global.php</code>. |
302 | 304 | </p> |
|
329 | 331 | second option, because deleting a user row is rarely what your foreign keys want. |
330 | 332 | </p> |
331 | 333 | <p class="lede"> |
332 | | - The skeleton stores only what it needs to run those flows: first name, last name and the email |
333 | | - address used as the identity, for password reset and account activation. Anonymizing replaces |
334 | | - exactly those. |
| 334 | + On the user profile, the skeleton stores only what it needs to run those flows: first name, last |
| 335 | + name and the email address used as the identity, for password reset and account activation. |
| 336 | + Anonymizing replaces exactly those; contact form messages and remember-me records are kept as they |
| 337 | + are. |
335 | 338 | </p> |
336 | 339 | <div class="hero-ctas"> |
337 | 340 | <a class="btn btn-ghost" href="https://docs.dotkernel.org/frontend-documentation/v5/reference/account-anonymization/" target="_blank" rel="noopener">Anonymization reference</a> |
|
340 | 343 | <div class="callout"> |
341 | 344 | <h4>What anonymization changes</h4> |
342 | 345 | <ul> |
343 | | - <li>First and last name become <code>anonymous</code> plus the current UNIX timestamp - for example |
344 | | - <code>anonymous1725980747</code>.</li> |
| 346 | + <li>First and last name become <code>anonymous</code> plus the current date and time in |
| 347 | + <code>dmYHis</code> format - for example <code>anonymous23092026155300</code>.</li> |
345 | 348 | <li>The email becomes the same value plus whatever you set in <code>userAnonymizeAppend</code> - |
346 | | - <code>anonymous1725980747@example.com</code>.</li> |
347 | | - <li>The avatar image and its database record are deleted.</li> |
| 349 | + <code>anonymous23092026155300@example.com</code>.</li> |
| 350 | + <li>The account status is set to <code>deleted</code>; the row itself is kept.</li> |
| 351 | + <li>On account deletion, the avatar image and its database record are deleted.</li> |
348 | 352 | </ul> |
349 | 353 | <p> |
350 | 354 | Point <code>userAnonymizeAppend</code> at a domain you control and it doubles as a catch-all |
|
389 | 393 | <div class="standard"> |
390 | 394 | <h4>Module contents</h4> |
391 | 395 | <p><code>Controller</code>, <code>Entity</code>, <code>Repository</code> and |
392 | | - <code>Service</code> folders, plus <code>InputFilter</code>, <code>EventListener</code>, |
393 | | - <code>Helper</code>, <code>Command</code> or <code>Factory</code> as needed.</p> |
| 396 | + <code>Service</code> folders, plus <code>Form</code>, <code>Fieldset</code>, |
| 397 | + <code>InputFilter</code>, <code>EventListener</code>, <code>Factory</code>, |
| 398 | + <code>Middleware</code> or <code>Enum</code> as needed.</p> |
394 | 399 | </div> |
395 | 400 | </div> |
396 | 401 | </div> |
|
423 | 428 | </div> |
424 | 429 | <div class="standard"> |
425 | 430 | <h4>4 . Prepare the config files</h4> |
426 | | - <p>Copy the <code>.dist</code> files into place - <code>local.php</code>, |
427 | | - <code>development.local.php</code>, <code>mail.local.php</code>, |
428 | | - <code>debugbar.local.php</code> - then fill in the database, SMTP and reCAPTCHA details.</p> |
| 431 | + <p><code>composer install</code> has already created <code>local.php</code> and |
| 432 | + <code>mail.global.php</code>, and development mode created <code>development.local.php</code>; |
| 433 | + fill in the database and reCAPTCHA details in <code>local.php</code>, and copy |
| 434 | + <code>mail.global.php</code> to <code>mail.local.php</code> for the sender and SMTP details, so |
| 435 | + credentials stay out of git.</p> |
429 | 436 | </div> |
430 | 437 | <div class="standard"> |
431 | 438 | <h4>5 . Migrate and seed</h4> |
|
474 | 481 | </tr> |
475 | 482 | <tr> |
476 | 483 | <th scope="row">PHP</th> |
477 | | - <td>8.2 or newer, mod_php or FCGI (FPM). <code>memory_limit</code> at least 128M; |
| 484 | + <td>8.2 or 8.3, mod_php or FCGI (FPM). <code>memory_limit</code> at least 128M; |
478 | 485 | <code>upload_max_filesize</code> and <code>post_max_size</code> at least 100M depending |
479 | 486 | on your data.</td> |
480 | 487 | </tr> |
|
491 | 498 | </tr> |
492 | 499 | <tr> |
493 | 500 | <th scope="row">Required extensions</th> |
494 | | - <td><code>mbstring</code>, the CLI SAPI for cron jobs, and Composer on |
| 501 | + <td><code>curl</code>, <code>gettext</code>, <code>intl</code>, <code>json</code>, |
| 502 | + <code>mbstring</code>, the CLI SAPI for cron jobs, and Composer on |
495 | 503 | <code>$PATH</code>.</td> |
496 | 504 | </tr> |
497 | 505 | <tr> |
498 | 506 | <th scope="row">Recommended extensions</th> |
499 | | - <td><code>opcache</code>; <code>pdo_mysql</code> or <code>mysqli</code>; |
| 507 | + <td><code>opcache</code>; <code>pdo_mysql</code> for MySQL or MariaDB; |
500 | 508 | <code>dom</code> and <code>simplexml</code> for markup; <code>gd</code> and |
501 | 509 | <code>exif</code> for images; <code>zlib</code>, <code>zip</code>, |
502 | | - <code>bz2</code> for compression; <code>curl</code> when calling APIs; |
503 | | - <code>sqlite3</code> for the test suite.</td> |
| 510 | + <code>bz2</code> for compression; <code>sqlite3</code> for the test suite.</td> |
504 | 511 | </tr> |
505 | 512 | </tbody> |
506 | 513 | </table> |
|
0 commit comments