<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"  xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://symfonycasts.com/screencast/symfony8-upgrade/php-84</loc><lastmod>2026-05-04T09:30:04+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2152778122-8e4b0a6cc4fe7e9cae97a48f3a898851a7ed8ff53a618eec90574a769108850a-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[PHP 8.4 & Recipe Updates]]></video:title><video:description><![CDATA[Hey friends! Welcome to a new course on upgrading a Symfony app from Symfony 7 to Symfony 8. Luckily, newer versions of Symfony make this upgrade process a breeze. But there are still some things to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1188489733/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=feae004828f8c54c8c7cbb5a565a457c127e0e3ee20ff36acc86e2e5bdb4ab88</video:content_loc><video:duration>681</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2026-05-04T09:30:04+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony8-upgrade/symfony-74</loc><lastmod>2026-05-06T09:30:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2153993296-edd07a14c824e9dc4714ec6ffbbb5cf3e70b5a4321d5faafc5b050cadc3bcf72-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Upgrading to Symfony 7.4]]></video:title><video:description><![CDATA[Alright, let's dive right into upgrading to Symfony 7.4. Open your `composer.json` file. Notice how the Symfony packages use a `7.3.*` format. This is slightly different from the rest of our...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1189464404/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7b618fa7251080a9351bbb1b217a069b8948569cd64cf30de5d0d7d139c4ce52</video:content_loc><video:duration>331</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2026-05-06T09:30:55+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/doctrine-inheritance/mapped-superclass</loc><lastmod>2026-04-23T15:08:14+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2131541150-95993931e9c7d7531bdb0ae9f772738280b4df55cbd0f767f180994f5dc68d0a-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Mapped Superclasses]]></video:title><video:description><![CDATA[Hey Friends! Let's dive into the world of Doctrine Inheritance in Symfony. You already know how Doctrine classes represent tables in our database, and their instances, or objects, represent rows. But...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1171890370/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=bb30d7305cf2be6fba1cc7ab123db48bc565f212ca406b275c7a7d825deb7e6c</video:content_loc><video:duration>245</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2026-03-10T09:30:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/doctrine-inheritance/foundry-fixtures</loc><lastmod>2026-04-23T15:08:14+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2132576853-b05cb3a40b1c9fb44f375e5c9e56321dfd2cda6fc593350a30728b9352a3ce03-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Foundry Fixtures for Inheritance]]></video:title><video:description><![CDATA[Ok, we left off with an error when we tried to load our fixtures. Open `src/Factory/StarshipFactory`. Basically, now that we made `Starship` an abstract MappedSuperclass, it can't be instantiated and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1172663688/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=eed73b0d95de29e9d17be2c896d8c22c57f601a54ff185f4c0c00bbffc51522e</video:content_loc><video:duration>293</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2026-03-12T09:30:31+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-forms/form-type</loc><lastmod>2026-02-09T14:27:01+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2102650766-09c3c5e2836e1cb9921397ab0959b7f15dba8f269826e82d0ad98f9135492a6e-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Creating a Form Type Class]]></video:title><video:description><![CDATA[## Introduction: The Power of Forms Forms are everywhere. Login boxes, search fields, admin tooling, checkout steps — if your app lets humans type things, congrats, you’re in Form Land. And even...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1151449366/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4246c0573d25e3b224b40e37db90e3e4d51e12f29d58b4386686f775494eb5fd</video:content_loc><video:duration>291</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2026-01-05T09:30:56+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-forms/render-form</loc><lastmod>2026-02-09T14:27:01+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2103854956-1115669f794482528125ac205cbc6287370e6e75399375849391612a6987a850-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Rendering the Form]]></video:title><video:description><![CDATA[In the last chapter, we dove into the Symfony Form component, built our first Form Type, and created a `Form` object from the type in the controller. Now, let's move on to the fun part — bringing it...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1152332199/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=16a10002fbb28172cf044e6529a18c74d596034865a4b52b417f684e4d984c55</video:content_loc><video:duration>216</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2026-01-08T09:30:18+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-forms/handle-form</loc><lastmod>2026-02-09T14:27:02+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2104370992-5ccb4ed96d8b95a211cc0603f35d489850b5d1e129bbd60330a41fe1cf494536-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Processing the Submitted Form]]></video:title><video:description><![CDATA[Alright, we've built, created, rendered, and styled our form. I've given it my all and now our form is ready for submission. Now, as any seasoned backend developer will tell you, the real fun begins...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1152696864/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=253d500f40565ea1bbf5445576420ca71b5cb29ccf4bc0cdd1b173d98756a75f</video:content_loc><video:duration>299</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2026-01-09T09:30:45+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/translations/installation</loc><lastmod>2026-01-30T14:36:44+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2032417180-9335fad58037900f60f48eb28b599a8b71093c6cb987307a45cad5531fe64a0a-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Installing the Translation Component]]></video:title><video:description><![CDATA[Hey friends! e alegro de que te hayas unido a mí en este curso de sobre las traducciones de Symfony! In this tutorial, we're celebrating one of the oldest components in Symfony, but for the first...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1097950293/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7a9124db7becb4863c19ee9d66c6b3d762ebb927c09db1842fdd9060b6f347b0</video:content_loc><video:duration>289</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-07-21T09:30:11+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/translations/localized-routes</loc><lastmod>2026-01-30T14:36:44+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2037136238-976ee8df222bef4c55fa9721a3587ea4550e7c5fd992c0b8e132d789f4e61db6-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Localized Routes]]></video:title><video:description><![CDATA[We installed the translation component. Go us! Also, our pages are advertised via the `lang` attribute as our default locale: `en`. But how can we figure out what language a user wants? There are...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1101610316/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a5402617c477a78365eb24961d840ec1628167e8c21569e9bac01c0841107f43</video:content_loc><video:duration>307</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-07-21T15:48:45+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/translations/language-switcher</loc><lastmod>2026-01-30T14:36:45+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2038373310-92293b8ffe98450d3860abb49427d1acbdf475bdb8618277569d5e171baffc1f-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Create a Language Switcher]]></video:title><video:description><![CDATA[We have localized routing up and running, but we can only switch locales by manually updating the URL. That won't do! Instead, let's add a language switcher! Up here, next to our search form, we need...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1102592354/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7fb84f0801c9cbdb267abdb4dec5daad2c15514a136430f0d947523433a520c4</video:content_loc><video:duration>242</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-07-21T15:48:47+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/bundle-development/initialize-bundle</loc><lastmod>2026-03-11T18:13:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2057057459-c6df0a6845f0c36cfdce7e4a1ef41b5459212941535e8b3bad4279293a276a3d-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Initialize the Bundle]]></video:title><video:description><![CDATA[Hey friends! Welcome to the *Reusable Symfony Bundle* course. I'm Kevin, and I'll be your *bundle navigator* on this journey. I've built a few bundles in my day, so I'm super excited to share my...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1117196016/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=526bb5e65a9468151787be6076665ac02f718254820bb491700337221ef7db22</video:content_loc><video:duration>303</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-09-08T09:30:33+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/bundle-development/bundle-class</loc><lastmod>2026-03-11T18:13:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2056774110-bf5698c744e722b8c5d2424cb46ed8e69e3c7b2745f794c5a12d3d23174c919e-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[The Bundle Class]]></video:title><video:description><![CDATA[We have a home for our bundle within our app. And, we've set up it's `composer.json` file so it's marked as a package for composer. Now it needs a "bundle class" so it can be loaded as a bundle by...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1116976626/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a128eaa9cf4a62f4ec75e92c4f4e4267b31c8c1cfabdacbbdc00322b2d25110f</video:content_loc><video:duration>132</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-09-09T09:30:29+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/bundle-development/install-locally</loc><lastmod>2026-03-11T18:13:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2057092546-4f1e737daf2d8a7acc5e8f2a8b336b73d87d96ffc64c365889dc684c4f8ba295-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Install our Bundle Locally]]></video:title><video:description><![CDATA[We have a bundle "package" and bundle class, and even though it lives within our app, we still need to "install" it. This is handled with Composer like normal but the method is a little different. It...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1117221484/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=9e0fa3cf9f3414af15084911b6ca4cfe63c1457d8236574d600f57a18b428596</video:content_loc><video:duration>150</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-09-10T09:30:44+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/doctrine-relations/setup</loc><lastmod>2026-01-30T14:56:13+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2026751540-a46b1d24238eb42fe8ff614683e9ec06b92f832b5deb7fc9f875c158d7abfe10-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Setup]]></video:title><video:description><![CDATA[Hey friends! Welcome back! And welcome back to me if I can be so bold. I'm returning from my 14-month brain cancer "vacation". Unfortunately, I'm not all better & sure, I type with one hand, like a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1093419011/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=042cdbb54b0d7191a79390e79d6685f41897082a56b3a80ae4cd074edb8320c7</video:content_loc><video:duration>130</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-06-16T09:30:14+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/doctrine-relations/part-entity</loc><lastmod>2026-02-11T23:59:43+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2120702540-8e0a77871d1a349e8655279b50f7e99731ad8ebcb5d20317396ec7e0202d265e-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Part Entity]]></video:title><video:description><![CDATA[We already have starships showing up on the homepage thanks to the `Starship` entity we built in the last tutorial. But now, it's time to step up our game. We need to track the individual *parts*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1164171871/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f8b9593ef7e67449f78af5d5300c8aa449c5eb4e0c62acf5f07cd3c0fb5479db</video:content_loc><video:duration>192</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-06-17T09:30:58+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/doctrine-relations/many-to-one</loc><lastmod>2026-01-30T14:56:13+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2026753606-fc384df62f074a0e8208e81bf69a89b2d63c6afdf8bdce5d0e2cc132561510d2-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Many To One: The King of Relationships]]></video:title><video:description><![CDATA[Alright folks, we've successfully built `Starship` and `StarshipPart` entities, and... they're sitting pretty in the database. But here's the puzzle: how do we *attach* these parts to their...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1093421173/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=50034c4b2f8c2ec9c8c03f649f16c4460184e13d2b0e51371b239f78ebecf262</video:content_loc><video:duration>276</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-06-18T09:30:12+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/doctrine-relations/setting-relation</loc><lastmod>2026-01-30T14:56:13+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2026753640-3783dd29649ddcb6f95c3883d48f3b63eba5f9d94641b08e45709d1889d0c5f7-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Setting the Relation]]></video:title><video:description><![CDATA[Ok, but how do we actually set the relation? How do we say: > This `StarshipPart` belongs to this `Starship`? So far, we've been working in `AppFixtures` with Foundry. We'll come back to Foundry in a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1093421610/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=679656bf4c04cc135a14541874702a100f5f01105de104764caff9e7db1c67ae</video:content_loc><video:duration>171</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-06-19T09:30:05+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/lemon-squeezy/lemon-squeezy</loc><lastmod>2026-01-30T14:16:33+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2006623415-fe6f1148d470819768618b60d4de068095544578a3f5c3d2a14d81826f30146e-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Meet LemonSqueezy - Your Merchant of Record.]]></video:title><video:description><![CDATA[Hello and *welcome* to another e-commerce tutorial! I don't mean to sell this too hard, but I think this tutorial is fantastic! There are *a lot* of payment processors available, which means selling...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1076762848/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=301eb7584ada587f42c004b8b9252b94f00063ec656d2141391a05f36c6abd5d</video:content_loc><video:duration>390</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-04-21T09:05:11+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/lemon-squeezy/checkout</loc><lastmod>2026-01-30T14:16:34+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2007233171-5758e33a2e4d58ac6be79a239a76f67c0fbe8703d5b9d1b40e7682d11e78201a-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Checkout Products]]></video:title><video:description><![CDATA[In the previous chapter, we created a new product and displayed it on our storefront. Now our customers can see the product and purchase it directly, even though we don't have a website. *Nice*! 😎 We...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1076778431/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=dfe386ed23848e378737a41e895dc14805c8e873237ee87693ff495d3ad2460e</video:content_loc><video:duration>355</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-04-22T09:05:36+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/lemon-squeezy/scoped-http-client</loc><lastmod>2026-01-30T14:16:34+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2007915336-69c189aeeefc0c87fcb6ca6a75de4fa2db02e3bfd2809084ab1cff79c744e55c-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Start the Course Project App]]></video:title><video:description><![CDATA[I *totally* get it. The words "payment system integration" sound super intimidating, but *trust me*, by the end of this course, you'll be saying: > With LemonSqueezy, it's *easy peasy*! Let's check...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1077813438/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=824aa98b887f337b6609b00756424359d479a21f5893070cdab440376c7a1e93</video:content_loc><video:duration>266</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-04-23T09:05:15+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/installing-mailer</loc><lastmod>2026-01-30T14:15:50+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1973779250-e56e78412198e40fe30bf76192979d4f62673a37df637902f7e4332561dfd5c6-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing the Mailer]]></video:title><video:description><![CDATA[Hey friends! Welcome to "Symfony Mailer with Mailtrap"! I'm Kevin, and I'll be your *postmaster* for this course, which is all about sending beautiful emails with Symfony's Mailer component,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1049437454/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=17d6da8dcd18a9a64a4ce776eabb53ee8715a58184cb5ae3cd492f0de76dd6c0</video:content_loc><video:duration>201</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-01-23T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/sending-first-email</loc><lastmod>2026-01-30T14:15:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1974331525-29620fe6c642e4d789f70045f6c1e27cb172bb54ff026deab6d4fd00529df8db-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Sending our First Email]]></video:title><video:description><![CDATA[Let's take a trip! "Visit Krypton", Hopefully it hasn't been destroyed yet! Without bothering to check, let's book it! I'll use name: "Kevin", email: "kevin@example.com" and just any date in the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1049884898/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=cde9fd300d375ca84f8ca8aaf0b36119c5261ada9664b9239f737ef8f8b690cf</video:content_loc><video:duration>197</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-01-24T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/better-email</loc><lastmod>2026-01-30T14:15:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1975917684-c02b2afe02f7f180890200396086bb601d676cc184e3f1c284c4c3288edfc2c4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Better Email]]></video:title><video:description><![CDATA[I think you, me, anyone that's ever received an email, can agree that our first email stinks. It doesn't provide any value. Let's improve it! ## `Address` Object First, we can add a name to the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1051164504/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ed3efb0470da4aa2e2a35c0cea76f94eeab35f0b93356ba38b064ebf06d36308</video:content_loc><video:duration>191</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-01-28T14:36:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/mailtrap-email-testing</loc><lastmod>2026-01-30T14:15:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1975930205-d19e764bef8be5c7da3bf22bf11ea278b3aa1128855bafb1007bca8b87beeaea-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Previewing Emails with Mailtrap (Email Testing)]]></video:title><video:description><![CDATA[Previewing emails in the profiler is okay for basic emails, but soon we'll add HTML styles and images of space cats. To properly see how our emails look, we need a more robust tool. We're going to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1051176528/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=fdd41910344c7cc19545ac29900f59b7e038253aff6aed8b35d057f5d614c6ff</video:content_loc><video:duration>128</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-01-29T09:01:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/html-email</loc><lastmod>2026-01-30T14:15:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1976851405-3894dcc1d2faf463ae8584f55440adcbb2d4898127ff6f79129a42a827ea849e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[HTML-powered Emails]]></video:title><video:description><![CDATA[Emails should always have a plain-text version, but they can also have an HTML version. And that's where the fun is! Time to make this email more presentable by adding HTML! ## HTML Email Template In...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1051956270/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f009aeccb836461b2994b56fdb37c6ca4724aa65b4fce7ad2a5df4bedc75e269</video:content_loc><video:duration>227</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-01-31T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/css-email</loc><lastmod>2026-01-30T14:15:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1977367889-957f1ecff884781429fb3531def3b4532d313401bc193c511cb68ca7e00b34b3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[CSS in Email]]></video:title><video:description><![CDATA[CSS in email requires... some special care. But, pffff, we're Symfony developers! Let's recklessly go forward and see what happens! ## Add a CSS Class In `email/booking_confirmation.html.twig`, add a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1052394772/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5f6c5576ff37e345c24f3af185189c30136f3654f32126302f662a1a036398e2</video:content_loc><video:duration>252</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-02-03T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/inky-foundation</loc><lastmod>2026-01-30T14:15:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1979502253-3fa62ed34fb547562da35caa6b9001044c59c19b26dcaf4487b12ffd517173ec-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Real Email Styling with Inky & Foundation CSS]]></video:title><video:description><![CDATA[To get this email looking really sharp, we need to improve the HTML and CSS. Let's start with CSS. With standard website CSS, you've likely used a CSS framework like Tailwind (which our app uses),...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1054186732/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=eec8822b0e85bf2fe819cf96cbe962ee2e8cd23661e9c7e1746071f769483c8c</video:content_loc><video:duration>216</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-02-07T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/attachments-images</loc><lastmod>2026-01-30T14:15:52+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1980862863-61825909827f2f009541f45cd125f1ba55d43fa66ba50eab1cfaebae52e59d4b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Attachments and Images]]></video:title><video:description><![CDATA[Can we add an attachment to our email? Of course! Doing this manually is a complex and delicate process. Luckily, the Symfony Mailer makes it a cinch. In the `tutorial/` directory, you'll see a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1055315893/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=630ad68ee7f1c7d55344a6b5a53ddeead2edd6d3d37c48cf48498ad1aba7da07</video:content_loc><video:duration>229</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-02-11T09:01:40+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/global-from-email-events</loc><lastmod>2026-01-30T14:15:52+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1981790114-88f603a69ad5a01ab8c9eea6d780e1a147fb8d9cbb7b22cff27f9442c0e8f419-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Global From (and Fun) with Email Events]]></video:title><video:description><![CDATA[I bet that most, if not every email your app sends will be *from* the same email address, something clever like `hal9000@universal-travel.com` or the tried-and-true but sleepier...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1056101053/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3e28ad9f10be956a353f23787058c87c7c43d3c405a13d2b32af8741d342f0d0</video:content_loc><video:duration>246</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-02-13T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/production-sending-mailtrap</loc><lastmod>2026-01-30T14:15:52+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1984876946-578a9eec0896f76a584ef48a4f95de74e3285e2efb6023bb5beab549fa55fdaa-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Production Sending with Mailtrap]]></video:title><video:description><![CDATA[Alrighty, it's finally time send *real* emails in production! ## Mailer Transports Mailer comes with various ways to send emails, called "transports". This `smtp` one is what we're using for our...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1058652893/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=aae312bc39ddadde08757fe20d0e8c28a130658deffaa6331540efd5ba2f4e1a</video:content_loc><video:duration>220</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-02-21T09:05:57+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/tags-metadata</loc><lastmod>2026-01-30T14:15:52+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1986715496-fba8365ff5e90e8243c53441eadb0827d8722551f2f97cd0ec96aabac9b08639-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Email Tracking with Tags and Metadata]]></video:title><video:description><![CDATA[We're now sending emails for *realsies*. Let's just double-check our links are working... All good! ## Mailtrap Email Logs Mailtrap can do more than just deliver & debug emails: we can also track...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1060216618/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7ca7233772da09e2990a976b48f4d756b3ec135c642cbc244ca1135f4bd97ec5</video:content_loc><video:duration>217</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-02-26T09:05:32+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/async-email-sending</loc><lastmod>2026-01-30T14:15:52+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1987189433-f2ab346e9aaed0c043f90526eacca96f24b0241b93da39654ef86c94fcdccce5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Async & Retryable Sending with Messenger]]></video:title><video:description><![CDATA[When we send this email, it's sent right away - *synchronously*. This means that our the user sees a delay while we connect to the mailer transport to send the email. And if there's a network issue...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1060607604/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=09309799224586c1b3e99f237327afad33d3a90f22a268464b04dfecfcf8c5e6</video:content_loc><video:duration>219</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-02-26T20:52:22+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/console-urls</loc><lastmod>2026-01-30T14:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1989116775-167582d2d830f32422060a8a2ef5dd26f948b6a9717b280ee2913999b1e5791b-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Generating URLs in the CLI Environment]]></video:title><video:description><![CDATA[When we switched to asynchronous email sending, we broke our email links! It's using `localhost` as our domain, weird and wrong. Back in our app, we can get a hint as to what's going on by looking at...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1062230222/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=593efc1815c9e458d00955812e405684d63430615b35f396490433ddd49b1047</video:content_loc><video:duration>295</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-03-04T09:05:20+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/functional-test-emails</loc><lastmod>2026-01-30T14:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1991377226-d9d819a460d9029eab6d5551d93c98a8cbf2ce1d97ea4259b5d05647b8fb497e-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Emails Assertions in Functional Tests]]></video:title><video:description><![CDATA[Okay, testing time! If you've explored the codebase a bit, you may have noticed that someone (it could've been anyone... but probably a Canadian) snuck some tests into our `tests/Functional/`...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1064126115/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=29119ea7ffa8af2b8926029218fd6624ef672fc1aaf44a80f681d4e5bb115fa7</video:content_loc><video:duration>361</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-03-10T01:20:37+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/twig-email-layout</loc><lastmod>2026-01-30T14:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1992694515-1e2fda32a337226f7c4562411ce4460710a610d965b6fe16c18170fea8f635bc-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Email Twig Layout]]></video:title><video:description><![CDATA[New feature time! I want to send a reminder email to customers 1 week before their booked trip. T minus 1 week to lift off people! ## Symfony CLI Worker Issue First though, we have a little problem...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1065226989/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a8007f43bb6a2676a074c1e82259950838098ab76bdaf097408a40b1f3ef3277</video:content_loc><video:duration>272</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-03-13T09:05:15+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/cli-command-email</loc><lastmod>2026-01-30T14:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1994899455-e029c2321ec889a4f6ba1f77912ac31baf572a5e3ff21d2f93cdfd505698f3d6-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Email from CLI Command]]></video:title><video:description><![CDATA[We've done the prep work for our reminder email feature. Now, let's actually create and send the emails! ## Reminder Email Template In `templates/email`, the new email template will be super similar...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1067059930/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d5b5fa41e2b158772fe028209782374701df920afef33014016fda9a66dc07bb</video:content_loc><video:duration>272</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-03-19T09:05:54+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/cli-command-functional-test</loc><lastmod>2026-01-30T14:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1999749896-3cd5cebc9f7582b158c7c0d1e8ec60aa3a5dc32222a1c9641732aed2dc233d67-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Test for CLI Command]]></video:title><video:description><![CDATA[The captain is tired of people running after the rocket because they show up late! That's why we created a command to send reminder emails! Problem solved! Now let's write a test to ensure it *keeps*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1071091357/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1bb4113399ecd329d8d85cc7dc515b9e45b5d3341957741a5cc312c3c8da451f</video:content_loc><video:duration>283</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-04-01T09:05:22+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/email-factory-service</loc><lastmod>2026-01-30T14:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2000198280-e4f4821e85157c94e5f28ae0f0af07c8b6f974656d88ac7ffb7df654e8f7c007-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Email Factory Service]]></video:title><video:description><![CDATA[Our app sends two emails: in `SendBookingRemindersCommand`, and `TripController::show()`. There is... a lot of duplication here. It hurts my eyes! But no worries! We can reorganize this into an...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1071465604/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7d777da5a5d68658fddfa555084714a2e8ef87aa13e0aa589205ddd4a1577465</video:content_loc><video:duration>269</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-04-02T09:05:41+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/email-event-webhook</loc><lastmod>2026-01-30T14:15:54+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2001303441-fc971697e42311422e00c2bca053b83203f15a22859e51fecc632f2b4c9dbc97-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[The Webhook Component for Email Events]]></video:title><video:description><![CDATA[In Mailtrap, when we send emails in production, remember that we can check each email: was it sent, delivered, opened, bounced (which is important!) and more. Mailtrap lets us set a webhook URL so it...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1072396064/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8a6144b52e2210401869dbf7788c82fc368dee09ae6c5eaf357aacb254e96e7d</video:content_loc><video:duration>229</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-04-04T09:05:55+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/webhook-demo</loc><lastmod>2026-01-30T14:15:54+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2001902141-6fcd209ccd889e1cef80e488b159d36f28ea5e4c0f2d9367d617529d2b8d86b8-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Demoing our Webhook via a Wormhole]]></video:title><video:description><![CDATA[Time to test-drive the Mailtrap webhook! First, we need to switch our development environment to send in production again. In `.env.local`, switch to your production Mailtrap `MAILER_DSN` and in...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1072886913/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8c72cc98589ea90fe8988771aa078213bcbce4e7efccc892f2ac69a381fefd16</video:content_loc><video:duration>199</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-04-07T09:05:48+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/bonus-symfony-scheduler</loc><lastmod>2026-01-30T14:15:54+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2010468761-b53ae8341b601fad49f5dae1d8614dab231b989a16bf9cb5bf3b3ed4c5f142e7-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Bonus: Scheduling our Email Command]]></video:title><video:description><![CDATA[Hey! You're still here? Great! I have a bonus chapter for you. One of our interns, Hugo, is complaining that he has to log in to our server and run the booking reminders command, every night at...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1079950862/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=aaf8f9062c340249f09e92e8507093fb087c290ae2bf0c7f1efe95d344d18e8c</video:content_loc><video:duration>349</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-04-08T09:05:49+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailtrap/messenger-monitor-bundle</loc><lastmod>2026-01-30T14:15:54+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2013782686-89330589141eac2a7d65684a0a7796f9bc3d667a5552013bf6c688fce3eba8ae-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Bonus: Messenger Monitor Bundle]]></video:title><video:description><![CDATA[Hey, you're *still* here? Great! Let's do one final bonus chapter! When you have a bunch of messages and schedules running in the background, it can be hard to know what's happening. Are my workers...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1082733602/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=db3e48ba5f44fdf2bd4fe002eed16ccfb8ee31501d2aa00462ce50c9d0b4c7ee</video:content_loc><video:duration>476</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2025-05-09T01:59:47+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-doctrine/installing-doctrine</loc><lastmod>2026-01-30T12:36:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1954695447-df4d0d454f490095be143bb7e40ab922a307d368803c11946a8dd3c64823a67c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing Doctrine]]></video:title><video:description><![CDATA[Yo friends! It's time for episode 3 of our Symfony 7 series. And this is an *exciting* one because we're bringing our app to life with a database. We don't *need* any new libraries to do this, but...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1032042869/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=edac0d9aba6ea9351471f2da217f5cec77c51fc7ebf250c45ecab968070bedda</video:content_loc><video:duration>231</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-11-24T05:29:27+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-doctrine/database-setup</loc><lastmod>2026-01-30T12:36:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1966521395-2197008da10e7feda3f18766edd8962db341b50666c7310429f8999167234bc3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Database Setup & Docker]]></video:title><video:description><![CDATA[All right, we have Doctrine installed! But now we need, ya know, to get a database server running. ## `DATABASE_URL` Environment Variable Take a look at our `.env` file. When we installed Doctrine,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1043329015/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=223164b5dc1e59903f29ad41239f46739b83f98727bd36a66cfc14592da0778a</video:content_loc><video:duration>233</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-11-24T05:29:36+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-doctrine/entity</loc><lastmod>2026-01-30T12:36:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1953373922-5a3498ffb72390c71c38c48bd0820f20e3cbd73fa240d5e04658813ef0b8b152-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Starship Entity]]></video:title><video:description><![CDATA[We have a database and can connect to it but... it doesn't have any tables! The Doctrine ORM uses PHP classes to represent tables in the database, like if you need a table for products, you create a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1032448296/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8946dfd37ecebae22cc01a3cd4265ac55be40a5044585cc8a81776de8ad54354</video:content_loc><video:duration>284</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-11-27T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/dependency-injection-attributes/introduction</loc><lastmod>2026-01-27T18:11:37+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1935222721-d9d0054c322e9e24353ec4452855700e4ae55a6ab350a3ce863c5b1fab519b98-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Introduction]]></video:title><video:description><![CDATA[Hey friends! Welcome to a brand new course that's all about *Dependency Injection Attributes*. What *are* Dependency Injection Attributes? Well, here's a little history lesson: ## A Brief History of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1017182216/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0036d03aa22cb9fcc6cf39a44c6299d5979dff9221d58022e7a7e34dd16dd2e9</video:content_loc><video:duration>387</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-10-08T08:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/dependency-injection-attributes/command-pattern-with-autowirelocator</loc><lastmod>2026-01-27T18:11:37+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1935811578-b3e51c167246a45f0a058ce1ab8e5c7760378d5e253969471004bf85806731c4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Command Pattern with AutowireLocator]]></video:title><video:description><![CDATA[Let's *do this*! If we take a look at our app, *this* is the UI for our remote. It’s basically just a form, and each button *submits* the form. The `name` attribute for each button is unique, and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1017747865/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4694ba9a963933842c86430c64ba6187c19103362338c50ce6888de1f78b497a</video:content_loc><video:duration>387</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-10-09T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/dependency-injection-attributes/simplify-with-autoconfiguretag</loc><lastmod>2026-01-27T18:11:37+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1936599337-c3f97e5cbeebc5124be9034b1d3782c4d098c62e0475b6882e8c00b28da5afca-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Simplify with AutoconfigureTag and AsTaggedItem]]></video:title><video:description><![CDATA[In the last chapter, we refactored the big `switch` statement in our controller to this little try-catch. Our remote works the same way it did before, but now we're using the *Command pattern*. We...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1018406684/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7b6360576f49d90ee0c6fd71d60836f1295b2a4ea80b62e1f9d8f80f3b3136a4</video:content_loc><video:duration>170</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-10-11T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/design-patterns-2/intro</loc><lastmod>2025-07-02T17:24:11+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1899514378-d5e86c70c8b243752fc728c80b233ccedee9baf8b6793b0f349ba78e6a5656db-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Introduction]]></video:title><video:description><![CDATA[Hey friends! Welcome back to episode *two* of our Design Patterns series! In this episode, we'll continue our journey of building the *greatest* command-line RPG game *ever*! To do that, we'll apply...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/984093106/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3ab58363448ea345dc379865e08dfb8ca1a7f73b72dd95209fd5241fa661f135</video:content_loc><video:duration>214</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-07-15T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/design-patterns-2/command-intro</loc><lastmod>2025-07-02T17:24:11+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1901743150-6355430110dedd2d785dae4a4897662d1a08d59136663d82412a184c207b00d3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Command Pattern]]></video:title><video:description><![CDATA[Ready for a new design patterns episode? Grab a cup of coffee and settle in, because we're taking a deep dive into the *command pattern*! We'll start with the basics - the definition and theory....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/986188229/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=52c2ad9bde36dedea0a2e78662f80c6d4540435469ace4630b69abec5728b2fc</video:content_loc><video:duration>221</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-07-17T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/design-patterns-2/command-coding</loc><lastmod>2025-07-02T17:24:12+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1903610853-ef481ace2a7898b51c6b356e5deea7b6501b0d9db0e44c253569da8c2502e561-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Adding Actions to the Game]]></video:title><video:description><![CDATA[Our investors have asked for a new feature: "make the game more interactive". Those stakeholders are so funny... Ok so, instead of running battles automatically, they want the player to be able to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/987986648/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f177a86d74a6ac97d4899cdebfdf51f72ee8ba349142f23544fba4eade82bacf</video:content_loc><video:duration>204</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-07-22T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/design-patterns-2/command-actions</loc><lastmod>2025-07-02T17:24:12+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1904783374-f60b8864f380be6a95819074dd74b98f32ade1861cfecd0a4330f824614eb72f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Implementing More Actions]]></video:title><video:description><![CDATA[All right! We're ready to add more actions to our game and allow players to *choose* their actions. *First*, we need to create an *interface* for our commands. To do that, inside the `ActionCommand`...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/989087668/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=af8a12a635acf80d32bcb7c267d3a5e8cf974b016db5e582ceb8f88fdbcadacc</video:content_loc><video:duration>195</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-07-24T09:01:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-fundamentals/setup</loc><lastmod>2026-01-30T14:56:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1866222657-721ab7f7b33f8d163095c17ca1b4640f2c0a24f6e20f3a2a4c1b49aee782e18f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Setup, Services & the Service Container]]></video:title><video:description><![CDATA[Hey friends! Welcome back to Episode *2* of our Symfony 7 tutorial. I’ll be your brave - or maybe foolish guide through topics I absolutely *love*.. No matter what you do with Symfony, the most...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/955099116/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0a5e810a2e9c07c54b370ac362b20a7601c1d4e6aa2ec6e9de9d7e08637fa877</video:content_loc><video:duration>265</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-06-10T09:01:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-fundamentals/time-bundle</loc><lastmod>2026-01-30T14:56:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1865913034-c31485d1712dcbcd3e69b613558a8048248724373769de50a09b1f869f1e32f7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[KnpTimeBundle: Install the Bundle, Get its Service]]></video:title><video:description><![CDATA[On our site, customers have a convenient "Ship Repair Queue" that lists all of the ships being repaired and their status. For this tutorial, we've added a new `$arrivedAt` field to our `Starship`...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/954848253/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d17dc5209e6bcadfa9102f89254e1f5ce439f15fa81ee5c334d044152c501e2d</video:content_loc><video:duration>290</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-06-10T17:37:36+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-fundamentals/http-client</loc><lastmod>2026-01-30T14:56:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1868264649-330313388bdc5b022c32753505e44495b2160364d78e9ea663d404424ff4ab71-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The HTTP Client Service]]></video:title><video:description><![CDATA[We know that Symfony is a collection of *a ton* of independent, teensy tiny PHP libraries, called "components". We only have a small number of them installed right now, but as we need more features,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/956571475/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f7c4ff4750bc9f82a32348a1e98cf9e4013dc2d6797c8e391e206059a3d29917</video:content_loc><video:duration>375</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-06-12T02:37:21+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony7-upgrade/upgrade-64</loc><lastmod>2024-08-16T10:47:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1788255943-7ef5a7d7cc21e5662d18a600dcb983f2f0d0d96e6801e53d911435ec886c32f3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Upgrading to Symfony 6.4]]></video:title><video:description><![CDATA[Hey everyone! Symfony 7 is out! Woo! Well, of course *I'm* excited - I love all things Symfony, Twig, related. But what does it really *mean* that Symfony 7 is out? ## Symfony's Delightfully...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/906454587/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=23143613b876e92d556a918b1b31da096d290491df1afbf1cf95c44c11f555a6</video:content_loc><video:duration>421</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-01-29T09:11:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony7-upgrade/upgrade-recipes</loc><lastmod>2024-08-16T10:47:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1788258162-acb8614dfacd3005f8d3d71a439e369113349ba7f33d28a267a41dea5f67219d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Flex Recipe Updates]]></video:title><video:description><![CDATA[When we install packages, many of them have Flex recipes. These add new files and sometimes modify existing files. They do everything needed so the package works immediately. I love that! And, over...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/906461247/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d43b3693f914ada72034245a0a923619e852706d4852836b3693a6f82f999f6b</video:content_loc><video:duration>364</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-01-30T09:16:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony7-upgrade/encore-upgrades</loc><lastmod>2024-08-16T10:47:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1790733391-9fa05d1eb326bf84ef967b60d0c5a32a4b7002a613d451af487ba5e9a8786aa7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Encore, StimulusBundle & their Recipe Changes]]></video:title><video:description><![CDATA[Let's keep upgrading recipes. ## symfony/twig-bundle Recipe Update Next up is TwigBundle. This has a conflict in the one file it updated: `templates/base.html.twig`. And... it's odd. You can see our...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/907964967/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8683e7e5ebc1e2f78f46b82e5d94c63ac8a0005519285c6123f884f153471409</video:content_loc><video:duration>487</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-01-31T10:46:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/setup</loc><lastmod>2026-01-30T14:57:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1804760222-d103ef71c3a303150c9ed3c368da36bcd806e0adbca47b7aedf5241c890bba96-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Setting up our Symfony App]]></video:title><video:description><![CDATA[Welcome to the first Symfony 7 tutorial! My name is Ryan - I live here in the fantasy world of Symfonycasts and... I am *beyond* excited to be *your* guide through this series all about Symfony, web...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/916786798/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=025fcb568fb81602db6ec8ee79e0853a7a87e0b3a505e1bdc94fdffcf67799af</video:content_loc><video:duration>274</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-02-27T09:21:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/directories</loc><lastmod>2026-01-30T14:57:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1804761626-460651549df96516a8d7f6942fbc5a47bead9d401a6218e54279a9790afb7cbc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Getting to Know our Tiny Project]]></video:title><video:description><![CDATA[Sprint back to your command center (aka terminal). This first tab is running the web server. If you need to stop it, press Ctrl-C... then restart it with: ```terminal symfony serve ``` ***TIP You can...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/916789049/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=9f897fc9429e089c80f4b480a47e9e11b5cb260d84b28145e33d6e25edb7f468</video:content_loc><video:duration>254</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-02-28T07:16:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/route-controller</loc><lastmod>2026-01-30T14:57:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1805815380-941638d14b77386e7f02651d38ba069ee3b9d214960bd592475f3193caa0fb12-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Routes, Controllers & Responses]]></video:title><video:description><![CDATA[Ok, here's the scoop. Wesley Crusher - everyone's favorite ensign from Star Trek - has retired from Starfleet and is working with *us* to start a new business: Wesley's Star Shop. Someone's gotta...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/917473830/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f8c7df4eaae0594d2e36f672656788292cc52f01c9b76c4e3e69b3286e8e6271</video:content_loc><video:duration>377</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-02-28T12:11:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/flex-recipes</loc><lastmod>2026-01-30T14:57:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1806078143-670a75dd20232917666b8c00411745283e1db5384e41fe60036dbd090ac0e972-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Magical Flex Recipes]]></video:title><video:description><![CDATA[I have a secret. When our project was created, it wasn't 15 files. It was... *one* file. If you peeked inside the code for the `symfony new` command, you'd discover that it's a shortcut for just two...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/917616779/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=98906178678fd4643dd99a68fe086fa6876120966b30618e01c3e77d934076da</video:content_loc><video:duration>340</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-02-29T09:31:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/twig</loc><lastmod>2026-01-30T14:57:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1807102895-b631dda797b53cd3aebe1eb13d5aa99533f74a884d6d1322acac88c7347039b8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig & Templates]]></video:title><video:description><![CDATA[I want to return HTML for this page. We *could* put that HTML right inside the controller... but that's going to get ugly fast. Fortunately, there's a better way: by using a templating library called...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/918141480/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0fe72e953322e94d1131a4d051a0c09c254ea86fd03c269f9d90a62451e74b18</video:content_loc><video:duration>492</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-01T13:31:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/twig-inheritance</loc><lastmod>2026-01-30T14:57:10+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1806814553-0af444966023abdcb102d55ae282f2aafc67e3000ae1d86fb3a756869d8eeb36-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig Template Inheritance]]></video:title><video:description><![CDATA[What about adding a layout to our page - like a header and a footer? Take a peek at the HTML for the page: it's *just* the HTML from the template. There's nothing special in Twig where a base layout...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/917239659/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3775e88bb7c71b8a6c117ee8f74ee69fcaf562dfdd516c21f65efb0903497fd6</video:content_loc><video:duration>230</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-04T09:31:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/profiler</loc><lastmod>2026-01-30T14:57:10+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1810088193-ef962170ff962baa5d544795155d7e730ce5dfdf6f31ec2ef9f1c090d01d2dbe-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Debugging with the Amazing Profiler]]></video:title><video:description><![CDATA[Symfony boasts some of the most *epic* debugging tools of all the Internet. But because Symfony apps start so small, we don't even have them installed yet. Time to fix that. Head over to your...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/920186472/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=775a2477eb2cd3c82e2f2d306f9a52a86c9cef87e180d80fa137a5e34a4bf7e0</video:content_loc><video:duration>268</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-07T09:26:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/json-api</loc><lastmod>2026-01-30T14:57:10+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1810090368-49134bf5d59083dd15c8faaa1a2f89a014af7843eeda8290001b79eff4349f44-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating JSON API Endpoints]]></video:title><video:description><![CDATA[If you want to build an API, you can *absolutely* do that with Symfony. In fact, it's a *fantastic* option in part, because of API Platform. That's a framework for creating APIs built on top of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/920199015/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4b0a83bf8f4e7c8d059b5b433dc44b0dd22192154cf3af3666cd211c4d9ed7fc</video:content_loc><video:duration>437</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-08T09:31:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/services</loc><lastmod>2026-01-30T14:57:10+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1810694186-b1f15d7ad6a721c7fab9464345dee9156712615684ae6e3d6eddea0df6355ccc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Services: The Backbone of Everything]]></video:title><video:description><![CDATA[Let's talk about services. These are *the* most important concept in Symfony. And once you understand them, honestly, you'll be able to do *anything*. ## What is a Service? First, a service is an...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/920532764/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=27c9d6005dd3911b602f2ffc693bced2490e5181192d7293b0001903efa1f7f1</video:content_loc><video:duration>467</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-11T09:26:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/create-service</loc><lastmod>2026-01-30T14:57:10+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1817994800-a7b312c1c103ba991458e6080cd2869672bc80bcc8760f5ba15a26a8c4242e7f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating your own Service]]></video:title><video:description><![CDATA[We know that services do work, and we know that Symfony is full of services that we can use. If you run: ```terminal php bin/console debug:autowiring ``` We get the dinner menu of services, where you...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/924826111/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=122333f52b4e20a77232495ce621a240399f1dad1d9630c0066053c0b5ddbfbb</video:content_loc><video:duration>424</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-19T09:21:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/route-requirements</loc><lastmod>2026-01-30T14:57:11+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1820089869-4e2f680a150f0895c5b013ce29a1b66ab05f775e02d557b8a8153c58eb542218-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Fancier Routes: Requirements, Wildcards, and More]]></video:title><video:description><![CDATA[With all the new code organization, let's celebrate by creating another API endpoint to fetch a *single* `starship`. Start like usual: create a `public function` called, how about, `get()`. I'll...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/926073928/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=cf1791ce8e209a6e74dc9f3cc4a34524c8dcab2ab2ad165f5bedecd73dbddbad</video:content_loc><video:duration>416</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-22T09:26:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/generate-urls</loc><lastmod>2026-01-30T14:57:11+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1820102846-8d363b900e5f5be278e416eda115af9015fe4e7f362cc178ec05c949037955ca-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Generating URLs]]></video:title><video:description><![CDATA[Let's create a "show page" for ships: a page that displays the details for just *one* ship. The homepage lives in `MainController`. And so we *could* add another route and method here. But as my site...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/926083630/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=9954649f417b095205d32e09a6720fddb6b7f14b2c8e46dadc4a5cf8df920dbb</video:content_loc><video:duration>331</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-22T12:35:42+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/asset-mapper</loc><lastmod>2026-01-30T14:57:11+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1823108978-9372ae19914f17afb8ff11d284bb6a0ed1eec2fe4af2c5e8d75693a4508f74e9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[CSS & JavaScript with Asset Mapper]]></video:title><video:description><![CDATA[What about images, CSS and JavaScript? How does that work in Symfony? ## Stuff in public is... Public First off, the `public/` directory is known as your document root. Anything inside `public/` is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/927953871/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=cdbeed963a8812c801fb802505f819916ab80652444cd7531661af7206116a7a</video:content_loc><video:duration>377</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-22T12:35:44+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/tailwindcss</loc><lastmod>2026-01-30T14:57:11+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1820716161-eff9302c1cfc1017ab89c1b9296399ef40dc9cae352ed4bfeba3f5330371074f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Tailwind CSS]]></video:title><video:description><![CDATA[What about CSS? You're free to add whatever CSS you want to `app/styles/app.css`. That file is already loaded on the page. Want to use Bootstrap CSS? Check out the Asset Mapper docs on how to do...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/926475759/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6f0f99b3e17ddc7e5390c357c6efed66b79067f0a52454231bef95da38b80d74</video:content_loc><video:duration>375</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-27T09:11:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/partials</loc><lastmod>2026-01-30T14:57:12+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1820717027-81734251e87ec6dadfdd65cde70e0c9174a5e9c16196f64dbf97e73559b19c51-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig Partials & for Loops]]></video:title><video:description><![CDATA[We just gave our site a design makeover... which means we updated our templates to include HTML elements with a bunch of Tailwind classes. The result? A site that's easy on the eyes. For some parts...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/926477021/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c21536e07580cf890772d2f6822baf660fb37cfaa0797ec5d96022edb8ad4a16</video:content_loc><video:duration>164</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-28T09:16:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/enums</loc><lastmod>2026-01-30T14:57:12+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1821822414-31cd06de42f55c5611dfc992cfebde2b79eed7cb311451843231bce450921f57-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[PHP Enums]]></video:title><video:description><![CDATA[Inside the loop, making things dynamic is nothing new... which is great! For in progress, say `{{ ship.status }}`. When we refresh, it prints! Though, yikes! The statuses are running *way* out of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/926479640/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f5b4fa8b780927ef55eb4eb10a145a1ea278d2baebb8497c400cb2504a991c72</video:content_loc><video:duration>210</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-28T12:59:31+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/design</loc><lastmod>2026-01-30T14:57:12+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1821833162-85cc7c56caa459fa064be72a34f0e2252400380f513c6e992c3f52eff27fe39a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Smart Model Methods & Making the Design Dynamic]]></video:title><video:description><![CDATA[Adding the `.value` to the end of the enum to print it works like a charm. But I want to show another, more elegant, solution. ## Adding Smarter Model Methods In `Starship`, it'll probably be common...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/927129250/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f3cbf10afd7c215757a5c03e666bfb70fae1e497a69e800ce68b19fd881c647d</video:content_loc><video:duration>284</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-28T12:59:31+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/stimulus</loc><lastmod>2026-01-30T14:57:12+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1821990174-3573b3ac80c8e69990591b3b0bbd20abdd1c144dcbef2769f714b4a2b5a21367-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Stimulus: Writing Pro JavaScript]]></video:title><video:description><![CDATA[We know how to write HTML in our templates. And we're handling CSS with Tailwind. What about JavaScript? Well, like with CSS, there's an `app.js` file, and it's already included on the page. So you...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/927240082/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=efb357264312412bfb88a7735dcbf6729dccb51bcf7c618d2558543fe2084933</video:content_loc><video:duration>480</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-28T12:59:32+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/turbo</loc><lastmod>2026-01-30T14:57:12+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1823147936-5fb4fcedf38bc7d96cad4dfc9ec718001d4d48814959027a54e0b567a5019179-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Turbo: Your Single Page App]]></video:title><video:description><![CDATA[When I build a UI, I want it to be beautiful, interactive, and smooth. Personally, I choose *not* to use front-end frameworks like React or Vue or Next. But you *can*... and there's nothing wrong...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/927981917/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b3d4a666dc217dacb317db0be42320523fdb8185bcba30662a1b4ba5bd6b5729</video:content_loc><video:duration>272</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-28T12:59:32+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony/maker</loc><lastmod>2026-01-30T14:57:12+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1823156313-3d88f6a907cd9e3919c77dc95b9edc5ddb1540e7215a5426c803a0673141440d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Maker Bundle: Let's Generate Some Code!]]></video:title><video:description><![CDATA[Hats off for nearly making it through the first Symfony tutorial. You've taken a huge step toward building whatever you want on the web. To celebrate, I want to play with MakerBundle: Symfony's...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/927986159/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f39655c58d0c3ea0554d626d699e7013ef4c040b6fc28c1b9aa6059599dc2806</video:content_loc><video:duration>313</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2024-03-28T12:59:33+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/last-stack/last-stack</loc><lastmod>2026-01-30T14:16:48+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1761774769-cc9216d94c24df6ed7f4076bbdf81cb57cbb887f9f66b780ea772adf1b34b62f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hello LAST Stack!]]></video:title><video:description><![CDATA[Hey everyone! Welcome to 30 days of LAST Stack! I gotta say, this might be my favorite tutorial ever. I had an absolute blast building this, because unlike usual around here, I'm going to go a little...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/889864575/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f780fe2a0ed2eb7858ab14ee6e7751f0f9885a582be8f7aec80ef337e5dfa27e</video:content_loc><video:duration>241</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-12-01T09:56:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/last-stack/asset-mapper</loc><lastmod>2026-01-30T14:16:48+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1761775115-64452053e982b9445fd84fd483427ffdda05e99bdfcebf2d11eaf99c3f1788b1-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Asset Mapper]]></video:title><video:description><![CDATA[Okay, so how are we going to bring CSS and JavaScript into our app? Are we going to add a build system like Vite or Webpack? Heck no! That's one of the fun things about all of this! We're going to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/889921980/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8d2a664077b33575010537771d70da4c46f26f0052d78eac3e6e3ee411c773a2</video:content_loc><video:duration>318</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-12-01T21:04:34+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/last-stack/js-modules</loc><lastmod>2026-01-30T14:16:48+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1761778748-b61d584be20ae7fd026f2ea8dabb2b57e51dce870506c012805dc2bcd8c23851-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[JavaScript Modules]]></video:title><video:description><![CDATA[Inspect element on this page and head over to the browser console. Ah, we've got a console log that says it comes from `assets/app.js`. And sure enough, if we spin over and open that file... there it...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/889929985/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=356f00b1d8155bb364f11adcf70b8605d18e96facce3b5e8351b1c66bb0be82b</video:content_loc><video:duration>393</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-12-01T21:04:35+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/last-stack/js-packages</loc><lastmod>2026-01-30T14:16:48+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1763754833-23d9f00c180bf3026986f6b2d8d33e8a2857ad844d1f8c264533cbcab3b3610d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[3rd Party JavaScript Packages]]></video:title><video:description><![CDATA[Welcome to the fabulous day 4! Where we're already creating JavaScript modules... a fancy term that means we're writing import statements and export statements. And we're pulling this off entirely...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/891205213/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6da64343f87515ae4f17981b700992bebe4516315d69a4c812e46370d8ba2c66</video:content_loc><video:duration>305</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-12-04T20:21:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/last-stack/css</loc><lastmod>2026-01-30T14:16:48+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1763764117-272e2746e0dc76ae3da967b11bc23aad1564a0d650dec77acdcdae9db6827c33-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[CSS]]></video:title><video:description><![CDATA[Day 5 already? We're flying! It's time to add some CSS to our site. So how does that work inside AssetMapper? ## Including a Manual link Tag? Well, we already have an `assets/styles/app.css` file....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/891210561/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=cf4d5d33fdb11a54bcea4b217bb1517fd716eb305d864e0568921d9dc3539e74</video:content_loc><video:duration>382</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-12-05T09:21:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/last-stack/tailwind</loc><lastmod>2026-01-30T14:16:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1794194558-739a5c034589ec7f5f8806b2b089ad8bd589b28d977184aeb4a6d54fd78570dd-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Tailwind CSS]]></video:title><video:description><![CDATA[I love using Tailwind for CSS. If you've never used it before, or maybe only heard of it, you might... hate it at first. That's because you use classes inside of HTML to define *everything*. And so...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/910291191/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=381999cb02f72f566a9d8a99b7bf3ccfb451a219443cc4e7f4e90faabd2de954</video:content_loc><video:duration>564</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-12-06T09:41:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/last-stack/stimulus</loc><lastmod>2026-01-30T14:16:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1764957220-685125408696c2283e4b4a0bb1689dfb9d6d77df5a62c7d32ca1cb125a913d13-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Stimulus]]></video:title><video:description><![CDATA[Welcome to lucky day number 7. Today we're talking about Stimulus: a small, easy-to-understand JavaScript library that lets us create super-organized code that... just always works. It is one of my...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/891940663/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5ba903c7a58aa542166134dc747ce2fbcd3822106b8ae73fe1d87fbd43b4c4ec</video:content_loc><video:duration>405</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-12-07T09:56:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-extending/install</loc><lastmod>2026-01-30T14:56:30+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1717715267-50f000081e8e75d383bd63bf1b5adcb24da1a49ddffab3fd2981355391f95251-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Setup & Ways to Extend API Platform]]></video:title><video:description><![CDATA[Fasten your scales, dragon enthusiasts! It's time to dive into the third episode of our riveting API Platform saga: the episode where things get... let's say: more advanced and interesting. Episode 1...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/859791190/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6cc4cff9beccec8a1b9c9950503f012fddf6c18155ef02e1c8af26fdf9896180</video:content_loc><video:duration>279</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-09-04T09:41:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-extending/custom-field-provider</loc><lastmod>2026-01-30T14:56:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1717714165-510da73e9be38639699d18cc33fd49a6b96ff636fc500566ed8e9cda757280f3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[State Providers, Processors & a Custom Field]]></video:title><video:description><![CDATA[API Platform 3 rolled out snazzy new concepts called State Providers and State Processors. We chatted about them in the last tutorial and we're going to dive even *deeper* in this tutorial. ##...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/859788988/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=04ffc135153e56542fde008fa79bcadacea309c979976e0db63d80d4e7fed90c</video:content_loc><video:duration>289</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-09-05T09:46:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-extending/decorated-state-provider</loc><lastmod>2026-01-30T14:56:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1717714729-e82f1c69046c5069a4f34b791288fb7272c92731ac5556c86754ac0918d8f3d5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Decorating the Core State Provider]]></video:title><video:description><![CDATA[To populate the non-persisted property on our entity, we'll leverage a custom state provider. Create one with: ```terminal php bin/console make:state-provider ``` Let's dub it...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/859789470/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=aaf38f7a7cb77080bf1d94822022ffae986da8adde8629106415e7a40151ff89</video:content_loc><video:duration>287</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-09-06T09:46:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-extending/custom-field-collection-provider</loc><lastmod>2026-01-30T14:56:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1719853284-ab340e28b77170e5a1c83d6eee709018e0a1d19238fc7017f5f841182c5c1eef-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Decorating the CollectionProvider]]></video:title><video:description><![CDATA[Let's boldly do something that scares most us developers: run the *entire* test suite: ```terminal symfony php bin/phpunit ``` These were obediently passing when I started the tutorial... but they've...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/861351073/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=140c4908051441bebb52920dd89cbfffdfa83761437501d9933368d9bb38ef48</video:content_loc><video:duration>432</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-09-07T09:46:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-extending/simpler-state-processor</loc><lastmod>2026-01-30T14:56:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1719853674-dc5502e815a914a9cd8f49b14f2714780a4dbdef95e940c4217be09b4158fdc3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Simpler State Processor]]></video:title><video:description><![CDATA[Publishing a `DragonTreasure` is easy: make a `Patch` request to the treasure endpoint with `isPublished` set to true and... celebration! But... what if, when a `DragonTreasure` is published, we need...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/861352419/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7d85783aa8e745b445d2ec26e6dd177db1e43858783ba07a0a478a382fa45cc9</video:content_loc><video:duration>347</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-09-08T09:46:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-extending/on-publish</loc><lastmod>2026-01-30T14:56:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1719852862-76f2450dff14e92f95e5a33edd2d79f3a8e0250d2e0d051482e81ebc71f62fa4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Running Code "On Publish"]]></video:title><video:description><![CDATA[Oh, quick, minor thing about state processors. The `make:state-processor` command created the `process()` method with a `void` return. And... that makes sense. API Platform passes us the data and our...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/861349830/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2f9c9bd6ef4d3a2667e50802bf0f7fbe6c210956d1558a088d218521cd3b2df2</video:content_loc><video:duration>365</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-09-11T09:51:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-extending/custom-resource</loc><lastmod>2026-01-30T14:56:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1722785164-27bb8cc38e24029d709ed6b5c0caa89e8591dbcd4f30ca5afb152798bbe4d1fa-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Totally Custom Resource]]></video:title><video:description><![CDATA[So far, we have *two* API resource classes: `DragonTreasure` and `User`. And both are *entity* classes. But having your `#[ApiResource]` attribute above an entity class *isn't* a requirement. You can...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/863521692/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=806bbd7c2a730103356ffa8ae601b2c416eada3b137a764f18bb5ec08e10acf5</video:content_loc><video:duration>259</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-09-12T11:21:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-extending/custom-resource-provider</loc><lastmod>2026-01-30T14:56:32+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1723308956-81e0f7a1593b8f33beb028d4d12b856c7253ad6e589d3496df2a1b4aeb34cc1b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Custom Resource State Provider]]></video:title><video:description><![CDATA[We have a shiny new API resource class and... for the most part, we'll use it like normal. ## Customizing ApiResource Options For example, instead of `DailyQuests`, maybe we change the `shortName` to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/863941546/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3722293d6baf7383a4729b26596934d01dde47b21ea2ce72e52f203138c999dc</video:content_loc><video:duration>304</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-09-13T11:06:41+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/asset-mapper/setup</loc><lastmod>2026-03-17T17:09:38+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1690520394-b77f23f00ece5d876d1c3294578d8858f7b70e6b187dc4b96390daccff236200-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[A World without Build Systems?]]></video:title><video:description><![CDATA[Whoa, hey! Welcome to my frontend laboratory where we're going to do something that I *honestly* thought I would *never* do again. Something bold! Something... maybe just a bit crazy. We're going to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/840494734/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=76fae05b65b723f4bb8c8d48deee10e8a302a87e9083db1cb633bfaa3cbaa438</video:content_loc><video:duration>244</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-06-28T17:33:36+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/asset-mapper/es6-browser</loc><lastmod>2026-03-17T17:09:38+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1690596247-694325a430c8d225679458753b6e6df6906261dbf693c1a2e98594c1ecdc3a6f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Doing Modern JS Right in your Browser]]></video:title><video:description><![CDATA[Before we talk about *anything* related to Symfony, we're going to strip things down to the bare minimum and prove that we *can* code modern JavaScript, right in our browser. ## Directly Loading Some...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/840548912/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=61f23b388e2ff829bcce272bc0676836815e18cb7d0ca9bc567bd16584c0ddad</video:content_loc><video:duration>461</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-06-30T09:41:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/asset-mapper/install</loc><lastmod>2026-03-17T17:09:38+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1690651784-dbb668103cc9a62d2812dc3d22705a66e18900711349c1d164ee25802f3a7a5b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing AssetMapper]]></video:title><video:description><![CDATA[We now know that we can run modern JavaScript directly in our browser. But to help smooth the process, we're going to install a new Symfony component called AssetMapper. Find your terminal and run:...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/840554058/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c722260464fcc62aaddeb9da1c05bdddca355aa5def5027f4dfd461a696e9638</video:content_loc><video:duration>183</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-06-30T21:24:15+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/asset-mapper/usage</loc><lastmod>2026-03-17T17:09:38+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1696606401-bcc7fa820bd7e96ee4c9035015174cecb95389c501aab35587995cf78411defb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Mapping Assets]]></video:title><video:description><![CDATA[AssetMapper isn't that big of a deal. Sure it dresses cool and has good dance moves, but it's really quite simple. It has two main features. Feature number one: we configure "paths" - like the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/844462341/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=253981a6a15b4a5aa71955e3367bde03b79aee94b8fe6584f7795d8d303c23e4</video:content_loc><video:duration>361</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-06-30T21:30:23+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/asset-mapper/css</loc><lastmod>2026-03-17T17:09:38+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1690657962-b76b81d9f7b99cba24899492f096cce538e231c224e7e84895f9cf7b9aeb298a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[CSS & Background Images]]></video:title><video:description><![CDATA[When we're talking about the frontend of a site, we're mostly talking about two things, CSS and JavaScript. Let's start with the CSS side of things... which is dead simple with AssetMapper. You...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/840594016/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=48d5f0ea61378a5862aa896f6e068c126ae8eb8a6d4cefb1ad293d4b8d7d6647</video:content_loc><video:duration>206</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-07-03T19:09:16+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/asset-mapper/vendor-css</loc><lastmod>2026-03-17T17:09:39+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1696318108-e3cdb54f13d152c477d6d320e5ed0c1738256e30c8c63dbe37e4d2c2da1e57d5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[3rd Party CSS]]></video:title><video:description><![CDATA[We talked about adding CSS to our site, but what about *third-party* CSS like Bootstrap? With a build system such as Encore, we have a `package.json` file, and we can run: ```terminal skip-ci npm...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/844249462/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1ab32bd48ac651fba6a0cc898fd5eb410941796b3773f6bb6ac94f0ca2468365</video:content_loc><video:duration>369</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-07-11T17:52:54+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/doctrine-queries/dql</loc><lastmod>2026-03-06T10:31:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1669807214-f8e75c86daf5c716b278facf54c681a8460eb95fb833355b7b13d6d02770a337-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Doctrine DQL]]></video:title><video:description><![CDATA[Hey there friends! And thanks for joining me for to a tutorial that's all about the nerdery around running queries in Doctrine. It sounds simple... and it is for a while. But then you start adding...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/826726907/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1a6c8fcd08ef830406ca5f54158fa61c06af7f7bba882d65da3cc8c9d44ebffb</video:content_loc><video:duration>458</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-05-15T09:46:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/doctrine-queries/query-builder</loc><lastmod>2026-03-06T10:31:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1670740166-969f31fece40b065328b5d2789694659029c399a440f54d99973e6c17c403f07-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The QueryBuilder]]></video:title><video:description><![CDATA[It's really powerful to understand that DQL is *ultimately* what's being used behind the scenes in Doctrine. But most of the time, we're not going to build this DQL string by hand. Nope, we're going...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/827372642/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2bec646c637a6d84b6881935a9fa777e40fca1d27a15bd2fa7675b05ea69806d</video:content_loc><video:duration>122</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-05-17T09:41:40+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/doctrine-queries/and-where-or-where</loc><lastmod>2026-03-06T10:31:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1671586097-d84ceac08c3e81bdf5a87b66bc1b42d905717a8f43b6601131068e0ef6a2d09f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[andWhere() and orWhere()]]></video:title><video:description><![CDATA[Our site has this nifty search box, which... *doesn't* work. If I hit "enter" to search for "lunch", it *does* add `?q=lunch` to the end of the URL... but the results don't change. Let's hook this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/827948126/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6be937db4bd6810551e5f37d3cbb6bec1b7a24ea65a770fbaccbe882dfb9b805</video:content_loc><video:duration>426</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-05-18T10:56:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/doctrine-queries/joins</loc><lastmod>2026-03-06T10:31:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1671769868-d00560454c292c114839a2244461f4f3667ad850b2e1f2a94c5904e7e0c54983-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[JOINs]]></video:title><video:description><![CDATA[We've got this cool `->andWhere()` method that searches on the `name` *or* `iconKey` properties of the `Category` entity. But could we *also* search on the fortune cookie data *inside* each category?...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/828064374/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=006b49e01e1fbd88d6b2003e99b2b09c5ca7f226f61bf23c893e0515254c7b19</video:content_loc><video:duration>225</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-05-19T09:56:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-security/production-docs</loc><lastmod>2026-01-30T14:15:17+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1687378731-c44631b9f33cefda6ebd6ad2e871935e0b598bc4b1ad7f8950abbf08d09dfec9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[API Docs on Production?]]></video:title><video:description><![CDATA[Welcome back you wonderful JSON-returning people, to API Platform episode 2. In [part 1](https://symfonycasts.com/screencast/api-platform), we got busy! We created a pretty killer API to store dragon...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/838428467/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=adbbeee605fde2dd9a8aa1b38123708b3e95fbb2c6bca6265d9c2d2325e0537d</video:content_loc><video:duration>502</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-03-13T09:51:41+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-security/tokens-cookies</loc><lastmod>2026-01-30T14:15:17+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1627382504-9d37f454aa38ab9ac591a77b9acabdff2c1c10127abbbdd02b5767528d7b2687-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[API Tokens? Session Cookies?]]></video:title><video:description><![CDATA[Join me, while we tell a tale as old as... the modern Internet: API authentication. A topic of hype, complexity and unlikely heroes. Characters include sessions, API tokens, OAuth, JSON web tokens!...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/805952253/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ca88c9eca091a3c183f93e8308e8349c56593dcfa3620de1b189532e3c09f1ad</video:content_loc><video:duration>487</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-03-14T09:51:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-security/json-login</loc><lastmod>2026-01-30T14:15:17+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1623894598-3b6d2c2fe21b5e74f5ee0566b394978faf49abe237e4f4bd8423ceb2dfef8ff9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[API Login Form with json_login]]></video:title><video:description><![CDATA[On the homepage, which is built in Vue, we have a login form. The goal is that, when we submit this, it will send an AJAX request with the email & password to and endpoint that will validate it. The...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/804449138/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a4563794aa1da75ebb2a0ed3228fe44547c6f01b6783569210ec8deab85b8ccb</video:content_loc><video:duration>336</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-03-15T09:51:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-security/auth-errors</loc><lastmod>2026-01-30T14:15:17+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1624038381-078225eba95b198b02de3d474580fe6bb2a1a4ddeb10d6e4cad7b20bdc7bcc8e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Handling Authentication Errors]]></video:title><video:description><![CDATA[When we log in with an invalid email and password, it looks like the `json_login` system sends back some nice JSON with an `error` key set to "Invalid credentials". If we wanted to customize this, we...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/804454886/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7a1be8cfea614e15c16e72a605727d961a11fccafafeb3281a0b76a8d5046815</video:content_loc><video:duration>227</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-03-16T09:51:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-security/login-response</loc><lastmod>2026-01-30T14:15:17+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1729241616-beb54fb41befd0c145c0c8f9a94c0348ba731e7c0e5bbc9c873a4b26a8138e64-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[On Authentication Success]]></video:title><video:description><![CDATA[If you refresh the page and check the web debug toolbar, you can see that we're *not* logged in. Let's try using a real email and password. We can cheat by clicking the email and password links: this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/868197188/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f9ff7658fd61e7f95a27f907622b982c0da6c4c0fae0ca8b82854dbf004c5910</video:content_loc><video:duration>363</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-03-17T09:51:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-security/data-page-load</loc><lastmod>2026-01-30T14:15:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1631361064-7ee5c9511fd87939a357de2b73ddc5a3d75b864bc40f821a6e3ecff33e85a15f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Logout & Passing API Data to JavaScript]]></video:title><video:description><![CDATA[What does it mean to "log out" of something? Like logging out of an API? Well, it's two things. First, it means invalidating whatever your token is, if possible. For example, if you have an API...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/807665249/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c88153c610c6e9959fedf83c07bdaef52c4d47a759919ae2f7ba950d756d3b2a</video:content_loc><video:duration>345</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-03-17T12:27:48+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-security/stimulus-values</loc><lastmod>2026-01-30T14:15:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1632823725-371a9c13ae26e5ba261d26bb430558f272539dc16120375273eeafd9e4b981d5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Passing Values to Stimulus]]></video:title><video:description><![CDATA[Setting a global variable is fine. But if you're using Stimulus, there's a better way. We can pass server data as a *value* to a Stimulus controller. Of course, this is a Vue app. But if you look in...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/808347515/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=700d40ec79d4ee6c6d7ad656a129debb496cb813ad606dd107f4bf8475bacb10</video:content_loc><video:duration>272</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-03-17T12:27:49+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-security/api-token-entity</loc><lastmod>2026-01-30T14:15:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1635962077-0a653fc7f97c8526188c30442076b6e3289573ec7c17cac7c7822eb153379cc7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Token Types & The ApiToken Entity]]></video:title><video:description><![CDATA[Okay, so what if you need to allow programmatic access to your API? ## The Types of Access Tokens When you talk to an API via code, you send an API token, commonly known as an access token:...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/809512277/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=34b17c276dac4e280f27f8e051f4f0586c198cdcb119ebf6adf859c6fdee222d</video:content_loc><video:duration>359</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-03-22T09:46:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-security/token-string-fixtures</loc><lastmod>2026-01-30T14:15:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1772154634-4dc3b7f1e5611b10fd9a45fe5a82be434d8cdecce6252842ec78f2379f40e254-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Generating the API Token & Fixtures]]></video:title><video:description><![CDATA[The most important property on `ApiToken` is the token string... which needs to be something random. Create a construct method with a `string $tokenType` argument: [[[ code('8783e12576') ]]] This...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/896743099/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a6aa3902a9f379e179608569e9e0d6ddf72616419dc2293aeacb62c9c964dfe1</video:content_loc><video:duration>358</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-03-23T09:16:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform-security/access-token-authenticator</loc><lastmod>2026-01-30T14:15:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1640558074-1649ec8fa9067d6f32dea90ffbf0638adf3f321345f256aa6c8ca954cb67f433-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Access Token Authenticator]]></video:title><video:description><![CDATA[To authenticate with a token, an API client will send an `Authorization` header set to the word `Bearer` then the token string... which is just a standard practice: ```php $client->request('GET',...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/811594537/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=741ac998ab3e73742b21cc0ad2015a4b86d6ba54d39506a217d559079f5893e3</video:content_loc><video:duration>536</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-03-27T09:06:40+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform/install</loc><lastmod>2026-01-30T14:03:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1589469490-0626bef7f94e30ba4d64c4f477014a02d8f5dbe980a12f564e28ef7ae75ad98d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing API Platform]]></video:title><video:description><![CDATA[Hello and *welcome* you beautiful people, to a tutorial that's near and dear to my heart: how to build magnificent castles with *Legos*. Oh, that would be awesome, wouldn't it? But really, we're here...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/790056807/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=76bf1ee41d9eef8c7d00be845ae07e546ff1dfa143fe26aa06dfb225af2acdb6</video:content_loc><video:duration>449</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-19T09:56:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform/api-resource</loc><lastmod>2026-01-30T14:03:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1611328359-636e6097b8525a6d3d00ed9d3455cde5b28b66a9e33a12be5061a1eef6408b39-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating your First ApiResource]]></video:title><video:description><![CDATA[We're about to build an API for the *very* important job of allowing dragons to show off their treasure. Right now, our project doesn't have a *single* database entity... but we're going to need one...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/799129636/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=347a3c9d2c6a7d3735d2f0039018bbb9b96a4f8f8e9018bb8f4dd64ec556ad15</video:content_loc><video:duration>344</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-20T09:36:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform/swagger</loc><lastmod>2026-01-30T14:03:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1589764379-f67717ec946ada422bcb116d5ccecca047674d1e1bd242ab03a073d6e1af16c8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Swagger UI: Interactive Docs]]></video:title><video:description><![CDATA[The amazing interactive documentation that we've stumbled across is *not* something from API platform! Nope, it's actually an open-source API documentation library called Swagger UI. And the *really*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/790200394/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7a9b6cfe705e822b973852d1b85fb1e552ac3ff3e78ce8d72a76a90a6b0bad0b</video:content_loc><video:duration>401</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-23T09:11:41+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform/open-api-spec</loc><lastmod>2026-01-30T14:03:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1784288886-79c8dda1c6e7521a066e6ba4379cedc1f74d74a77606778ed07f89537ab68f9f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Powerful OpenAPI Spec]]></video:title><video:description><![CDATA[Earlier, I said that these interactive docs come from an open source library called Swagger UI. And as long as you have some config that *describes* your API, like what endpoints it has and what...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/903935091/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=60cb0526bf3ed2f3065935ce13ea85c116fa7d58abd5bd534643449241ee187a</video:content_loc><video:duration>324</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-24T09:11:40+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform/json-ld</loc><lastmod>2026-01-30T14:03:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1594706412-7664b1144b5b5c122d4159ec4169712d1ed91b794b5a12ba590a146fd0492745-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[JSON-LD: Giving Meaning to your Data]]></video:title><video:description><![CDATA[I've just used the `GET` collection endpoint to fetch *all* of my resources... which shows that we have a treasure with `id=1`. I'll close up this operation... and use this other `GET` endpoint....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/792275021/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b61a8888e361fb32203b4a6e644a7f2e7070873398216cd864c98adc0cb7eb09</video:content_loc><video:duration>441</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-25T09:21:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform/hydra</loc><lastmod>2026-01-30T14:03:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1989036712-8727f8b6109b1929aa2cd0aa8d2654cd8c9fb9aaf0a07c5cdbd1c6982eb4cae4-d_1108x624?&amp;r=pad</video:thumbnail_loc><video:title><![CDATA[Hydra: Describing API Classes, Operations & More]]></video:title><video:description><![CDATA[We're looking at the JSON-LD documentation that describes our API. Right now, we know that we only have one API resource: `DragonTreasure`. But if you look down at the `supportedClasses` section,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1062162865/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=fae54e8144db5e5d330da97beea1ead0b7dded3bdf0fe6e265d38b30e82ae303</video:content_loc><video:duration>246</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-26T09:21:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform/profiler</loc><lastmod>2026-01-30T14:03:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1598598261-1391cd76e5eba6e1a871c821972bcc39d3d154a153bbf9c78780860b6095b850-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[API Debugging with the Profiler]]></video:title><video:description><![CDATA[We're going to be doing some seriously cool and complex stuff with API platform. So before we get there, I want to make sure we have a *really* awesome debugging setup. Because... sometimes debugging...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/793902456/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=bc20bff81a36f0f5ab747d87756a8b3c4245d8f859c4187b470212d3f84f1b17</video:content_loc><video:duration>312</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-30T09:16:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform/operations</loc><lastmod>2026-01-30T14:03:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1612580708-aa3744c47190efb624f6a4208033860c19d9357abb3ece0add50f4038aec37b9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Operations / Endpoints]]></video:title><video:description><![CDATA[API Platform works by taking a class like `DragonTreasure` and saying that you want to expose it as a *resource* in your API. We do that by adding the `ApiResource` attribute: [[[ code('79ebe0e721')...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/799694386/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0715328503c0cefd550a18802c7fcdb6386b7965e8b8733d2928b291dcd73c34</video:content_loc><video:duration>398</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-31T09:16:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform/serializer</loc><lastmod>2026-01-30T14:03:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1729217372-e4dc7b55a52e0da5c1ba22f61d1bf04a638d05ebd3d46e0c6143a15696e4886a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Serializer]]></video:title><video:description><![CDATA[The key behind how API platform turns our objects into JSON... and also how it transforms JSON back into objects is Symfony's Serializer. `symfony/serializer` is a standalone component that you can...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/868180872/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c4fb516c28eb4fe1bfc5252432a4453cc7a8c2bb9f55b44a97dab66e464ee165</video:content_loc><video:duration>548</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-02-02T09:36:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpunit-integration/integration-test</loc><lastmod>2026-01-30T15:58:13+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1749488577-a6587d46b1962a4c0f55a9e8a547e1c142c9cb6e48d475b5fbf6bd8745f1db86-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hello Integration Tests!]]></video:title><video:description><![CDATA[Hey hey, people! Welcome to episode *two* of our testing series, which is all about *integration testing*. In episode 1, Anakin accidentally triggered the auto-pilot on a star fighter... which then...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/881742135/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3c7cab789645b81c2bd1fcb4e8182f1bb5fed2a19ec4ef14797d2f536b99d727</video:content_loc><video:duration>461</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-11-06T18:07:30+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpunit-integration/kernel-test-case</loc><lastmod>2026-01-30T15:58:13+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1746595942-275fc39f76f0ddead97702e86c119967f2c6138652c964592c7dba2d047207ff-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[KernelTestCase: Fetching Services]]></video:title><video:description><![CDATA[In our app, if we wanted to use `LockDownRepository` to make some real queries, we could autowire `LockDownRepository` into a controller - or somewhere else - call a method on it, and *boom*!...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/879871870/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=91716abc29e94df39021463fe6e777f2b599b4dd42901bbf75a07fe40ce7eeb1</video:content_loc><video:duration>286</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-11-06T21:36:11+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpunit-integration/database-setup</loc><lastmod>2026-01-30T15:58:14+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1746596071-027e9e3ccad9c418ff75141f741d769eeebb973fea2a1f173414c28105f5e05e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Test Environment Database Setup]]></video:title><video:description><![CDATA[This first test was *too* easy! So let's write another, *more interesting* one. How about, ahem, `public function testIsInLockDownReturnsTrueIfMostRecentLockdownIsActive()`. Phew! Start the same as...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/879871775/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3fb8cbe472656434b9e03b3eb1b882817e46fed6d80093e3110ebac060e1bbe7</video:content_loc><video:duration>570</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-11-06T21:36:12+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpunit-integration/reset-database</loc><lastmod>2026-01-30T15:58:14+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1746596211-8a5dff8eba33942bbb2788c0ea45c4238abebcd4eeca6bcbfb99772b41a979c4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Resetting the Database]]></video:title><video:description><![CDATA[It's really common with integration tests or functional tests to talk to the database. And we almost always need to *seed* the database before the test: to add some rows to `LockDown` before doing...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/879871702/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6a6ff628407f8bb135c75425e4636eb69e33fbc23de3f9a8fec9a008592a92b3</video:content_loc><video:duration>287</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-11-07T16:00:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/install</loc><lastmod>2026-01-30T14:51:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1548683479-9056267914bf2c308d46416e0ddb0f3ff24d6fc5cb2d62a14a96baac75c1f7af-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hello Layouts+ Setup!]]></video:title><video:description><![CDATA[Hey friends! I'm *so* glad you're here with me, because this tutorial is about something fun, cool, and *quite* powerful. No, it's not about a masked, crime-fighting feline with superpowers, though...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/771260456/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=56722fbaf1b5822903e2ffbcefaf171a5f648657bac1b7db1a25dee0ada66059</video:content_loc><video:duration>450</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-11-16T18:26:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/how-it-works</loc><lastmod>2026-01-30T14:51:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1548723276-aed61852057df385c27128c4b769cc26305541512fe8807c9935946a446cd8d1-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating & Mapping Layouts]]></video:title><video:description><![CDATA[Ok, let's see what Layouts is all about. In this chapter, we'll, step-by-step, create & use a "layout", learning *exactly* how Layouts works its magic along the way. To check out the Layouts admin...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/771676306/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4287175c7f705e289bb123c9ed0fe28c5257877056ebcc119d9a62a6529651d0</video:content_loc><video:duration>691</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-11-16T18:26:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/twig-blocks</loc><lastmod>2026-01-30T14:51:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1548735526-4f6fd67e505a549114fcde2a7b2bbc0fdb091e8aef8dd9b2bda93f22ceedaa86-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Adding Twig Blocks to your Dynamic Layout]]></video:title><video:description><![CDATA[So we just *completely* replaced our homepage with a dynamic layout. But, that's not really *that* interesting. What I *really* want to be able to do is use my *existing* homepage template and all...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/771681293/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c62b5dfd1ec09bba3511c26f3a944493cc694d60c00fe8e71d7e46a48ffcfa1d</video:content_loc><video:duration>273</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-11-16T18:26:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/shared-layouts</loc><lastmod>2026-01-30T14:51:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1548743435-100c68a21a7c42d112cf307903d688700e6e72c4b227da2e952271e5979f3be3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Shared Layouts]]></video:title><video:description><![CDATA[Open up `base.html.twig` and move the `{% block layout %}` to be around *everything*. So, put the start just inside the `body` tag... and the end just before the *closing* `body` tag: [[[...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/771689782/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=fd689ed20ab183c96ddd8e2ac00117fe4602c36085aa5ac95e8ef939ea4c80fd</video:content_loc><video:duration>445</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-11-16T18:26:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/using-blocks</loc><lastmod>2026-01-30T14:51:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1549104503-ddc8aef2e8ee11f1edf2503a984cef49b02435ffdc756651972f6b7a55ea47db-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Adding More Customized Blocks]]></video:title><video:description><![CDATA[We're going to work more on this Recipe List Layout later. But, let's do one more things right now. Edit that layout. I want to give our admin users the flexibility to change this *title*. Cool!...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/771693355/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0468a057bb2b3b6c0ca884c95437fd6e60705f509b6a48d8ae3e9cfa6c1f0f53</video:content_loc><video:duration>316</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-11-17T06:26:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/value-type</loc><lastmod>2026-01-30T14:51:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1552233496-fa30c2448977cc739c56149b9ea8d92afb3828a6c9e0044a6fb0351085faa181-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Adding Lists: Value Type]]></video:title><video:description><![CDATA[We have a `Recipe` entity and, on the frontend, a page that lists the recipes. We also saw how easy it is to create a layout, which instantly makes parts of this page configurable. ## Adding Lists of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/773515473/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=9591a32abc959cb819bbf9edd049f5f92bffd548865551e7c1327d0a2faf65e8</video:content_loc><video:duration>598</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-11-22T09:26:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/value-converter</loc><lastmod>2026-01-30T14:51:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1552318826-7130acfa7988f56838ee20c54c50d09c2b6857f9a62a28fe8f224cc6179cd7a2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Value Converter]]></video:title><video:description><![CDATA[As soon as we changed our Grid type to use a Dynamic collection... it stopped loading. The error is hiding down here in this AJAX call. The best way to see it is to open that URL in a new tab. There...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/773533259/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=fa95f56790f8694e4e0669bc50b45f1c189c0e713e62db4a6deca4436f559ca5</video:content_loc><video:duration>530</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-11-23T09:31:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/item-view</loc><lastmod>2026-01-30T14:51:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1553644935-4933669204706ef565aae7fd4a3bfc342bfb9ed479781f5a5da4442f39abb450-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Item View Template]]></video:title><video:description><![CDATA[Okay, team, things are looking good. We created a `Recipe` "value type", a custom query to load them, and a value converter to help layouts *understand* our `Recipe` objects. What we have *not* done...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/773981767/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1449eaad0331783f064a0375cbb05e03682439ed0338b5cf608f18c7237abbab</video:content_loc><video:duration>387</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-11-24T09:11:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/frontend-item</loc><lastmod>2026-01-30T14:51:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1556396017-4f3086573c12d64e722b07526bc0ffc9e1d55085aca08fa92afffbc69979167b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Frontend Item View]]></video:title><video:description><![CDATA[Time to create the `Recipe` item view for the *frontend*. This starts almost exactly the same. In fact, copy the admin config... then paste. In Layouts, we know that the `app` key means the "admin"...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/775620703/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=963a8de87c3185e5841bc09a634d5c3c5928d2915d4753956a116d47199426b7</video:content_loc><video:duration>461</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-11-28T09:46:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/ajax</loc><lastmod>2026-01-30T14:51:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1556397283-f143df13b15f9f7f4583fdec507e887d1a667e5b68f0ab8ee88880838ce8981c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Ajax Pagination & CSS/JS]]></video:title><video:description><![CDATA[Now that we're rendering these recipe items via the grid block type, check out what we can do. Click the grid, go to the design tab and then check "Enable pagination". Then you can choose between a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/775622010/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=cfcd9b53e2b9d7a4aa90ff23ba5cd27bb47d3f479dbf2f53023769918e46903a</video:content_loc><video:duration>403</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-11-28T13:04:43+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/content-browser</loc><lastmod>2026-01-30T14:51:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1559969151-b96aec0072410c045b3fa86c4c8add1b0da9ef86b6903307c54ade375e9bbe81-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Content Browser]]></video:title><video:description><![CDATA[We can *now* embed lists, grids, or thumb galleries of recipes into *any* layout dynamically. That's *super* cool! And we could always create more query types to, for example, choose between the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/777404582/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=42933842210d0a7a26fe2870e67268e56f50e098ec4242d41b5defc95bcb1e64</video:content_loc><video:duration>542</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-12-05T09:36:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/backend-items</loc><lastmod>2026-01-30T14:51:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1601741599-a2eb4942066c540f20a9f579a5a7b3992c7fdba0119f1b7208293bd6bb31467d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Content Browser: Returning the Items]]></video:title><video:description><![CDATA[Our Content Browser is *sort of* working. We can see our one location... we just don't have any results yet. That's because, for whatever location is selected, the Content Browser calls...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/795272057/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5fd8e1c26d8a96ffbf616fa3dbc8daf6eeaae4604123af30453af2d5164f0d4d</video:content_loc><video:duration>333</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-12-06T10:26:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/value-loader</loc><lastmod>2026-01-30T14:51:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1561839768-353a853c4d346e8da6a4dc533109be75c2f6b069529dd2009f4e4b72e453daca-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Value Loader + Preview Template]]></video:title><video:description><![CDATA[So our content browser was working beautifully... until we selected an item. At *that* time, it chose to do an odd thing: explode! The Ajax call that failed says: > Value loader for `doctrine_recipe`...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/778227242/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0585756e68c7eec9f72762565393c9bc3b14629d13577237860573fe9347515e</video:content_loc><video:duration>451</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-12-06T18:16:55+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/contentful</loc><lastmod>2026-01-30T14:51:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1561883102-5a6cd7b06c9868f6b7abc011abe376d51f370f56557d45908e60cf15240fb973-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Contentful: Loading Data from an External CMS]]></video:title><video:description><![CDATA[If we added five more entities and we wanted to be able to select those as items in the Layouts admin, we could add five more value types, query types, and item views. Now that we know what we're...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/778247135/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8701099bb4d87a2128452e055a939fcfd8ce147ca7fe171104630f9e817dff40</video:content_loc><video:duration>482</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-12-06T18:16:56+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/contentful-layout</loc><lastmod>2026-01-30T14:51:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1561911722-a750ebca7c8254ece3c3914c0abbce79118fdde650d8b6977f04aadc245955c8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Mapping a Layout to Contentful Pages]]></video:title><video:description><![CDATA[The Contentful integration we just installed added two things to our site. First, it added a Layouts integration: new value types, query types, etc so that we can select our Contentful content in...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/778265251/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=38b7a84b656f9fd4bb7cd11ab5fdcb84a1509826c4bc73b930e538d4520ec069</video:content_loc><video:duration>475</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-12-06T18:16:57+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/contentful-page</loc><lastmod>2026-01-30T14:51:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1563348113-43d3ecd1c2d792006a58bec6d69777b271bac30d376a354bc05799acb62f2a04-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Building the Contentful Page]]></video:title><video:description><![CDATA[We now have full control over how the Contentful pages render. That's thanks to the "Individual Skill layout" that we mapped to all Contentful "Skill" pages. But... all we have is this manual `h1`...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/778970431/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=454c2f724067584fd4deb4cca3ad58fd3ae7240f571d31935c6ae9f3e778e024</video:content_loc><video:duration>367</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-12-12T09:31:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/slugger</loc><lastmod>2026-01-30T14:51:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1563389134-4e838ca3b39a5149eb8566f83a93710e2de35b87776bad31392debc9b599bf75-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Customizing the Contentful Slugger]]></video:title><video:description><![CDATA[Before we go further into customizing the look and feel of our site, I want to fix the skill URLs so that instead of just `/mashing`, the page is `/skills/mashing`. Remember: the fact that our...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/778976066/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a9ac123dc319127c2f269f1c106d7a5f145889b29367dce2f13072acc5af5caf</video:content_loc><video:duration>336</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-12-13T09:31:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/skills-page</loc><lastmod>2026-01-30T14:51:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1567970378-1e605ce94e2ea75a74582e83ba2977de97385aba356029c7e8dd700108b4caa8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Skills List Page + A Grid of Skills]]></video:title><video:description><![CDATA[Thanks to the Contentful integration, in addition to our `doctrine_recipe` value type, we now have a *second* value type that can load things from Contentful. This means that we can render lists and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/781140844/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b3a24907c448c7f8c82066254ffe56952009272836713a403396613ecd23b09f</video:content_loc><video:duration>456</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-12-15T09:41:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/theme-templates</loc><lastmod>2026-01-30T14:51:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1568084504-de04154ace73ab542cff87994ffc006a4374542c56b3323e9589ed90d8179b07-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Themes & Overriding Templates]]></video:title><video:description><![CDATA[We can now add *a lot* of dynamic content to our site, like these static blocks up here, grids, or lists. The grids and lists can hold items from Contentful *or* our `Recipe` entity. But to *really*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/781158083/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5478b12751d215db09a857c8c28c522bd38dea30bcb72b5689556a8abfa5f675</video:content_loc><video:duration>319</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-12-15T14:40:15+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/block-views</loc><lastmod>2026-01-30T14:51:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1569460690-df4d0fcedfb0e14aef1c9ebccb04ffd3af4af5c77386366362586dfa355d6613-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Block Views & View Types]]></video:title><video:description><![CDATA[Let's override one other template completely. Go into the Individual Skill Layout. We're using a Contentful entry here, which is a "Referenced asset"... and it's rendering as this image tag. Cool! ##...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/781871803/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=23200052bfc9acc8b0d70d6edb4cefab09c41bf9a0d3492e07b8ddd242061222</video:content_loc><video:duration>573</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-12-19T09:16:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/item-views</loc><lastmod>2026-01-30T14:51:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1572049932-5b97c17adb6defa051ec3750ab40f7fcf63db50af045767e0c52558af00e10ac-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Deep Dive into Item Views]]></video:title><video:description><![CDATA[When it comes to customization, you can do *a lot* of damage by looking at which templates are rendering and using the theme system to override them. *But* there *are* a few cases where you'll need...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/783003796/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8a704df22a42bc462af592d48cf72d69885696228060b70892e979a68d471209</video:content_loc><video:duration>407</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-12-21T09:51:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/prepend-config</loc><lastmod>2026-01-30T14:51:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1579375551-a21ca62ca43fb949b8cd7a92fe10c3a69714e399b4b5b3ef25f3a20b8f051277-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Prepending Config]]></video:title><video:description><![CDATA[I'm *pretty* sure that our new `item_view` is configured correctly. We have `item\value_type: contentful_entry`, which I *know* is correct... and then we're using `contentful\content_type` set to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/785728611/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=292aa7742769471a38276982f71f611493c00f7a03be6671cc01c377666ddfaa</video:content_loc><video:duration>235</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-03T09:16:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/item-template</loc><lastmod>2026-01-30T14:51:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1579624879-04ec8caa72235344bdedf554916e7dba671fb3b070eb4abc50a368945b31a014-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Contentful Item Template]]></video:title><video:description><![CDATA[Our "item" template for skills *is* now being used! So, let's finish it! We already know what we want the skills to look like... so let's go steal that from `templates/main/homepage.html.twig`. Find...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/785760580/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8e2b56b2b4a7437290591f736d06de0669433c86d883c430eba7fce290d4d54f</video:content_loc><video:duration>372</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-04T10:01:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/block-view-deep</loc><lastmod>2026-01-30T14:51:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1580966837-2d24388b3e47c3d92371540c5d316653bed1ef0a2a70377e7617a6c16e590a7e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Block Views & Block Definitions]]></video:title><video:description><![CDATA[Let's create a layout for our "individual recipe" page so that we can customize this a bit more. I love that we can create new layouts on the fly, whenever a page needs to be tweaked. ## Adding and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/786453333/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4ec0a34c9dcc82aa2470c6f7d95594c86af7ed06b37aeb918de4b3a1227da894</video:content_loc><video:duration>288</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-05T09:16:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/new-block-view</loc><lastmod>2026-01-30T14:51:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1581658535-8a57e4ac1a71229162d8be6d30289aa199535a94e166f6c0500c5eff21bcd2e0-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Custom Block View]]></video:title><video:description><![CDATA[So here's the plan. We're going to add a new "view type" to the list block definition. Then we're going to map that to a *template* via `block_views`. ## Updating the "Block Definition" For step 1,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/786768355/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=20011a0bab0e1d1918f50bd338a1c4cd3bdcf3e9511a1bb82fe2ba0219c3fbae</video:content_loc><video:duration>465</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-06T09:26:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/item-view-type</loc><lastmod>2026-01-30T14:52:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1582373311-2762e52acf4e6b77727053850dd10c5c05f65526c65962e64d5704db3de0ab7d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Custom Item View Type]]></video:title><video:description><![CDATA[The Grid of skills on the `/skills` page looks *terrible*. Let's go find the layout for that: Skills List Layout. Ok, so this is a *normal* Grid... and it renders like any *other* Grid on the site. I...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/787075799/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8f28796e92bc1b0a0e6619b5dadaade4c0afb06fae0e663cc666fb16f7885317</video:content_loc><video:duration>364</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-09T09:21:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/netgen-layouts/block-plugin</loc><lastmod>2026-01-30T14:52:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1584011469-a8dd031daa9e605381ba99884158e4acecf7bdaed675f397a7fb9bac45c1720e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Block Plugins]]></video:title><video:description><![CDATA[Well look at us! We've made it to the *last* topic of the tutorial. We've already transformed our static site into one where we can reorder the layout for each page, mix it with custom code from Twig...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/787706687/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=52e7b217045d4ddc7bc13e9181fb5ba5ccef4c42f1c0d2185b3e8a067057b7fb</video:content_loc><video:duration>615</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2023-01-10T09:06:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-doctrine/install</loc><lastmod>2026-01-30T12:55:06+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1508033352-9632a580d688089759a10a5cd88dc8c66ce17a6f51ac0c5c0f679c15b5aac8d2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing Doctrine]]></video:title><video:description><![CDATA[Welcome back team to episode *three* of our Symfony 6 series! The first two courses were *super* important: taking us from the basics up through the *core* of how *everything* works in Symfony: all...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/750009680/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6c6087a85e6c00383a198d47af808edf85ccf4cd70b67aabf645253c1b50b41d</video:content_loc><video:duration>375</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-08-08T09:41:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-doctrine/docker-compose</loc><lastmod>2026-01-30T12:55:06+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1497318194-79b9cbd100658a62c0dc81260c2903f8c4b7f90fe2b649beb6c1a1519a22779d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[docker-compose & Exposed Ports]]></video:title><video:description><![CDATA[We need to get a database running: MySQL, Postgresql, whatever. If you already have one running, awesome! All you need to do is copy your `DATABASE_URL` environment variable, open or create a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/744291419/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ce02dbd68256d5db0f2837b5f466709f1ff19ccc1b7507f8a9bb815083f03da1</video:content_loc><video:duration>413</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-08-09T09:41:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-doctrine/docker-env-vars</loc><lastmod>2026-01-30T12:55:06+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1772110803-a52e52068e9c0553bc5ee608292c1484804331ba45ed0f42d3fcda9092558acb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Docker & Environment Variables]]></video:title><video:description><![CDATA[We now have a Postgres database running inside of a Docker container. We can see it by running: ```terminal docker-compose ps ``` This also tells us that if we want to *talk* to this database, we can...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/896719031/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=887653d958d4e74705bad7bd7b441365af5500bdf579b1cb91758b3ba7593b7d</video:content_loc><video:duration>223</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-08-10T09:41:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-doctrine/console</loc><lastmod>2026-01-30T12:55:06+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1481432140-33027f620e9ffbba67d7529efaff9233831853f623f8d79f81d7f022e303380d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The "symfony console" Command & server_version]]></video:title><video:description><![CDATA[Doctrine is now configured to talk to our database, which lives inside a Docker container. That's thanks to the fact that the Symfony dev server exposes this `DATABASE_URL` environment variable,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/736238242/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0cc014230c5de6e0a91fdf9e555d694d1bf4bac2d7356eaa04407ecd9f1aabb8</video:content_loc><video:duration>235</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-08-11T09:41:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-doctrine/entity</loc><lastmod>2026-01-30T12:55:06+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1493744801-80bf470e2354321c0860ea1430e2a5b289cbe5aa67faf0378fa7a299a5329f4a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Entity Class]]></video:title><video:description><![CDATA[One of the coolest, but maybe most *surprising* things about Doctrine, is that it wants you to pretend like the database doesn't exist! Yea, instead of thinking about tables and columns, Doctrine...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/742401247/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=cec40586c358d476470b56ef2b39954fabd916088ad1274f007c380c1e61061b</video:content_loc><video:duration>539</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-08-24T09:21:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-doctrine/migrations</loc><lastmod>2026-01-30T12:55:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1493756783-ec1409d38df297de3ca7b221657db2a728768637e6d7b234d5d8f9425b280b86-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Migrations]]></video:title><video:description><![CDATA[We created an entity class! But... *that's it*. The corresponding table does not *yet* exist in our database. Let's think. In theory, Doctrine knows about our entity, all of its properties and their...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/742416547/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0d1e37fa2848670babe2e30a44e82e04aa9c3a2ff18ad4a9ac514597e4b7e969</video:content_loc><video:duration>254</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-08-24T20:12:37+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-doctrine/add-property</loc><lastmod>2026-01-30T12:55:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1496821566-5a3f946ec85a35a5c425242294924040a4d4dbfde8c740520ea69af7f9b9b8f3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Adding new Properties]]></video:title><video:description><![CDATA[In our `VinylMix` entity, I forgot to add a property earlier: `votes`. We're going to keep track of the number of up votes or down votes that a particular mix has. ## Modifying with make:entity Ok......]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/744016330/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e6770b8b13e43e059f6d791c7ef4efeeb1e14248ad7ba9c99173d805c144d548</video:content_loc><video:duration>319</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-08-29T09:32:51+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-doctrine/foundry</loc><lastmod>2026-01-30T12:55:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1517531822-51b158a7cb558833777c945109bb32d39e1fcb717f30ccde41ee6e5cef6262e6-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Foundry: Fixtures You'll Love]]></video:title><video:description><![CDATA[Building fixtures is pretty simple, but *kind of* boring. And it would be *super* boring to manually create *25* mixes inside the `load()` method. That's why we're going to install an awesome library...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/755348382/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0820cf8eb68fa413b3572c98d83905565842769fd8d5c7c474691f0590a0047b</video:content_loc><video:duration>440</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-09-30T09:26:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/design-patterns/patterns</loc><lastmod>2024-04-10T17:42:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1534049457-bf3dac2b1474046bb410ccd55d1a89f6429461c62c6b28ac80df1a2461fe16f7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Design Patterns & Their Types]]></video:title><video:description><![CDATA[Hey friends! Thanks for hanging out and giving me the *privilege* to guide us through some fun, geeky, but also *useful* stuff. We're talking *design patterns*. The idea is simple: The same problems...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/763915860/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=77acf6fad689568707d895a7d6cc574138c8f8bb834473852b02ba36bf783f4b</video:content_loc><video:duration>360</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-10-28T18:38:17+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/design-patterns/strategy</loc><lastmod>2024-04-10T17:42:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1534795017-1e0efd90c27709c19d98ad62fca0b03620776d12b8334c0d30978f83aa1e0a9a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Strategy Pattern]]></video:title><video:description><![CDATA[The first pattern we'll talk about is the "strategy pattern". This is a *behavioral* pattern that helps organize code into separate classes that can then interact with each other. ## Definition Let's...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/764319925/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=294f6fe3130e1b0636d8b03ef135d32f150720110dce1253370d951c83cdd87d</video:content_loc><video:duration>609</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-10-28T18:38:20+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/design-patterns/strategy-benefits</loc><lastmod>2024-04-10T17:42:10+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1535226844-0d5d6043d573155b722d40b8c9bca544f909c4e3755cd3884b03991fbad2d50f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Strategy Part 2: Benefits & In the Wild]]></video:title><video:description><![CDATA[We just used the Strategy Pattern to allow things *outside* of the `Character` class to control *how* attacks happen by creating a custom `AttackType`... then passing it in when you create the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/764376958/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f5e6c4648dcbd55db2215680fa15f858d6bc75c0064a412e3a566e61f9461bdb</video:content_loc><video:duration>583</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-10-31T19:33:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/design-patterns/builder</loc><lastmod>2024-04-10T17:42:10+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1537744318-31df3cb8610f1f32f7395efabd3c41af4faba0786186f8c7e7c14a0897eca265-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Builder Pattern]]></video:title><video:description><![CDATA[Time for "design pattern" number *two*: the "builder pattern". This is one of those creational patterns that help you instantiate and configure objects. And, it's a bit easier to understand than the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/765758560/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e692ddaf3218639f30c752f631b549549a9b861c99d68666ffbb274a3a9ed8a0</video:content_loc><video:duration>450</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-11-03T09:51:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-fundamentals/bundles</loc><lastmod>2026-01-30T12:54:52+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1450212142-76331d464371039d7c73b7f638a3b014fe7de13561efe5278c91ee4e1c2fadc1-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bundles!]]></video:title><video:description><![CDATA[Hey friends! Welcome back to Episode 2 of our Symfony 6 tutorial series. This is the one where we *seriously* level-up and unlock our potential to do *anything* we want. That's because, in this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/719873864/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=47a1f97afd8ec4f562208445c83641b4aabfc73a3b3b7979d1862d0a0188bcff</video:content_loc><video:duration>271</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-06-14T10:21:40+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-fundamentals/time-bundle</loc><lastmod>2026-01-30T12:54:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1450216066-31a8984264532ec04f0f72351adb2640c61c1da1f3026fbf88630ac5c7fd2400-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[New Bundle, New Service: KnpTimeBundle]]></video:title><video:description><![CDATA[On our site, you can create your *own* vinyl mix. (Or you'll *eventually* be able to do this... right now, this button doesn't do anything). But another great feature of our site is the ability to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/719878321/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=80d54b456524c59cce2b1f6412bf1c98cacd33362621b0fa3206b3a689ef863f</video:content_loc><video:duration>309</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-06-15T09:26:40+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-fundamentals/bundle-services</loc><lastmod>2026-01-30T12:54:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1454153754-e67ea9cc4ee0413daeb0aa0af9b5f5af85a84222601099c00b4bc525d5e7466a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Finding & Using the Services from a Bundle]]></video:title><video:description><![CDATA[We just installed KnpTimeBundle. Hooray! Um... but... uh... what does that mean? What did doing that *give* us? The *number* one thing that a bundle gives us is... services! What services does *this*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/722017104/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1af335c28426a239b0309171a2402d7c250924be23c4b3bc26f78809c537c37a</video:content_loc><video:duration>398</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-06-20T09:46:43+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-fundamentals/http-client</loc><lastmod>2026-01-30T12:54:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1454540522-ee20d6ebc4a341168d35eff12aafd0f094851edd9dae3abecfb47d15ad706e2a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The HTTP Client Service]]></video:title><video:description><![CDATA[We don't have a database yet... and we'll save that for a *future* tutorial. But to make things a bit more fun, I've created a GitHub repository - https://github.com/SymfonyCasts/vinyl-mixes - with a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/722232359/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e51cafe35b8593d3ca34e5620a509102cb67c69a17270cf478cb1bda5dc66a89</video:content_loc><video:duration>383</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-06-21T10:21:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-fundamentals/cache-service</loc><lastmod>2026-01-30T12:54:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1455527871-0b8122c4f64090274c516b88d6e9cd8cc1e1df997c3a12f0b624115d3e81f91e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Cache Service]]></video:title><video:description><![CDATA[*Now* when we refresh the browse page, the mixes are coming from a repository on GitHub! We make an HTTP request to the GitHub API, that fetches this file right here, we call `$response->toArray()`...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/722792875/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c6f2d28a747801cc9af468b5f24bbcb0a65ddab0772e143357109c6bda34d0a5</video:content_loc><video:duration>485</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-06-22T09:26:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-fundamentals/bundle-config</loc><lastmod>2026-01-30T12:54:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1456230335-b8e9e8b77f0f62d06d353bc318b18b930898efbfc1d5c0b3e78b42d445800696-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bundle Config (to Control Bundle Services)]]></video:title><video:description><![CDATA[We're now using the `HttpClientInterface` and `CacheInterface` services. Yay! But *we* aren't actually responsible for *instantiating* these service objects. Nope, they're created by something else...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/723196475/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e47ce26d93a2f0b14dd4f2d4b59aaee1c4164ab86be91665095d3581bc4cd1bc</video:content_loc><video:duration>363</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-06-23T09:46:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-fundamentals/cache-config</loc><lastmod>2026-01-30T12:54:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1458409373-869c3db04f9510b4a91eca5592c0face9340be5c9015ad1cc7d8dffd00baa9d8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Configuring the Cache Service]]></video:title><video:description><![CDATA[So... I want to know how I can configure the cache service... like to store the cache somewhere else. In the real world, we can just search for "How do I configure Symfony's cache service". But... we...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/724292693/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a4318eba37d99141e9610f7cadb43d7498ded10764652f6d65540039b31e6667</video:content_loc><video:duration>339</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-06-27T10:01:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-fundamentals/debug-container</loc><lastmod>2026-01-30T12:54:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1460359992-5de34a3bd22250cfc4a0605200208058234afc7963a26cb7d68e925555c4a6f3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[debug:container & How Autowiring Works]]></video:title><video:description><![CDATA[Ok, I lied. *Before* we talk about environments, I need to come clean about something: I have *not* been showing you all of the services in Symfony. Not even close. Head over your terminal and run...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/725028139/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c9aad2bc42c3b6409352a365bba0f38145820f9dc06ac6cac5ed1b4518cda9b4</video:content_loc><video:duration>461</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-06-30T09:31:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpunit/install</loc><lastmod>2026-04-09T19:43:03+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1520201500-c70f0f53afccf583079f888bdaf4cab02164c522923190b316ae26d14ac5e004-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[PHPUnit Install]]></video:title><video:description><![CDATA[Hey everyone! Welcome to PHPUnit: testing with a bite! The tutorial where we discover, to our horror, that yet *another* Dinosaur theme park has built their systems... without any tests. It won't...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/756780105/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8cbe6611578c3d216ab0a701eedbb773ff91a1bebd5e2b04f03ea1c2f0124d4f</video:content_loc><video:duration>241</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-10-06T10:46:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpunit/first-test</loc><lastmod>2026-04-09T19:43:03+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1530104211-461ec0709774d65165f8ec4f22df947d619213908f893f230b54175dd2e078fe-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Our First Test]]></video:title><video:description><![CDATA[We already have this `Dinosaur` class... and it's *pretty* simple. But when it comes to dinosaurs, bugs in our code can be, mmm, a bit painful. So let's add some basic tests! ## Creating the Test...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/761870181/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=19b6e31245a61a57b5318a94dd1a3c48e9c276087603b8b70438c204b2ddce4f</video:content_loc><video:duration>436</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-10-07T18:46:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpunit/real-test</loc><lastmod>2026-04-09T19:43:04+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1530103692-aefc007d091a456c33f6a53f7d96bb9e544494f7b38930310ca942b98c34d411-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Testing Class Methods]]></video:title><video:description><![CDATA[As a reminder, the class is currently pretty simple: we pass some data to the constructor... and then we can *read* that data via some methods. Instead of just "hoping" this all works, let's go ahead...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/761871872/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7a30c3add5b34bd82681e10ec8ab588ec4da0ae0b642da904c9dde0d92627294</video:content_loc><video:duration>417</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-10-10T10:21:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpunit/tdd</loc><lastmod>2026-04-09T19:43:04+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1530106651-8ff32f633743f6a8881e76da3c2b1d77abf76135af19684d17ceeab15a90e36e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[TDD - Test Driven Development]]></video:title><video:description><![CDATA[All right. So one of the problems is that when Bob, our park ranger, sees the dinosaur size... he can't remember if these are in meters... or centimeters... which makes a big difference when you step...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/761873932/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=eda84a8958f055b317eff422899c43f0611dcccab3b085613db3e0691b136686</video:content_loc><video:duration>259</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-10-11T10:26:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-upgrade/setup</loc><lastmod>2024-06-07T18:18:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1416799769-50ff16cd03f7464c5513c7d9f46b6cb35ab323d5bbf5e47af8e437ca0a02ce98-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Project Setup & The Plan]]></video:title><video:description><![CDATA[Hey friends! If you're like me, you probably have a Symfony 5 project - or 10 - lying around just *waiting* to get upgraded to Symfony 6. Well... you've come to the right place! That's *exactly* what...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/700956793/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2316f2ccd35a424b2ff4614e62a4096c6a009cf18355a21ed3bd29b1643407ae</video:content_loc><video:duration>254</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-19T20:34:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-upgrade/upgrade-5.4</loc><lastmod>2024-06-07T18:18:21+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1416575381-8e018099934e6630e231aef26380e6fe3e15ade8a13f79d6e086ebc88cbc0aba-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Upgrading to Symfony 5.4]]></video:title><video:description><![CDATA[Step one to upgrading our app to Symfony 6 is to upgrade all of the Symfony libraries to 5.4. And... that's pretty easy: it's just a composer thing. ## Tweaking the Composer Version Constraints In...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/700836871/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=bfbb122ef850370a67a2b51d9ded159d9b52fdc814d2a855a37e8295e318299d</video:content_loc><video:duration>322</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-20T09:34:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-upgrade/rector</loc><lastmod>2024-06-07T18:18:21+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1723261819-ea700def7a59ae73ec13029953a25540647b9dd622a009ad198653710818db1d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Automating Upgrades with Rector]]></video:title><video:description><![CDATA[Now that we're on Symfony 5.4, our job is simple: hunt down and update all of our deprecated code. As soon as we do that, it will be safe to upgrade to Symfony 6. That's because the *only* difference...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/863907296/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2c657b12acf6a2361a6ef95054ac8eed13f8d6b8e89e8a64b5c0fb0194ea7183</video:content_loc><video:duration>410</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-21T09:37:50+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-upgrade/rector-fixup</loc><lastmod>2024-06-07T18:18:21+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1419695055-8fc7ab89141b8e565823fd8c622d61fe2b69a0693d8d2c5c25cf1b24bb8b3615-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Post-Rector Cleanups & Tweaks]]></video:title><video:description><![CDATA[Rector just automated several changes to our app that are needed to remove deprecations on Symfony 5.4. *Plus* it did some bonus refactoring, like adding the optional `Response` return type on our...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/702672784/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=252c38ed5ec8722114d2f6e65f4dbcdfb0f7735a103595565b9a95d51794287a</video:content_loc><video:duration>604</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-25T10:07:50+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6-upgrade/framework-bundle-recipe</loc><lastmod>2024-06-07T18:18:21+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1421720410-655d0140e9e7d625280bf8007a5187294f7909730d266dccf2a26e0c95df5389-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Updating the All-Important FrameworkBundle Recipe]]></video:title><video:description><![CDATA[At your terminal, run: ```terminal composer recipes ``` As you probably know, whenever we install a new package, that package *may* come with a recipe that does things like add configuration files,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/702976911/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=029fbfa257c5fb33badf022ad4d30012ea5e779e5679448f28bc915a95ccdd1d</video:content_loc><video:duration>696</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-28T09:36:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/setup</loc><lastmod>2026-01-30T12:54:40+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1395910098-a2c15d7c25ea8096fa5aefbfef1e450d7180fc757ec7b19a2c346cf7a4ae4229-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hello Symfony]]></video:title><video:description><![CDATA[Welcome. Hello. Hi, my name is Ryan and I have *the* absolute pleasure to introduce you to the beautiful and fascinating and productive world of Symfony 6. Seriously, I feel like Willie Wonka...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/689303931/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d55cf6871f67128866a28db5f0eafbe6ec1522d4c060a637362df51b044dcdeb</video:content_loc><video:duration>373</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-09T09:49:22+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/directories</loc><lastmod>2026-01-30T12:54:40+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1390982408-93b8c24acbce7491d52b640a9b8a71e2443209aead9db0226c1f6c51590bd341-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Meet our Tiny App]]></video:title><video:description><![CDATA[Let's get to know our new project because my *ultimate* goal is for you to *really* understand how things work. As I mentioned, there isn't a lot here yet... about 15 files. And there are really only...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/686520071/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=80cb0392551023b8b4877f3ad5a11db8df99f42c88e449abb6b880858bdb25d8</video:content_loc><video:duration>313</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-10T10:49:22+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/route-controller</loc><lastmod>2026-01-30T12:54:40+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1394014549-a29856019e14c89a4454a1c19c0bf81237afeb0751342987090e75827ea5bae3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Routes, Controllers & Responses]]></video:title><video:description><![CDATA[I gotta say, I miss the 90's. Well, not the beanie babies and... definitely not the way *I* dressed back then, but... the mix tapes. If you weren't a kid in the 80's or 90's, you may not know how...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/688086472/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=09d5a178fe0c34468bf5eadf35f08d3295605a974ad05716e41330182c2bb567</video:content_loc><video:duration>504</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-15T09:19:22+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/wildcard-route</loc><lastmod>2026-01-30T12:54:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1394042366-d6186bd9bd94ac1fe54039a5ef06b299390d3520e201ece570b7fa3489f2b93f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Wildcard Routes]]></video:title><video:description><![CDATA[The homepage will eventually be the place where a user can design and build their next sweet mix tape. But in addition to *creating* new tapes, users will also be able to browse *other* people's...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/688215796/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=cce3ae8a59894c234a68aecae34236de8efffc9391aaf28193463c00994ed997</video:content_loc><video:duration>466</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-15T20:22:36+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/flex</loc><lastmod>2026-01-30T12:54:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1452967508-3d2812a0556bf90f42167a58a69004ed7551234ae275a7a882c9a2dcc2d8a779-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Symfony Flex: Aliases, Packs & Recipes]]></video:title><video:description><![CDATA[Symfony is a set of libraries that gives us tons of tools: tools for logging, making database queries, sending emails, rendering templates and making API calls, just to name a few. If you counted...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/721475075/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1606bd34ccc8aafc4a01365dd0e901441fe6e81f62ca4abacdf1afe2ab929b56</video:content_loc><video:duration>530</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-15T20:32:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/flex-recipes</loc><lastmod>2026-01-30T12:54:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1394511345-e358ca668e958f7a300f2bf1e10060e883b95883f8c19005acd35b421c0aec6a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Flex Recipes]]></video:title><video:description><![CDATA[We just installed a new package by running `composer require templates`. *Normally* when you do that, Composer will update the `composer.json` and `composer.lock` files, but nothing else. But when we...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/688461271/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5f3a171276755c8ccc815decaa7d937550bccd7d26b2a98d75fdcd4c62fbbf3a</video:content_loc><video:duration>471</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-15T20:40:54+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/twig</loc><lastmod>2026-01-30T12:54:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1397878141-e95f4dfc222276449ae34fbc9759edd5d8834c11fc15425468dbbba23bf402a3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig ❤️]]></video:title><video:description><![CDATA[Symfony controller classes do *not* need to extend a base class. As long as your controller function returns a `Response` object, Symfony doesn't care *what* your controller looks like. But usually,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/690346783/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e1e90d64cb2ead95b3f8893ac05672682115d84785ae306b89fdbe2990dea837</video:content_loc><video:duration>365</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-21T09:52:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/twig-inheritance</loc><lastmod>2026-01-30T12:54:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1399676144-2fbe086f42429652f4e9d46fb451392f2e3ccb25ed2fd550339e9abccb63691e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig Inheritance]]></video:title><video:description><![CDATA[Head to https://twig.symfony.com... and then click to check its documentation. There's lots of good stuff here. But what I want you to do is scroll down to the Twig reference. Yea! ## Tags The first...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/691410015/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=87a58f3a66fd05fc6921cf278648c260a6796debaf564c3e952b69cac460c40a</video:content_loc><video:duration>482</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-23T14:31:31+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/profiler</loc><lastmod>2026-01-30T12:54:41+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1400408958-795f278a957a8ef714e6290b7b7daa4a518b5690833e368f2d7e4ae53e96d716-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Profiler: Your Debugging Best Friend]]></video:title><video:description><![CDATA[Time to install our *second* package. And this one is *fun*. Let's commit our changes first: it'll makes it easier to check out any changes that the new package's recipe makes. Add everything:...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/691846347/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ae3ae8b837267ef6365349565753353460d7a35a7d5a31d60d0e5bf3e9274096</video:content_loc><video:duration>448</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-24T14:16:31+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/assets</loc><lastmod>2026-01-30T12:54:42+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1400452688-e8771d30e47a2b3cd645522d9c3796c006a5445b04f4ecb7716c7c9037317764-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Assets, CSS, Images, etc]]></video:title><video:description><![CDATA[If you download the course code from the page where you're watching this video, after unzipping, you'll find a `start/` directory that contains the same brand new Symfony 6 app that we created...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/691871486/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=303d8b7a736118428782c8eb81b5b625d5ed59f9d76a4235442db36d16d9ca02</video:content_loc><video:duration>636</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-25T09:16:31+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/generate-urls</loc><lastmod>2026-01-30T12:54:42+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1400569249-6d8eb4b4ed91ad964365a676408ec55e3f85046a47b2a098cd6dcf4603a38d82-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Generate Urls & bin/console]]></video:title><video:description><![CDATA[There are two different ways that we can interact with our app. The first is via the web server... and that's what we've been doing! We got to a URL and... behind the scenes, it executes...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/691882385/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e13c2bd33334ccdf0bd35221b013222f6f88012fbf0a2dfa62093ee249f75940</video:content_loc><video:duration>477</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-28T09:16:52+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/json-api</loc><lastmod>2026-01-30T12:54:42+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1403190505-3955189ff99bb6697d48b6d94228e657bbc21ff7f78ecb6beb943f664fb71744-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[JSON API Endpoint]]></video:title><video:description><![CDATA[In a future tutorial, we're going to create a database to manage songs, genres, and the mixed vinyl records that our users are creating. Right now, we're working entirely with hardcoded data... but...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/693251445/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d122a6ad42cb3c26db3fed78f4f40d5e90c670ead124b2244f6e23a612d1edde</video:content_loc><video:duration>298</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-03-29T09:46:31+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/route-requirements</loc><lastmod>2026-01-30T12:54:42+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1404539936-d95dc4381c0245c4de1f4f6bd370db3eac607b975207745acf0e9413e6a593bc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Smart Routes: GET-only & Validate {Wildcards}]]></video:title><video:description><![CDATA[Now that we have a new page, at your terminal, run `debug:router` again. ```terminal-silent php bin/console debug:router ``` Yep, there's our new endpoint! Notice that the table has a column called...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/694176300/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1d3dada21cf20dc1176279b6f0a971f34b257584f08148dfc70d2fea8c159660</video:content_loc><video:duration>296</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-04T09:23:32+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/services</loc><lastmod>2026-01-30T12:54:42+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1406346303-e4fef2074337ec3d59c33d68c56f605b36764df9a3f49c69f64a9a2a812c72d6-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Service Objects]]></video:title><video:description><![CDATA[I see Symfony as two big parts. The first half is the route, controller, response system. It's dead simple and well... you're already an expert on it! The second half of Symfony is *all* about the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/694920612/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=fdc442bcad1c8d5fe126b21936c18c3030a92635fe59bc164f40579c17525333</video:content_loc><video:duration>338</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-05T09:24:29+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/twig-service</loc><lastmod>2026-01-30T12:54:42+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1406448763-88297a9ff1ef0436b7a87fefde824a8e6cf7de0b1cc33344ec174b0840c045c7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Twig Service & Profiler for API Requests]]></video:title><video:description><![CDATA[Since this page just loaded without an error, we *think* that we just successfully logged a message via the logger service. But... where do log messages go? How can we check? The logger service is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/695221089/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c1ecd844d0db92adbc206d4bd343060b16ebb6e4ccad205d30fe2b2c07e827d5</video:content_loc><video:duration>364</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-05T21:52:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/webpack-encore</loc><lastmod>2026-01-30T12:54:42+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1687458122-d36c2ff0d5d6478f7fc251ca5f15b31332d8d885b63ca9b34969022ddf9262bd-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Setting up Webpack Encore]]></video:title><video:description><![CDATA[Our CSS setup is fine. We put files into the `public/` directory and then... we point to them from inside our templates. We could add JavaScript files the same way. But if we want get truly serious...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/838483966/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7bb55ee446ee7713a10c67714a60ba9250ba0f8e3ca4ac2e8517a311b414783f</video:content_loc><video:duration>312</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-06T15:21:43+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/webpack-encore-usage</loc><lastmod>2026-01-30T12:54:43+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1407489768-87130c8c377f53adf824d7556b7d516af6221a4620b875227f5359a68f6ceed0-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Packaging JS and CSS with Encore]]></video:title><video:description><![CDATA[When we installed Webpack Encore, its recipe gave us this new `assets/` directory. Check out the `app.js` file. Interesting. Notice how it *imports* this `bootstrap` file. That's actually...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/695812265/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=faee6bb041e52d01f1e6856458476e9501af6595a9feb9e67ca99bdb8d2a1dbb</video:content_loc><video:duration>365</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-06T15:33:27+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/js-vendor-libs</loc><lastmod>2026-01-30T12:54:43+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1411620794-9c5bddb12e1000061d15b235d7fa63b6389870a83fc0edcdffd79f814a82484a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing 3rd Party Code into our JS/CSS]]></video:title><video:description><![CDATA[We now have a nice new JavaScript and CSS system that lives entirely inside of the `assets/` directory. Let's move our public styles into this. Open `public/styles/app.css`, copy all of this, delete...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/697993288/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=11aad8a209610d301b481f95fe3ca47289217c743cbac0bd3b3dc2a45bea6683</video:content_loc><video:duration>351</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-11T10:05:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/stimulus</loc><lastmod>2026-01-30T12:54:43+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1846213447-985eea3e20c74551543f4f3b616bcc5257fe52d211d74bf03e950bc290f13827-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Stimulus: Sensible, Beautiful JavaScript]]></video:title><video:description><![CDATA[I want to talk about Stimulus. Stimulus is a small, but delightful JavaScript library that I *love*. And Symfony has first-class support for it. It's also heavily used by the Ruby on Rails community....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/942562094/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e7265a44edfa3f492bc264194cf905f8f06760d559bdb11580039c423ae2691f</video:content_loc><video:duration>301</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-12T09:18:23+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/stimulus-example</loc><lastmod>2026-01-30T12:54:43+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1414191560-4ab44d45215b98294651c6488df269877bef26a089ecc9b8de6228fa507083ff-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Real-World Stimulus Example]]></video:title><video:description><![CDATA[Let's put Stimulus to the test. Here's our goal: when we click the play icon, we're going to make an Ajax request to our API endpoint... the one in `SongController`. This returns the URL to where...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/699524981/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=952f4f6589903c2a0ef9c1805b1e0ec6474b1c674f7b339a821bc47e00698177</video:content_loc><video:duration>530</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-14T18:22:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony6/turbo</loc><lastmod>2026-01-30T12:54:43+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1414783301-8508811ccb9d88fe5156e2723130c8aa10835e026f5170773d31eaeddf5e9e6d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Turbo: Supercharge your App]]></video:title><video:description><![CDATA[Welcome to the *final* chapter of our intro to Symfony 6 tutorial. If you're watching this, you're crushing it! And it's time to celebrate by installing one more package from Symfony. But before we...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/699854323/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=013f6c4de899c42ca72c3a1a2a002fcb9545be3797c58e7cc08f73602ca6c8ce</video:content_loc><video:duration>406</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-04-15T19:16:13+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/easyadminbundle/install</loc><lastmod>2025-06-06T16:23:16+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2024037495-a0cddb3e645335ecad50a81f21f6b2253da65e26738586a95db81167428974b1-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Installing EasyAdmin]]></video:title><video:description><![CDATA[Well hey friends! We are in for a *treat* with this tutorial! It's EasyAdmin: my favorite admin generator for Symfony. It just... gives you so many features out of the box. And it looks great! This...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1091252542/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e6549cec8778423281cec16ea45e290eac9318636c4a4e3bd294c4a2fd774b39</video:content_loc><video:duration>209</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-01-26T09:46:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/easyadminbundle/dashboard</loc><lastmod>2023-02-21T21:14:04+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1569725626-876512b8bfbd460039ecc2783c55c1d22ef3db86c588ac68805ed3335f4ccbf7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Admin Dashboard]]></video:title><video:description><![CDATA[Run: ```terminal git status ``` Installing EasyAdmin didn't do anything fancy: it doesn't have a recipe that adds config files or a button that makes cute kittens appear. Darn. It just added itself...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/781993726/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f477f641295f485ee63254e998a3203c0cebcbf5701ed6b5a22512890a9d666c</video:content_loc><video:duration>451</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-01-27T09:31:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/easyadminbundle/crud-controller</loc><lastmod>2025-06-06T16:19:16+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2024035867-f08c1bd85c5c6e59ba39252a600a6d8268efbe7dcb2a65fa3c99537ee3674d22-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Hello CRUD Controller]]></video:title><video:description><![CDATA[The true reason to use EasyAdmin is for its CRUD controllers. Each CRUD controller will give us a rich set of pages to create, read, update, and delete a single entity. This is where EasyAdmin...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1091249404/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=21dc796d01a2be492abb14933cea68637053e8f039e7f9cd637bfa4b506be219</video:content_loc><video:duration>364</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-01-28T09:16:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/easyadminbundle/dashboard-crud-hierarchy</loc><lastmod>2023-02-21T21:14:04+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1361270716-69377a6e3e7cf2f6b186430bf0792f237d07c3d8a0b16d1e134082592b4845c5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Global vs CRUD-Specific Configuration]]></video:title><video:description><![CDATA[The methods `configureAssets()`, `configureCrud()`, `configureActions()` and `configureFilters()` all live here inside of `AbstractCrudController`. And each gives us a way to control different parts...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/671778618/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3bf689fa44665460c858d2a441d39b27972172934cfa295d4680c851c5ca5862</video:content_loc><video:duration>553</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-01-31T09:51:29+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/easyadminbundle/menu-items</loc><lastmod>2023-02-21T21:14:04+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1361886198-b30f9aadbafcc004f5c6084456a8b949ae0bc87cf234457c8ccdaac4a5ab925d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Controlling the Dashboard Menu]]></video:title><video:description><![CDATA[There are two things that we can do from our `DashboardController`. The first is to configure the dashboard itself, which is mostly just the title, menu links, and also controlling the user menu. The...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/672054924/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=733307b861298ad2e4183d86f4144c34dea378a707ca734e14e5cdd23e70bdb2</video:content_loc><video:duration>355</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-02-01T09:41:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/easyadminbundle/assets</loc><lastmod>2023-02-21T21:14:04+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1362912993-933b7ded2b5955466de1a84fba36759b68f3a10e427db2b39e1be5e4bd2d490e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Assets: Custom CSS and JS]]></video:title><video:description><![CDATA[The EasyAdmin interface looks pretty great out of the box. But what if we want to customize the way something looks? For example, if I want to change the background on the sidebar. How can we do...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/672502419/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7a7f96add6b71e976856e9f59f1e6d86157d249631541b37b2fabe84d1b63779</video:content_loc><video:duration>497</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-02-02T09:34:30+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/easyadminbundle/fields</loc><lastmod>2023-06-15T01:43:12+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1684258458-e02be6be9718ca02fed6499fcfb70145374be6d5ca4d1df316c85c61c9d9f2f9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Configuring Fields]]></video:title><video:description><![CDATA[Open up the "Users" section. EasyAdmin has a concept of _fields_. A field controls how a property is displayed on the index and detail pages, but *also* how it renders inside of a form. So the field...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/836379450/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d4fb37129ff0602fca3360065d11993b907e8979b6af221e49c571da3dbb7eb9</video:content_loc><video:duration>421</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2022-02-03T09:14:29+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-security/install</loc><lastmod>2026-01-30T15:48:29+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1278946913-93ce9e349bb019a5af985024cf864859f760e82d09157e5bb_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[composer require security]]></video:title><video:description><![CDATA[Welcome back friends! I'm *so* happy that you've stumbled into my Symfony 5 security tutorial for a bunch of reasons. The first is that well... uh... the site that we've been building has NO...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/636540043/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2847f01cf47272b782a0bfd9f27f94da1135dc29a278cae54ecdae63145a93fc</video:content_loc><video:duration>307</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-10-20T09:27:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-security/make-user</loc><lastmod>2026-01-30T15:48:29+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1280041738-0b66772237473e2ededfef7b28482bf1094b5ccad9040ed81_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[make:user]]></video:title><video:description><![CDATA[No matter how your users authenticate - a login form, social authentication, or an API key - your security system needs some concept of a user: some class that describes the "thing" that is logged...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/637206137/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=eb8e88623286d6041d52f0790c2793965c9ed15be8a925668c4312709d9fdc7a</video:content_loc><video:duration>357</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-10-21T09:32:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-security/user-entity</loc><lastmod>2026-01-30T15:48:29+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1280042397-8f7c9b6fb3c31caf650a78b0abc63c3ce3c297b594cd1e3bd_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Customizing the User Class]]></video:title><video:description><![CDATA[What's cool about the `User` class is that... it's our class! As long as we implement `UserInterface`, we can add *whatever* else we want: [[[ code('3a25cd7778') ]]] For example, I'd like to store...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/637206300/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0da3a753c64d90a0f9ee7acf3e1e14a3651d416c79d9a0bef20bd2ea1c022f3d</video:content_loc><video:duration>188</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-10-22T09:34:52+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-security/login-form</loc><lastmod>2026-01-30T15:48:29+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1283605702-2a83b7fe19caf0974e9f31ba1a034e14c5dec8206c6eec685_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Building a Login Form]]></video:title><video:description><![CDATA[There are a lot of ways that you can allow your users to log in... one way being a login form that loads users from the database. That's what we're going to build first. The easiest way to build a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/638466295/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ced1388798f04f00d15c8e44901add8014ff8f5b44e2926e6bbf8cead40219e1</video:content_loc><video:duration>187</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-10-25T09:14:52+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-security/firewalls-authenticator</loc><lastmod>2026-01-30T15:48:30+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1284623262-5f70c8062d1aef4f87fa18d7666853754a80cbad35755891e_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Firewalls & Authenticators]]></video:title><video:description><![CDATA[We built this log in form by making a route, controller and rendering a template: [[[ code('db53d89860') ]]] Dead simple. When we submit the form, it POSTs right back to `/login`. So, to authenticate...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/638888912/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6af22235039ebad43730b33743b814f4b557046102beef4beda91fadbd2f67ac</video:content_loc><video:duration>399</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-10-26T09:14:52+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-security/passport</loc><lastmod>2026-01-30T15:48:30+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1396110794-745fff9c2af2daf93e72009820d5c9fa8399b2d411b3b063d1877bbd68aa4105-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Authenticator & The Passport]]></video:title><video:description><![CDATA[On a basic level, authenticating a user when we submit the login form is... pretty simple. We need to read the submitted `email`, query the database for that `User` object... and eventually check the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/689450880/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b11a1471b1918994effffe0b2c1c2af16eaf3ede26cad1c53d8442e88e2e7cce</video:content_loc><video:duration>384</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-10-27T13:44:52+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine-relations/answer</loc><lastmod>2023-02-22T07:42:38+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1239767035-4b85fe045bd8f7a335e714fae937cb438ab9009ba67514614dbdcad686dfd429-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Answer Entity]]></video:title><video:description><![CDATA[Oh hey there friends! Welcome back to part 2 of our Doctrine in Symfony series... you wonderful database nerds you. Last time we mastered the basics, but good stuff! Creating an entity, migrations,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/603516984/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c7cd284b2620bf181b29f356e9037b2f786a52e0835fe5273d25e6edfd1cbd05</video:content_loc><video:duration>332</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-09-13T09:30:33+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine-relations/many-to-one</loc><lastmod>2023-02-22T07:42:38+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1240751822-5ce701eb24c7bc9bfa74960f41c4efc992e4cf107176504d8887f355aca3d4ae-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The ManyToOne Relation]]></video:title><video:description><![CDATA[Okay: we have a `Question` entity and table. We have an `Answer` entity and table. Yay for us! But what we *really* want to do is *relate* an `Answer` to a `Question`. To do this... well... *forget*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/604391775/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5dcc7aeab8f8f2ca6ca057882430259c9037a362eb19181087463f82f828c06e</video:content_loc><video:duration>515</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-09-14T09:50:33+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine-relations/saving-relations</loc><lastmod>2023-02-22T07:42:38+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1244124684-3490263441152f498fb426fee80eca79e75f490d761f37ddd85e950858e6cedc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Saving Relations]]></video:title><video:description><![CDATA[Our `answer` table has a new `question_id` column. Cool... but how do we *populate* that column? How do we relate an `Answer` to a `Question`? This is actually pretty easy... but it might feel weird...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/607454935/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d2da98bd2168881c44a47332574ef96682ea49e180ae42b18ba1c38b75fef2f9</video:content_loc><video:duration>238</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-09-15T09:25:33+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine-relations/foundry-relations</loc><lastmod>2023-02-22T07:42:38+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1244127033-062f21a2d092d91c3e72e02220178e98c749ff73a97438f79abeb74fec2503da-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Relations in Foundry]]></video:title><video:description><![CDATA[We're using a library called Foundry to help us generate rich fixtures data. Right now, it's creating 25 questions. Let's use Foundry to *also* add some answers. ## make:factory Answer Start by...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/607457700/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3d1dc2bfd7c3e08b2a3de9fe395bdf3297722ef391c6f055b0abf43493e3ce83</video:content_loc><video:duration>281</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-09-16T09:10:33+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine-relations/foundry-factory-relation</loc><lastmod>2023-02-22T07:42:38+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1244131168-46849f372b619f33c279937a3a8cfc60178ffce9d53102c8b4f3d1aa8c2c746f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Foundry: Always Pass a Factory Instance to a Relation]]></video:title><video:description><![CDATA[I love Foundry. But using Foundry with Doctrine relationships is probably the *hardest* part of this library. So let's push a bit further. Pretend that, in this situation, we want to override the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/607461578/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4445f0bf54b57db90843a1351af0ee09b2e8bf5d2cab85252cc14d7cd545f8a1</video:content_loc><video:duration>297</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-09-17T09:40:33+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/turbo/intro</loc><lastmod>2023-02-22T07:42:39+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1151718470-e49293c9e684ba93cc5432b0cd2de719a3e49216901295149719ad73a3288bde-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Turbo: Drive, Frames & Streams!]]></video:title><video:description><![CDATA[Hey friends! Welcome back for part two of our Symfony UX series. The whole point of this series is to take a traditional web app - so an app with Twig templates that return HTML - and learn to do two...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/557231785/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7a8a355a849d5a97e97fe6c14440876532816dde75768b45d38c99a04c09e312</video:content_loc><video:duration>303</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-06-01T10:00:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/turbo/install</loc><lastmod>2023-02-22T07:42:36+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1325843242-bbd88d116a2fc526deb6e94cbf7fb2bae156d1b5e3f254519a0ce0a2340e1438-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing Turbo]]></video:title><video:description><![CDATA[Wouldn't it be cool if when we click on a link or even submit a form, instead of that triggering a full page reload, it made an Ajax call... then updated the page with the new HTML? Well, that's...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/656757391/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8d5e3c0f24ff4b746a7695bd4d333f633af2044bf0153b91644561b3aa16fcd8</video:content_loc><video:duration>221</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-06-02T10:05:07+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/turbo/how-drive-works</loc><lastmod>2023-02-22T07:42:36+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1153723514-1991562bbb93a7f3fc4d4361238eb63aebaad78f282a1e7e6aa7047777f4cdd1-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[How Turbo Drive Works]]></video:title><video:description><![CDATA[This is Turbo Drive. And yes, it feels like absolute magic. So let's break down how this works. ## How Was Turbo Activated? The Magic Stimulus Controller To start... we never wrote any JavaScript...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/558230542/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4370b1b78bed76a4b8eed3ec11f8b6be9a0267bec99fb9a2f9c05d727643152c</video:content_loc><video:duration>577</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-06-03T09:45:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/turbo/javascript</loc><lastmod>2023-02-22T07:42:36+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1156914657-e7b9a699904fe508425be1859a00759f816e2608dfcd304bea42594e327a4820-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Turbo-Friendly JavaScript]]></video:title><video:description><![CDATA[The *biggest* gotcha with Turbo Drive is JavaScript. And that's for one simple reason: suddenly there are *no* full page refreshes! And... a lot of JavaScript is written to *expect* that behavior. ##...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/559669655/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=386c2094efdba1db9f36a964f8c13ff8e3921c7b71755142dba084bc56fee2dd</video:content_loc><video:duration>416</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-06-07T09:55:07+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/turbo/disabling</loc><lastmod>2023-02-22T07:42:36+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1156916616-04ae2c971c66a102d617b0f056a92f9286f5860bb4d2980c29c7c5760ac8955d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The "defer" Attribute & Conditionally Activating Turbo]]></video:title><video:description><![CDATA[Inspect element and go check out the `head` tag. Notice that all of our `script` elements live up here in the `head` with a `defer` attribute. That's on purpose. And this `defer` attribute comes from...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/559677295/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a2fb15085dc3b7fbc681e9afff5748fa703ac38d64339d33a6fb61cc87f5fbaf</video:content_loc><video:duration>242</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-06-08T10:00:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/turbo/forms</loc><lastmod>2025-07-31T03:27:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/2042640365-22f25efb157c5c9b6261b96b18e775113541462f18b9e12aadf71af28c98619b-d_1108x624?&amp;r=pad&amp;region=us</video:thumbnail_loc><video:title><![CDATA[Form 422 Status & renderForm()]]></video:title><video:description><![CDATA[We already know that Turbo Drive also works for form submits. To prove it, head to the login page and log in as `shopper@example.com` password `buy`... using these handy cheating links that are...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/1105989241/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8ab84bb6ef1cf78e1d6188d9abf457395610b63a929865043014bc52bb66edfe</video:content_loc><video:duration>545</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-06-09T09:15:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stimulus/ux</loc><lastmod>2023-02-22T07:42:34+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1054753600-81e89bcacf5f06e5e3d74c13faa8384eca1ea9bd0892d606be2662b335a76cc2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Symfony UX]]></video:title><video:description><![CDATA[Hey friends! I *sure* am glad you're here for part 1 of our 2 part Symfony UX series. ## HTML Build on the Server or in JavaScript But what *is* this Symfony UX thing anyways? That requires... a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/509523802/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=dff2c4beb91535681c8db47438c33f4823e2e5cb3dc00304466b66cf72299555</video:content_loc><video:duration>334</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-02-08T09:48:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stimulus/encore</loc><lastmod>2024-06-11T22:29:11+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1868527919-6a7cfc1eaf901278d29ecca4718fdb9ba133bf2513fcb7a2bfb2a7fa2eef0c65-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Setting up Webpack Encore]]></video:title><video:description><![CDATA[So let's get Webpack Encore installed so we can get a proper CSS and JavaScript build system set up. ## Installing Encore Find your terminal and run: ```terminal composer require "encore:^1.14" ```...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/956786121/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4c26c41ed93f1b079f98f03f2a9e9a3ae2576032dbcd50b13282b67da578b118</video:content_loc><video:duration>311</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-02-09T09:28:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stimulus/splitting-importing</loc><lastmod>2023-02-22T07:42:34+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1569713571-25bf1122f24ca0751418a825e4f7b174c0391c0a9f7893643465a34735db90ff-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[encore watch & Code Splitting]]></video:title><video:description><![CDATA[Let's get Encore to build our assets! Do that by going back to the terminal and saying: ```terminal yarn watch ``` This reads our `app.js` file and outputs the final files into a `public/build`...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/781989839/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=99571344378b10cfc26f0f0bfbb6fc9a9d8b5a058f82bad23797295966f12cac</video:content_loc><video:duration>246</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-02-10T09:43:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stimulus/controllers</loc><lastmod>2023-02-22T07:42:34+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1325827098-41512e6dc509bcdcfceaf39fa6f0e16d92b491028b416c5cb021574f693bd8c4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Stimulus Controllers]]></video:title><video:description><![CDATA[Ok: time for Stimulus! First stimulus is... a JavaScript library! If you start a new project and install Encore fresh, like we did, then thanks to the recipe, `stimulus` is already inside of your...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/656749126/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d24201c4360292f1710cedab77c16a7b249a0859f35d978f63c4e030d6e8ddbb</video:content_loc><video:duration>353</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-02-11T13:18:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stimulus/properties-events</loc><lastmod>2023-02-22T07:42:34+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1058510411-aaf3e464854c7c5946283bfdaae8a53254bf30ec51b4a6e1f76191736a167f6a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Magic with Events, Properties & HTML from Ajax]]></video:title><video:description><![CDATA[To show off the power of this simple, controller-instance-bound-to-HTML-element concept, let's count how many times each element is clicked and print that inside the element. ## Adding a Controller...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/511333506/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d4bd100769fb80a14d84063a3c80a29f1b0731266ed204f7541bae84f3594d9e</video:content_loc><video:duration>283</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-02-12T09:08:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stimulus/targets</loc><lastmod>2023-02-22T07:42:34+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1062331755-3a99abf4577af9708f073847e023c9682df171a6f5ccb0efd8c7afe175cb2d3c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Targets: Finding Elements]]></video:title><video:description><![CDATA[Each time stimulus sees a new `data-controller="counter"` on the page, it instantiates a new instance of our controller class and calls this `connect()` method. From here, we can do anything! We can...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/513077301/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2cfcf2be05fb05645607fb706cc5b6f31af72286d0aaf2c5aa78d7df85b40fb1</video:content_loc><video:duration>401</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-02-17T09:38:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stimulus/actions</loc><lastmod>2023-02-22T07:42:34+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1062340167-c8550491b2e7d274280834418796622b233a4362f9f7a22aa36af3a5994777f7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Actions: Listening to Events]]></video:title><video:description><![CDATA[I want to make our controller more realistic: instead of being able to click anywhere on the element to increment the count, let's add a button. Easy enough! In the template, add `` and then the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/513081919/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6b962db92ba4d6fcd85dda192c95808b9be5393ab88e6674846999981f527ee6</video:content_loc><video:duration>283</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-02-18T09:38:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue2/setup</loc><lastmod>2023-02-22T07:42:33+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/998444776-e59e88e82ec4df1da51ca002272847c78b0daf9cc8c5e599fe2d9abe97a9ef72-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Project Setup]]></video:title><video:description><![CDATA[Welcome back you beautiful front-end JavaScript people! In part 1 of our Vue series, we learned a ton of Vue basics and lots more. Now it's time to go further: to get into the nitty-gritty details of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/481373574/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=11ad25c78a20a1d13cbb97f9661bb658ba843256e22735a73aa57f8d6705b873</video:content_loc><video:duration>262</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-11-23T09:05:51+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue2/product-show-page</loc><lastmod>2023-02-22T07:42:33+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/998556169-55ffdcce4e3c1b8f802059ed57628e3b3b310e0db4c3884d72ce5b5430bca42a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Page 2: Product Show Page]]></video:title><video:description><![CDATA[Let's build a page to view a single product! We'll get there by clicking on this link... or the image or... any of this. We *could* use the Vue router so that when we click any of these links,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/481496611/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c3fde0139b92accf11554f593d25e4e12b514799f92bd6e497665ffb90702dbb</video:content_loc><video:duration>419</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-11-24T09:28:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue2/product-context</loc><lastmod>2023-02-22T07:42:33+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1002512562-a1547e637264b8a68ec5ce263552f6ce751c73632a2c410bc33cfa37e30ede1a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Current Product Id]]></video:title><video:description><![CDATA[So here's the plan: make our top-level Vue component - `products.vue` - able to render either the product list page *or* the product show page. Why are we making *one* component able to render two...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/483836358/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1db935eef463e706053c08842a614f6cce00a15c2e07733f044e05f07a7f23dc</video:content_loc><video:duration>296</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-11-26T09:53:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue2/dynamic-component</loc><lastmod>2023-02-22T07:42:33+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1003282998-f4db0f460f56ae7c2c0204275a7a2048308e1511714fb5646cd7f0099ed4fb93-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Dynamic Component]]></video:title><video:description><![CDATA[Our top level component - `products.vue`- can now read the `currentProductId`, which will either be set if we're on a product page or will be null if we're on the page that lists products, which is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/484291380/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=765fcc747885ff8102019d17dcedc824a9c166c41ab3b5193dbea0cf1e747f84</video:content_loc><video:duration>444</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-11-27T09:23:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue2/ajax-delay-rendering</loc><lastmod>2023-02-22T07:42:33+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1004317941-b7a60f8cc95ff959bde405e48adebb76692f2c42ef0e22c80e084ba34e3802b8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[AJAX & Delayed Rendering]]></video:title><video:description><![CDATA[Let's start building the product page. In the component, we have the `productId`, but not the product *data*. We'll need an AJAX call to get that. ## AJAX call for Product Data In...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/484902294/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ac6556377a14ef766e03c0cbd57b3f96026f51d8f3de903d11604158bfaf5e38</video:content_loc><video:duration>438</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-11-30T09:48:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue2/dumb-component</loc><lastmod>2023-02-22T07:42:33+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1004318675-0124888711b958af518ad360c84a9a0220fa5cf4b08ed8bc61755c6521ee67dd-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Making the Title Component Less Smart]]></video:title><video:description><![CDATA[In the last tutorial, we created a `title` component, which we're reusing so that we can have a consistent look and styling. [[[ code('43b583bc8b') ]]] Cool! In `product-show.vue`, let's use that!...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/484903401/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c9e8066ec515685828562610eb5320b4732aac131ad73dab186a2bdc796a7d67</video:content_loc><video:duration>239</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-12-01T09:47:27+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue2/product-template</loc><lastmod>2023-02-22T07:42:33+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1007847192-de2af0dc1d528ae9680595d6676601184c302c42caeeab0276516f34b7254012-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Product Template & Color Selector]]></video:title><video:description><![CDATA[Time to build this product show page and make it shine! This will involve adding... mostly just a bunch of HTML that prints product data... so let's cheat! If you downloaded the course code, you...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/486971042/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=507d5a2df0d3aaf3a375ec25b02818e6ac33a8f7427fe6d5655085ddc129062d</video:content_loc><video:duration>306</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-12-04T09:38:05+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2-extending/setup</loc><lastmod>2023-03-22T12:57:39+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/958552430-2296983d8763afdc4c88ef2d55ad0e92e8764b27a2af250f8d070f75cff2b456-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[App & Test Setup]]></video:title><video:description><![CDATA[Hey friends. Yea! It's time for part 3 of our API Platform tutorial series. First, let's do a status check, because we have been busy! In [part 1](https://symfonycasts.com/screencast/api-platform2),...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/458601953/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0cd268f645c43035fbb48bc9a1a5ccc8ee9e189ed69f864fd85370bfb60011c1</video:content_loc><video:duration>464</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-09-09T09:21:12+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2-extending/persister-decoration</loc><lastmod>2023-02-22T07:42:32+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/954498735-4a60d8c99374b3a61c47fd9a9b5f9c6a73c1bf15f3c99f4fe1ff91a5836463a6-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Data Persister Decoration]]></video:title><video:description><![CDATA[In the last course, we create this `UserDataPersister` class: [[[ code('8afac30e1f') ]]] ## Um, what is a "Persister"? Now, let's back up real quick. Whenever you use a `POST` or `PUT` endpoint,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/456194555/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a546d5afdef8c87050a21fa6b3636af938580d23a9a7239ef58d17af4b026fde</video:content_loc><video:duration>408</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-09-10T09:18:14+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2-extending/decoration-deep-dive</loc><lastmod>2023-02-22T07:42:32+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/955357871-106f56280b9c2adba4f37f2cf152b0214dccebc79d545bc4003480b185f9c6ee-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Decorating Data Persisters vs Context Builders]]></video:title><video:description><![CDATA[To do the actual *saving* of the `User`, we want to call the *specific* core ApiPlatform data persister that *normally* saves entities. So... how can we do that? To start, we need to figure out which...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/456724878/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=80ca12c19e99ebc2ba6d3169ff9111fdc91635f0255bfa0f44b85e75584f0fab</video:content_loc><video:duration>534</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-09-11T09:58:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2-extending/persister-context</loc><lastmod>2023-02-22T07:42:32+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/956870005-8076bc94b96e894c91dbf6e5b0c04411860978f7fb21f2655ce370f3c1191c30-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Custom Logic Only for some Operations]]></video:title><video:description><![CDATA[Data persisters are *the* way to do logic before or after something saves. But what if you want to do something only when your object is being created? Or only when it's being updated? Or maybe only...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/457575621/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2db95589dadfce8e3681e2099cc2c040c43846e332b9841e3345d8a29443a378</video:content_loc><video:duration>302</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-09-14T09:51:38+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2-extending/setting-published</loc><lastmod>2023-02-22T07:42:32+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/956874920-6787ff339bd9bbc1aef475aaf8838f0178a59b93b9e0753243c406f3a7bd0af9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Publishing a Listing]]></video:title><video:description><![CDATA[One of the things that we *can't* do yet is publish a `CheeseListing`. Boo! Right now, when we create a `CheeseListing` through our API, it always gets an `isPublished=false` value, which is the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/457577951/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0af8767460960b33438777d4cff355f7d4559cade6f028df12a858964db62000</video:content_loc><video:duration>362</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-09-14T15:48:55+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine/install</loc><lastmod>2023-02-22T07:42:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1317555875-18c6723ba3bf03f5d3f845b45baf2a79117046da2cdc35b4d6717425381a04f4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing Doctrine]]></video:title><video:description><![CDATA[Well hey friends! And bienvenidos to our tutorial about learning Spanish! What? That's next week? Doctrine? Ah: welcome to our tutorial *all* about making Symfony talk to a database... in English. We...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/652946680/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=58934965878d280207cce7dde768674b52eac2ae5ec5ce71215871ccb0ac67c1</video:content_loc><video:duration>474</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-07-30T16:12:18+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine/docker-database</loc><lastmod>2024-07-30T07:45:45+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1907811185-5fcf9bc8f7fef4318e7943a5904e4e4f7de1a35d6e046048e385497304c7a101-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[make:docker:database]]></video:title><video:description><![CDATA[Doctrine is installed! Woo! Now we need to make sure a database is running - like MySQL or PostgreSQL - and then update the `DATABASE_URL` environment variable to point to it. [[[ code('44307a5c42')...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/991926974/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f3ab9471ba91647e3f7dd27feed0a43fa7561b42552bde1d5bb9f1769b7ba07b</video:content_loc><video:duration>324</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-07-31T09:32:12+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine/docker-compose</loc><lastmod>2023-02-22T07:42:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/934362635-4cf6bd141c97d5a04fcd0b735f5c560551b7e2b9b73104b66dfbbcf1a0397e8b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[docker-compose & Exposed Ports]]></video:title><video:description><![CDATA[We just started our MySQL docker container thanks to `docker-compose`. So... ah... now what? How can we *talk* to that database? Great question! Start by running just: ```terminal docker-compose ```...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/444250616/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=02e4987803dfc554cfb3a00dd9d84fbe14b64512def140723af312885fc51a7c</video:content_loc><video:duration>286</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-08-04T15:11:10+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine/docker-env-vars</loc><lastmod>2023-02-22T07:42:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/971623643-86413e45c1df2f7a1f7276a9834d41f2aa8448a6bb14ae282bcec7357c504bd3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[docker-compose Env Vars & Symfony]]></video:title><video:description><![CDATA[Thanks to our `docker-compose.yaml` file and the `docker-compose up` command, we started a MySQL container in Docker. You can prove it by running: ```terminal docker-compose ps ``` Yep! Port 3306 of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/466203735/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=498b9a7eafd52b974958a602aa452695fe490c1470a86a460eac41e503c5a278</video:content_loc><video:duration>299</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-08-05T14:56:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine/console</loc><lastmod>2023-02-22T07:42:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1135575094-6ec9005fdbe2fe285c99afac7cafe03e081f2bac1d46dba59713bcaf046e290a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[doctrine:database:create & server_version]]></video:title><video:description><![CDATA[We have a Docker database container running *and* our app is *instantly* configured to talk to it thanks to the Symfony web server. But... we can't really *do* anything yet... because that MySQL...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/548493532/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a645b7147aa818f8e9f3f309d2b91cfd0415f5d72e148640d26f9b02601ba46e</video:content_loc><video:duration>289</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-08-06T07:08:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine/entity</loc><lastmod>2023-02-22T07:42:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/936175990-fc363c9a062fd792218619510f27631d78a9e5dca956ba678a7cfedd92f5f665-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Entity Class]]></video:title><video:description><![CDATA[Doctrine is an ORM: an object relational mapper. That's a fancy way of saying that, for each table in the database, we will have a corresponding class in PHP. And for each column on that table, there...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/445344948/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=64ed652bb3096db60115c0fcdb00d31ac0fdebf3f9cb03837a0ac26129c1cd36</video:content_loc><video:duration>477</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-08-07T14:45:58+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine/ago</loc><lastmod>2023-02-22T07:42:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/936569448-a58be6ceca38f48f48972247173ab0d4a98ca5a9ed2e00bec81f99c463edfdb2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA["5 Minutes Ago" Strings]]></video:title><video:description><![CDATA[Let's make this date dynamic! The field on `Question` that we're going to use is `$askedAt`, which - remember - *might* be *null*. If a `Question` hasn't been published yet, then it won't have an...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/445576311/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ffa14b55151c09cf2e0aa727396ae93481e577cb387f9ba443dfe3cac1cf1da4</video:content_loc><video:duration>195</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-08-12T13:46:47+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine/foundry</loc><lastmod>2023-02-22T07:42:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1179317386-f8e4cd8a18a2512212fe72aa161f401652535681faf4ec1e4180086e4b9a30a5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Foundry: Fixture Model Factories]]></video:title><video:description><![CDATA[In the `load()` method of the fixture class, we can create as much dummy data as we want. Right now... we're creating exactly *one* `Question`... which isn't making for a very realistic experience....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/570310569/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2387ba83f3b82029a2772da62917f52f547c5c25ce281e4c178fd7eb41b44efb</video:content_loc><video:duration>356</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-08-26T15:46:50+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-doctrine/foundry-tricks</loc><lastmod>2023-02-22T07:42:32+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1135567399-76da23700d985b39ddf0782a311258066dcf531901e31f1e6cf385f22fc95340-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Foundry Tricks]]></video:title><video:description><![CDATA[In `QuestionFactory`, we're already doing a pretty good job of making some of this data random so that all of the questions aren't identical. To help with this, Foundry comes with built-in support...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/548489795/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2e8ee7f998baf7f37f192e244184eee5ca728fe0a90e8fa79424b4578f21df31</video:content_loc><video:duration>448</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-08-28T12:33:24+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-fundamentals/bundles</loc><lastmod>2023-02-22T07:42:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/881514472-ecc59fadac00e12cee717125c9c6394675b7fbd6645ed2b5e5faad4db2d3189b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bundles!]]></video:title><video:description><![CDATA[Hey friends! Welcome to Symfony 5 Fundamentals! I *cannot* emphasize enough, how *important* this course is to make you *super* productive in Symfony. And, well, I *also* think you're going to love...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/410013952/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=26ab450f17c874e7c0c3dce4f5fe53bfd68ba327c557b826b935a4648068cdb9</video:content_loc><video:duration>371</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-04-21T08:27:23+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-fundamentals/markdown-bundle</loc><lastmod>2023-02-22T07:42:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/881529166-a2ca4a704b36b2d9ef867119846df9e928f660e71dc8b43cb27f866d095276fc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[KnpMarkdownBundle & Service]]></video:title><video:description><![CDATA[Fun fact! Witches & wizards *love* writing markdown. I have no idea why... but darnit! We're going to give the people what they want! We're going to allow the question text to be written in Markdown....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/410024349/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4d159bce7002b8b98bfbf2adff5749e111ad45d7561ab26bd12c31dcb555de98</video:content_loc><video:duration>475</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-04-22T08:37:23+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-fundamentals/cache-service</loc><lastmod>2023-02-22T07:42:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/882658928-ecc4a4fae533048485da5050b904bb729ddc09d8ee773f6e980808c8a378e219-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Cache Service]]></video:title><video:description><![CDATA[Parsing markdown on *every* request is going to make our app unnecessarily slow. So... let's cache that! Of course, caching something is "work"... and as I *keep* saying, all "work" in Symfony is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/410846167/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b234e23a55b2e3e06ea8b498d9fc73622d050a2129588e82021acf9f14bc393d</video:content_loc><video:duration>301</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-04-23T08:30:21+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-fundamentals/bundle-config</loc><lastmod>2023-02-22T07:42:31+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/882669403-6675afefce30d664c08a391539f8f81b37a7955bad2f1b0a1eb3460ad4796661-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Configuring Bundles]]></video:title><video:description><![CDATA[In the show controller, we're using two services: `MarkdownParserInterface` - from a bundle we installed - and `CacheInterface` from Symfony itself: [[[ code('8ae4105c51') ]]] And... this was pretty...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/410853626/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ab2e732f5bfd44dbec5f75f96ef45ae7e55fca67b5aaba9fcb2ef89774b6a2eb</video:content_loc><video:duration>390</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-04-24T08:10:21+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue/setup</loc><lastmod>2023-02-22T07:39:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/898156745-db23281e3703db76d5050fb994e0e9a7756693a90adb41d87c5d9daa9cf1797d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Encore, Symfony & API Platform]]></video:title><video:description><![CDATA[Well hey friends! Welcome to the delightful world of Vue.js. I know I say that *every* topic we cover at SymfonyCasts is fun - and I *totally* mean that - but this tutorial is going to be a *blast*,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/422223355/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=24c29d3bc0e8b58a7fb69e7ebedd5352ca17d62ff9713329885a2a16952d311b</video:content_loc><video:duration>435</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-05-24T20:07:27+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue/vue-install</loc><lastmod>2023-02-22T07:39:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/899153220-04be032becf359731adb00b16e624558571ff7e78f9dc65320ba347f6b83da34-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing Vue, Webpack & Eslint]]></video:title><video:description><![CDATA[To use Vue, we, of course, need to install it in our app. And, because we're using modern JavaScript practices, we're not going to include a `script` tag to a CDN or manually download Vue. We're...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/422912823/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5475542c0faf450ad38b9290fb78df887bea6d7026c0b8f79988c49411cfa5ab</video:content_loc><video:duration>537</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-05-26T20:07:46+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue/vue-instance</loc><lastmod>2023-02-22T07:39:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/899153510-7dcfc61fce604de8871a8dcec1af62d9afd313c7adbc8d5482550bc2d9657b1c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Vue Instance & Dynamic Data]]></video:title><video:description><![CDATA[We've just seen the most basic thing you can do with Vue. And if you think of Vue as a templating engine like Twig, it makes a lot of sense: we instantiated a new Vue instance, told it *where* on the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/422915794/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=be827a490a834e5958b5ad6c062ca56428f7c4de25c81f3921f6c1b4a5ac63d0</video:content_loc><video:duration>370</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-05-26T20:08:16+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue/single-file-component</loc><lastmod>2023-02-22T07:39:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1051502888-01465e42d53cfc7eb5b5b0398d4902038f353fce45d8d2012a21e203ea3e5eca-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Single File Component]]></video:title><video:description><![CDATA[As we've seen, it's *totally* possible to configure the Vue instance and put the template in the same file. But... this is going to get *crazy* as our app grows: can you imagine writing 100 lines of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/508042229/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ad05bf4a6fffe490f6573347dc7dc8b4bbc0ce732f7e0809f0b395c7a1b3ec6b</video:content_loc><video:duration>257</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-05-28T19:30:24+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue/styles</loc><lastmod>2023-02-22T07:39:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/900331739-d1203b2a7c9b1f7ab4f7e8ee00d224484495160544b108164fcef719cb6830cb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[CSS: Styling a Component]]></video:title><video:description><![CDATA[Our main focus in this tutorial will be to build a rich product listing page inside of `products.vue`. To get that started, I'm going to replace the `h1` with some new markup - you can copy this from...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/423750465/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5b4c3a26e0ca672f2c8235d088f46cbffa923862aea1b5c5a42d8ac846936989</video:content_loc><video:duration>291</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-05-28T19:47:30+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/vue/data-dev-tools</loc><lastmod>2023-02-22T07:39:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/902107109-f31014ce87c54925f5b5b43357b073fed294b6f4914c069ff28da155a2d79752-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[data() and Vue Dev Tools]]></video:title><video:description><![CDATA[The template I pasted in is 100% hardcoded. Boring! See this little "shipping" message down here? Let's pretend that sometimes we need this message to change - like maybe if the user is on the page...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/424902862/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=43f76a9506016a0b21b86190eb13a6444351e56e0ac62e5da8cfcd4ec23cc93e</video:content_loc><video:duration>268</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-06-01T21:02:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/deep-dive/events</loc><lastmod>2023-02-22T07:39:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/867218494-cc1f80557ecb2f9fc09f652ed662fa81dbecb847763b984b2f343e8acfcdbe9a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Events, Events & Events!]]></video:title><video:description><![CDATA[Hi friends! Ok: so you already know how to use Symfony... maybe you... use it every day. Heck, I love it so much, I've been known to use it on vacation! And now, you're ready to go deeper - to find...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/399267498/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=137ef171ba1b778040a814e258b29a1187e1953aebae1e092b795a820a767587</video:content_loc><video:duration>310</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-23T09:58:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/deep-dive/event-listener</loc><lastmod>2023-02-22T07:39:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/867811647-00568e5252a2455d89c3b3e7f2d578f63f1840f8a0adb715af153e727e6c8c32-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hooking into Symfony with an Event Subscriber]]></video:title><video:description><![CDATA[Before we dive into the core code, let's hook *into* the request-response process. Let's create our own *listener* to this `kernel.request` event. To do that, in the `src/` directory, I already have...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/399685025/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b30e2f140e91939c4b6dc95f8a435e24801503faafcb17739512b4f8721ba7ae</video:content_loc><video:duration>354</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-23T09:58:14+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/deep-dive/kernel-handle</loc><lastmod>2023-02-22T07:39:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1148584170-6b675e3300d5faba2229ddb3b7da408a995d17d3a2b925ce493c72a8be281ae4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[index.php to HttpKernel::handle()]]></video:title><video:description><![CDATA[Let's start from the *very* beginning of the request. When we load a page, the *first* file that's executed is `public/index.php`. No matter what, this is where it all starts. So let's literally go...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/555824602/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c4b45132fee7b1884c7c751aeda6d1ecc656618e7c7dee8ad09a111a25054ef7</video:content_loc><video:duration>410</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-23T10:03:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/deep-dive/router-listener</loc><lastmod>2023-02-22T07:39:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/867899638-692e39100d2059816817d4d5e7efad5d0767e239236c12f80836374d49b31dba-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[RequestEvent & RouterListener]]></video:title><video:description><![CDATA[We've traced the code from the first file that's executed - `public/index.php` - all the way into this core `HttpKernel` class. Specifically, this `handleRaw()` method. These 50 lines of code are the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/399747672/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=02021777653d1608b14ea56af607fec69638328e39aeb6e6264d21e23800c5d7</video:content_loc><video:duration>386</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-23T10:03:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/deep-dive/request-attributes</loc><lastmod>2023-02-22T07:39:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/867904851-2ee7c196e1d57e8777e6f7c42eca532cc07b886e5149b8affe59a4e28e0bb597-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Routing Secrets & Request Attributes]]></video:title><video:description><![CDATA[This array is the *end* result of the route-matching process. Apparently, the router returns an array with the wildcard values from the route *plus* keys for the route and controller. But... it's a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/399751451/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=82ea4341b8873d4046ca8022925f552a3d9b9d7e054a8d9667171fcc80fdbd15</video:content_loc><video:duration>467</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-23T10:03:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/deep-dive/controller-resolver</loc><lastmod>2023-02-22T07:39:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/870758318-0e41b72da8a33076537ec789724ef743362c47177eec0010e0f9171f298110ef-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Controller Resolver]]></video:title><video:description><![CDATA[After the `kernel.request` event is dispatched, it checks if `$event->hasResponse()` and, *if* that's true... it *returns* the response! Well, it calls `$this->filterResponse()` and returns *that* -...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/401855989/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e0ae91e7709d0b4775d0220f28bb0f1a700cc3796722684bee1abbb6eddb0eec</video:content_loc><video:duration>423</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-29T14:20:26+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/setup</loc><lastmod>2026-01-30T16:12:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/861602844-3a91aeacf32a86c22ae78b979d334ab566d2dfd61b6af30d522395b98b52dd6a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating a new Symfony 5 Project]]></video:title><video:description><![CDATA[Hey friends! And *welcome* to the world of Symfony 5... which just *happens* to be my favorite world! Ok, maybe Disney World is my *favorite* world... but programming in Symfony 5 is a *close*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/395352813/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d2cd1d2ea111f4ab64a49fe2edfcaf8f2aa88a64b0ce9f1a549a5bc3574f3906</video:content_loc><video:duration>365</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-04T03:22:24+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/dirs-server</loc><lastmod>2026-01-30T16:12:28+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/861888160-3114ee7de3fa12776f72391765db0503cce6d612f5f8ecad11071499d5c8bfec-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Meet our Tiny App + PhpStorm Setup]]></video:title><video:description><![CDATA[One of my *main* goals in these tutorials will be to help you *really* understand how Symfony - how your *application* - works. To start with that, let's take a quick look at the directory structure....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/395555234/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=9c9e8e2d174164ac2547abbc7262e1b4b9f9444160968ec8198dcedec4ef7d74</video:content_loc><video:duration>330</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-05T10:09:26+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/route-controller</loc><lastmod>2026-01-30T16:12:28+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/862144887-217ca83a7ff59d065ee49ca2d7a1e26cd21baa74c62764d7cfbeb5eb7403b557-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Route, Controllers & Responses!]]></video:title><video:description><![CDATA[The page we're looking at right now... which is super fun... and even changes colors... is *just* here to say "Hello!". Symfony is rendering this because, in reality, our app doesn't have *any* real...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/395733360/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e581f84286a41698d5a1f0522127f5da49f663412612532a1b5fa0e9a8b5d465</video:content_loc><video:duration>356</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-06T10:02:06+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/annotations</loc><lastmod>2026-01-30T16:12:28+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/862153797-a6d129d1a565d63fc84a1a1c1f92c8a633787cf506dc79054dbd2a5401d7bac0-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Annotation & Wildcard Routes]]></video:title><video:description><![CDATA[Creating a route in YAML that points to a controller function is pretty simple. But there's an even *easier* way to create routes... and I *love* it. It's called: annotations. First, comment-out the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/395738165/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b5f5f1c4db09b9974e0d739e9d9759dcf4f371be091cae8c419dbb93dc2f9e46</video:content_loc><video:duration>370</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-09T10:02:06+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/console</loc><lastmod>2026-01-30T16:12:28+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/862155660-e284189beb8204f83374522a4e45375afef49690816dd0b4afb8618ee28ef04d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Lovely bin/console Tool]]></video:title><video:description><![CDATA[Let's commit our progress so far. I'll clear the screen and run: ```terminal git status ``` Interesting: there are a few *new* files here that I didn't create. Don't worry: we're going to talk about...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/395740323/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=29bc9ed098d1aa8f1b1ec5fdf568d7f10d28d7347972d37099086df6aa29aadb</video:content_loc><video:duration>162</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-10T10:02:06+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/flex</loc><lastmod>2026-01-30T16:12:28+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1688569667-3846bc873f743706be0e0893b2b5b9f21b16e5cd254cc84e99d0aaa9539a3277-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Flex, Recipes & Aliases]]></video:title><video:description><![CDATA[We're going to install a *totally* new package into our app called the "security checker". The security checker is a tool that looks at your application's dependencies and tell you if any of them...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/839227919/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=fecce663285a052aca467d270b86daa8ad29267edd7973f256c528faace7c314</video:content_loc><video:duration>386</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-11T10:07:06+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/flex-recipes</loc><lastmod>2026-01-30T16:12:28+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/862200508-46cca463116ebee370be23921a65c1815c39150e0c15b2732506abc78606c897-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[How Recipes Work]]></video:title><video:description><![CDATA[Where do these Flex recipes lives? They live... in the *cloud*. More specifically, if you look back at https://flex.symfony.com, you can click to view the Recipe for any of the packages. ***TIP The...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/395772953/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1e94414b41a34b9f7fa8ebd16c6296db7956807f5b8f1a85973c3368dd6fcd03</video:content_loc><video:duration>186</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-12T10:10:27+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/twig-recipe</loc><lastmod>2026-01-30T16:12:29+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/863720456-29f1f4db4dc811f32e05db533f9c5f862d2dbac7fdae6fcbc6aae18dd7b32499-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Twig Recipe]]></video:title><video:description><![CDATA[Unless you're building a pure API - and we *will* talk about returning JSON later in this tutorial - you're going to need to write some HTML. And... putting text or HTML in a controller like this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/396801153/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=019f26be9eed72ab72a19991b3a6322dc4fad7f9c7e8f933d3fd62810f789641</video:content_loc><video:duration>226</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-13T09:36:42+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/twig</loc><lastmod>2026-01-30T16:12:29+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/863923642-985b21f903d5ad87a4d84ec16cf8cf55e578997b4a6bff629a2b516444c4a35d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig ❤️]]></video:title><video:description><![CDATA[Let's make our `show()` controller render some *real* HTML by using a template. As *soon* as you want to render a template, you need to make your controller extend `AbstractController`. Don't forget...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/396938873/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8898ca007f3574a7c54305a76e3d0f73196749c0bf17a0c5b6f9aab7f0f7950f</video:content_loc><video:duration>614</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-16T10:57:57+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/profiler</loc><lastmod>2026-01-30T16:12:29+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/929511459-e6a262900d81a221d77d9b2cdcd39f5cd4450e1c2cb0289fa53c01f62b273969-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Profiler: Your Debugging Best Friend]]></video:title><video:description><![CDATA[We're making some *pretty* serious progress - you should be proud! Let's check out what files we've modified: ```terminal-silent git status ``` Add everything: ```terminal-silent git add . ``` And...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/441403094/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2b7c9a470a2952a13059af0f2cdffd74a0e4fd950c4ef2428d3e27ef4b15f7f4</video:content_loc><video:duration>406</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-16T12:27:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/assets</loc><lastmod>2026-01-30T16:12:29+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/865388602-c9c0fca91e061fe6d69d462ca88e3ed7cdb540eded53d8bef3d9a31a958aaef4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Assets: CSS, Images, etc]]></video:title><video:description><![CDATA[We're doing really well, but yikes! Our site is *ugly*. Time to fix that. If you download the course code from this page, after you unzip it, you'll find a `start/` directory with a `tutorial/`...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/397950026/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=08226cbd262344ea1966e2a760d1c93c258083708946d8f445d11062c96a9181</video:content_loc><video:duration>598</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-16T12:27:15+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/generate-urls</loc><lastmod>2026-01-30T16:12:29+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/865395162-a68b29d8415a7dcd32a231fdd7584d9031c6c87587f5ee8659b741014c398a9d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Generate URLs]]></video:title><video:description><![CDATA[Go back to the "show" page for a question. The logo on top is a link... that doesn't go anywhere yet. This *should* take us back to the homepage. Because this is part of the layout, the link lives in...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/397954990/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=47e4d0b02c649e5083c489679fd68258c93a5100c0343a0d07c3381a834c7546</video:content_loc><video:duration>311</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-16T12:47:13+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/json-api</loc><lastmod>2026-01-30T16:12:30+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/865425854-5202e1feafe4bbe78f2c78c4b37a9274e973ca79ef6940f836ea37daddb93eca-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[JSON API Endpoint]]></video:title><video:description><![CDATA[One of the features on our site... which doesn't work yet... is that you can up and down vote answers to a question. Eventually, when you click up or down, this will make an AJAX request to an API...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/397977350/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c642ee59e86a361de38ab1da44f80495ef354663e78ff46c67ff79ed2e448d70</video:content_loc><video:duration>389</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-16T14:24:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/javascript</loc><lastmod>2026-01-30T16:12:30+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1047439115-ade1399751d048924a42db0fe6f81826ea85416d1f9fc77c083cedb6d0a2122a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[JavaScript, AJAX & the Profiler]]></video:title><video:description><![CDATA[Here's our next goal: write some JavaScript so that that when we click the up or down vote icons, it will make an AJAX request to our JSON endpoint. This "fakes" saving the vote to the database and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/506171626/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=89d888f2a241841d1ddf612db7c4147ddaccbe35bf74f77b15ab37f51781d763</video:content_loc><video:duration>432</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-16T14:38:51+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/route-requirements</loc><lastmod>2026-01-30T16:12:30+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/865512324-6249edc20ae745e2ed28e4f66fc9521ee37d7c979a75b104ad744d78e06ffb17-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Smart Routes: POST-only & Validate {Wildcards}]]></video:title><video:description><![CDATA[Inside our JavaScript, we're making a POST request to the endpoint. And that makes sense. The topic of "which HTTP method" - like GET, POST, PUT, etc - you're *supposed* to use for an API endpoint......]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/398040523/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4173e504454761fd382f0c5628288f57f4a1af3a7836b1d66b48b5a58bdec2b0</video:content_loc><video:duration>244</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-16T18:33:41+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/services</loc><lastmod>2026-01-30T16:12:30+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/865522664-21f3973afbb622d5ba0090b983975cc996b531d0eade6233857e546a7d83fd00-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Service Objects]]></video:title><video:description><![CDATA[Symfony is really two parts... and we've already learned *one* of them. The first part is the route and controller system. And I hope you're feeling pretty comfortable: create a route, it executes a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/398048034/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2fe5201a8c6461255ddaaa7d2a2150886c8548929297ac748f00225f75b2899d</video:content_loc><video:duration>505</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-17T10:37:07+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/webpack-encore</loc><lastmod>2026-01-30T16:12:30+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1091845980-5420dfd37dd0a1bfd19703d2f9becf51b34b43a277bda4bffc47d8e6e55969aa-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hello Webpack Encore]]></video:title><video:description><![CDATA[Our CSS and JavaScript setup is fine: we have a `public/` directory with `app.css` and `question_show.js`. Inside our templates - like `base.html.twig` - we include the files with traditional link or...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/527450465/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=154c4db437710d044af4764cbf06bb185b9e91600ba4a32ccf7d2fb1e3cf5075</video:content_loc><video:duration>245</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-17T10:37:13+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5/webpack-encore-usage</loc><lastmod>2026-01-30T16:12:30+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/971740735-8c8c4e71c202570d9e2ab4e897575a8d4ee7eb893e726a7dcfb8accefb39f2dc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Webpack Encore: JavaScript Greatness]]></video:title><video:description><![CDATA[***TIP The recipe now adds these 2 files in a slightly different location: * `assets/app.js` * `assets/styles/app.css` But the purpose of each file is exactly the same. *** Okay: here's how this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/466278215/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=070166667fc5525633bf6fcc5a56b2c68ce9175883c41f50a368db3014fbe9a8</video:content_loc><video:duration>510</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-17T11:28:15+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-upgrade/flex-symfony-require</loc><lastmod>2023-02-22T07:39:25+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/840763230-0fcc11bbbcb57e2b404e19660f9789d567941141aa1db0da484212c3c27b09a6-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Flex, Versioning & extra.symfony.require]]></video:title><video:description><![CDATA[Hi friends! Today we get to explore the, strange, mysterious, shiny world of Symfony 5. Duh, duh, duh! Well... first we'll cover how to *upgrade* to Symfony 5 - which is its own fancy process - and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/380398307/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1e45691f092c9e86e6aa97e99c2efab4b4339425d9e24abb6c9264e1fec83ea7</video:content_loc><video:duration>512</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-19T09:26:44+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-upgrade/version-constraints</loc><lastmod>2023-02-22T07:39:25+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/841050823-048158300e9bdaed380929f7a9ecc0cbdccf2ed5895af836e8c9a1eb91751c1b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Managing Flex, extra.symfony.require & Version Constraints]]></video:title><video:description><![CDATA[We just ran: ```terminal composer update "symfony/*" ``` Thanks to the `extra.symfony.require` key in our `composer.json` file: [[[ code('6149fccb88') ]]] Which is currently set to `4.3.*`, it only...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/380611156/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=bde18eb1ac4c97c567dc9877a5428a1cd7978ea50839f8ba61bfa1471009991e</video:content_loc><video:duration>302</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-20T09:34:11+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-upgrade/upgrade-4.4</loc><lastmod>2023-02-22T07:39:25+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/906880532-419cfced7af562d573aa70ab9caad1446bbdd70155899e8a22958573696dee4e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Upgrading to Symfony 4.4]]></video:title><video:description><![CDATA[To upgrade from Symfony 4.3 to 4.4 - that's a "minor" version upgrade - we need to change the `extra.symfony.require` value to `4.4.*` - done! - *and* update each Symfony package version to that same...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/427780276/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c16b330f79b3db83063e9493dc4b0fac57d8a21c437da938adedea9475be42ee</video:content_loc><video:duration>346</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-26T10:19:11+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-upgrade/upgrade-recipe-git</loc><lastmod>2023-02-22T07:39:25+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/842188428-60f32a2fd9389f9b37833a72406feb01467d7c417889bf25413224adff012fb4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Selectively Committing Recipe Updates]]></video:title><video:description><![CDATA[We just... sort of... *accidentally* updated the MonologBundle recipe by removing that package and reinstalling it. Doing that modified *several* files. Let's add the changes we *know* we want to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/381450709/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=9a8c6f71fe27ec765ad0455b33f4bf82ae28c1ab219ccb3dea6f0cc62b950066</video:content_loc><video:duration>275</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-27T09:23:12+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-upgrade/recipe-commands</loc><lastmod>2023-02-22T07:39:25+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/843009313-72c2434e55308327dfccc9a95ede6042370070217b52bd9a3cc0491fb9ad878d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Upgrading Recipes: New Commands!]]></video:title><video:description><![CDATA[Fun fact time! When you start a brand new Symfony project, behind the scenes, what you're *actually* doing is cloning this repository: `symfony/skeleton`. Yep, your app *literally* starts as a single...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/382033585/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=10d4adf7ce4ae1b339775b4d3516b3957a9542f232e3bcc8562b67aec59383bf</video:content_loc><video:duration>396</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-30T15:47:40+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony5-upgrade/console-recipe</loc><lastmod>2023-02-22T07:39:25+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1353317231-5b8e6162ea3533da5b9df758f48405dc9e787b799a3d688ab54117b121da2ea8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Recipe Upgrade: symfony/console & bootstrap.php]]></video:title><video:description><![CDATA[The first recipe I want to update is `symfony/console`. Let's get some more info about it: ```terminal composer recipes symfony/console ``` Just like before, it shows us some links: a link to what...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/668349256/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=74ec4607bc1330a451250746985fee5de8743202777a6145032d94219b8f11ed</video:content_loc><video:duration>504</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-01-02T09:56:35+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2019/keynote</loc><lastmod>2023-02-22T07:39:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/836730173-275a6d0875831efa5266055409f7c04c6fdda45842253ab94f007aa3529b414a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Keynote (Fabien Potencier)]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2019 Amsterdam presentation by [Fabien Potencier](https://connect.symfony.com/api/alternates/4aed4f5d-e0cb-4320-902f-885fddaa7d15). Time for Symfony 5! Watch live as Fabien gives...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/377318819/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f90923690fde6d4a246b7d8ec05c4683332350b379614484be99ca735bdaac71</video:content_loc><video:duration>2542</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-05T13:18:06+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2019/http-3-its-all-about-the-transport</loc><lastmod>2023-02-22T07:39:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/836063398-875c9195f1f8fa49e06895de6186068521e9dfb959ed05f7cb6257dbd3c184a7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[HTTP/3: It's all about the transport! (Benoit Jacquemont)]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2019 Amsterdam presentation by [Benoit Jacquemont](https://connect.symfony.com/api/alternates/e5effdbc-6ecf-44ff-818d-274a82d9494e). [Talk slides](https://speakerdeck.com/bitone/3)...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/376840571/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=adb375a66f4dc708a955c4d40de546e02fa6d013da3059ff68f67a5cb7f0c260</video:content_loc><video:duration>2194</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-05T13:18:58+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2019/how-to-contribute-to-symfony-and-why-you-should-give-it-a-try</loc><lastmod>2023-02-22T07:39:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/837136353-79810c1d70ae98d8b036e679617bb9bf2bc8fd86ba0ad15628704cf67b537dbb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[How to contribute to Symfony and why you should give it a try (Valentin Udaltsov)]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2019 Amsterdam presentation by [Valentin Udaltsov](https://connect.symfony.com/api/alternates/d5ee9661-dcbf-4fdf-9d61-76f51adf4360). [Talk...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/377631765/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1a77ace1622869cd13c77f0e777e2c6fdbe376b2039b58bd6202a0649f35a98b</video:content_loc><video:duration>2294</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-05T20:59:15+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/london2019/keynote</loc><lastmod>2023-02-22T07:39:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/828402025-4a55f6df04242909eb692479728390e2f1b5b2088eff293d4f68ebf65d14b29c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Introducing Symfony Notifier (Fabien Potencier)]]></video:title><video:description><![CDATA[***TIP Symfony Live London 2019 presentation by [Fabien Potencier](https://connect.symfony.com/api/alternates/4aed4f5d-e0cb-4320-902f-885fddaa7d15). *** ## Talk Abstract In this talk, lead developer...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/371021799/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0ba2f1a7c4e3667af4d754b984c0f27b6be649dd52316a068409f863e724e7ed</video:content_loc><video:duration>2221</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-11-05T13:17:19+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/london2019/queues-busses-and-the-messenger-component</loc><lastmod>2023-02-22T07:39:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/828008276-3a1e91f1d62ecd5ea4617801c9ff4579f001f2616d8f9a1d000aa94f1c1199dc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Queues, busses and the Messenger component (Tobias Nyholm)]]></video:title><video:description><![CDATA[***TIP Symfony Live London 2019 presentation by [Tobias Nyholm](https://connect.symfony.com/api/alternates/c92dd500-ba6d-4729-a5d0-c15c254d6bb3). *** ## Talk Abstract Message queues are the perfect...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/370709370/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3f102aacb78ffafaa3823764c3de844874abb1d57a47d3da1f93fcce870e6a70</video:content_loc><video:duration>2578</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-11-05T13:49:55+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/warszawa2019/keynote</loc><lastmod>2023-02-22T07:39:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/820350529-8323b1ff93b2a96cd6a34e12143d6cea38ec6fd53f0fa48ee25b9735902ebc26-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Keynote (Fabien Potencier)]]></video:title><video:description><![CDATA[***TIP Symfony Live Warsaw 2019 presentation by [Fabien Potencier](https://connect.symfony.com/profile/fabpot). *** ## Talk Abstract In the keynote, Symfony lead-developer Fabien Potencier talks...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/364817346/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=af861049cd2fa4811c359f47cdf2e1055fc6dbce4c45da7f3553ab6b77e42c18</video:content_loc><video:duration>2716</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-10-07T18:07:29+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/warszawa2019/symfony-makerbundle-szybsza-praca-i-mniej-bledow</loc><lastmod>2023-02-22T07:39:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/820374325-c008c4b355d7126d2ec833968c161c3afc3ded11ead567919338162985f381c2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Symfony MakerBundle - szybsza praca i mniej błędów (Przemysław Bogusz)]]></video:title><video:description><![CDATA[***TIP Symfony Live Warsaw 2019 presentation by [Przemysław Bogusz](https://connect.symfony.com/api/alternates/22e15d1f-6a6b-44ef-b5f3-853f80681391). This talk is in polish and (sorry!) no transcript...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/364836745/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f0ae50a175301282cafdc441a1a5759d08b2f7de895bbb4cd37a4619f6e0259c</video:content_loc><video:duration>3004</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-10-07T18:07:29+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/solid/solid</loc><lastmod>2023-02-22T07:39:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1117333436-9dc95d9c2c28dd1cd6ec47b71e25f2688ee2ba0a27c0605861882e8c1c052b9b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[SOLID: The Good, The Bad & The Real World]]></video:title><video:description><![CDATA[Hey friends! Welcome to our *long* awaited tutorial on the principles of SOLID: single responsibility principle, open closed principle, Liskov substitution principle, interface segregation principle...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/538818983/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5f6205718291b5dbd762f320f89aa7b17430c71946df16bc649b341e3a518cd4</video:content_loc><video:duration>202</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-04-26T09:35:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/solid/srp-defined</loc><lastmod>2023-02-22T07:39:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1117334875-33cf64c8f163f94944ef0bfb801a8d7a5dfd980c1a9b630a2bbcb17fd107dbf2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Single-Responsibility Principle: What is it?]]></video:title><video:description><![CDATA[SOLID starts with the Single-Responsibility Principle or SRP. SRP says: > A module should have only one reason to change. Um, huh? This sounds... a *little* too "fluffy" to be *actually* useful....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/539707106/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e06e8478132724558cb0f5aca4d68626dcb209b3ffb0104381cbba973c55671e</video:content_loc><video:duration>458</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-04-26T17:01:48+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/solid/srp-responsibilities</loc><lastmod>2023-02-22T07:39:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1120016195-d82c9066354f280289ade3c49e6ac60edcc1dd8d729cd7c566bec871906a0b34-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[SRP: Responsibilities]]></video:title><video:description><![CDATA[We've just been informed that - gasp - from time to time, our confirmation email doesn't reach our user's inbox! Ah! And so: we need to implement a resend feature. ## SRP: You Shouldn't Need to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/541055338/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=31c355777c8fc055a0d10ebba9c37a55cd0ebfcfe3bae0863743d8a51478df06</video:content_loc><video:duration>384</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-04-27T18:25:26+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/solid/srp-refactoring</loc><lastmod>2023-02-22T07:39:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1123514138-e312e2ef8083b69a3954d5bf6f5850d494bc88d1bfde0ea48cf1468c10ddd046-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Refactoring for SRP]]></video:title><video:description><![CDATA[We've identified that `UserManager::register()` handles two things that might change for different reasons. These are its two responsibilities: one, creating and sending a confirmation email and two,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/542717834/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=27159bf271618a4dadce8250fa600999f68e83e1e1d3477b04b292b077d2930a</video:content_loc><video:duration>443</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-04-29T09:45:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/solid/srp-takeaways</loc><lastmod>2023-02-22T07:39:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1124577142-76c1b74699e8ac77dd7142589c3ab5e62f6038d18b13291866a4740144bee5af-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[SRP: Takeaways]]></video:title><video:description><![CDATA[We decided that the confirmation email functionality and user creation functionality are likely to change for different reasons. And so, we split these two responsibilities into two separate classes....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/543261256/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b8d39cc91b1de951eb000297f1f8671d762037eb2e97652c3b657213769422d2</video:content_loc><video:duration>252</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2021-04-30T10:00:07+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailer/install-mailer</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/823637418-12c0832c180fdddbc48785e2df1eecf86cb5ff5fd163e82c7031fb5a1db5341d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hello Symfony Mailer]]></video:title><video:description><![CDATA[The year is 1995: internet connection speeds are reaching a blistering 56 kbit/s, GeoCities is transforming *everyone* into an accomplished web designer, and sending *emails*... is *all* the rage....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/367326581/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=adaf736f057e2f6142d4f571b595943ef46892c077e55512ee3eedb10115a595</video:content_loc><video:duration>272</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-10-21T10:01:46+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailer/email-object</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/824358991-48594535d299ad9022668c795725dbae4192701177cd835d804559d95936124b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating, Configuring & Sending the Email Object]]></video:title><video:description><![CDATA[Time to send... an email! After a user registers for a new account, we should probably send them a welcome email. The controller for this page lives at `src/Controller/SecurityController.php`... find...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/367850803/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=fd0536ec037eebb7f3bbbe2b873a531119d0319a9ee28382b1c46325de9331ac</video:content_loc><video:duration>254</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-10-22T10:41:46+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailer/config-mailcatcher</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/826323604-bb94b9ccc4fdcff03686b49f1f3e82558161014c0fbddb58bdd6fd21fa01b186-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Transport Config & Mailtrap]]></video:title><video:description><![CDATA[We've already learned quite a bit about how to customize a specific email... with a *lot* more coming. But how do we customize how an email is *sent*. In Symfony, the way that your messages are...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/369391892/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=905a6d7938a79c3530b5339576ceba64b368b8d95923c5c9a3093a6277f9da8c</video:content_loc><video:duration>343</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-10-23T10:57:06+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailer/html-emails</loc><lastmod>2023-02-22T07:39:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/824980982-46baeb51b90f0da24f98398be8324ef15608fd6d8a7f25672db3e23364f483f8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[HTML Emails with Twig]]></video:title><video:description><![CDATA[Every email can contain content in *two* formats, or "parts": a "text" part and an HTML part. And an email can contain *just* the text part, just the HTML part or both. Of course, these days, *most*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/368334501/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5e755d3c14a3369f43155325a0af73a30bcb670b78fa9ebb44b7df4bc905a404</video:content_loc><video:duration>344</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-10-24T10:57:06+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailer/absolute-urls</loc><lastmod>2023-02-22T07:39:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/840697024-cdb127776d4f088cbeb23e53ebcc56765e5ccc8de6e431a09d2b125d79352805-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Absolute URLs to Routes & Assets]]></video:title><video:description><![CDATA[The HTML content of our email will use *this* template... which is still *totally* static. For example, see this link going to `#homepage`? That's just a placeholder. Normally in a template, we would...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/380348933/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a874576a65b0c19d4ba0a6670ad5b56f81f8b6f9d9d42e7a0b3f758c76da84c2</video:content_loc><video:duration>326</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-10-25T09:54:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/mailer/dynamic-mails</loc><lastmod>2023-02-22T07:39:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/834517044-e7d11f874a1fca5909d00e53c08bc4342243ed53fd3f1c18e29475ca9f3ef9a7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Email Context & the Magic "email" Variable]]></video:title><video:description><![CDATA[When you set the HTML part of an email, Mailer helps out by creating the "text" version for us! It's not perfect... and we'll fix that soon... but... it's a nice start! If you *did* want to control...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/375676388/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e454a5b81cdec6be9c7627f2532c1469218e4944adb059c980140413fc6dc648</video:content_loc><video:duration>450</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-10-28T09:52:50+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/intro</loc><lastmod>2023-02-22T07:39:21+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/832758361-3ce35ac7a7fe3d9479371ac9be2fbc56d7ae2cd9ae06e9412b62f39282990b25-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Performance, Profilers and APMs]]></video:title><video:description><![CDATA[Hey friends! Welcome to the *fastest*, most *performant* SymfonyCasts tutorial of all time, on Blackfire. The end. What? We should say a bit more? Uh, Blackfire is *all* about having fun while you...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/374341344/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=174a528a6e882198ce4a05c3a5a9f5680fac015d38b90f56ab0205b18109b0e7</video:content_loc><video:duration>335</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-11-21T09:50:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/the-pieces</loc><lastmod>2023-02-22T07:39:21+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/833317919-c547bd479778d3018cadd30d38d49fa572c62d2ace32a64142f4efc90fdfa3e2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Blackfire Install: Agent, Probe, Chrome Extension]]></video:title><video:description><![CDATA[So let's get Blackfire installed on our local computer. Head over to `https://blackfire.io` and log in or register for a new account. As you can see, I've been busy using Blackfire already. ## Agent...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/374769360/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=573f25f0fd3a92f932f79f47168a898255536d9c3155be2feeda3aabdf2340cf</video:content_loc><video:duration>194</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-11-22T09:05:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/install</loc><lastmod>2023-02-22T07:39:21+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/843068465-11e3b5aa6a134e39ce4113174c2c04d568718eb8388721f9be2593708314a4fb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing the Agent, Probe & Chrome Extension]]></video:title><video:description><![CDATA[So... let's get these pieces installed! Back on the install page, the setup details will vary based on your operating system. Fortunately, Blackfire has details for pretty much all situations. I'm on...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/382076490/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e793dd709b819591b8c247ac3f951ebe0cfe618bf9f6444e8d714c50448d94d1</video:content_loc><video:duration>386</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-11-25T10:20:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/function-list</loc><lastmod>2023-02-22T07:39:21+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/834201248-24e29ab601cb1432f522b9cf5e2f4e886e821fd65e9ae8929709a28c99234514-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Wall Time, Exclusive Time & Other Wonders]]></video:title><video:description><![CDATA[We just made Blackfire profile our first page. One of the *best* things about Blackfire is that, instead of just... giving me some raw data-dump and saying: > Good luck navigating *that* black pit of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/375433663/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=eee2070c0cff5d4897909dd53bc806b265346a63935c4ed71e3ed374f65223e1</video:content_loc><video:duration>467</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-11-26T10:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/call-graph</loc><lastmod>2023-02-22T07:39:21+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/834628236-3d2e0dd393eb91b77803027800f16da412eadeb11fdb8d5584e24ee1f376ea0b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Finding Issues via the Call Graph]]></video:title><video:description><![CDATA[There are two different ways to optimize any function: either optimize the code *inside* that function *or* you can try to call the function less times. In our case, we found that the most...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/375761497/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2e751d3b3c34428f21279983d032062bfc766c1f70b2a18950ba2936be2376f4</video:content_loc><video:duration>410</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-11-27T09:50:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/comparisons</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/834634251-93d8b08aef382c1cad43b3758a8821b35004852eaeb9d15d0c6e44a40408d75c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Comparisons: Validate Performance Changes, Find Side Effects]]></video:title><video:description><![CDATA[We've just updated our code to make a `COUNT` query instead of querying for *all* the comments for a user... just to count them. So, the page will *definitely* be faster. Right? Are you *absolutely*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/375766012/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0db57469d265e30540ec48f7a4ebe05c1574720d04f82890b2900150902a0731</video:content_loc><video:duration>236</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-11-29T09:51:04+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/recommendations</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/835809507-ca234634cd7c5ca90067a39be1f0250c2f2f577b2640652405372cdbdbff21d8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Recommendations]]></video:title><video:description><![CDATA[Head back to the Blackfire dashboard... and click into the latest profile - the one with our COUNT query improvement - https://bit.ly/sfcast-bf-profile2. The critical path is now much less clear......]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/376653441/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0db29303e739f450a5c99be0f4b68e54c19af507426f32c8baf1813675190a51</video:content_loc><video:duration>385</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-02T10:29:25+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/property-caching</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/836241158-a71540dfa0da24dcc4475b1bf1018d5933da7effc3997aebac21464cda6e4f82-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Property Caching]]></video:title><video:description><![CDATA[Now that we've got our application in production mode and we've dumped the autoloader, it's easier to see what the biggest performance problem is on this page: https://bit.ly/sf-bf-profile4 And...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/376971234/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0a6b4b2d6ce7f7bd228caacb9c0363cbe1c1337fa4d93c1faca9cae673a80a6d</video:content_loc><video:duration>497</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-03T09:35:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/cache-compare</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/836697220-2928a0f955f3f1c96e1c18caf82cc549a6c127e9d89d1f21d2a4a07fe29ff21d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Using a Caching Layer & Proving its Worth]]></video:title><video:description><![CDATA[Whenever we make something more performant, we often *also* make our code more complex. So, was the property-caching trick we just used worth it? Maybe... but I'm going to revert it. Remove the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/377304992/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=485d8ede61bf8c1518323851023e3f947bdb70077102de8854f1964288867a99</video:content_loc><video:duration>264</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-04T14:10:18+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/n-plus-one</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/836907799-1f84eaaee979a7bedbb450e78afd631a8a97ac3c269282d4d0fa7a19098f7bb6-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The N+1 Problem & EXTRA_LAZY]]></video:title><video:description><![CDATA[At this point, I'm pretty happy with the show page that we've been profiling. So let's look at something different: let's profile the homepage at https://localhost:8000/. Ok, this page has a list of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/377461690/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=74af1fcd8bd45bee6e432415ece7385b550af14e4de93066effee8ce5aaa38a9</video:content_loc><video:duration>359</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-05T10:40:25+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/n-plus-one-joins</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/838006083-838f15ef03747b6a457fa64cb1a4758678cf3fe8e3d8c83e647e89d11af9b9f5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Fixing N+1 With a Join?]]></video:title><video:description><![CDATA[We made a *huge* leap forward by telling Doctrine to make `COUNT` queries to count the comments for each `BigFootSighting`... instead of querying for *all* the comments *just* to count them. That's a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/378291088/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5d5fa78bc1bf16df9ff8f346abb2c4d6e8a9d9eb66ae8d7287963afbcf872a67</video:content_loc><video:duration>278</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-06T10:02:50+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/profile-all</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/837463186-7c2c20daac5d400a1aaef9b8e860236debf1e17cbe5d30a93f24771c1bdf002b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Profile All Requests (Including Ajax)]]></video:title><video:description><![CDATA[When you open the browser extension to create a profile, it has a few options that we've been... ignoring so far. ## Debugging Mode ***TIP Debugging mode is available via the Debugging add-on. ***...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/377877691/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ab4a58eb48059f65c7b039939a08f523789ed6360a9fb3d6bf18ecb753abb378</video:content_loc><video:duration>363</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-09T10:42:50+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/blackfire-cli</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/838218880-f0d47b4cff86fcad903e32e7c4e7fee8f50bbbfc78f992ede549e8f41f8a0ae5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Blackfire CLI Tool for AJAX Requests]]></video:title><video:description><![CDATA[We know that the probe - that's the Blackfire PHP extension - doesn't run on every single request: it only runs when it detects that our browser extension is *telling* it to run. There's actually a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/378455486/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2519f6557a3e99d3994c4b12f4cbee6511c24e9fe25b2d763e61244b78a2f023</video:content_loc><video:duration>286</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-10T09:22:50+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/command-line-scripts</loc><lastmod>2025-10-14T01:18:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/838642824-937398f238c351abb1e9e488e67ddd44f547691fb13fe56a9772ca805067c3e5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Profiling Command Line scripts]]></video:title><video:description><![CDATA[As handy as the CLI tool is for profiling AJAX requests, its *true* purpose is something different: it's to allow us to profile our custom command-line scripts. Let's check out an example. I've...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/378783104/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=712816c8298d68d54179daa6a5fb0f911e6595a62cca01bdb3be11bf9b2fefce</video:content_loc><video:duration>393</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-11T13:52:51+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/timeline</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/838845722-4015c936769b66b52236123f64df2a748b10aff91d7cd75d78552aa9b5c74456-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Timeline: Go Behind-the-Scenes with your Code]]></video:title><video:description><![CDATA[Click log in to find our super-secure login system. We not only give you a valid email address, but even the password! We're *very* generous to our users. You can't tell, but now that we're logged...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/378940336/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=786155f6a10415331288fe8095f5cf8cfb818966fed339da142a23360b993830</video:content_loc><video:duration>435</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-12T10:27:50+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/timeline-surprise</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/838961935-b6c1be8dcce98b83360033b55c2fb262f3279224b729efd42b742d14fd397f38-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Timeline: Finding a Hidden Surprise]]></video:title><video:description><![CDATA[One of the big spots on the timeline is the `RequestEvent`. It's purple because this is an event: the *first* event that Symfony dispatches. It happens before the controller is called... which is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/379029875/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6f5b0e1129360b797310cc163229b8f87aabe6105088db9e7914b4aecaaa4c1e</video:content_loc><video:duration>278</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-13T10:23:45+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/instantiation</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/839674631-e980d43a596e6805fd2f0d24cfae38de7174044f6ad05d27a7cacbf24e6ee931-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Spotting Heavy Object Instantiation]]></video:title><video:description><![CDATA[I want to show a... more *subtle* performance problem. To even *see* it, we need to go back to the `prod` environment: [[[ code('698fc11371') ]]] Make sure to run `cache:clear`: ```terminal-silent...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/379574820/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2f29b40a30d44db7b13cba2d1c8977780b8734f1e1b9b8792336ee39b4688e47</video:content_loc><video:duration>366</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-16T10:28:45+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/service-subscriber</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/840065611-38c8b9da4e1883560b54f271a089d808c112b1b27251e9557c3f03f5f8bbcfe9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Service Subscribers]]></video:title><video:description><![CDATA[Because this service is instantiated on every request... it means that all four of the objects in its constructor *also* need to be instantiated: [[[ code('6c0c186b70') ]]] That's not a *huge*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/379882683/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=dfe9f14b7a7e3b203ec83581cbe0e3bf18f9d80e0a1429824fd9c4dd502b65ae</video:content_loc><video:duration>382</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-12-17T10:03:44+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/manual-instrumentation</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/853045410-52ce929ff3b649e6b05e6df3c20074c05fc06cde83b4a4d51f6897da00c782ff-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Manually Profile (Instrument) Part of your Code]]></video:title><video:description><![CDATA[Profiling a page looks like this. ## Profiling: What happens Behind the Scenes First, something tells the Blackfire PHP extension - the "Probe": > Hey! Start profiling! Which basically means that it...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/389396866/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7b1c424bbb91e21d9aea39bee917263e9d1d10d2b34327971dbed3ad4499b29b</video:content_loc><video:duration>544</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-05T10:25:49+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/auto-profile</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/853279217-bd25397833e24c0bfb87a85dc0f58d289c634eb2ca87f697fdb2897c32a5829c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[SDK: Automatically Create a Profile]]></video:title><video:description><![CDATA[Imagine you have a performance "problem" on production. No worries! Except... the issue is only caused in some edge-case situation... and you're having a hard time repeating the *exact* condition......]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/389569605/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=abaf59cf9eeea473ae72ef95bf84c272776b6dcfb689796961266a2c79921277</video:content_loc><video:duration>283</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-06T10:05:00+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/probe-create-subscriber</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/853667489-52d12bc6ed0942cd265be58b11dd8aecb9a200aba6cf748750e5e6c77b735d1c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating an Automatic Probe Early in your Code]]></video:title><video:description><![CDATA[Once we determine that we want to *create* a probe dynamically in our code, we *really* want to do that as *early* as possible so that Blackfire can "instrument" as much of our *code* as possible. ##...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/389827282/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ab241f45865a331746e8cb28d3990a79fa4655981821d36f3c63e170da199bac</video:content_loc><video:duration>477</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-07T10:00:00+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/performance-tests</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/853913268-8585aa4fb65e3761c3835705848aa81f9388d0fd9e16ee6768d86b6ff8abb37b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Performance Tests]]></video:title><video:description><![CDATA[Let's profile the Github API endpoint again. I'll cheat and go directly to `/api/github-organization`... and click to profile this. I'll call it: `[Recording] GitHub Ajax HTTP requests` because we're...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/389988895/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=207c83d61379962c01cddfca3d75296aa57deea1cfd9b403337245430f46165b</video:content_loc><video:duration>405</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-10T10:15:00+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/metrics</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/854008520-e098e581ea1fb4c34d930fe458652f7af9addc02706b93db2509d9ee32aa75ea-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[All about Metrics]]></video:title><video:description><![CDATA[Where did this metrics string come from - this `metrics.http.requests.count`? [[[ code('4e37b19b3c') ]]] There are two things I want to say about this. First, Blackfire stores *tons* of raw data...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/390053872/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=248291521ea3c488b60ab4c76106aec91d4a897129a8db912726b7c015bb2bc3</video:content_loc><video:duration>567</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-11T10:25:34+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/assertions</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/855230501-4eac9b102a06ffd31051907da85a66b07a43bb20ee1af94130542d2a85799ce9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Assertions / Profile "Tests"]]></video:title><video:description><![CDATA[Adding specific assertions inside a test is really cool: [[[ code('621f575434') ]]] But you can *also* add assertions *globally*. What I mean is, whenever you trigger a *real* Blackfire profile -...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/390889915/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=39394ec1f8188b3d5fdaf280d525cd2bdcb3a9a2d6f5758cf855fed89623e84e</video:content_loc><video:duration>247</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-12T10:25:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/blackfire-player</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/855473695-4cf7c7c6b8742a80d553ed7faf72b5c5d0810346526ce7532de395801f62da3b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Blackfire Player]]></video:title><video:description><![CDATA[Pretend for a few minutes that the Blackfire profiler that we've been learning *so* much about... doesn't exist... at all. Why? Because we're *now* going to talk about something that has the word...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/391058422/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b387ebf4e6efc495c052e375259a503e481aa35873a5b7ffbcb445db8149fa51</video:content_loc><video:duration>287</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-13T09:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/blackfire-player-expects</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/855575085-006b2bf9b2bace31e2741f4d805afeca542a8b11b53a035c74ea1d94cadd7160-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Expectations/Tests with Blackfire Player]]></video:title><video:description><![CDATA[We just used `blackfire-player` to execute our first "scenario". It's pretty simple: it goes to the homepage then clicks the "Log In" link: [[[ code('e3eaee2e22') ]]] It works... but... we're not...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/391127014/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=076304faa4a488604030fd123c06cc96992bd7eea9e3e1cc1fa197dc99a53cb9</video:content_loc><video:duration>370</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-14T10:02:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/deploy</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/855758443-f6e14ca644801701058b2da65efa686a5f513a7f0d912d3c835d5c9a314d51eb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Deploying to SymfonyCloud]]></video:title><video:description><![CDATA[Transition point! *Everything* we've talked about so far has included profiling our *local* version of the site. But things get even *cooler* when we start to profile our *production* site. Having...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/391248243/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a0f7022812a391d5b13d05a842b773ec32ea0f7edfd4a8921e832be5f41ad8cf</video:content_loc><video:duration>301</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-17T10:32:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/sf-cloud-database</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/855766877-29dcda772f8d66a32f2a11186eb5fe8d945f0bda1bb5e8b3b31c36a63574a68e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Database Tricks on SymfonyCloud]]></video:title><video:description><![CDATA[We just deployed to SymfonyCloud!!! Well, I mean, we *did*... but it doesn't... ya know... *work* yet. Because this is the *production* 500 error, we can't see the real problem. No worries! Head back...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/391253349/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=9a8040c5c0c07225056d339a0e84e1ec5e13549bf995bc19fa3d67849a7d86e8</video:content_loc><video:duration>480</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-18T10:42:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/environments</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/857676978-e6a091b9ffd052ff3564842876f93ae4f77c79aea10012ffa8bbee7f2cf9d53c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Blackfire Environments]]></video:title><video:description><![CDATA[Now that our site is *deployed* - woo! - how can we get Blackfire working on it? Well... we already know the answer. If you find the Blackfire Install page... it makes it easy: I want to install on...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/392546505/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=50fab5d52e62313b45dc13e22443717343dc21869aaa4a63bc588e6409a368e8</video:content_loc><video:duration>437</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-20T10:22:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/env-profile</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/857677959-33110795aebdf0bb5d8e1f310a935a6360d088f642b75261a986c597161e2dda-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Production Profile: Cache Stats & More Recommendations]]></video:title><video:description><![CDATA[We just profiled our *first* page on production, which is using the Blackfire Server Id and Token for the *environment* we created. ## Profiles Belong to the Environment Go to https://blackfire.io,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/392547273/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8508cb1387af2404cc67aa3952526ad108f737c8f90fcc1855968969a61021cf</video:content_loc><video:duration>258</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-21T10:27:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/build-basics</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/858287396-a5725fbc1f9340b4841ab85c2826d873f5791b29fd4affad685967bae8744fca-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Automatic Performance Checks: Builds]]></video:title><video:description><![CDATA[Head back to https://blackfire.io, click "Environments" and click into our "Sasquatch Sightings Production" environment. Interesting. By default, it takes us *not* to the profiles tab... but to a tab...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/392978952/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=934aad1f75d0ef6d780b9931744ffb757e64cfe3a4b5f614ccc2b276e6bcfe54</video:content_loc><video:duration>435</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-24T10:32:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/build-scenarios</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/858292520-1c90b32e730bf83e14c676456c0ef3ca5b537a9cd829aa17e090de07412afca2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Builds with Custom Scenarios]]></video:title><video:description><![CDATA[A few chapters ago, we created this `scenario.bkf` file: [[[ code('7f280e7891') ]]] It's written in a special `blackfire-player` *language* where we write one or more "scenarios" that, sort of,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/392982659/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=39b5ec61c94bb7584dbff0a50a2f8c3cbd5eebf6659bb43c1dc9ba55fe009e45</video:content_loc><video:duration>332</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-25T10:42:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/custom-metrics</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/858300717-cd94413f16cedecce6e8b6978c4f1b0c1b1545283524524d4637d03d428d84ab-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Per-Page Time Metrics & Custom Metrics]]></video:title><video:description><![CDATA[We know that the scenario will be executed against our *production* server only. If we profiled a *local* page, this stuff has no effect. That means that the results of these profiles *should* have...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/392988627/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=41e21d0a858382a7c268c12d18689a9650451bfc0b8233da1ce780f1d876a5c1</video:content_loc><video:duration>269</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-26T10:41:13+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/comparison-build-tests</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/858349784-c5e0e545f5fc6d48fe8d69b07be5315797a32b8b0b2d957466e2797f32639eb8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Testing a Build Compared to the Last Build]]></video:title><video:description><![CDATA[A *long* time ago in this tutorial, we talked about Blackfire's *truly* awesome "comparison" feature. If you profile a page, make a change, then profile it again, you can *compare* those two profiles...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/393024445/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c29c77fb442f9c3d599d91e5ffbcbce3e2f50ddbc3d5e5dfd4f16811d95dc7c6</video:content_loc><video:duration>466</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-27T10:31:13+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/cloud-environments</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/860093147-68546f31dc5e03e2f972e692d259af904f3d7f2a44dd4b7d705c9b96fd99a34f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Staging Servers on SymfonyCloud]]></video:title><video:description><![CDATA[For your site, you *hopefully* have a staging environment - or maybe *multiple* staging environments where you can deploy new features and test them. What about *those* machines? Should we *also* run...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/394278153/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6634382c878a25054a68df57040292832932e8e68aca31e54fc042a0f4047678</video:content_loc><video:duration>286</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-02-28T09:46:27+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/staging-environments</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/861003342-baef7c322ebe585749e968601f2494d1c8e3aea5de5d94f12885f0c77f0946ef-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Staging Environment Builds]]></video:title><video:description><![CDATA[We now have *two* versions of our site deployed: our production deploy and a, sort of, "staging" deploy of a pretend feature we're working on. Blackfire is *all* set up on the *production* server,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/394932861/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ddfac354a987bd93f89738788272c96e4e933388d0f8f41006d2eb106500a4bf</video:content_loc><video:duration>476</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-02T14:08:48+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/blackfire/environment-vars</loc><lastmod>2023-02-22T07:39:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/861213539-eb19bf8e03ee8991f22c1731c1bc018255440842ba6ce45e0cd826460d127c9b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Blackfire Environment Variables]]></video:title><video:description><![CDATA[Often, your production server will have different - hopefully *bigger* - hardware than your staging server... which means that your staging builds may run slower than production. That's going to be a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/395078519/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=87600103db736983124ad807b63cc459da871602d33c0b2767060426f5d7ec34</video:content_loc><video:duration>255</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2020-03-03T10:48:57+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/messenger/install</loc><lastmod>2025-02-17T16:39:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/793855824-f7095ef75c8747b892700f9383430b0df18c11d0c06aed3786f6b1c6b4a9cdc6-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing Messenger]]></video:title><video:description><![CDATA[Yo Friends! It's Symfony Messenger time!!! So, what *is* Symfony Messenger? It's a tool that allows you to... um... send messages... Wait... that made no sense. ## Um, What *is* Messenger? Let's try...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/344389212/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a32b94010b4f56fce1beeebde46aa6ad15e7af3cff2bd4b9b4c68adda6072034</video:content_loc><video:duration>375</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-26T10:00:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/messenger/message-class</loc><lastmod>2025-02-17T16:40:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/794461858-807f20769b1cfcfffab0d616b009509db71f15446b59dce0659aa66be73fc0b3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Message, Handler & the Bus]]></video:title><video:description><![CDATA[Messenger is what's known as a "Message Bus"... which is kind of a generic tool that can be used to do a couple of different, but similar design patterns. For example... Messenger can be used as a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/344859286/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4e221f7c4d0375418a92b12ad1005ab2f887d7a53ac14cb949224123b63a2fa0</video:content_loc><video:duration>516</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-28T10:15:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/messenger/handler-work</loc><lastmod>2025-02-17T16:40:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/794562003-c4b7700ccba6a8f53cbafb815edd818dd02f65c12e5a3aadfd33078830d31eca-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Doing Work in the Handler]]></video:title><video:description><![CDATA[Inside our controller, after we save the new file to the filesystem, we're creating a new `AddPonkaToImage` object and dispatching it to the message bus... or technically the "command" bus... because...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/344936083/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=43458cfee1fdaa719a2045c6ccfb7c8496c3c1ba52f81daf3e29992dc81a2235</video:content_loc><video:duration>392</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-07-01T10:55:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/messenger/another-message</loc><lastmod>2025-02-17T16:40:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/795339458-d7755bcc05796fd7200c1547f9cf928f44e8053075cee6a2a9379dc022e1e11f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Message, Handler & debug:messenger]]></video:title><video:description><![CDATA[Our app has one other small superpower. If for *some* reason you're not happy with your Ponka image... I'm not even sure *how* that would be possible... you can delete it. When you click that button,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/345539133/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=795967a0c560360646a94276e5cd8cbd87e65958b0f83fbcab942e0a1b4ac0db</video:content_loc><video:duration>351</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-07-02T10:15:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/messenger/async-transport</loc><lastmod>2025-02-17T16:40:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/927754112-df44c9924db485ad44bb222d034ac17414aa8e9b46451825812a54ce4ab5e610-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Transport: Do Work Later (Async)]]></video:title><video:description><![CDATA[So far, we've separated the instructions of what we want to do - we want to add Ponka to this `ImagePost` - from the logic that actually does that work. And... it's a nice coding pattern: it's easy...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/440347381/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=badc513d723c61d3cb9f27ea842acafc839ed3e30d809c92f039d75608478066</video:content_loc><video:duration>453</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-07-03T11:00:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2-security/production-docs</loc><lastmod>2023-03-22T12:52:37+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/803709683-2e9641814236306ba9d5f60137ea009cc645f1527ef0a0df6a87a8926a6bbf52-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hello API Security + API Docs on Production?]]></video:title><video:description><![CDATA[Friends! Welcome to part 2 of our API Platform series - the one where we're talking all about ice cream, um, security. We're talking about security, not uh, ice cream. Hmm. Um, it's going to be...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/351962825/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=85a03318df73dea5043eac048c255448873692bdb802a710252b2c860331d017</video:content_loc><video:duration>535</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-08-05T11:02:50+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2-security/tokens-cookies</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/803890343-75943f03d9a4911ddf6093c4bc1f851a0315b0231443085dcb7c97f5b40b7c6c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[API Auth 101: Session? Cookies? Tokens?]]></video:title><video:description><![CDATA[How *do* we want our users to log into our API? There are about a million possible answers for this. To figure out *your* answer, don't think about your API, just ask: > What action will a user take...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/352106292/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b438748e23d62b641d82f6e43dde518014eedd018b53e773e9541e346e6ca4a7</video:content_loc><video:duration>245</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-08-06T10:24:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2-security/json-login</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/804190005-19af69c6cbb18e9190bde6e0d4de1f26da775fbdeac9b5aac43f15adf99b8338-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Login with json_login]]></video:title><video:description><![CDATA[If your login system looks similar to the traditional email & password or username & password setup, Symfony has a nice, built-in authentication mechanism to help. In `config/packages/security.yaml`,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/352336088/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a4a098e87d8c141f2608b9b407ded59761f4a72b39339852d8883cdc320de24a</video:content_loc><video:duration>387</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-08-07T10:39:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2-security/auth-errors</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/805588441-d34535aee5e3a87aba2f0d0c9a877ddb0dae768de44141f7cd44f96c119384f3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Authentication Errors]]></video:title><video:description><![CDATA[We just found out that, if we send a bad email & password to the built-in `json_login` authenticator, it sends back a nicely-formed JSON response: an error key set to what went wrong. Great! We can...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/352527427/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a6029ba3d4ce263d7922dca58d89b175033836b8e282baf13de8868cd5be3dcb</video:content_loc><video:duration>355</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-08-08T10:04:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2-security/login-success</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/804444079-bde2e244fef1a8805508a3a4aa5a5b194b545fc96c2d8d6cd307ec3e706a3cc9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Login Success & the Session]]></video:title><video:description><![CDATA[Let's see if we can log in for real. But first... we, uh, need to put some users in our database. Head to `/api` - we'll use our API to do that! Eating our own dog food. I *do* have a few users in my...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/352533103/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f66c6fa4d5200fe87ba95a38d4e842316ff9a7a45fbc86fd3fb53c098553254e</video:content_loc><video:duration>268</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-08-09T10:39:39+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/keynote</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611091-67837988e1d4796638b1ac41bc700aee2e817c4acbbb6946f34ad44093f38aee-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Keynote (Fabien Potencier)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Fabien Potencier](https://connect.symfony.com/api/alternates/4aed4f5d-e0cb-4320-902f-885fddaa7d15). This talk is in French and (sorry!) no transcript...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551567/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=176621b3832a23c12bad49f9a04dbd02a7f6bbb244a8aff1cd6669a3dc221acd</video:content_loc><video:duration>2550</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/demystifier-react-et-redux-avec-symfony-et-webpack-encore</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787610958-a9b73ac0d945fb28ec03e69e7744e18ab6cdbfa2809fc3fefadc6badf9fbc4b7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Démystifier React et Redux avec Symfony et Webpack Encore (Titouan Galopin)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Titouan Galopin](https://connect.symfony.com/api/alternates/9aa65b94-9860-4c98-9e92-cd19c9913df0). This talk is in French and (sorry!) no transcript is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551506/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7f06a703c02caf475e2c329f3f21174e28f921e145007a07bfe963c3a396a737</video:content_loc><video:duration>2096</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/des-apps-symfony-sous-steroides-grace-a-vue-js-mercure-et-panther</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611158-b5cdaf7415f83bff3ddd8a5eaee3d6583a4fe9b83bf977ff1beb300b0ef3fe2f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Des apps Symfony sous stéroïdes grâce à Vue.js, Mercure et Panther ! (Kévin Dunglas)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Kévin Dunglas](https://connect.symfony.com/api/alternates/38ddfa21-7c76-42d5-a191-e984d53e7367). This talk is in French and (sorry!) no transcript is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551514/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=163a960f9fc5c38f96f3c80bebcc1aea2436ab3f7c4b1a752fb57e13b0f59c19</video:content_loc><video:duration>2656</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/etat-de-lart-delasticsearch-avec-symfony</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611107-b88a9d6c4baa9d0e658b4a7f66d9789be5ee0de3afdb2669994025fd0fecbb6d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[État de l'art d'Elasticsearch avec Symfony (Damien Alexandre)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Damien Alexandre](https://connect.symfony.com/api/alternates/9c760fb7-71dc-47b0-8ec0-2918868a1633). This talk is in French and (sorry!) no transcript...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551542/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8cddf8a48f971cef0f69fd77c74ccc70ce69a7974b3bcd5b2a3c044089af67e3</video:content_loc><video:duration>2457</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/http-3-cest-une-question-de-transport</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611024-dee9e20536ce3b49af17b8e1de437601cfd507cc44b172d13a5bb3a94e44d363-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[HTTP/3: C'est une question de transport ! (Benoit Jacquemont)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Benoit Jacquemont](https://connect.symfony.com/api/alternates/e5effdbc-6ecf-44ff-818d-274a82d9494e). This talk is in French and (sorry!) no transcript...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551551/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a45de93dfcf89aa8cb9908b85c97febaaff3a86c9ab1cefda1d585ba5db7a56b</video:content_loc><video:duration>2116</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/des-images-au-cordeau-pour-vos-applications-symfony</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611071-d5f0ddb287f2003160820c7a5747cc9ef25312c1c62004ef35a085a7490c7c2d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Des images au cordeau pour vos applications Symfony (Mathieu Santostefano)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Mathieu Santostefano](https://connect.symfony.com/api/alternates/589e8550-8af6-4efa-9ba2-ba8de63e702b). This talk is in French and (sorry!) no...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551560/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=cb20d61c94e82975644d179d76c208ceb20d0978cff329987f84111a6ea50649</video:content_loc><video:duration>1976</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/du-developpement-a-la-production-une-architecture-grandissante</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611086-bbb1fc3cc81c7d4ac85db743bc80059e8cccb1e78abf7d785b1d81ac0a48aec7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Du développement à la production, une architecture grandissante (Kevin dejour)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Kevin dejour](https://connect.symfony.com/api/alternates/7b08b853-9d5a-4334-9b60-01290f2500d0). This talk is in French and (sorry!) no transcript is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551529/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1544a4a6f8f6aebf0e2a5a62096a7d7fa47e05ba6414f4f6041956de37c5a42b</video:content_loc><video:duration>2572</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/les-meilleurs-bundles-et-outils-pour-vos-applications-symfony</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611084-7f9a9b4b848fc2d1c5e83301258ebd7ffa4f77f40151cfce435259e67393e6fc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Les meilleurs bundles et outils pour vos applications Symfony (Danielle KAYUMBI BONKOTO)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Danielle KAYUMBI BONKOTO](https://connect.symfony.com/api/alternates/a1910b75-eb25-4bbe-bab2-e6c10a9c2ee8). This talk is in French and (sorry!) no...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551571/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=da54d9cc0f420b44fc846f12f5f5191097836c3ae5be0cc6481ba3d1677560ce</video:content_loc><video:duration>2113</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/open-source-renouveau-de-lhumanisme</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/788177727-51c207f1a0a268da8fae8be2064828c12633a1ae7a9c674d90bb5b95b609ddc1-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Open source, renouveau de l'Humanisme (Jérôme Vieilledent)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Jérôme Vieilledent](https://connect.symfony.com/api/alternates/6933550d-7827-43b4-b260-088a52758d08). This talk is in French and (sorry!) no transcript...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339980475/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=23d986d30c70dd6250d84ae74e9e55738eb8bb3fedc347555247a9cd2f9eeed6</video:content_loc><video:duration>2453</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/doctrine-en-dehors-des-sentiers-battus</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611118-86eb4570017a28a6efd87d88c60e13453a50e225cec4688de42f41255d915e42-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Doctrine en dehors des sentiers battus (Romaric Drigon)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Romaric Drigon](https://connect.symfony.com/api/alternates/37cd387c-d19e-4472-876a-8082ada2ca21). This talk is in French and (sorry!) no transcript is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551535/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a92ad0ed2fb5a063487020eb59fdeb1e3336623ba1b0b37bb3aeaf0d7d74228b</video:content_loc><video:duration>2231</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/lecon-n-139-api-platform-ce-nest-bon-qua-faire-un-poc-faux</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787610973-b7a9015887e1d2b4b818d6aae63c525c3eb07f02a626c2d19262737371f68373-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Leçon N° 139, API Platform ce n'est bon qu'à faire un POC, FAUX ! (Grégoire Hébert)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Grégoire Hébert](https://connect.symfony.com/api/alternates/1f727629-3384-49f7-bac6-125ab4d817b0). This talk is in French and (sorry!) no transcript is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551495/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4cafcc9d778b907c456370f8335a1d12365e3c106f0e515fe3ca26afd1d702c3</video:content_loc><video:duration>2001</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/symfony-httpclient-what-else</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/789228368-984a48e759954e63269e1ea90a21994d861143225e7fd8714ff37f1d9e3a9c7e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Symfony HttpClient, what else? (Nicolas Grekas)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Nicolas Grekas](https://connect.symfony.com/api/alternates/072fe4aa-78a1-45c7-b802-34eb632562ef). This talk is in French and (sorry!) no transcript is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/340796073/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2dc06639dc7ca3bd7697079484f7e507b56ec399d0099ca9304e58fdcce9541a</video:content_loc><video:duration>3212</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/voyage-au-coeur-de-react-admin-ladmin-generator-dapi-platform</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/788177495-7b4e93a1d8285fbe4328acf9c78aca0d186395850584ce43c321541918d77173-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Voyage au coeur de React-admin, l'admin generator d'API Platform (François Zaninotto)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [François Zaninotto](https://connect.symfony.com/api/alternates/af4beeda-2dc8-4981-88a1-373de50ab1fb). This talk is in French and (sorry!) no transcript...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339980478/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4916316d2d6148cd5dcde0d8580430c9c1576bf24c8a8e23504d58de2cc2a8b4</video:content_loc><video:duration>2835</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/rabbitmq-simplement</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611174-cc422a896542279f9042ab6b21930b164a8311392cce3c751819a4ca78a96962-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[RabbitMQ simplement (Frédéric Bouchery)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Frédéric Bouchery](https://connect.symfony.com/api/alternates/17ad8ca0-a602-4dc8-84a1-c785637d6a3b). This talk is in French and (sorry!) no transcript...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551578/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e5f0b5e02b60f8bfa8ac0ed897adb7fab20a1eab88906f76ec0a5b23415b2768</video:content_loc><video:duration>2558</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:01:28+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/developpement-dapplications-tdd-avec-symfony-et-ses-amis-en-situation-reelle</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611308-11454c5456a121ae8fbee32afd92ecd666e1b57970eb0d82818767331146c414-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Développement d'applications TDD avec Symfony et ses amis en situation réelle (Chris Holland)]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 presentation by [Chris Holland](https://connect.symfony.com/api/alternates/c6747465-e45e-4e9d-96c8-a4fff2460516). This talk is in French and (sorry!) no transcript is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551520/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=9abc17dee910580846c00cd4346dd19ec05cb356fb5cc795f4efb006a3489215</video:content_loc><video:duration>2251</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:18:18+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/paris2019/lightning-talks</loc><lastmod>2023-02-21T21:24:27+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611180-7370e6c050d47d3f3e3fd3a8995a781d0b634b206d6b2d3b1e3f481b5195df1e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Lightning Talks]]></video:title><video:description><![CDATA[***TIP Symfony Live Paris 2019 lightning talks by various authors. This talk is in French and (sorry!) no transcript is available. *** ## Les side-projects, c'est cool !...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551502/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=88c4742cf4bd585e36fc3d220b0963e4a1bd5ff331a7d8b10059374e7e184c7b</video:content_loc><video:duration>2988</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T19:18:18+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/lille2019/keynote</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/785415708-184a5edfb37f9b9ac00f68ce9269f835819034c71f1dd1a511a3ef4f1b036553-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Keynote (Fabien Potencier)]]></video:title><video:description><![CDATA[***TIP Symfony Live Lille 2019 presentation by [Fabien Potencier](https://connect.symfony.com/profile/fabpot). This talk is in French and (sorry!) no transcript is available. ***]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/338066238/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3ed7125a09cc2cd51ee6ba6b7f91a079f727979590ae7aef15475760ff4097c0</video:content_loc><video:duration>2633</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T18:55:46+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/lille2019/organiser-et-optimiser-une-ci-complete</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/785415679-f30527db8b299d7ea0c0f3fff570b858e1667a03c5e43fc940bf7eb68041b552-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Organiser et optimiser une CI complète (Hubert Lenoir)]]></video:title><video:description><![CDATA[***TIP Symfony Live Lille 2019 presentation by [Hubert Lenoir](https://connect.symfony.com/profile/hubert_lenoir). This talk is in French and (sorry!) no transcript is available. *** ## Talk Abstract...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/338066245/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=81e69d88746fb8c56dd3bb883e7177f1e55d6248965ccb56b9436933bd5bc9aa</video:content_loc><video:duration>2489</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T18:55:46+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/lille2019/demystifier-react-et-redux-avec-symfony-et-webpack-encore</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787610958-a9b73ac0d945fb28ec03e69e7744e18ab6cdbfa2809fc3fefadc6badf9fbc4b7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Démystifier React et Redux avec Symfony et Webpack Encore (Titouan Galopin)]]></video:title><video:description><![CDATA[***TIP Symfony Live Lille 2019 presentation by [Titouan Galopin ](https://connect.symfony.com/profile/tgalopin) (actually, this recording is from Symfony Live Paris). This talk is in French and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551506/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7f06a703c02caf475e2c329f3f21174e28f921e145007a07bfe963c3a396a737</video:content_loc><video:duration>2096</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T18:55:46+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/lille2019/mercure-des-uis-toujours-synchronisees-avec-la-bdd</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611158-b5cdaf7415f83bff3ddd8a5eaee3d6583a4fe9b83bf977ff1beb300b0ef3fe2f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Mercure : des UIs toujours synchronisées avec la BDD (Kévin Dunglas)]]></video:title><video:description><![CDATA[***TIP Symfony Live Lille 2019 presentation by [Kévin Dunglas](https://connect.symfony.com/profile/dunglas). This talk is in French and (sorry!) no transcript is available. *** ## Talk Abstract Et si...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551514/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=163a960f9fc5c38f96f3c80bebcc1aea2436ab3f7c4b1a752fb57e13b0f59c19</video:content_loc><video:duration>2656</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T18:55:46+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/lille2019/les-meilleurs-bundles-et-outils-pour-vos-applications-symfony</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611084-7f9a9b4b848fc2d1c5e83301258ebd7ffa4f77f40151cfce435259e67393e6fc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Les meilleurs bundles et outils pour vos applications Symfony (Danielle KAYUMBI BONKOTO)]]></video:title><video:description><![CDATA[***TIP Symfony Live Lille 2019 presentation by [Danielle KAYUMBI BONKOTO](https://connect.symfony.com/profile/hoddan). This talk is in French and (sorry!) no transcript is available. *** ## Talk...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551571/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=da54d9cc0f420b44fc846f12f5f5191097836c3ae5be0cc6481ba3d1677560ce</video:content_loc><video:duration>2113</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T18:55:46+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/lille2019/api-platform-ce-nest-bon-qua-faire-un-poc-faux</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787610973-b7a9015887e1d2b4b818d6aae63c525c3eb07f02a626c2d19262737371f68373-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[API Platform ce n'est bon qu'à faire un POC. FAUX (Grégoire Hébert)]]></video:title><video:description><![CDATA[***TIP Symfony Live Lille 2019 presentation by [Grégoire Hébert](https://connect.symfony.com/profile/gregoirehebert). This talk is in French and (sorry!) no transcript is available. *** ## Talk...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551495/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4cafcc9d778b907c456370f8335a1d12365e3c106f0e515fe3ca26afd1d702c3</video:content_loc><video:duration>2001</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T18:55:46+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/lille2019/doctrine-en-dehors-des-sentiers-battus</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787611118-86eb4570017a28a6efd87d88c60e13453a50e225cec4688de42f41255d915e42-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Doctrine en dehors des sentiers battus (Romaric Drigon)]]></video:title><video:description><![CDATA[***TIP Symfony Live Lille 2019 presentation by [Romaric Drigon](https://connect.symfony.com/profile/romaricdrigon). This talk is in French and (sorry!) no transcript is available. *** ## Talk...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339551535/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a92ad0ed2fb5a063487020eb59fdeb1e3336623ba1b0b37bb3aeaf0d7d74228b</video:content_loc><video:duration>2231</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-06-06T18:55:46+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/encore-install</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1095548794-0fb179ecc9ca8d01f76161514d4b196ff55804bfced3262679b9272e615ea8d7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hello Webpack Encore]]></video:title><video:description><![CDATA[Yo friends! It's Webpack time! Yeeeeeeah! Well, maybe not *super* "yeeeeeeah!" if *you* are the person responsible for installing and *configuring* Webpack... Cause, woh, yea, that can be tough!...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/529409915/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=dc12bac48a7331e4430828eff4a0ae1d986dff26e69a38a368248bce435367e9</video:content_loc><video:duration>400</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-04-16T10:05:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/first-webpack</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1242229151-234b69b17b0b8544be8cf6fb740dd86f5e642c9cbe7635a32b5d6f2a4e26ab65-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Webpacking our First Assets]]></video:title><video:description><![CDATA[So, Webpack only needs to know three things. The first - `setOutputPath()` - tells it *where* to put the final, built files and the second - `setPublicPath()` - tells it the public path to this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/605681876/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c15209a2a8b182ca2a8e73decdd79ecd94ed743cc77c485cf0307d0e5557dcdc</video:content_loc><video:duration>327</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-04-17T10:20:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/twig-helpers-scripts</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1047408139-188225e0efb62a18b459909996a7e24848dc42c643c75ced20eb9c709d484ac0-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig Helpers, entrypoints.json & yarn Scripts]]></video:title><video:description><![CDATA[Encore is outputting `app.css` and `app.js` thanks to the `app` entry: [[[ code('6a1484af3d') ]]] And we successfully added the `` tag for `app.css` and, down here, the `` for `app.js`: [[[...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/506159198/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f8a660317e4a8b54ce731579df454c286e23d14e65720925c9c6f6aecd1d1487</video:content_loc><video:duration>244</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-04-18T10:55:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/require-import</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/776578985-60f592378790fb20a12c3a55225a91f1f2456ab583706acb697d82659f6efaea-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Modules: require() & import()]]></video:title><video:description><![CDATA[Let's get back to talking about the *real* power of Webpack: the ability to import or require JavaScript files. Pretend that building this string is actually a lot of work. Or maybe it's something we...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/331260799/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6d4e9c32460432a580a9aee68e1d848e66344323328efd21e86e4c2bd066e181</video:content_loc><video:duration>297</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-04-19T10:10:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/external-libs</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/776582725-3356915a25364616bf4a1d86be13153de10af0e043ac65893f526c28d2685ff4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Importing External Libraries & Global Variables]]></video:title><video:description><![CDATA[We already added the `app` entry files to our base layout: the `` tag and the `` tag both live here: [[[ code('3a46b9906a') ]]] This means that *any* time we have some CSS or JavaScript that should...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/331263637/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c95c62bea555347b02f80f58ac46ac082dd852b0d87e28091e20689ce2ed13ca</video:content_loc><video:duration>398</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-04-22T10:15:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/bootstrap</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1178640517-fbaf86e2f1c35d8f7926cda9409520e6283e58a5f6c2ccbd46672ad1cfd25463-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bootstrap & the Curious Case of jQuery Plugins]]></video:title><video:description><![CDATA[The inline code in `base.html.twig` isn't working anymore because we've *eliminated* the `$` global variable: [[[ code('dc92df5c76') ]]] Woo! To make it work, let's move *all* this code into...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/569986838/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4913f104d14ee4464d728c5b15228f81103ba4453c9ba5e6100c8fe658e0bc74</video:content_loc><video:duration>365</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-04-23T10:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/code-splitting</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/776614520-660f5770e3d81ac3aac1cb486b59206d50b4d9c114f801d504808bf9f0ade9eb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Magic of Split Chunks]]></video:title><video:description><![CDATA[View the HTML source and search for `app.js`. Surprise! We have *multiple* script tags! Actually, let me go to the inspect - it's a bit prettier. Black magic! We have *two* script tags - one for...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/331287612/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0813ab3b4d22dd6bca544c1d6e2c7b4b5e522a2f7ec5a467add9cd138e4e3ce7</video:content_loc><video:duration>366</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-04-24T10:15:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/css</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/777632380-e637b8e323aa01cdde096a21276aab92bbeae014979a38b303fe491574f5368d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Importing 3rd Party CSS + Image Paths]]></video:title><video:description><![CDATA[We're on a mission to refactor all the old `` and `` tags *out* of our templates. For the base layout, we're half way done! There is only *one* script tag, which points to the `app` entry: [[[...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/332046331/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d396ad030f821813865fc963e5584f37dbf2d370358ba13368d4a76ae2f16307</video:content_loc><video:duration>534</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-04-25T10:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/sass</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/993583556-511ce6f1516ac8b4478dee51839b08f97ee8fa08aab16bbaac06ad1b55880646-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Sass & Overriding Bootstrap Variables]]></video:title><video:description><![CDATA[What if I want to use Sass instead of normal CSS, or maybe Less or Stylus? *Normally*, that takes some setup: you need to create a system that can compile all of your Sass files into CSS. But with...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/478545471/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2513b60bd01bbb3a114e518a21d9e523c2f80e286be988e9dedee811627bfec7</video:content_loc><video:duration>490</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-04-26T10:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/copy-files</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1177737165-a475367a229febf791965ee30e08a4d1a717cf19ae16109288f219a275c8ffe1-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Copying Files]]></video:title><video:description><![CDATA[Do a force refresh on the homepage. Ok, we've got some broken images. Inspect that. Of course: this points to `/images/meteor-shower.jpg`. Open this template: `article/homepage.html.twig`. There it...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/569525341/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=272fa1099ed588b6a8c7689f9a6b2ad80c8f6fcfc7ad19b5ac356ee69ed2363f</video:content_loc><video:duration>491</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-04-29T10:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/multiple-entries</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/778505953-37c25600c72116497e2badee41915c7f84f76a82aa8ca154314cb0428c0d228d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Page-Specific JS: Multiple Entries]]></video:title><video:description><![CDATA[On the article show page, if you check the console... it's an error! > $ is undefined Coming from `article_show.js`. This shouldn't be surprising. And not *just* because I seem to make a lot of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/332724131/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f14a3a9a9f72a122406fd934ff900050135cbc7ebe3a07f61a5264edf385cb1b</video:content_loc><video:duration>456</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-04-30T10:30:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/entry-refactoring</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/779283983-168b7225e437925d722d216be44eec9def04c570bc647a1213e283bb9ed17059-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Entry Refactoring]]></video:title><video:description><![CDATA[Here's our mission: to get rid of *all* the JavaScript and CSS stuff from our `public/` directory. Our next target is `admin_article_form.js`: [[[ code('c4e833da8f') ]]] This probably won't come as a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/333329741/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1d53e4155486aed1f45c50384d6cd525d5b80115683505594340619dfdf1c296</video:content_loc><video:duration>424</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-01T12:00:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/refactor-autocomplete</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/779714036-b8845afa6fd012715da82b60041f1a83034a771e035726cff4fe52b799e9b6c0-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Refactoring Autocomplete JS & CSS]]></video:title><video:description><![CDATA[We still have work to do to get the `new.html.twig` template working: [[[ code('9dc8f8541e') ]]] we have a script tag for this external autocomplete library and one for our own...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/333662441/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=881784fa8ca35d99c0a29ec1b6fdfcdb03e26490f7a22c9039db218b9914d971</video:content_loc><video:duration>321</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-02T10:25:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/autoprovide-jquery-modules</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/779834704-1e638f31864078798ea77fc0d9b7da01202afffed099e742313c88566083d17c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Auto-Provide jQuery for Mischievous Packages]]></video:title><video:description><![CDATA[Everything *should* be working... but nope! We've got this > jQuery is not defined error... but it's not from *our* code! It's coming from inside of `autocomplete.jquery.js` - that third party...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/333754288/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=80d6e3c4356975c80811720bc527ed4078949c9c426be3d14375daadf23a2545</video:content_loc><video:duration>397</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-03T10:05:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/add-style-entry</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/779837195-a69b53772e94f2094879e94976877bd0c3bbbfc1093c1329df02aa197d624e4c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[addStyleEntry(): CSS-Only Entrypoint]]></video:title><video:description><![CDATA[There are only two files left in the `public/` directory, and they're both CSS files! Celebrate by crushing your `js/` directory. We have *two* page-specific CSS files left. Open...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/333756316/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c42eeaf56fbee90b2e043de03872b6e50571a03838b54cbf279248e157bf2b71</video:content_loc><video:duration>231</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-06T10:10:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/postcss-browsers</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/971758815-8103adc6de9682aa46de4cb4f399c7d8f8c719f3a2b649813be793af427b7fd5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Support any Browser with PostCSS & Babel]]></video:title><video:description><![CDATA[Go back to `/admin/article` and click to edit one of the articles. View the source and search for `.js`. Okay, we have several JavaScript files, because Webpack is splitting them. Click to look at...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/466287957/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f1c68d50fb5f5eb170175adf5c679ab64e6d1131847c328af3f10e8dd842a59e</video:content_loc><video:duration>360</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-07T10:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/browserslist</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/781138108-2f3144aed3d8997456f296f9c78c3641f65bbf516d4139d0a7a62584a3ae3d7a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[browserslist: What Browsers do you need to Support?]]></video:title><video:description><![CDATA[PostCSS is running! Let's see what it does! Go back to your browser. We haven't reloaded the page yet. I'll search for `app.css` and click to open that. Search for one of the vendor prefixes:...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/334756290/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b59ab750bd6594ae8bb44d6e62584739866edf207faa1e9204fbbf2e8a40cfc7</video:content_loc><video:duration>364</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-08T10:50:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/babel-polyfills</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/781419156-6a6aa8ecc2f4284183d04597df75e561032ab114e12de2486796f831bf1ba78d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Polyfills & Babel]]></video:title><video:description><![CDATA[Babel is pretty amazing. But, it's even doing something *else* automatically that we haven't realized yet! Back in `admin_article_form.js`, and it doesn't matter where, but down in `ReferenceList`,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/334977152/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f54c5d80ade919a4b9daaa1e37f3e44e0974f12e5fd8df26422a2158ccc12931</video:content_loc><video:duration>275</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-09T10:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/single-runtime-chunk</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/781424416-fbb3c066e36418d77b94bf883894681e5ee16df17bd456a190eeb82e2a82cb04-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Single Runtime Chunk]]></video:title><video:description><![CDATA[Head back to the homepage and click any of the articles. In an earlier tutorial, we added this heart icon that, when you click it, makes an AJAX request and increases the counter. Well, part of this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/334981136/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=617a0b7787e9edf297125d111d132fd92891e5f4b7e54797ad4ff1036a092f00</video:content_loc><video:duration>391</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-10T10:30:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/async-imports</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/782420043-9e0cab965f90c6733ad8db399270f558ce3818d071f16b72ede6a852f170203e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Async Imports]]></video:title><video:description><![CDATA[Head back to `/admin/article`. We have a... sort of... "performance" issue here. When you create a new article, we have an author field that uses a bunch of autocomplete JavaScript and CSS. The thing...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/335760425/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5163547d08ae7ffd47dd737b7292259c263392933c0d82ae17e5d34447645ab0</video:content_loc><video:duration>342</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-13T13:49:35+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore/production</loc><lastmod>2023-02-21T21:24:26+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/782571015-b8fe7560109bcb8d6ea88a5f0a8dad7924636fccca964147ec2a3c90927c457c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Production Build & Deployment]]></video:title><video:description><![CDATA[Ok team: just one more thing to talk about: how the heck can we deploy all of this to production? Well, *before* that, our files aren't even ready for production yet! Open the `public/build/`...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/335879422/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=282c758a87f9ea716155735bfc7b06d932132dcf406e6df3e4b9a2879e28f189</video:content_loc><video:duration>363</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-14T11:00:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2/install</loc><lastmod>2026-01-30T14:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1243338310-8f2027388586ea2907def35dc77a09646faca477eba8f21991ab9cb79b505e91-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[API Platform Installation!]]></video:title><video:description><![CDATA[Yo friends! It's time to talk about... drum roll... how to bake a delicious cake that looks like an Oreo. Wait... ah! Wrong tutorial. It's time to talk about API Platform... so fun, it's *almost* as...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/606712572/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=36a85c11add24f97588c0806b70d9f1170bf3a26121cb6cbffc942a87bc3944f</video:content_loc><video:duration>402</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-16T10:20:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2/api-resource</loc><lastmod>2026-01-30T14:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1243331144-2e9e0b8e6861930ca1bb3df1c63ef149c8df055b80a0d4bce23cf585b224d0cc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Our First ApiResource]]></video:title><video:description><![CDATA[Question: have you ever gone to the store and accidentally bought *too* much cheese? It's the story of my life. Or maybe you have the opposite problem: you're hosting a big party and you don't have...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/606705866/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=21cd4733fa6e11a93df34e07a2fc25d9960bb69ac4183fa823dd2fb2145b0722</video:content_loc><video:duration>337</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-17T09:55:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2/swagger</loc><lastmod>2026-01-30T14:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/783799931-2fac625f6d23cd2ff0007be1790805beb243c57d2dbc73669b831d59da148d2f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Swagger: Instant, Interactive API Docs]]></video:title><video:description><![CDATA[We're currently looking at something called Swagger: an open source API documentation interface. We're going talk more about it soon, but the idea is basically this: *if* you have an API - built in...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/336846583/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6dc1e89396bf6a2cca4f7a2aea2a8af76a55a28db0ccf739096d4281b7679eb3</video:content_loc><video:duration>512</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-20T10:20:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2/open-api-spec</loc><lastmod>2026-01-30T14:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/784446568-76b31be1e5d24d70b0e82bf611a168f6bc63b1ab8e77ff127aa72891c6610e12-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[OpenAPI Specification]]></video:title><video:description><![CDATA[Confession time: this tutorial is about a *lot* more than just API Platform. The world of APIs has undergone *massive* changes over the past few years, introducing new hypermedia formats, standards,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/337364675/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=479957ca2323df8f8f7cab6cef56b418d355bf9cf82478ea5651abb2c0833e9c</video:content_loc><video:duration>392</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-21T10:50:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/api-platform2/json-ld</loc><lastmod>2026-01-30T14:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/784961266-b77de494b5a28c13b25572231baf6d7b7e3a17cad947b5f21d0d9f2deb70ba5c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[JSON-LD: Context for your Data]]></video:title><video:description><![CDATA[A typical API returns JSON. Go to `/api/cheese_listings/2.json`. When I think of an API, this is what I *traditionally* picture in my head. ## Your Data Lacks Meaning But, what is the *significance*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/337766134/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=86c171d173cfe2cbc16255327d5057a9ea58e699bb8aa57ea66469ebc522f94c</video:content_loc><video:duration>630</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-05-22T13:05:21+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-uploads/server-setup</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/760180367-5dbced06bdd5642b13af20457d99043633aebdd7f66f06de7e2719238ffcd27e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Setting up with the Symfony Local Web Server]]></video:title><video:description><![CDATA[Yo friends! It's file upload time! Woo! We are going to absolutely *crush* this topic... yea know... because file uploads are a *critical* part of the Internet. Where would we be if we couldn't...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/317886745/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d500b9cf35b1f74d6d050907b17e4fc87d677b3e50dfa5891be7687ab2a9e337</video:content_loc><video:duration>315</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-18T11:15:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-uploads/upload-request</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/760443823-cf2b2ca6020c245aa7836ebe5c4abf42ea35b01f04f73005c0855113e24da9f6-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Uploads, multipart/form-data & UploadedFile]]></video:title><video:description><![CDATA[This page uses a Symfony form. And we *will* learn how to add a file upload field to a form object. But... let's start simpler - with a good old-fashioned HTML form. The controller behind this page...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/318111763/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2d28e3247726aa773855573841817436e865cfc38f7aec793aeaef6b96db6eba</video:content_loc><video:duration>479</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-19T10:25:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-uploads/storing-uploaded-file</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/760700183-104c91010853c01a614fa4868e24aeb9b3c9b12764ecbd35afd92fd5b54abc9d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Where & How to Store the File]]></video:title><video:description><![CDATA[For now, the form is still submitting to this test endpoint. We'll change that soon by moving it into the actual article form. But, to finish a successful file upload, we need *move* the uploaded...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/318320153/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1e28767f54fa854c681781b0ece3ed8750b6347450fd7e17ce55aea1f66dc95f</video:content_loc><video:duration>306</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-20T10:55:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-uploads/file-naming</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/760978200-84cfccba87cc7edea01f7fcff717738894fd2f8b23637bedf666ed6a44d7cf67-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Unique (but not Insane) Filenames]]></video:title><video:description><![CDATA[I told the `UploadedFile` object to move the file into `public/uploads`. And it *did*... but I kinda get the feeling it wasn't trying very hard. I mean, that is a *horrible* filename. Well, to be...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/318597779/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=174a127a45ab8209c4ce024a95215f8b03f5a9d67a672931ac53b307dd5f89f0</video:content_loc><video:duration>390</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-21T10:20:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-uploads/upload-in-form</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/761345176-afe142f543c506a91199f4ec1c90b9e2ef51eefa20a5c8a4ebaffe30241fee19-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[File Upload Field in a Form]]></video:title><video:description><![CDATA[We're rocking! We know what it looks like to upload a file in Symfony: we can work with the `UploadedFile` object and we know how to move the file around. That feels good! It's time to talk about how...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/318915474/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f3738f33e8178f74afc07a84b600e8519769578dc79bb355eb01c93b6f3ae2d4</video:content_loc><video:duration>549</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-22T10:15:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-uploads/uploader-service</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/761567639-cf7078e42e40018a21bc89a7e4cd96e72c2f65cd00f041d8545f34e2d57a1cf3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Centralizing Upload Logic]]></video:title><video:description><![CDATA[We've got a pretty nice system so far: moving the file, unique filenames and putting the filename string into the database. But it *is* kind of a lot of logic to put in the controller... and we...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/319091195/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4176b277418e474001344eb7f5bcd99ff05cb6f3afb00a52329a74ab459c9e5f</video:content_loc><video:duration>421</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-25T11:00:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/back-to-basics</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/773851367-b8ba6bd4253b00e98dd80425695d7f0cbd19423f4fa43e510f51bc3e009547f2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Back to the Basics (Symfony local Web Server)]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Fabien Potencier](https://github.com/fabpot) Keynote presentation covering Symfony's local web server. *** Okay. Welcome. Good morning. Thank you. So if you...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329119889/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8cb548ae7c59c81cc298e94771a4f7d612df0a03926294a5545cc145d3d81406</video:content_loc><video:duration>1896</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-23T02:35:07+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/knowing-your-state-machines</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/773894110-f6be52838a714fac3643dd5986da2926862b08c9f8ade8e46c8a5c4052229672-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Knowing your State Machines]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Tobias Nyholm](https://github.com/nyholm) Web development is not just about delivering a response. It is also about writing good code. The state pattern will...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329151106/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1e5ae71336699420badb7963e41f0b68159e21b841bbdec779c267b3cd0d8962</video:content_loc><video:duration>2703</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-23T02:35:07+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/behat-best-practices-symfony</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/773917938-a720898fbbddab8f36a7ff4dcee05992a7a267ecf93b9d03761d4f84a6825bca-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Behat Best Practices with Symfony]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Ciaran McNulty](https://github.com/ciaranmcnulty) Behat is widely used as part of a Behavior Driven Development lifecycle, but it's also widely misused. In...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329168821/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=41fb121d4b10e4aabb7be95f6e9ed6a4213158573a75cd63da763e328aa373b0</video:content_loc><video:duration>2612</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-23T02:35:07+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/file-storage-modern-php-apps</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/774205884-ae1bc8a102c91cb3b885b105ae945d70a196ca8dc9f31752598d9c8cd37b3c70-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[File Storage for Modern PHP Applications]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Frank de Jonge](https://github.com/frankdejonge) Many PHP applications need to store files. There are many different reasons to store file, and not all...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329397125/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8ce3160709fd7f40f70b53f401239ebd779995f08e5d6e521dfe4e6dcb0ae80f</video:content_loc><video:duration>2389</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-23T02:35:07+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/symfony-messenger-6-months</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/774142636-75fc68a4af7397080978fe06500003318c7ea4cd55dd1fcd1d6fcd575b6ff7a2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Symfony Messenger: 6 months already and more to come]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Samuel Roze](https://github.com/sroze) The Messenger component brings asynchronous processing to Symfony: using message bus(es) you are able to decouple your...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329346908/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b1a29caaa379beefe66e37db8a7b5023556cbafd82f8b037b2fe2bbbddcf9bb7</video:content_loc><video:duration>2042</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-28T15:08:11+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/varnish-caching-logged-in-users</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/774187263-5ec8b6144794de1fff8e4a42e4824732cbf4ec569ed252987be54b7b46113e9d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Going crazy with Varnish: Caching pages of logged in users]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [David Buchmann](https://github.com/dbu) You know how HTTP caching works but need more? In this talk we look into ways to cache personalized content. We will...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329382430/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=62258aefa1c0d8ac0e27d0d33c8e8ac4233599617ae46456e6af9c6466dd6a94</video:content_loc><video:duration>2666</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-23T02:35:07+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/changing-php</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/774288421-0b06d6305a963bf7fe3ec8a5184bbda45cecc1f9b7d84b7ceef5649c6b16294c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Changing PHP]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Pedro Magalhães](https://github.com/pmmaga) PHP releases a new minor version every year. Major versions happen when there are enough changes that justify to do...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329468276/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d79fef8b3db429bbfa37d5253ca4dc89e4c1bf2a42704066700b8e21317516aa</video:content_loc><video:duration>2054</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-23T19:27:10+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/symfony-forms-rich-domain-models</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/774452691-7b736a1b9b53aef42a1dd0f64bb23921fc0b9cb6db3319a2ebc9649935005050-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Using Symfony Forms with Rich Domain Models]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Christopher Hertel](https://github.com/chr-hertel) & [Christian Flothmann](https://github.com/xabbuh) With the popularization of DDD people started shifting...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329603784/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=773301ce4b26dfd2a17d46ee0ad9a0e0e9c4a0372711b7d7fad107e1260cf323</video:content_loc><video:duration>2403</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-23T19:27:10+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/one-year-diversity-initiative</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/774450810-e07a0c4e4055a8d5069f082674ddc62b4f284170098e208c56896a5c8b2c42f6-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[One year diversity initiative]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Lukas Kahwe Smith](https://github.com/lsmith77) Last year in Cluj the diversity initiative was announced by Fabien. This talk aims to give an overview how...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329602233/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f9677fcaa7c477ade55f67db791d9dd7ce852b95b5191fc5f8ba5f4ec667d0b8</video:content_loc><video:duration>2231</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-23T19:27:10+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/static-php-analyzer</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/774535770-c8f336a9f0f6adc6f54d55d8122a7467aafc7b7b17e37e415b7f445789702275-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[How Static PHP Analyzer Changed the way I Look at Code]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Nicole Cordes](https://github.com/IchHabRecht) Let me introduce you to the world of static PHP code analyzers. I'd like to show you which tools exists, how to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329670319/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=172953d3ae7ce1e5d927936635d0437e39f8d6bb94b950dbcda914e7de1cbf43</video:content_loc><video:duration>2059</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-05T11:19:51+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/building-global-web-apps-multi-region-hosting</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/774495529-b490d1566f335456d6d8c1d8b117002246a1276881203213a3a741f67792d92e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Building Global Web Apps with Multi-region Hosting]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Jordi Boggiano](https://github.com/Seldaek) This session will explore various setups and case studies from my attempts at hosting sites used by global...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329638268/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ac2ffff3bf233a5360b4c9cf1011197a8c1e3710287836bfa2bf2679ed513841</video:content_loc><video:duration>2420</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-05T11:19:51+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/building-apps-immutable-servers</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/774719016-efef13d3e818ec9385a141bfe5f7d714f6569f87e96396d488961719fc507f3d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Building Apps for Immutable Servers]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Daniel Gomes](https://github.com/dcsg) Immutable Servers are not new and they are not that simple to achieve. However, the advantages of having Immutable...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329816677/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f0742286addc7fc292a0301bbb52e5e51900f1801259f045cbe462b5e46855aa</video:content_loc><video:duration>2092</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-05T11:19:51+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/bulletproof-mongodb</loc><lastmod>2023-02-21T21:24:23+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/776016490-293b14fed3b85218964ad9b242febd04ae259713e03e869fba5448bf0da97ef1-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bulletproof MongoDB]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Jeremy Mikola](https://github.com/jmikola) An all-too-common approach for database error handling is to log the exception, return a 500 response, and move on...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/330821542/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=78eb72b9e9386ad6c3c03890f277cf59446e97c77a9bbae609afddb203f9926e</video:content_loc><video:duration>2613</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-05T17:24:13+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/power-sf-components-apiplatform</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/774739050-efb794af618c8571bdf42808f1353f506414a3eb84eb9d040c9a8f1ec272ce78-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Leverage the power of Symfony components within ApiPlatform]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Antoine Bluchet](https://github.com/soyuka) ApiPlatform is great for building API-first software. Even better, it's build on top of Symfony! Did you hear about...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/329832583/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a5d4e3a7cfbf392d88421bda0652f711b4b31e731aafa9f1ba93342f8b931afd</video:content_loc><video:duration>1665</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-28T15:08:11+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/patterns-behind-doctrine</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/776260624-7ac77617058198339c264e7cdba379fca131a1915722a4943af732679133c382-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Patterns Behind Doctrine]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Denis Brumann](https://github.com/dbrumann) How does Doctrine talk to your database? What are Data Mapper, Unit Of Work, and Identity Map? These are the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/331015749/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=45fc2ac2c7f1c72354b524a5d06cf673281fbf6a11264bb7bdf1ab181aa975b9</video:content_loc><video:duration>2259</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-28T18:32:32+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/when-testing-makes-no-sense</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/776354927-217a357c37b31f7f2f052a1ed3e1ec8f0c55e8223f4c6d00ce0afde4dc9ffd0f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[When Testing Makes No Sense]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Miro Svrtan](https://github.com/msvrtan) If you look at the stage of any conference in the PHP world, people are preaching testing, testing, testing ... If you...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/331088853/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=34b65399c1bbd7e088d3795ce40fd585b7dcedae0008aadd7f64b2ec1def55b1</video:content_loc><video:duration>2215</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-28T19:40:34+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/microservices-gone-wrong</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/776534473-3df6b3cbb1faa1b99b59089d9669c5966b2d18d52703860c61f7ede83870d923-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Microservices Gone Wrong]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Anthony Ferrara](https://github.com/ircmaxell) Microservices are the latest architectural trend to take the PHP community by storm. Is it a good pattern? How...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/331227449/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=74dc2ad0b193e5d206021fa4b715dbd9869aeca254df448d9be25588600f1d5b</video:content_loc><video:duration>2360</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-02-28T20:44:06+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/handling-user-access-symfony</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/766944106-886bdce5bf1e2b929cfe2f0b84371c6e8a05aa9f43e5fdd7c0d74e6b0096a73b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Security: Handling User Access with Symfony the Right Way]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Diana Ungaro Arnos](https://twitter.com/dianaarnos) We often overlook a central security requirement that any application needs to meet: controlling users'...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/323771358/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8d6e3b2928570d450f8b7170af8fdc0fdd64e7508c1b9ac479f6813eaa45fe42</video:content_loc><video:duration>1781</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-03-11T17:38:18+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/webpack-encore-tips</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/776551134-1937da4b3b74827f9d90863a7165fc680b4a7f7ef4a261a3594b6f62ae947226-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Webpack Encore: Tips, Tricks, Questions & Best Practices]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by [Ryan Weaver](https://github.com/weaverryan) With Webpack, your JavaScript & CSS code can have superpowers you've only dreamed up. And with Symfony's Webpack...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/331239879/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d53baa29266cd734347186a82fdba1ab27667920222bf54266f7caafe2189fae</video:content_loc><video:duration>3045</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-03-11T17:38:18+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/my-first-year-with-event-sourcing</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/776575144-1a8f835e0b3c7cfd309639ccb8045dee4ee316413e82c8bf477e78035c506c1f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[My first year with event sourcing (in Symfony)]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by Tim Huijzers Over the last couple of years, I have heard of Event sourcing but didn't really know where to start until I did a tutorial at DPC '17. After having...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/331255646/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4f77c462868ade68bb01492a1b779c7b4f4ce8c68fe005898afc9ff280f777d7</video:content_loc><video:duration>2485</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-03-23T18:25:35+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/symfony-4-internals</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/777227990-023df2a35da6811f5391e90af8e8e2ec8f66d1cffbb4cc99936ec168731a50e5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Symfony 4 Internals]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by Tobias Nyholm Symfony is a request and response framework. But what about all that magic that happens around your code? Why isn’t autowiring slowing things...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/331735855/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=115c2c1056da19c1dda37531683dbcaf7e2efa2beb420b5e5b419f174499dac9</video:content_loc><video:duration>2508</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-03-23T18:25:35+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/typical-symfony-4-2-app</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/777572129-aefb23286cbfc0f027ad9102c5ac09def59de15e86b79b096ad47ab479ae90a3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[What’s a Typical Symfony 4.2 Application Like?]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by Nicolas Grekas Symfony's configuration system has improved a lot in recent years. Version 4.2 brings a lot of minor improvements that all together give an even...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/332000130/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=638677642353ace995d5a0e547be7760b32e23133db42aab3d937ad20678e4d0</video:content_loc><video:duration>2258</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-03-23T18:25:35+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/api-platform-ftw</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/777608843-ae2163b166149778623f670593881e68be853e4af7645d0d69c786c90ca77f4b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Modern Application Built from Scratch: API Platform FTW]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by Anderson Casimiro Scenario: You had an awesome idea. A brand new business. So you have to test it‘s adherence to market… as soon as possible. How? Fortunately...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/332027842/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=313b0221256bfe9735654237b4916cfa1e9aeaad080d69849a18a38d0032b472</video:content_loc><video:duration>2065</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-03-23T18:25:35+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/vuejs-components-symfony-app-panther</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/777611936-55e34c5fd01dc00fdfad3012f439ae9f261015d92d84fb4cd2f09dd729daa64f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Integrate (Vue)JS Components in a Symfony App, add E2E Tests with Panther]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by Kévin Dunglas Thanks to the new capabilities of the web platform (web components, Progressive Web Apps…) and the rise of modern JS libraries (Vue, React,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/332030149/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=91487fc1a8d8cd170d47c822a359ff18bb7bb4732d47f438410abcc2b4a5161b</video:content_loc><video:duration>2504</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-03-23T18:25:35+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/profiling-your-symfony-application</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/777645231-9366b55cbedbaadc14fc8490fb813a0d94d66120442815993f9b93361ca480f3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Profiling your Symfony Application]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by Michael Cullum A 1 second delay on an e-commerce site can result in a 7% reduction in your conversion rate; but profiling isn't just important in e-commerce...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/332055587/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=021c3bfef1d35aeffe6aafffdd46b9d3cab02ea4b4665b4a95ac4f7a7a1c1082</video:content_loc><video:duration>2570</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-03-23T18:25:35+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/year-of-symfony</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/777633758-599238bc1bb2409e4d199db8200b73f4e2d68bd2adb376099ca4e921e1323e1e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[A Year of Symfony]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation by Sarah Khalil & Nicolas Grekas Let's review what happened during the last year: basically we'll see and/or discover nice new features that appeared since the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/332047402/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=180a67ca9135d1316088c95903b57fc276ad8993b088f1339623099de508ed75</video:content_loc><video:duration>1337</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-03-23T18:25:35+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfonycon2018/magic-show</loc><lastmod>2023-02-21T21:24:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/777700957-2560572ac26fd886cc867240b67ab7568cfc140f7d37ffdb8087ce06b949cc02-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Magic]]></video:title><video:description><![CDATA[***TIP SymfonyCon 2018 Presentation of magic, prepare to be amazed! ***]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/332095300/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2688211169ded435d63d3d10b09849decd5056731cba2f32db7b46f7dfc5235e</video:content_loc><video:duration>670</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-07-02T13:32:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpspec/install</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/750271140-6981846a5752a20c0de7c8f772d2f3de3f08597742e5c86274ddafec39bc01c2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing phpspec]]></video:title><video:description><![CDATA[Yo friends! Oh, SO glad you've made it for our phpspec tutorial! You will *not* regret it. Thing number one to know about phpspec is: it's... just... fun! Ok, but what *is* phpspec? It's a unit...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/309808914/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8c427fe42e987520eb3c54cef92543c83e7e80d6bd092300fe7f63268d1639bc</video:content_loc><video:duration>373</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-07T11:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpspec/specification</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/750443554-859bcaf8f783367b524bd3bb36f8a1dc01d7308ea80c3fe406fb08f92e96dbd5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Buzzwords! Specification & Examples]]></video:title><video:description><![CDATA[So if phpspec is all about helping you design your classes - helping you ask: how do I want this class to look and behave? - how... does it actually do that? The idea is cool: instead of jumping...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/309952484/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f8b68a5e61bbdb494b6030ca80281d12f789d1cda7af8ec24478684f0d6ea9aa</video:content_loc><video:duration>467</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-07T20:10:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpspec/matchers</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/750802807-7cf2e962424e888b9010ac51128faf8c308119f2c9a0bd5650d18062db6509ee-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Matchers, Examples & Generation]]></video:title><video:description><![CDATA[We have an empty `Dinosaur` class. As *proud* of that empty class as I am, I think we need to start thinking about what we need this class to actually *do* - how we want it to behave! This *totally*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/310254776/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c48248cb62dabe066931a03b2d43af5ba47754a63972852704ecd9f4d02bbcb5</video:content_loc><video:duration>583</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-09T11:30:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpspec/inline-matcher</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/751077136-d0c0f0c114a0be9a91c243c2f1c5b7e4a008168cc2dd5fdabc197d59fc14cd27-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Custom Inline Matcher]]></video:title><video:description><![CDATA[One of the *main* goals of a spec class is for it to communicate the behavior of our class through readable and natural language. More important than being a test, this class is meant to be...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/310478690/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f2145e22266f34a50b5749973ad8e7de7be8fa363338d6c7d529212b1b4d2d5c</video:content_loc><video:duration>335</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2019-01-10T11:50:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/triaging</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/720235453-aebb35df4c549293617f71dede5b931913557f3d3fc2190340a81faa81cfd477-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Organization & Triaging]]></video:title><video:description><![CDATA[What could be better than eating ice cream at the beach? Only one thing I can think of: eating ice cream at the beach... wait for it... *while* contributing to Symfony! ## The Massive Power of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/285541948/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a3ba9e395d98af9b80a1570ec3e552901c3e1c3584562ec810f634c7ec8efe7f</video:content_loc><video:duration>414</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-08-20T10:55:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/pr-reviewing</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/720662000-65ec7183e9b9c3a0772606a9bdee87bcbfe9d8e713c65436521f1b2c2e664cdb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Testing the Code from a PR]]></video:title><video:description><![CDATA[It looks like Colin did a *great* job with this new feature. But, we can give a merger *much* more confidence by actually testing it in a real project! ## Creating a new Test App In PhpStorm, I've...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/285892883/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f2dd2b008998898a8d32a3facc392e707ca123c927b6cc7ce8c0ee30f139d1e4</video:content_loc><video:duration>264</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-08-21T10:50:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/pr-link-symfony</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/721037226-044d8034c25afcdb6c8bec99b49e48b6ec1951e67c9ffe6a4d119f1dd9f4f14d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Linking Symfony deps to your Local Copy]]></video:title><video:description><![CDATA[Here's the question now: how can we make our test app use the pull request code from the `symfony/` directory? Check out the `vendor/symfony` directory in the app: it's just a bunch of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/286193975/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5442c9efc5cc193a28fea1365dba534f8762825c8ea0870cb24288678568a75d</video:content_loc><video:duration>408</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-08-22T15:36:17+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/testing-bug</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/721142779-4f6ef6d84bfa554b627d08698d5fd070cc64078df5bfdceea87d8ffb211007ed-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Triaging a Bug Issue]]></video:title><video:description><![CDATA[We just reviewed our first pull request! So let's see what other trouble we can get into! One of the *most* important thing you can do is to triage *issues*. If an issue is for a feature request,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/286276978/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=bdbbd9c5055df7adeb3ccd552c807b7e2ade4e71fd00ae16b23f533097655c46</video:content_loc><video:duration>516</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-08-23T10:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/bug-reproducer</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/721288078-e658600c0904795b36776a382f91ddd3bf1c9e2e34653390b98cc0de5afd7133-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bug Reproducer]]></video:title><video:description><![CDATA[Triaging issues and pull requests is seriously, the *best*. But, occasionally, *you* might be the person who finds the bug! That happened to me just today, and I want to report it! To make the *best*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/286395614/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=db6ed601ae7f61f119bc9777d9b918410977740e7f05571a6385888cd207d70e</video:content_loc><video:duration>426</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-08-24T10:25:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/symfony-branches</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/722011519-b65b34c80a97ae74123e2c9aa91925b859e24bb936041137b30457fbafad3d02-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Symfony's Branching Strategy & Pull Requests]]></video:title><video:description><![CDATA[We've already helped push forward a pull request, solved an issue and even reported a bug. Hello! We deserve cake! And we deserve to move up one more level of difficulty: it's time to contribute...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/286983885/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1df507ef3fe9e0d8cb08c38f7d2ea41586b01557062afa6150b3cafe7c2508e8</video:content_loc><video:duration>331</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-08-28T10:35:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/pr-create-class</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/722597056-017ab726ee4ec64947e3c13231bcfe761874287c70a5fe9c7165e33c67b3e24c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Coding a new Feature]]></video:title><video:description><![CDATA[We've just created a new branch based off of Symfony's `master` branch. And now, we're ready to create the amazing new `TargetPathHelper` class. But... where should it live? It's related to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/287451718/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d4cfa3f7c9fe23a2def2d0348304ba3ebc11dc2d507a7c8e3fdca8d0533bb1a7</video:content_loc><video:duration>605</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-08-29T11:23:15+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/test-service-config</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/722482551-79cd7467b7d42a6218c98a77607ebc173d655aed9914c1efc0152993ff80fe2f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Writing & Running Symfony's Tests]]></video:title><video:description><![CDATA[When you make a pull request to Symfony, you *almost* always need at least one test. And... yea... we definitely need a test for our new `TargetPathHelper`. But, before we start writing it......]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/287357137/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0efc57c07017d38c8462d1f0fe2080f7c39aefff2be100ed6ab4af8d17e458c7</video:content_loc><video:duration>325</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-08-30T10:45:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/pushing-fork</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/722723435-20d158dc19aeada028c1c59de479fe48190d3754f4b706e93a6026be9df71a98-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Services, Autowiring & Pushing To GitHub]]></video:title><video:description><![CDATA[We *now* have a fully-functional new class *with* a test! But, we have *not* registered this class as a service yet. Which means... the user would still need to do that manually. That's a bummer! ##...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/287551703/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=449840205fd73299cb9aa884032a9baacd84548c9449afd19b47587c4e2fd957</video:content_loc><video:duration>351</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-08-31T10:15:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/submitting-pr</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/722743260-0b5fdfaf71c27e3226298d0a31f8fefa7c2a1701cafdddce2042210d7991f8ef-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[PR Details & Continuous Integration]]></video:title><video:description><![CDATA[The *first* thing to notice is the base branch. This is *super* important. Because we created our branch off of master, this base branch must be master. If we created the branch off of 3.4, then, of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/287567604/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e41f61977907512c5d29c00cd573868a40bb043aaffb4e04d48482feeceda76d</video:content_loc><video:duration>425</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-09-04T11:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/documentation-bug</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/723616967-c4a39ba742c646752e4f6754e1d5bf213148b3d18d94019f5b3aef556de29edb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Uh oh: Documentation Bug!]]></video:title><video:description><![CDATA[The *last* TODO for our PR is to create a documentation PR. And, honestly, in my opinion, making changes to the documentation is probably the easiest *and* most *effective* way to contribute to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/288262358/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4f8bddef3c968f98ef5627dd01f02382d72f4c058c7a587f8075c07958aa8781</video:content_loc><video:duration>477</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-09-05T11:30:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/docs-ci-feature</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/723815116-9240895cf3434005334235ee1dbc5a79de6c0946798a4ff0f9dddf3c8ba7cb82-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[All about the Docs: CI & Format]]></video:title><video:description><![CDATA[After waiting about a minute, oh! You'll notice that the continuous integration for our documentation pull request failed? What does that even mean? Are there tests for the docs? Let's learn a few...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/288411667/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3c744780559f3327982fd930a5126c70b185ba5ff5f7c38d4becd494f188486a</video:content_loc><video:duration>447</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-09-06T11:15:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/contributing/recipes</loc><lastmod>2023-02-21T21:24:22+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/723836223-162412d3168a5aa05acc20af2b7fa6982935d64d7d423e25159e47787b58fd07-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Recipes & Other Repositories]]></video:title><video:description><![CDATA[We've seen a *bunch* of ways to contribute: triaging issues & pull requests, creating pull requests and contributing to the documentation. But there's so much more! The Symfony ecosystem is a *lot*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/288427624/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ca8ebec3f48248ad74ffc019e3c85be4e282084a27e5f8ad632db2a572795453</video:content_loc><video:duration>496</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-09-07T12:00:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-forms/form-type-class</loc><lastmod>2023-02-21T21:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/735031299-b7801adfa06224cd2b8ba4db968020bc7d9fb3f4aa340000cd56272d5d906d93-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Form Type Class]]></video:title><video:description><![CDATA[Hey friends! And welcome to, what *I* think will be, a *super* fun tutorial: the one about cookies! Um, forms! The *first* question you *might* ask is: forms? Do we even *need* forms anymore in this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/297370836/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=267c389f3712db1b2411454813e66d7aca485423ebb86ec015f235ffd28b9258</video:content_loc><video:duration>551</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-10-29T11:40:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-forms/form-submit</loc><lastmod>2023-02-21T21:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/735629079-8a6b77359f644b7c148fa8205e18906dcddb307b3ed3080a87e444c442c2c6be-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Handling the Form Submit]]></video:title><video:description><![CDATA[Creating the form class and rendering was... easy! Now it's time to talk about handling the form *submit*. Notice: we haven't configured *anything* on our form about what *URL* it should submit to....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/297845925/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f367315302bb306cf26b56b810eefe0e322f139d2e5714900620cbc3c6b9b97e</video:content_loc><video:duration>524</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-10-30T12:00:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-forms/flash-messages</loc><lastmod>2023-02-21T21:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/735776784-4247c4862485ca0fc25a58d2b9dcc4b6a174e7b1d0acefb11222d04881503dd8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Success (Flash) Messages]]></video:title><video:description><![CDATA[Our form submits and saves! But... it's not all *that* obvious that it works... because we redirect to the homepage... and there's not even a success message to tell us it worked! We can do better!...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/297966055/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1fa2364d5ea33b35d22c57781f225adc5b740aaf6eb739c779b95161063e2adf</video:content_loc><video:duration>410</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-10-31T11:10:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-forms/data-class</loc><lastmod>2023-02-21T21:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/736014881-84e3932e515698e33f7b50ccfeb4f3eaaf24455e424138a45860d6f3345c5cf4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bind Your Form to a Class]]></video:title><video:description><![CDATA[We created a form type class, used it in the controller to process the form submit *and* rendered it. This is pretty basic, but the form system is already doing a lot for us! But... I think the form...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/298165253/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0b6f442f9bc5dae5c8aabf14b31a8a94f209b2c8c0053bd975f3fd6aee6501a8</video:content_loc><video:duration>452</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-11-01T11:30:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-forms/types-options</loc><lastmod>2023-02-21T21:24:21+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/736053350-df6f1f24655d21bb2da7405c5f535de9820347cccc64366669a9a12f0b4df8c2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Field Types & Options]]></video:title><video:description><![CDATA[Our form has an input `text` field and a `textarea`... which is *interesting* because, in our form class, all *we've* done is give each field a name. We... actually have *not* said *anything* about...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/298198154/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c2ec98b485eb0cc564ed42d4ed964cdfaaa5945e528e2e4d22b3363d3eb12968</video:content_loc><video:duration>285</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-11-02T11:40:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-security/make-user</loc><lastmod>2023-02-21T21:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/726433959-f3b68e223c589c9d015a82b0b1be4e47684401128066a82e9dc225a4be944e72-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Security & the User Class]]></video:title><video:description><![CDATA[Yeaaaa! You've done it! You've made it to the tutorial where *we* get to build a security system with Symfony. This stuff is *cool*. Seriously, these days, the topic of security is gigantic! Just...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/290534257/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e720de88526b6caaacf275f3330c811b288e837cc4da1064417ec3063c2ba46c</video:content_loc><video:duration>390</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-09-10T12:00:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-security/user-class</loc><lastmod>2023-02-21T21:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/726414682-329affc18029263dbd8067801f70cbe4d9b02a76163d70e54febbdd682e5f8ff-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[All about the User class]]></video:title><video:description><![CDATA[Now matter *how* your users will login, the *first* step to creating an authentication system is to create a `User` class. And we just did that with the handy `make:user` command. Go check out that...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/290518944/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f9c7a37a9e1009ed969ec958fbd59acec1b5885dd1a3c654d99ce180e3821bcb</video:content_loc><video:duration>198</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-09-11T11:45:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-security/user-entity</loc><lastmod>2023-02-21T21:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/726417238-d5a163921bd900084c4fc22cb8e754863dbe0c5606e0fd44cbb007bf6a7159de-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Customizing the User Entity]]></video:title><video:description><![CDATA[The *really* neat thing about Symfony's security system is that it doesn't care at *all* about what your `User` class looks like. As long as it implements `UserInterface`, so, as long as it has these...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/290520859/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e8c90d3a4af7f0cd29de94f8d20b9208bf691cc4f63441dc5e18c05a2beac6b3</video:content_loc><video:duration>388</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-09-12T11:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-security/login-form</loc><lastmod>2023-02-21T21:24:20+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/726417962-5892a8e67154e2a70e29af6e48b01c050411f00b58b5e71acddb3f95c8f7adda-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Login Form]]></video:title><video:description><![CDATA[There are *two* steps to building a login form: the visual part - the HTML form itself - *and* the logic when you *submit* that form: finding the user, checking the password, and logging in. The...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/290521421/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7c03f175ad900f48c9bdd2f36208c3efc76571ad52042d07ad4554daf3b22fe6</video:content_loc><video:duration>516</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-09-13T11:10:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-doctrine-relations/comment-entity</loc><lastmod>2023-02-21T21:24:19+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/701321856-5836d6a1c7d87b261a45498423dbe5cf98d58e580bcaddde0d8a130fb419c2cb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Adding a Comment Entity]]></video:title><video:description><![CDATA[Hey friends! I mean, hello fellow space-traveling developer... friends. Welcome, to part *two* of our Doctrine tutorial where we talk *all* about... relationships. Oh, I *love* relationships, and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/270239515/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ad8b8de1fb27977282850c2f3fd0cf21fed1ed605d9765592c24d3894bc3328b</video:content_loc><video:duration>304</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-05-17T10:50:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-doctrine-relations/many-to-one-relation</loc><lastmod>2023-02-21T21:24:19+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/701327018-85bfc7b6d9430333a9a60c290a0852e2dded1d22b62a803f89cc1bfe661503fe-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Adding the ManyToOne Relation]]></video:title><video:description><![CDATA[Hmm. We want each Article to have many Comments... and we want each Comment to *belong* to one Article. Forget about Doctrine for a minute: let's think about how this should look in the database....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/270244037/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=43ad223c2c47ecb925b47d60b5c7515f740684883d22f39ac68cbd1aaa2d6f1a</video:content_loc><video:duration>554</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-05-18T10:10:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-doctrine-relations/saving-relations</loc><lastmod>2023-02-21T21:24:19+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/701330846-5300c5c8265ad44eacb7485aed4cfb1e2f9d601b58e8483acb4802d817d8a930-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Saving Relations]]></video:title><video:description><![CDATA[Our `Comment` entity has an `article` property and an `article_id` column in the database: [[[ code('c91ede73d9') ]]] So, the question *now* is: how do we actually *populate* that column? How can we...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/270247720/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c6af3f67efb8508c74c1bfa09014b91aae62376e19fb0ea8e5788af697a22671</video:content_loc><video:duration>275</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-05-21T10:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-doctrine-relations/fetching-relations</loc><lastmod>2023-02-21T21:24:19+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/701334857-ef422accbd0678bf51fcb2d4e7356ff7e046aa0677552890b875a91290c8c540-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Fetching Relations]]></video:title><video:description><![CDATA[Yes! Each `Article` is now related to *two* comments in the database. So, on the article show page, it's time to get rid of this hardcoded stuff and, finally, query for the *true* comments for this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/270251279/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2353d4d45fedddade509ac891a14ea32f6660d5197862787b33abc67bf340213</video:content_loc><video:duration>362</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-05-22T11:05:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-bundle/bundle-directory</loc><lastmod>2023-02-21T21:24:19+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1535994814-005796bd5eda42ae4f5c285e07030351898177d533c7e6eec6829f18c5273771-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bootstrapping the Bundle & Autoloading]]></video:title><video:description><![CDATA[Heeeeey Symfony peeps! I'm excited! Because we're going to dive *deep* in to a *super* interesting topic: how to create your *own* bundles. This is useful if you need to share code between your own...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/764969194/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=684047918076edcf6ebea1b84e1238c164faf264e9e3bbe3a4ab7c4e18b78752</video:content_loc><video:duration>441</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-03-14T11:20:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-bundle/bundle-services</loc><lastmod>2023-02-21T21:24:19+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/688821159-323c8bbe3e84e09e8513552228f9492b79e95da2f44b6e87345dc5c366adb41f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Auto-Adding Services]]></video:title><video:description><![CDATA[At this point... we have a *directory* with a PHP class inside. And, honestly, we *could* just move this into its own repository, put it on Packagist and be done! But in that case, it wouldn't be a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/260168710/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5fa281cbc33c29e171774d4358b5a4f21bfbbec02509eb8fded142c2c32ec050</video:content_loc><video:duration>410</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-03-15T10:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-bundle/autowiring-public-private</loc><lastmod>2023-02-21T21:24:19+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1046685323-5d749bb905dc87a62a8c1707e09fc70d5e17e10a1523f485d76c3a5bc63dcec7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Autowiring & Public/Private Services]]></video:title><video:description><![CDATA[Head back to `services.xml`: there are a *few* really important details we need to get straight. ## Best-Practice Service IDs First, in our *applications*, we usually make the service id match the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/505815897/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f395a7c0b37c96be39fcfdc6af3a7e9ecec0022ab7d119bb172eaed5fa817045</video:content_loc><video:duration>268</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-03-16T10:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-doctrine/install</loc><lastmod>2023-02-21T21:24:19+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/695224640-ac99d5573d1506f20531192039af65fe6e5a2fbd253f3b1f8e0d51778e3d933c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing Doctrine]]></video:title><video:description><![CDATA[Friends! Welcome back to the *third* episode in our starting in Symfony 4 series! We've done some really cool stuff already, but it's time to explore deeper in an epic search for intelligent life......]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/265261134/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8a52b0386965f6fa0a6289975733501e389668390556049225da8938d2b3b497</video:content_loc><video:duration>284</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-04-18T11:00:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-doctrine/create-entity</loc><lastmod>2023-02-21T21:24:19+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/695386752-0c3c94b3591f622bc20598d9c898cbf6191b5cea605a5ff25a85dd819848a251-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating an Entity Class]]></video:title><video:description><![CDATA[Doctrine is an ORM, or object relational mapper. A fancy term for a pretty cool idea. It means that each table in the database will have a corresponding *class* in our code. So if we want to create...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/265391459/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a74279cdfd0ca301870ab0b1789e431b32c3b07c953ce1b90cdc7eb58ca7904f</video:content_loc><video:duration>295</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-04-19T10:30:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-doctrine/database-migrations</loc><lastmod>2023-02-21T21:24:19+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/695899133-50903d5cac01e314335d413d34b3acd152a9fb247f9a6e3bd5409203efe16ffd-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Database Migrations]]></video:title><video:description><![CDATA[The `Article` entity is ready, and Doctrine already knows to save its data to an `article` table in the database. But... that table doesn't exist yet! So... how can we create it? ## Generating a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/265798759/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f2a562a0275d2a0de3ee87b69cdbde2be514872cfd2f13a09a867b0d3cd2df05</video:content_loc><video:duration>347</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-04-20T10:30:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-fundamentals/bundles-services</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/679486623-95e2cc7ef9e6b48cedd692630025c212e397f74945d678ba1be657c0779614d1-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bundles give you Services]]></video:title><video:description><![CDATA[Yo guys! Welcome to episode *2* of our Symfony 4 series! This is a *very* important episode because we're going to take just a *little* bit of time to *really* understand how our app works. I'm...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/252769987/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=42301c8ac6d59eb6927721e15cb981c60797d764246780c9bc285d2812d3c478</video:content_loc><video:duration>260</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-25T11:25:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-fundamentals/markdown-bundle</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/679498428-c16f31e5ccbb28f9f419b387e2a3556ce6120910af0ed01e2b10528e100a5314-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[KnpMarkdownBundle & its Services]]></video:title><video:description><![CDATA[Scroll down to the "Why do Asteroids Taste like Bacon" article and click to see it. Here's the goal: I want the article body to be processed through *markdown*. Of course, Symfony doesn't come with a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/252777665/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=806f13d8bbdf0e68ac51f9aa4ecd788d992a217422b1da8c3b3c158f6ce0d6e5</video:content_loc><video:duration>280</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-26T10:30:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-fundamentals/caching</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/994290719-a52439483c297f094634c4cea23c2d541776b36283e5e0221cf0ecff542f8a06-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Cache Service]]></video:title><video:description><![CDATA[Thanks to the 7 bundles installed in our app, we *already* have a bunch of useful services. In fact, Symfony ships with a *killer* cache system out of the box! Run: ```terminal ./bin/console...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/478959438/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a7b22dfa68eeaabc110f0817463463fab74723a1b6ed54f4218a53a8ef111283</video:content_loc><video:duration>341</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-29T10:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/setup</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/855797126-bafe7d340f37fa1c238bf7b7c071a88e2538f4af570d91ead2a81c3deedc2c7e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Symfony 4: Let's Launch!]]></video:title><video:description><![CDATA[Hey guys! Yes! It's Symfony 4 time! I am *so* excited. Why? Because *nothing* makes me happier than sitting down to work inside a framework where coding is actually *fun*, and where I can build...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/391274202/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=aefa03299d475ed97cff60673da3a9559e5d68885d728d1889fd77ba09a87534</video:content_loc><video:duration>243</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-08T14:17:43+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/micro-app-phpstorm</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/676239818-2d0674ac1abc3dee08d7af6c20d3c785ad865f2227b7a211be87e2570ef77c5a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Our Micro-App & PhpStorm Setup]]></video:title><video:description><![CDATA[Our mission: to boldly go where no one has gone before... by checking out our app! I already opened the new directory in PhpStorm, so fire up your tricorder and let's explore! ## The public/...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/250209312/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1707ff6a2def542b67e93a7c4c3713321f13a30cd8bd971fb97802373c9ac76d</video:content_loc><video:duration>337</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-09T10:55:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/route-controller</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/789463251-4c924b221e445e146e0c171aff3ecc55b3d294009844fb9b021fc4b329d36273-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Routes, Controllers, Pages, oh my!]]></video:title><video:description><![CDATA[Let's create our *first* page! Actually, this is the *main* job of a framework: to give you a *route* and *controller* system. A route is configuration that defines the URL for a page and a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/340975275/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=bb3a630916efb490034a29f6de8210b5672f115dd27cf3055331f91d005edce4</video:content_loc><video:duration>436</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-10T03:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/flex-recipes</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/718552711-5c1ae5c068924bea3a250fe3f1e3bb3ef0c6a70b9de71f5303bc69e9bcedb353-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Symfony Flex & Aliases]]></video:title><video:description><![CDATA[It's time to demystify something *incredible*: tractor beams. Well actually, we haven't figured those out yet... so let's demystify something *else*, something that's already been happening behind...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/284158462/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=dc61d91a4edae6ed8e7fd716d42d6c81501095a2c698c1bc2b5d199f67debeac</video:content_loc><video:duration>351</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-11T11:15:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/twig-recipe</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/676826699-0c58045e2e1ab584318f4fa82d09326d94353f1f8d34a1bbbb85f992e7cc0e25-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Twig Recipe]]></video:title><video:description><![CDATA[Do you remember the *only* rule for a controller? It must return a Symfony Response object! But Symfony doesn't care *how* you do that: you could render a template, make API requests or make database...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/250670969/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6a5ede69180e5492f3b9ffe2afe567ad44af198bc5a116d07c02cb13ed7a6c9d</video:content_loc><video:duration>169</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-12T11:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/twig-love</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/677348894-af637f4fa5d5d84244921bcc7fa4501e6a72e6eb12448cd31bbff5dc33094c9e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig ❤️]]></video:title><video:description><![CDATA[Back to work! Open `ArticleController`. As soon as you want to render a template, you need to extend a base class: `AbstractController`: [[[ code('21312d03bb') ]]] Obviously, your controller does not...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/251091347/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d072cc31421fbe8b9209f5896209a23cc7c329a867ae6a946eae9d67d80ef3d5</video:content_loc><video:duration>503</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-15T10:40:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/debug-toolbar-profiler</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/754487517-9f8988ce713ab88cc9c96b0a6aa28016f087660d47fd6e984d845fa114d5b7b8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Web Debug Toolbar & the Profiler!]]></video:title><video:description><![CDATA[Make sure you've committed *all* of your changes - I already did. Because we're about to install something *super* fun! Like, floating around space fun! Run: ```terminal composer require profiler...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/313228887/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1e85661ccc7a89b9946bb1b27913f680f0ac0c50e038b475d590d41d14b8ed7b</video:content_loc><video:duration>235</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-16T10:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/debugging-packs</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/677718629-47915d92fd210cd653aee35a5fcfa9f24b81745badea71b312a8332b749b29c4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Debugging & Packs]]></video:title><video:description><![CDATA[Symfony has even *more* debugging tools. The easiest way to get *all* of them is to find your terminal and run: ```terminal composer require debug --dev ``` Find your browser, surf back to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/251380040/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=492e5b86de113b61f39cd2cd7515871238728c0c672baa0c7671777f862e8a12</video:content_loc><video:duration>196</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-17T10:55:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/css-assets</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/677911521-f4101360e7466b8a6a8a9441a8ab8dff1d06bbf9d68230a07ccd1088b3b3e442-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Assets: CSS & JavaScript]]></video:title><video:description><![CDATA[Even astronauts - who *generally* spend their time staring into the black absyss - demand a site that is *less* ugly than this! Let's fix that! If you download the course code from the page that...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/251526054/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1938afdc64230a65ede730e743c6f4dc7b16ee91408f32d4404256ad557d9f9e</video:content_loc><video:duration>531</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-18T10:55:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/generating-urls</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/677911713-bce9f279c9d32825535286983113f72d78cc388ea4b6bca813686221c265cf32-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Generating URLs]]></video:title><video:description><![CDATA[Most of these links don't go anywhere yet. Whatever! No problem! We're going to fill them in as we continue. Besides, most of our users will be in hypersleep for at least a few more decades. But we...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/251526287/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=27ebf02e504c078690de04fe55f7021ca3da8e4153ac7e1ef9f27c492f316449</video:content_loc><video:duration>348</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-19T10:55:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/javascript</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/678633019-36e86cdce9cfaedf08222e52e837773521f549a1bbe0010847041656a4f48c5c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[JavaScript & Page-Specific Assets]]></video:title><video:description><![CDATA[The topic of API's is... ah ... a *huge* topic and *hugely* important these days. We're going to dive deep into API's in a future tutorial. But... I think we at *least* need to get to the basics...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/252092999/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=fd5842445455099bce03b0d78420c98ee26bff1aa264e1099589e1cf9ed29cb9</video:content_loc><video:duration>316</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-22T10:55:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/javascript-api</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/678859620-e2909941f03de8349342ac15194a2a23770b11212020a7ad3a4ac0f0490a2014-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[JSON API Endpoint]]></video:title><video:description><![CDATA[When we click the heart icon, we need to send an AJAX request to the server that will, eventually, update something in a database to show that the we liked this article. That API endpoint also needs...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/252270395/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1ae2884e7b7d2e1b92caeb18f097c3467272aa553c15f9b779cd0759e9dbb80e</video:content_loc><video:duration>389</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-23T11:40:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4/services</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/679194567-c15e2c39fcd628977139599307dbff1c8b55c3cd7a2dd481493af1d54bd74198-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Services]]></video:title><video:description><![CDATA[It's time to talk about the most fundamental part of Symfony: services! Honestly, Symfony is nothing more than a bunch of useful objects that work together. For example, there's a router object that...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/252532789/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c4fbb65f3290def2e19bf76edfb1fb053ab2979817ffee330a4167a656203cba</video:content_loc><video:duration>444</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-01-24T15:56:00+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-upgrade/sf34-deprecations</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/673188509-fd57c987c7e887d81baf3677452895ab43bff6680b4716ce2542bc0c59b87f7f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Upgrade to Symfony 3.4]]></video:title><video:description><![CDATA[Symfony 4: it's a *game* changer. It's my *favorite* thing since chocolate milk. Honestly, I've *never* been so excited to start writing tutorials: you are going to *love* it! But first, we need to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/247831282/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=48c9639523de3815a75020b402d224b035f85dd684707117c17bac1a3c3da30d</video:content_loc><video:duration>536</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-12-18T17:15:43+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-upgrade/service-deprecations</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/673234069-8d9771cccd1779ebabb07fa2208cc0ee8f54111cdcea2e3528429f0440e960b4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Autowiring & Service Deprecations]]></video:title><video:description><![CDATA[Woo! There are only *two* deprecations left on the homepage... but they're weird! And actually, they're *not* real! These are *false* deprecation warnings! ## Upgrade to the Symfony 3.3 services.yml...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/247866604/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0498d22ae1fb1a67155e309c07aa60b1f671ed3879d01643fa0530107249081d</video:content_loc><video:duration>557</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-12-19T11:00:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-upgrade/upgrade4</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/673650353-34ad0ef69a69475c8e71bfdf0ea33e9423fc72dfa9bec258297615bfbaaea3c0-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Upgrade to Symfony 4.0]]></video:title><video:description><![CDATA[With the deprecations gone... yeah! It's time to upgrade to Symfony 4! If you were hoping this was going to be really cool and difficult... sorry. It's *super* easy... well... *mostly* easy. Open...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/248195831/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=33fe87f79ffe572992c4a90a873bc3fd10b0b80e94900307a758bd396de9eca0</video:content_loc><video:duration>398</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-12-20T10:55:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony4-upgrade/flex</loc><lastmod>2023-02-21T21:24:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/673678172-30ce08586516a9f432445c87b578aab5a2f58b8ca56987319b36eaf2e9e28190-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing Flex]]></video:title><video:description><![CDATA[Our project is now on Symfony 4.0, and it *still* works! Well, it *almost* works: we would just need to remove a few references to `SensioDistributionBundle` and `SensioGeneratorBundle`. The point is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/248217104/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b8cf5ad5245e89ec118908e4c4d70feb0a700c2afad226c6242d9dc81ece01b4</video:content_loc><video:duration>267</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-12-21T11:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/encore-install</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/740218717-f7e2fd470f39770fc6ff03491d8474519558e5c102b2815be9dd538668430b74-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installing Encore]]></video:title><video:description><![CDATA[Hiya guys! And welcome to our tutorial on Webpack Encore! I have to admit, this tutorial is near and dear to my heart, because I helped *write* Webpack Encore. But also because I think you're going...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/301625816/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=73c4ad61d871b85fac8733ad456d7f5ccd6a2d1ac21faf5c01d363e8995bf79c</video:content_loc><video:duration>531</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-02-22T10:50:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/first-encore</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/740223031-df01814b4425ec1c6538319b7fd9d75d4e20dca22702b22279a3c0770aec1e0d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Our First Encore]]></video:title><video:description><![CDATA[Create a new file: `webpack.config.js`. Here's how Webpack works: we create a config file that tells it *which* file to load, where to save the final file, and a few other things. Then... it does the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/301629379/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=fb72267675ef7b25a85f76b3c5df8c9d803deee072ab49cdeafb8d983c3e6c54</video:content_loc><video:duration>482</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-02-23T10:15:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/require-outside-libs</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/787419985-605b1771c2aba49bb6b6aae1424d865b517ce2e53c1501d183daa55f39106826-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Require Outside Libraries]]></video:title><video:description><![CDATA[When you use Webpack, the *hardest* thing is that you need to start thinking about your JavaScript differently. You need to *stop* thinking about global variables, and *start* thinking about how you...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/339402308/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2afe3794aa0395654a6473614b94944008dccb251317f599b41fcc9fbcd5ca81</video:content_loc><video:duration>346</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-02-26T10:40:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/entry-components</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/685334761-f0c0c4c9297d6f500370e34d19ff5540ddd28dd896753106bdb97eccce9f11d6-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Component Organization]]></video:title><video:description><![CDATA[With our new-found super-power to require files, we can really start to clean things up! First, remove the self-executing function that's around everything: [[[ code('21e41f99e2') ]]] We *originally*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/257420019/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3008c890512376b57ac3fa300f807b49236cad00bfd67440a003f1ad25909bed</video:content_loc><video:duration>301</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-02-27T10:40:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/multi-page-entry</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/685729357-3e1b2daacf92fb9b6227720f9a9efead392b37a215b1a90af619aece73d37238-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Multiple Pages / Entries]]></video:title><video:description><![CDATA[This is all *really* nice... but, so far... it *kinda* looks like Webpack only works for single-page apps! I mean, if this were the *only* page in our app, we could write all of our JavaScript in the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/257738049/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a606a321c39612623f443a154114435b82cb1992dfe33bc0b874ad5170e2653a</video:content_loc><video:duration>278</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-02-28T10:25:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/jquery-plugins</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/685753606-7781f6dcb39f1e9eda5693115b1dd9f3e126fbcbab879b5cfc144a293ada42e0-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[jQuery Plugins / Bootstrap]]></video:title><video:description><![CDATA[Now that Webpack is handling `layout.js`, let's simplify it! Remove the self-executing function. And, of course, add `const $ = require('jquery')`: [[[ code('410e7007dd') ]]] Perfect, right? Well......]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/257756906/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=9312a62862cc80c417f6f94a82dead580005312ac664448db7bd08a028728ffa</video:content_loc><video:duration>405</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-03-01T11:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/require-css</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/883054795-2b4240cc92cd7e32a0228dd5133dfc09c4a71aff6d16868055abe1b7f967f7d2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Require CSS!?]]></video:title><video:description><![CDATA[Oh, *before* we talk about CSS, I forgot to mention that these `public/build` files do *not* need to be committed to your repository: we can rebuild them whenever we want from the source files. So...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/411137422/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=17164ea54693210cb729470390e6dbf3778a5ccc350a169e6e6d43b4c6bf59ea</video:content_loc><video:duration>559</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-03-02T10:55:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/copy-plugin</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/740222885-73e3ca47570c3fa1775057730b239bec0a714ded94f463f148ea392fbdb0bc57-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Handling Images with the CopyPlugin]]></video:title><video:description><![CDATA[Bonus! A *really* cool side-effect of using Webpack is that *none* of these files in the `assets/` directory need to be public anymore! I mean they *live* in the public directory currently... but the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/301629352/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=10ffce16cfcf4c04c19725dad5d853b70969a91e7968b28e6859d925471f46cc</video:content_loc><video:duration>390</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-03-05T10:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/sass-sourcemaps</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/686245062-bfced89649d626dd0f0fd721b2a4e78e62a6a3592a340a913cecb32f37fbb603-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Sass & Sourcemaps]]></video:title><video:description><![CDATA[Our `layout.js` file requires `main.css`: [[[ code('cc031305e5') ]]] That's cool... I *guess*... if you like using boring old CSS. But I want to be more Hipster, so let's use Sass instead. Well, I...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/258143673/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d12c8c345e1c6f67008378a9c3faf5d8eccd354cb68280ba0ad840827a0bd985</video:content_loc><video:duration>330</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-03-06T10:50:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/fos-js-routing-bundle</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/686248374-bfa5a615222a1f6e6a98a97ba248edb5a48b1be63d89e6022f926bba15740c71-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Integrating FOSJsRoutingBundle]]></video:title><video:description><![CDATA[Open `Components/RepLogApp.js` and search for `Routing`: [[[ code('567fe22c24') ]]] Guess what? *This* `Routing` variable is a *global* variable. Boo! It's our *last* one. In `templates/`, open the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/258146151/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6d0358096046177fac2fd114f7d9dd37a7c92ca525a482150427b72f7cd143ac</video:content_loc><video:duration>271</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-03-07T11:05:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/import-export</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/687453160-fb038b0689f2eba16c26d11cd523c28bb7a09dbd37170794f740e09c909a4a95-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[ES6 Import & Export]]></video:title><video:description><![CDATA[If you watched [episode 2][javascript_es6] of our JavaScript series, then you know that ECMAScript is the official name of the JavaScript language standard and that ECMAScript version 6 - or ES6 -...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/259098130/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5f72d0d315beb2afb5d6e37788d8b62e75984d0ee1b1206f90d69fc115e88517</video:content_loc><video:duration>360</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-03-08T11:15:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/production-build</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/738144902-38f2fbc60b95aa7503900f8bca216e1badeed8804e9ba348b2f46b22c57257fa-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Building for Production]]></video:title><video:description><![CDATA[I *love* our new setup! So it's time to talk about optimizing our build files for production. Yep, it's time to get serious, and make sure our files are minified and optimized to kick some...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/299917740/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c732981564c27f05931004403b86177f007d699c51ccfd4cdee02ff36aff9698</video:content_loc><video:duration>404</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-03-12T10:20:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/webpack-encore-legacy/versioning</loc><lastmod>2023-02-21T21:17:09+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/688256336-29965545f8a1e98d63fbd8cf6922825a7b68e0f3673112684dcbbeebb95676d9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Asset Versioning & Cache Busting]]></video:title><video:description><![CDATA[There is *one* last thing I want to talk about, and it's one of my *favorite* features in Encore. Here's the question: how can we *version* our assets? Or, even *more* simple, how can we bust browser...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/259728482/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=496295a5b317a476d7d73c9dbb920d5ff193c15bf125e62b93738c33d1d9b4c9</video:content_loc><video:duration>361</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-03-13T11:25:03+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpunit-legacy/phpunit-setup</loc><lastmod>2023-02-21T21:17:08+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1243238929-93a25d7fdd7fe2a63a3f43abff3bec2b12bde5816532a69285c8af4d2eb45edc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[PHPUnit: Secure the Park]]></video:title><video:description><![CDATA[Let me paint you a scary picture: It's Friday night. It's stormy. The office is empty and you're deploying fresh code straight to production. Suddenly, an alarm! What? The fences are down!? The...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/606622278/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6dc296d1ea8d7487885fff6f0b8789a63a24247454066ad542e5966cfb4eb0b7</video:content_loc><video:duration>343</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-11-07T11:05:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpunit-legacy/test-assert-code</loc><lastmod>2023-02-21T21:17:08+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/665565428-eed46f00b9177f8809c382285bd7ea23dd485c3eebd8532cf9391599c3991fd4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Tests, Assertions & Coding]]></video:title><video:description><![CDATA[So... we don't really have much code to test yet! That might feel weird: when I started testing, I wanted to write the code first, and *then* test that it worked. But actually, you can do it in the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/241862757/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=85eac5e720d80f09915d28eab97c1e3b2dbab234c9ab7dd3a0c2e0dd9389fb66</video:content_loc><video:duration>400</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-11-08T12:56:29+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpunit-legacy/tdd-cycle</loc><lastmod>2023-02-21T21:17:08+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/666091829-9718ed51a7786eb77dd9b29d2b6958bf63c6b9e725dc09fece8bf06aa79a20a4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[TDD & Unit, Integration & Functional Tests]]></video:title><video:description><![CDATA[## Unit, Functional & Integration Tests Before we get back to coding... we need to talk about just a *little* bit of theory! No, don't run away! Give me just 2-ish minutes! So, there are actually...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/242279513/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=214af2c804898de28c98ff440dd9adbee8117f2600659bed6e29ba5112b8a910</video:content_loc><video:duration>221</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-11-09T11:20:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/ansistrano/server-provision</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/656627336-d31ecc8e670315313fc91190ec0520e3cbf2545275d13d2b0778ce321d2d79bc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Setup: Server Provisioning]]></video:title><video:description><![CDATA[Hey guys! Ok, here's my situation: I've built this *amazing* new app: MooTube: the latest *fad* in cow fitness. There's just one more problem to solve, before cattle start signing up in herds: the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/234929718/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ab89464dcc0043ad5c824b13b7d84ec6f6b19cee41f0bb2d024607c990f04e11</video:content_loc><video:duration>518</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-09-25T11:05:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/ansistrano/ansistrano-role-install</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/720837830-1699d88ba5ab331ea9199368a10c2c2583070e9849234df1def414f1441bc03e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Ansistrano Role Installation]]></video:title><video:description><![CDATA[We already have an `ansible/` directory, which has a bunch of files to support two playbooks: `aws.yml` that boots new EC2 servers and `playbook.yml` that can *provision* those servers, installing...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/286034106/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ce8b12955c0dd653203d96bdc0349c1f32d0af33255cf38ec56479256f646723</video:content_loc><video:duration>350</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-09-26T11:40:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/ansistrano/ansistrano-deploy</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/657555511-0364ab010604fc2304397879943b9932541720332dfb095511b34b58ed7a1fd3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Anatomy of an Ansistrano Deploy]]></video:title><video:description><![CDATA[Go back to the Ansistrano GitHub page. Find the table of contents near the top, and click [Deploying][deploying]. Excellent! This tells us how to use this role *and* how it works! Ansistrano is based...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/235674271/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=80df4bcc755accf3c52cb50cf146086aa8b8c03690fdcd74ac1086b52f7d21bb</video:content_loc><video:duration>280</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-09-27T11:20:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-3.3/upgrade-3.3</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/637775391-d936af51cbdf6810d469d00be701eb77bf9ad32cf65953a6265fa0f245ee04d1-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Upgrading to Symfony 3.3!]]></video:title><video:description><![CDATA[Yo peeps! Wow, Symfony 3.3! Actually, that version number *sounds* kinda boring. I mean, 3.3? Really? I expect cool stuff to happen in version 3.3? Well..... normally I'd agree! But Symfony 3.3 is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/219901725/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1265b009de6da0b5332417de0a48bacb641e057b1498657338413a7313eeb2de</video:content_loc><video:duration>321</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-06-02T10:55:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-3.3/defaults-autowire-autoconfigure</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/638349044-d325994171982101968555b63c97b27ba01d5a90d25b72de39da0ca0561e53af-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[_defaults, autowire & autoconfigure]]></video:title><video:description><![CDATA[If you started a brand new Symfony 3.3 project, its `services.yml` file will look like [this][services_yml]. You're actually seeing at least *four* new features all at once! Wow. All of this is built...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/220362525/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f3968aea49ada60f4a4079074af402dc656d8b7b1afdf96fe6849684bc39bd02</video:content_loc><video:duration>320</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-06-06T10:50:10+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-3.3/class-ids</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/638348216-6993bef932f18e0f809417cea664ff89abe1ac20f390292907d188b525d6bd2c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Service Class Name as Service id]]></video:title><video:description><![CDATA[Traditionally, our service ids looked like this: some underscored, lowercased version of the class name: [[[ code('9f789a2f9d') ]]] That's still *totally* legal. But in Symfony 3.3, the best practice...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/220361870/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=19cc0eb8c791a8d4fe1ad6040177bac5ba982fbabc149912cf2e165e42880c8f</video:content_loc><video:duration>251</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-06-07T10:50:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-3.3/private-services</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/638342762-91866a484c697fd5541cdf3ebe0a45cf01d7589f93ccbe04585f923c1756e238-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Making all Services Private]]></video:title><video:description><![CDATA[There is *one* more key that lives under `_defaults` in a new Symfony 3.3 project: `public: false`: [[[ code('ce051e5dfb') ]]] The idea of public versus private services is *not* new in Symfony...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/220357672/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a2901d8b93ea62bc60ebe8262da8693018d8cf03150a4525871092eca1a7b174</video:content_loc><video:duration>186</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-06-07T10:50:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-3.3/auto-register-services</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/638820510-4d58bf74f6d3f0f039f524e36bdd506e878561bc397cbeff2c7073e43ff13067-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Auto-Registering All Services]]></video:title><video:description><![CDATA[Go back to the Symfony Standard Edition's [services.yml file for Symfony 3.3][services_yml]. These two sections are the most *fundamental* change to the Symfony 3.3 service configuration. Copy the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/220733640/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f356e5e3877b2d44e3a9c411d0296bfc1a8d178257b034c4af6cd64b61198571</video:content_loc><video:duration>324</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-06-08T10:20:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/fosuserbundle/fosuserbundle-setup</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/631121244-a8a2420e629c08d4d97afd93963972e4fa93e99e89d0b46622f1b2ff771b8a7b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Rock some FOSUserBundle!]]></video:title><video:description><![CDATA[The most *popular* bundle in *all* of Symfony is... [GifExceptionBundle](https://github.com/jolicode/GifExceptionBundle)! Wait... that's not right... but it *should* be. The *actual* most popular...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/214609407/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a784f288845302cc4d30612609fa6bf7f03bd318eb5af8bf0b9a9204d35facf3</video:content_loc><video:duration>722</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-04-25T14:10:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/fosuserbundle/security-setup</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/631419888-0a34502910c0dcdfea499094cb6edc08468de0d8f656f7077af6f5925ba23cd7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Security Setup]]></video:title><video:description><![CDATA[With FOSUserBundle setup, the only things we *can't* do is login and logout. FOSUserBundle *does* give us a `/login` page, but it's just a static HTML form: setting up the actual authentication part...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/214846225/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=24c3e4cd95c4368167fbd1374b4bdad49f775326ff40a87315522abe1af16ecc</video:content_loc><video:duration>317</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-04-27T10:50:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/fosuserbundle/roles-canonical-fields</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/631550523-dc48df11567c8ee15e3ed8d3e92e038dc0d64dfc221b2a78bd9a22b90cc5c8b4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Dynamic Roles and Canonical Fields]]></video:title><video:description><![CDATA[Let's see what this all looks like in the database! To query the user table, we can actually use the console: ```terminal php bin/console doctrine:query:sql 'SELECT * FROM user' ``` Nice! We...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/214949749/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=15004e589aa117dfc08d33e6058238513efd8cac2dca8c7ea59e07d5b48ef466</video:content_loc><video:duration>317</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-04-28T10:25:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/fosuserbundle/template-customize</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/757018228-0978aaad9694bd28bbdda303a04e53386d6a3956d40f8eecd90197c82d0805cc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Layout and Template Customization]]></video:title><video:description><![CDATA[Everything *works*, but if you go to `/register`... it looks *awful*. Well, of *course* it looks awful! FOSUserBundle has *no* idea how the page should be styled. But don't worry: we can get this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/315283789/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=efc9795fd5d2caafa8be4ac8e02ddb89a493e9213d920804cc393bc86fc39f33</video:content_loc><video:duration>338</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-05-02T10:30:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/fosuserbundle/customize-text-translations</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/632741312-cbdced40d272340f3af4e9aa1883667a81255d613512651b52d53884526e5997-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Customizing Text via Translations]]></video:title><video:description><![CDATA[Create a new user: `aquanaut2@gmail.com`, `aquanaut2`, `turtles`, `turtles`. Hey, a pretty flash message! > The user has been created successfully ***TIP If you don't see this, make sure you're...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/215907012/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=642c0105dfd05ef2fa3bbc03047011ebd8d8b8a2541c42675f815f602b147b4f</video:content_loc><video:duration>162</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-05-04T11:35:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/fosuserbundle/customize-forms</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/632742768-b8d825022252713715f59be52bc71c3ef510c08e873fc7278e8d7cfc5d7d5da2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Customizing the Forms]]></video:title><video:description><![CDATA[What if we wanted to add our own fields to the registration form? Like, what if we needed to add a "First Name" field? No problem! ## Adding a firstName field to User Start in our `User` class. This...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/215908130/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=89ba1aceb556af4f7abe2448b8689f6fe46ddfd581bc5b1a434ed13a38adadc0</video:content_loc><video:duration>387</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-05-05T10:35:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/fosuserbundle/removing-username</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/632740777-774210f478fef324458a8895515f16f4ccbd80f677de154f49fffa1645f39cc3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[My Users don't have a Username!]]></video:title><video:description><![CDATA[Okay: a challenge! In some apps... you don't even *need* a username - you register and login entirely with your email. But... with FOSUserBundle, we *always* have a username field. So, are we stuck?...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/215906618/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d67ecb073e4e10b7dc9495583ede4e8ca87f17eb25708c5f4bd95c319c4fbb60</video:content_loc><video:duration>142</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-05-08T11:35:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/fosuserbundle/customize-events</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/632730512-1e67e3a50436f655229052508c9440364af545d0d61ae9819a05a5c31e6c5e7c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Customize everything with Events]]></video:title><video:description><![CDATA[We can override templates. We can override translations. We can override forms. But there's *more* than that. For example, after we finish registration, we're redirected to this registration...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/215898653/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0275de6cb333f925d8a5fa8ca798a1b558a5c0eb01bf5ea5413bb3a0c192af60</video:content_loc><video:duration>387</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-05-09T11:35:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/fosuserbundle/target-path-trait</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/632729032-007b181b41470a3baba693a0c7c891e8b348574c618eb54fe631b6937ad9e101-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[TargetPathTrait: Redirect to Previous Page]]></video:title><video:description><![CDATA[We now have control over where the user goes after registering. But... it's not as awesome as it could be. Let me show you why. First, look at my `app/config/security.yml` file. In order to access...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/215897456/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2b80e96806ce06f34be279a674916551b2f76611aa740627d23fc0a3bb2f7bed</video:content_loc><video:duration>185</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-05-10T11:35:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/fosuserbundle/guard-authenticator</loc><lastmod>2023-02-21T21:17:07+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/632729720-e614a25cd415fbea92780e5b55f3e5518717dd7d38cd15ccb5c44b80e1e4738e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[FOSUserBundle <3's Guard Authenticators]]></video:title><video:description><![CDATA[We *now* understand that FOSUserBundle *just* gives us a nice `User` class and some routes & controllers for registration, reset password, edit profile and a few other things. The bundle does *not*...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/215897948/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=874d993afdf57c86cc0d3a53d3ed0e4d1a149215cbded35932924576f7c6c032</video:content_loc><video:duration>275</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-05-11T11:35:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/easyadminbundle1/bundle-install</loc><lastmod>2023-02-21T21:17:06+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/641957661-ed190e55b8e1c24d0084dc691e09fc4c9d009e70c4519d8135a9fb3f8efee1b2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installation and First Admin]]></video:title><video:description><![CDATA[Hello! And welcome to another *amazing* episode of: "Recipes with Ryan". Today we'll be baking a positively mind-blowing, mile-high cinnamon bread! Huh? It's not the recipe video? EasyAdminBundle?...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/223224816/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=23e6b1c7fe69bcdbaeee2afb42db97ec2de9120432e2d6c2073aa7b8d862c701</video:content_loc><video:duration>356</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-06-27T10:15:07+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/easyadminbundle1/design-security</loc><lastmod>2023-02-21T21:17:06+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/641957258-c94e52366936cf7ec9e466d5ac789c9f58b17dcc8a4085561f559b8f5ad098b1-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Design Config & Security Setup]]></video:title><video:description><![CDATA[With about six lines of code, we got a fully functional admin area. It must be our birthday. But now... we need to learn how to take control and *really* customize! And for most things... it's......]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/223224533/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=28e7cb4ffa6919ad4a47c43f1d74d58a12e3ae1bacde8c7129782e5fcd87c7d4</video:content_loc><video:duration>256</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-06-28T11:15:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/easyadminbundle1/basic-views-entities-config</loc><lastmod>2023-02-21T21:17:06+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/641956868-e0a1d8e786367c7dc9109b2a39a51fc56b58c58c6900ab021e3d2bd0c2318997-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Views & entities Config]]></video:title><video:description><![CDATA[With EasyAdminBundle, you can configure just about *everything*... in multiple different ways. It's *great*! But also confusing. So, let's get it straight! There are two different axis for...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/223224173/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=41218ab3ff6ad804b89b1bcd89305418805d7707bbc55cce29e622b4196a8c0b</video:content_loc><video:duration>357</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-06-29T11:20:07+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/php7/speed-throwable</loc><lastmod>2023-02-21T21:17:06+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/636639799-aaabe09da40db8f13fd9499b8866bce2808fc606914d5e442040cb1f13deba4c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[1 <3 Speed & Throwable]]></video:title><video:description><![CDATA[Hey guys! I hate to start a tutorial off on a depressing note but... look... PHP 5 is *dead*. WAY dead. Like, it's not even supported anymore. PHP 5 is like that old, bad relationship that you just...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/218998617/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b675ee81ace6631f77013416ccc89dc7d1089eac297cf8eb9ff33b1e2a23fae0</video:content_loc><video:duration>326</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-05-30T11:00:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/php7/scalar-type-hints</loc><lastmod>2023-02-21T21:17:06+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/638278452-a88f32b854d2e65378ee7e1f8678e57bd26fa4e1e1aea9a106d735e9fbbaf8b5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Scalar Type Hints]]></video:title><video:description><![CDATA[Of course the big big features of PHP 7 are scalar type-hinting and return types. Let's play with scalar type-hinting first. Open up `src/AppBundle/Controller/GenusController.php`. Let's create a new...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/220307683/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=90cafb66b576d6754d5734a53b2cae7f4940c1f18a135787617fc8d6b898ab05</video:content_loc><video:duration>321</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-06-01T10:30:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/reactjs/eslint</loc><lastmod>2023-02-21T21:17:04+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1568124672-aef9716ab9aa2d15bc8ff2be0d602bc23cfad09cbc00904ea00e2ae1d3300680-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The World of React + ESLint]]></video:title><video:description><![CDATA[Hey friends! And welcome! Oh, I am *so* excited to talk about React. Developing in React *feels* great, and it's powerful! You can build *any* crazy frontend you want. But, honestly, writing this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/781228649/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=095f21e399a5d6542bfd20d5363659cb00d912eb6a58fe341f45b51e162760a2</video:content_loc><video:duration>493</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-06-19T10:32:32+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/reactjs/react-create-element</loc><lastmod>2023-02-21T21:17:04+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1568161805-6a44e53afab01d347669a5b36efaea20282eb198c0f60d5b7cbb0ec7ca0ef958-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[React.createElement()]]></video:title><video:description><![CDATA[Time to install React! Find your open terminal: `yarn add react` - and we also need a second package called `react-dom`: ```terminal-silent yarn add react react-dom --dev ``` `react` is... um......]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/781244425/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ac5cdbebf5884ad4a3bc706481b9b9871546c19175d23410eae3f69ccba4fd16</video:content_loc><video:duration>400</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-06-20T10:25:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/reactjs/jsx</loc><lastmod>2023-02-21T21:17:05+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/993766771-88b2eb1ab290ae2409814479c24211c4b15f2ac9c8909235216b2afd687237e4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[JSX]]></video:title><video:description><![CDATA[This system of creating a "virtual DOM", or "tree" of React element objects and rendering that to the page is a really cool idea. But, it's already a total pain: imagine if we needed another...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/478661909/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6fd0c36a061d3dcb264b5eaf4dc78afd3d1c3080bb5b08af0c866b88b894b97f</video:content_loc><video:duration>387</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-06-21T10:45:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/reactjs/react-component</loc><lastmod>2023-02-21T21:17:05+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/708871041-7b0f76924f4b24b45bc89fa5d758b3e1879e05dde36f163a362c3f308a1fb45b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[React Components]]></video:title><video:description><![CDATA[It works like this: we create React *element* objects and ask React to render them. But, React has *another* important object: a Component. Ooooooooo. It looks like this: create a class called...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/276361591/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7bcebf2609c804915534452ea549d855ccce855945e5226166dee671bf6007a3</video:content_loc><video:duration>530</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-06-22T10:15:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/reactjs/props</loc><lastmod>2023-02-21T21:17:05+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/709397142-842e8fb5bed63c4b8cab0d10a0f94c81181d3352358a8b4d1c85aa30a3572cec-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Props]]></video:title><video:description><![CDATA[So far, the component is 100% static. What I mean is, there are *no* variables at all. No matter what, each time we render `RepLogApp`, we will get the *exact* same result. I said earlier that a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/276791008/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=12a3170470026b8a345489454ab3f29c2db57db8ef78ec46d6bd620515dc9bc2</video:content_loc><video:duration>400</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2018-06-25T10:20:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/javascript-webpack/require</loc><lastmod>2023-02-21T21:17:03+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/647525344-5c6dc9fb2b236f796242808f18167b26da24ffc071a86cd0d881d61212cb0890-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Power of require]]></video:title><video:description><![CDATA[Yo friends! I am *ecstatic* about this tutorial on Webpack... because *we've* packed a *ton* of great stuff into it. But it's more than that! Webpack is going to *change* the way you develop...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/227667586/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2e73fc529e4c4aa09ea07c7daed16f3fb91369c6b7675c0d9fee3d00975ce0c7</video:content_loc><video:duration>540</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-07-31T10:35:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/javascript-webpack/first-webpack</loc><lastmod>2023-02-21T21:17:03+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/760639797-b2d2ecb80640c291aae9085b5ce3651d22d8a305b926a0149eb9f261aeb1e13a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Your First Webpack]]></video:title><video:description><![CDATA[Since the `require()` key doesn't work in a browser: [[[ code('87f43fcf2c') ]]] We're going to use Webpack to... pack it all together! Let's jump straight in to see how it works! ## Installing...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/318272378/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8b5711a2c929479029b263e941c82c9b028533584f7682e5af014833a68b2c58</video:content_loc><video:duration>245</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-08-01T10:35:01+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/javascript-webpack/webpack-config</loc><lastmod>2023-02-21T21:17:03+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/760642623-2e958333cef222f6d363bf9cf2b6054bbb4cafa934a01d13ac1b4c9b2087a01c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[webpack.config.js]]></video:title><video:description><![CDATA[Since we programmers are *famously* lazy, we don't usually run Webpack with all these cumbersome command-line options. Nope, we put them into a configuration file. At the root of your project, create...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/318274634/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ea5c25abfb1ba06c34eab34fff2408fbe3c7b02438be94d6a087eb11bbff0858</video:content_loc><video:duration>341</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-08-02T10:50:02+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/javascript-es6/ecmascript-es6-harmony</loc><lastmod>2023-02-21T21:17:03+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/621315030-8f321aea474d3b5ddc7eac3bf988923b876de24d2d40ca0558d8bfb4b3b2732f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[ECMAScript 2015 / ES6 / Harmony / Cookies]]></video:title><video:description><![CDATA[Welcome back! Oh man am I super excited about this tutorial. In the first episode, we dug deep into JavaScript: its great features, its weird features, and ultimately, enough good stuff to start...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/206326001/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0967ddfbfebd9520f381f2f1ca328537668591a67623ae72c1b412dffc41db3c</video:content_loc><video:duration>341</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-03-02T14:00:58+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/javascript-es6/arrow-functions</loc><lastmod>2023-02-21T21:17:03+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/621316040-da518638b62541e646b902aa5390c174ce4657046077ad3bf5d3f8b4c2a9c5fc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Arrow Functions]]></video:title><video:description><![CDATA[You will see the *first* big feature or ES2015 used *everywhere*... and at first, it looks *weird*. Very simply, there is a new, shorter syntax for creating anonymous functions. For example, in our...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/206326765/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=be1699b482dc4b0f5172c1322f2a446c7c60cdf55ea963680f790206e386ea31</video:content_loc><video:duration>458</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-03-02T14:02:47+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/collections/clean-url-slugs</loc><lastmod>2023-02-21T21:17:02+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/601385854-6709eb4688a9cba10d57c2bcb856ffab01af0ba1c4503c2914636de4d67070b2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Give me Clean URL Strings (slugs!)]]></video:title><video:description><![CDATA[Yes! Collections! Ladies and gentleman, this course is going to take us somewhere special: to the center of *two* topics that each, single-handedly, have the power to make you hate Doctrine and hate...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/190653124/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f910cab390abf4fa6ac1ea74e5c4ec5e78e1664d14e3de0c39af59ada42ec11d</video:content_loc><video:duration>339</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/collections/doctrine-extensions-sluggable</loc><lastmod>2023-02-21T21:17:02+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/755844602-2b66431bdcb67fdc1c0ad20e0b6eb1073961dd08d2693c4c6d3d428240dfed10-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[DoctrineExtensions: Sluggable]]></video:title><video:description><![CDATA[Since `slug` is just a *normal* field, we *could* open our fixtures file and add the slug manually here to set it: [[[ code('2189a51273') ]]] LAME! There's a cooler way: what if it were automagically...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/314318085/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d7e643547fceab85024e9953f40a445dff16c2ff73aa227741105b1e93588af8</video:content_loc><video:duration>299</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/collections/refactoring-carefully</loc><lastmod>2023-02-21T21:17:02+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/601370212-e206daf3ce848c50392f9890c6f9956dc44b9155bb376f01b4418d3327b56ce5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Refactoring Carefully]]></video:title><video:description><![CDATA[Time to refactor our code to use the *slug* in the URLs. I'll close up a few files and then open `GenusController`. The "show" page we just saw in our browser comes from `showAction()`. And yep, it...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/190641813/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d41c3cee5c0589e08cbd01a3b9aa212e49637192f1ef897e2b7f181f71828e2d</video:content_loc><video:duration>221</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/collections/many-to-many-setup</loc><lastmod>2023-02-21T21:17:02+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/601379126-b39e14738a69671b3a7f0960306f4652990b436ab621b5e5abe94960602f4056-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[ManyToMany Relationship]]></video:title><video:description><![CDATA[Let's talk about the famous, ManyToMany relationship. We already have a `Genus` entity and also a `User` entity. Before this tutorial, I updated the fixtures file. It still loads genuses, but it now...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/190648181/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d2fcdea603bea90d73b0991f8fde0a704b740e7db0c5c3f99907f4ef5fcd39d3</video:content_loc><video:duration>318</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/collections/insert-many-to-many</loc><lastmod>2023-02-21T21:17:02+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/601386351-25bcf3b1b36aa599d64b42cae2859a6ef77af4c048d0187c6b16c33f4321ffa1-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Inserting into a ManyToMany]]></video:title><video:description><![CDATA[The *big* question is: who is the best superhero of all time? Um, I mean, how can we *insert* things into this join table? How can we join a `Genus` and a `User` together? Doctrine makes this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/190653483/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7e69bb40c9038ff0edc6f72f8ab460af575386369642d62e592daa0bdae5e40b</video:content_loc><video:duration>327</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stripe-level2/creating-plans</loc><lastmod>2023-02-21T21:17:01+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/623847864-44b57aea135fb35dc346d28a3c6b3fdd56fbcc19c986bef6c6aa91f0f2e9de1f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Create those Subscription Plans]]></video:title><video:description><![CDATA[Yes! You're back! You survived [Stripe part 1][stripe_charging]. Ok... that's cool, but now we have bigger fish to fry. So fasten your seat belts, put on a pot of coffee, and get ready to sharpen...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/208513675/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8b72709d5903ca22a88339065b29b2bac38509611090690f26709c612bc12913</video:content_loc><video:duration>250</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stripe-level2/add-plan-to-cart</loc><lastmod>2023-02-21T21:17:01+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/588926936-570b25367945b7e0151f3c481e9bf57f85e160131bc04cb464406b122d63e90e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Add the Subscription to your Cart]]></video:title><video:description><![CDATA[We can already add products to our cart... but a user should *also* be able to click these fancy buttons and add a subscription to their cart. Open up `OrderController`: the home for the checkout and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/180643039/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=df732fdd4e8fb7b945512d9cde18b225e5867f950f4a94731d2fd266be7f5aff</video:content_loc><video:duration>295</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stripe-level2/make-the-subscription</loc><lastmod>2023-02-21T21:17:01+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/588929345-ec77b9e4e361c16c7145b0df9a43883601ab3c668f556892aff362c9665178d0-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating the Subscription in Stripe]]></video:title><video:description><![CDATA[Open up the Stripe docs and go down the page until you find subscriptions. There's a nice little "Getting Started" section but the detailed guide is the place to go if you've got serious questions....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/180644777/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a63d993a3fed5b247bafd00af04956ec138a394e38bce3512a946aa0d59f44dd</video:content_loc><video:duration>398</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stripe-level2/user-has-subscription</loc><lastmod>2023-02-21T21:17:01+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/588932590-62b7b54f55f1fd8578ef7daae06269ecbd83a5920ef13836fb434bb225e7f8fe-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Give the User a Subscription (in our Database)]]></video:title><video:description><![CDATA[Congrats on creating the subscription in Stripe! But now, the real work starts. Sure, Stripe knows everything about the Customer and the Subscription. But there are always going to be a few things...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/180647158/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3fad25d155486cd6a17222be75293e6635b924bbc4648b28b1efbacee4508979</video:content_loc><video:duration>521</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/ansible/ansible-intro</loc><lastmod>2023-02-21T21:17:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/627307546-1421113d356eb4b441f9b8e960faee14a13a27c8bafc88da8e76b0dabdf07ca4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hello Ansible!]]></video:title><video:description><![CDATA[Welcome automation lovers!!! You've come to the right place, because this tutorial is all about Ansible! And boy, it's just a *lot* of fun. Imagine if we could take control of an army of tiny, but...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/211313193/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6c6dc123e5d3d2dda76aef2869599874a13162e3142b8320b59227981756dce1</video:content_loc><video:duration>353</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-04-04T11:55:10+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/ansible/ansible-modules</loc><lastmod>2023-02-21T21:17:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/627310488-52d28756b1b9011ffab9944929d5888ef005aeb3b7191b7b80aef2288df81186-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Modules]]></video:title><video:description><![CDATA[We need to talk about 2 important words in Ansible: modules and hosts. Ansible comes built with a *ton* of things called *modules*: small programs that do some work on the server. Most of the time,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/211315529/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0ffcc718eb0870c35cee8e3769a13586c15fb4f35d1bbf0f1048cc786314082a</video:content_loc><video:duration>394</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-04-05T11:55:09+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/ansible/hosts-inventory</loc><lastmod>2023-02-21T21:17:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/627306926-7af879cbf5089b89eafdcca4ade665dedc9df2bc43c991a57c68ce866e1db98f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hosts & the Inventory File]]></video:title><video:description><![CDATA[When we run `ansible`, we see a few warnings on top: > Host file not found with a path to a host file somewhere on your system. Then it says: > provided hosts list is empty, only localhost is...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/211312768/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ff06d27971ce22085e6b0444a08384ae96e73886eed9f6cacf8e9b4f9533ea3a</video:content_loc><video:duration>285</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-04-06T11:55:08+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/ansible/vagrant-ansible</loc><lastmod>2023-02-21T21:17:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/815469720-059a60a56dad98c6b88cd85631082f498d5833b3d95c1287cf6e84e104f452eb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Vagrant <3's Ansible]]></video:title><video:description><![CDATA[Our first big goal is to see if we can use Ansible to setup, or provision, an entire server that can run our MooTube app. To setup an empty VM, we'll use Vagrant with VirtualBox. So before we start,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/361109796/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=602001d7c65c8d872379ed6a63d1534a54720007e457e4cb523935bf3b0a5f9e</video:content_loc><video:duration>390</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2017-04-10T14:17:22+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stripe/stripe-dashboard</loc><lastmod>2023-02-21T21:17:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/623846017-7992ff24be42bf461729d3ff221affff69c7410fab469f93bdf08ca58cbc655f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Your Stripe Dashboard]]></video:title><video:description><![CDATA[So you want to handle payment on the web? You *brave*, foolish soul :). Nah, it's fine - these days, handling credit card payments is a *blast*. Especially with Stripe - an awesome service we've used...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/208512234/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=00c115abc154f291e95bd624136c5206940e8aa53f97ac8a01813580779d7575</video:content_loc><video:duration>215</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stripe/checkout-form</loc><lastmod>2023-02-21T21:17:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/623844619-7d63eb2fc67e72dde70013a15880df1263e7de2aac810543bf614ddf57af7ea8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Embedded Checkout Form]]></video:title><video:description><![CDATA[Click on the documentation link at the top, and then click [Embedded Form][1]. There are two ways to build a checkout-form: the easy & lazy way - via an *embedded form* that Stripe builds for you -...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/208511096/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6aa5a0ee34cd5a0766a7fdc321f52e221b812415b1c9df63f981554e5969a63b</video:content_loc><video:duration>395</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stripe/charge-it</loc><lastmod>2023-02-21T21:17:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/586883072-880b52b7a484a29a90e57b103000604743aeb696131f2f34b25bdef064d82d43-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Charge It (The Stripe PHP SDK)]]></video:title><video:description><![CDATA[Stripe has a nice, RESTful API, and you're going to spend a lot of time talking with it. Google for "Stripe API docs" to find this amazing page. You can set this as your new homepage: it describes...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/179076463/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=37e3dbdfec5bd444a320654adedc340929951681526fc72e01ac6f7e1da930d6</video:content_loc><video:duration>265</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/stripe/hide-private-keys</loc><lastmod>2023-02-21T21:17:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/585560211-c6c266bb31cc92e359d6de4a35e0d10257a64ab5ba91866987acac38674f0b39-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hide Those Private Keys]]></video:title><video:description><![CDATA[We already know that our Stripe account has *two* environments, and each has its *own* two keys. This means that when we deploy, we'll need to update our code to use these *Live* keys, instead of the...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/178037613/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0277b4eb8b627d5daa59ec876b20d266b6636dacdbdffabfe24a9e61e6970ca1</video:content_loc><video:duration>165</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-form-theming/render-functions-reference</loc><lastmod>2023-02-21T21:16:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/596312105-ce8d3085f3638b5a117814a33758273754064a3a0a9f82b1f053ca4b35d68dc4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Form Parts & Functions Reference]]></video:title><video:description><![CDATA[Yo peeps! It's time to jump into a topic that's actually, super fun! Yep, we're going to learn to *bend* Symfony forms to our will: controlling *exactly* how they render... and believe me, by the end...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/186309990/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d4053166d7726005d5f1f0d6289c1d14f6d89eec1f3c62bf5154c61b0ad03615</video:content_loc><video:duration>190</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-form-theming/form-rendering-functions</loc><lastmod>2023-02-21T21:16:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/596314220-8f179c4cf6fb05b03cc21861fe8603695f82911b7b6b067c9af38af6a65ed15c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Form Rendering Functions]]></video:title><video:description><![CDATA[I want to render this form, but be as *lazy* as humanly possible. ## The Lazy Way: form() Copy the existing code - we'll put it back in a second. Then, use our first form rendering function: `form()`...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/186311658/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7b12f0a986ca1557ba436042baf96a28270c39ccc08e5a9dd832d1d3d5046f4e</video:content_loc><video:duration>296</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-form-theming/i-heart-form-variables</loc><lastmod>2023-02-21T21:16:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/596315491-c5581e08c3e1dc96512c2b7f644f00aa2a345073229d4366f143e96d43671136-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Form Variables are the Bomb]]></video:title><video:description><![CDATA[My favorite form rendering function is `form_row()` - pass the field as the first argument and... um... something weird called *variables* as the second argument. What are these variables? ##...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/186312597/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6d4729be0163460b64d66b717e95fdd285a37f785975f09ff38647a267c5089f</video:content_loc><video:duration>345</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/oo-ep4/class-constants</loc><lastmod>2023-02-21T21:16:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/582459005-7d82031e54c7fa7a85182512ebc85f37adc102bc032ba0831242b760f5f9159e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Wonder of Class Constants]]></video:title><video:description><![CDATA[Hey friends! I'm so glad you're here for part *4* of "Baking Delicious Chocolate Chip Cookies". Wait, they're telling me that's not right. Oh, ok, I'm so glad you're here for part *4* of our Object...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/175372075/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=24f4bcd8f26b975e71de35f91ab3428c0975d3237fb25ff8079119d9129ef11a</video:content_loc><video:duration>549</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/oo-ep4/static-vs-non-static-and-self</loc><lastmod>2023-11-01T14:39:18+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/582316259-ee9d993c77c64534591866e42960944f9e24e705203ad93ea8be5690463272fb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Static Methods]]></video:title><video:description><![CDATA[A really important thing just happened: for the first time *ever*, we referred to something on our class by using its *class name*. To use the constant, we said `BattleManager::TYPE_NO_JEDI`: [[[...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/175248058/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=00ddee28c1ff4f94db39d8e6ec945fce61020af440a0e4003e937d82f8d7e38a</video:content_loc><video:duration>252</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/oo-ep4/static-methods</loc><lastmod>2023-11-01T14:37:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/582317404-a4524f44d7bd273ba446dfc2e0d49a2434405d451c5ac3c054da64fa241acf83-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Static or Non-Static Methods?]]></video:title><video:description><![CDATA[In `index.php`, the three battle types are hard coded right in the HTML: [[[ code('6a31916a60') ]]] So what happens if we decide to add a *fourth* battle type to `BattleManager`. No problem: add a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/175248837/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=bf1c9d04e22c4165b2a0b6567f076d81d79f70029d8286861c45a107d8671366</video:content_loc><video:duration>265</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-doctrine-relations/create-genus-note</loc><lastmod>2023-02-21T21:16:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/562080800-f502d6598d43f8b1c3147c7d5749e4478cc8d413b042420ceaecdf1715977145-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Create Genus Note]]></video:title><video:description><![CDATA[It's you again! Welcome back friend! In this tutorial, we're diving back into Doctrine: this time to master database relations. And to have fun of course - databases are *super* fun. Like usual, you...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/160163498/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a58fa9803de6993c417cc068c1d1053cef6ee95367e1c4cb461b84dfce173c61</video:content_loc><video:duration>316</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-doctrine-relations/many-to-one-relation</loc><lastmod>2023-02-21T21:16:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/562072561-64460caa6781af173feab18f6526196f9fcdbeae09ef8a75cc108312bc814f47-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The King of Relations: ManyToOne]]></video:title><video:description><![CDATA[## Selecting between ManyToOne and ManyToMany Each `genus` will have *many* `genus_notes`. But, each `genus_note` that someone adds will relate to only *one* `genus`. There are only *two* possible...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/160156613/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=fb769919e8f9448b2fb46dba4b60694b4f1e256fb1b4be723aad7ce0801c1253</video:content_loc><video:duration>147</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-fundamentals/install-bundles</loc><lastmod>2023-02-21T21:16:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/557823702-10e9d6333527591c494002c1ecb2fecb35145ef43b3505f2e360e869ddce4605-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bundles]]></video:title><video:description><![CDATA[Woh! You're back! Hey friend! Ok, I'm glad you're here: this is a *big* episode for us. We're about to learn some of the most critical concepts that will *really* help you to master Symfony... and of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/156728459/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=275fe406c5f7028a3dfb016eccf7703bb0d6ce631514017f5ef53f84ccf42fc5</video:content_loc><video:duration>295</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-fundamentals/using-services</loc><lastmod>2023-02-21T21:16:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/557824038-71c5636ddbaa43ed96f1bfe22422069effc94d92e4aaa8f3205ec65c79a47bc2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Using a Service]]></video:title><video:description><![CDATA[Ok! Let's see if we can use this new service. First, some setup: in the template, remove the fun fact text and move it into `GenusController` by creating a new `$funFact` variable: [[[...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/156728666/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3988d99a47fbc0cf5ca8c32b70c5cf31c4e66f97fde6d6ad8852c180bdf43503</video:content_loc><video:duration>184</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-security/user-class</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/578311551-b4850ba1edc952480db2e3c04f2afcf4a82b2c89346b5377a35cc241effe771e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The All-Important User Class]]></video:title><video:description><![CDATA[Yo guys! You finally made it to the security course: you brave, brave souls. Whatever, these days, security isn't scary - it's super fun! You've got traditional login forms, Facebook authentication,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/172481222/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7e51c888e9557c9dad227eb28720fdefc7002f2c7c5a860e39c00e7af0c99ab5</video:content_loc><video:duration>262</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-security/user-interface-methods</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/578313139-8e0e4d66feffc2edf6da6a48d99ccd0e99586ad347f70393bddf76c023f8c1bc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The UserInterface Methods (Keep some Blank!)]]></video:title><video:description><![CDATA[Our job: fill in the *5* methods from `UserInterface`. But check this out - I'm going rogue - I'm only going to implement *2* of them: `getUsername()` and `getRoles()`. ## getUsername() First...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/172482158/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=53fc3c90a3d7638c54431eadb1b99a4cc3329c436cca382d61fdf3bf33313668</video:content_loc><video:duration>259</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-security/rendering-login-form</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/578318686-3f01133ecc930faa2e85e7252eef4beee521dc6c0f7379d43612e6a33e1ba024-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Rendering that Login Form]]></video:title><video:description><![CDATA[Time to build a login form. And guess what? This page is *no* different than every other page: we'll create a route, a controller and render a template. For organization, create a new class called...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/172485553/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4ad97618bec3e92ba5debe8d3180c21c169368795934f3849450ee1984973a58</video:content_loc><video:duration>392</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-forms/the-form-type-class</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/573249550-5c24360a6321129d39ecd8263f63b5205171467122ddf31c85718f55b5481ae3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Form Type Class]]></video:title><video:description><![CDATA[Hey guys! You're back! Awesome! Because this tutorial is all about *forms*: the good, the bad, and the ugly. ## Quit Hatin' on the Forms The truth is: the form component is super controversial: some...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/168703880/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0553c9506ea8040e40187867b89ef2b38f37b9e99a289d344df8cb6f7d25c521</video:content_loc><video:duration>194</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-forms/render-form-bootstrap</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/573250743-618daff7dade45a66c0515df1664f8640a2ca975b20f6e90b8f4dd6f53a7ee9f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Render that Form Pretty (Bootstrap)]]></video:title><video:description><![CDATA[Head into the `GenusAdminController`. I gave us a *tiny* head start - there's already a `newAction()`: [[[ code('076835d9b5') ]]] In the admin area, the "Add" button points here. Click it! > The...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/168704822/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7741fa2fe0b792d715cc34043fe96382af6ad4ee0b559f6d502361b80b6fc588</video:content_loc><video:duration>254</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-forms/process-that-form</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/573250068-cfa9b00cce6725a54253a96038fd83189ceb91f44f2a413f419240691eab79df-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Process that Form!]]></video:title><video:description><![CDATA[Inspect the HTML and check out the `` element. Notice: this does *not* have an `action` attribute. This means that the form will submit right back to the same route and controller that renders it....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/168704292/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=79b5add1c9ac9d8bfd0a8eb32102a82c05c416b39e674f19bfc6f6a37001f2ec</video:content_loc><video:duration>166</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-services/services-save-the-world</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/564822822-268be69fcfefbe1049b58ed6132a194a143b7e808c97f4c02e3d863249939c0d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Create Service]]></video:title><video:description><![CDATA[Hey, hey, friends! Back for more!? You should be feeling *pretty* good about yourself already - but you're about to feel like a kid in a very nerdy, borderline embarrassing candy store. In this...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/162382807/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=9e4de65d6daa379847eebc0be58f57a2ba853342e77d1bb4421595188127e1b4</video:content_loc><video:duration>226</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-services/create-service-class</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/564825007-f117beaeba8a97eaff7e601af5ef5fd1fc9956c6279268bf55cd8c930c0bf465-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating a Service Class]]></video:title><video:description><![CDATA[Ready to move a chunk of code *out* of the controller? Well good for you. Step 1: create a new PHP class. In `AppBundle`, I'll create a new directory called `Service` - but that could be called...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/162384766/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0eaa0c05a5bd67e27b92debe20fef753c2610403974a17ec06847cd8214f5752</video:content_loc><video:duration>191</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-services/the-dreaded-dependency-injection</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/564831278-d6e0c8101d0554c8042230dbe899fcb274a681e28aae92d7c066182e4d8114f3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Dreaded Dependency Injection]]></video:title><video:description><![CDATA[The `MarkdownTransformer` will do two things: parse markdown and eventually cache it. Let's start with the first. Open up `GenusController` and copy the code that originally parsed the text through...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/162390196/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=caa6726e19a2694c79edc8d13d82901ae659a3e38b3467202565f2d91ff671e3</video:content_loc><video:duration>227</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-doctrine/entity-class</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/560020187-77fa4fdeb2155cd9d7648d39f33321e627caad38a99748d9a1722447f3195e90-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating an Entity Class]]></video:title><video:description><![CDATA[Yo guys! Time to level-up our project in a *big* way. I mean, *big*. This series is *all* about an incredible library called Dog-trine. Wait, that's not right - it's *Doctrine*. But anyways, Doctrine...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/158504468/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0cee9718771c2f99998eb8f394b00a563f5369065bb6df5b4ae212df310b3c88</video:content_loc><video:duration>329</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-doctrine/db-config</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/560021169-6f8c725ec7fff557fa40b3640822fc7d0877e53dc24694ab2d741353376caeac-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Database Config and Automatic Table Creation]]></video:title><video:description><![CDATA[We *described* the `genus` table to Doctrine via annotations, but this table doesn't exist yet. No worries - Doctrine can create it for us! And actually, we don't even have a database yet. Doctrine...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/158505230/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1898f14acb0040ac7f89b397854d0f880719962f746a4bbd926e00e842d4704e</video:content_loc><video:duration>125</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-doctrine/insert-object</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/560069005-b9d0768260f1ccfe9bcf4cf33b6a6a12a7b146aac26f4b8d70ff941d4c3e901e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Inserting new Objects]]></video:title><video:description><![CDATA[Fearless aquanauts are constantly discovering and re-classifying deep-sea animals. If a new genus needed to be added to the system, what would that look like? Well, we would probably have a URL like...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/158542711/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c2b4fe7daec12b2a6658ef334befbe47e4af969afcb01681168cdaff882a979e</video:content_loc><video:duration>307</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/start-project</loc><lastmod>2023-02-21T21:16:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/549079407-dc96386b13bf4ecbf5ff523a4c4d1a816c714e2044cd272fccea93fc1a64d31b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Start Project]]></video:title><video:description><![CDATA[Well hey guys! You know what? I'm *pumped* that you're learning Symfony, because it's the hardest framework ever! Relax, I'm kidding. Symfony *does* have a reputation for being tough to learn, but...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/149777580/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6915f6741f26c129299394ba47de5b685c27d723170dddc058648d607ec507c2</video:content_loc><video:duration>216</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/phpstorm-git</loc><lastmod>2023-02-21T21:16:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/575193929-e19b52ee67b582a29faeadcf594ee3e95941d25665020ce9d1ff97fbc5e6ea04-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Setup! PhpStorm + git]]></video:title><video:description><![CDATA[I've already opened the project in PhpStorm. It is by *far* the best editor for working with Symfony. And I'm not even getting paid to say this! Though, if there are any PhpStorm employees watching,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/170221378/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b311bca43f93a1753b862b8cfabcf0d3e5c6477e55560169cae1d266c0fe9ac2</video:content_loc><video:duration>125</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/first-page</loc><lastmod>2023-02-21T21:16:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/549085837-63eb68ca1ac00b4d5107fa9f9d9d639ab633eea1b66450ab05be0c0d821cfdff-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[First Page]]></video:title><video:description><![CDATA[## Code goes in src/ and app/ You may have noticed that *most* of the committed files were in `app/` and `src/`. That's on purpose: these are the *only* two directories you need to worry about....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/149782509/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7eb2bb091a50f84474e5bb084cddfa429c10a57611075dada1d30ad5506915c5</video:content_loc><video:duration>255</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/routing-wildcards</loc><lastmod>2023-02-21T21:16:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/549223445-c267847a2a9fb357048eb4d0ff810fbac5a45bbc0e47085e18342a3df0a1a94c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Routing Wildcards]]></video:title><video:description><![CDATA[This page has a boring, hardcoded URL. What our aquanauts deserve is a dynamic route that can handle the URL for any genus - like `/genus/octopus` or `/genus/hippocampus` which is the genus that sea...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/149889890/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=661446fde1cf22d43128f4e4a4fde7ca6f9ba639f3cc70ce03a9ec8557ee6ea8</video:content_loc><video:duration>227</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/services-useful-objects</loc><lastmod>2023-02-21T21:16:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/549707583-2af98530a5e9be2caa996bcac9b088acaff2ae54504e4dae65b4c7b0a1ceb809-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Intro to Services]]></video:title><video:description><![CDATA[Ok! The first half of Symfony: route-controller-response is in the books! The second half is all about useful objects. Obviously, returning a string response like this is not going to take us very...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/150274646/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a3f0121427e0756c609b93e8033d535b7fbc180845390527ea1ae1ed1b92012a</video:content_loc><video:duration>260</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/listing-services</loc><lastmod>2023-02-21T21:16:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/549708097-10e91aeb63e992de9c3292138bad682276ba11df5df081e3fe6d3f8e743082ba-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Listing and Using Services]]></video:title><video:description><![CDATA[Rendering a template is pretty common, so there's a shortcut when you're in a controller. Replace all of this code with a simple `return $this->render`: [[[ code('6ad09ec8e1') ]]] That's it. Make...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/150275061/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=65dde9a1bdf47749c13c312f242e12f3dca9e43bd0f3d93e08fb26b47c921abf</video:content_loc><video:duration>165</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/hello-twig</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/549710409-fa777fbcaf255edf9fadf41e62bca6ebab2a4570eac52ac32f9ccd7f8a1da476-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig: For a Good time with Templates]]></video:title><video:description><![CDATA[Unless you're building a pure API, Twig is your new best friend. Rarely do you find a library that's this much fun to use. It's also really easy, so let me just give you a quick intro. ## {{...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/150277110/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ef8db9369f77e03c229ebd7b5bedef930c204d374950ebce21ad652b83973169</video:content_loc><video:duration>205</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/twig-layouts</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/549710783-b971972ce14106933f7f9467deba21cf87ee211c6aafe5846ac5013f068a2218-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig Layouts (Template Inheritance)]]></video:title><video:description><![CDATA[To get a layout, add a new do something tag at the top of `show.html.twig`: `extends 'base.html.twig'`: [[[ code('c6481ac0e5') ]]] This says that we want `base.html.twig` to be our base template. But...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/150277487/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6c6cc4e6b41b7982ea771dc21e2df18f6bb126e5256d2e86ff85fbcc997eed12</video:content_loc><video:duration>197</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/layout-assets</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/575198832-04555fd53913abf5d4ce0d3705216eba84033a9a34508a86e7d2d1afd80a5dc7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Loading CSS & JS Assets]]></video:title><video:description><![CDATA[We have an HTML layout, yay! Good for us! But... it's *super* boring... and that's just no fun. Besides, I want to talk about assets! If you download the code for this project, in the `start/`...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/170224840/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5f2e6caae509aa24434e04aefbebf22817ecbde4d46919b381a4b84b336845e3</video:content_loc><video:duration>287</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/json-api</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/550520953-a906afb5c486e0551123af3b456fc1d67a3abb72edd8070430f20134bdf51574-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[JSON Responses + Route Generation]]></video:title><video:description><![CDATA[Okay, this is cool... but what about APIs and JavaScript frontends and all that new fancy stuff? How does Symfony stand up to that? Actually, it stands up *wonderfully*: Symfony is a first-class tool...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/150915380/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3b01cd70b2fa251ec1873d8c8a6a04dd77e58a1e43de8ebe6cac03b643410b9c</video:content_loc><video:duration>244</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/url-generation</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/550520988-fe5b33dc32416112b10f56e55f6ab7813e63569c846a15c6fffe068fd73fb739-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Generating URLs]]></video:title><video:description><![CDATA[We now have *two* pages: the HTML `/genus/{genusName}` page and the JSON endpoint. Ok ok, the JSON endpoint isn't really a *page*, at least not in the traditional sense. But pretend it is for a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/150915478/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4a0d8005e0bae984f6f83f4ebf9282a4724c76737a8abe5c286f3c99d34b2330</video:content_loc><video:duration>156</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3/reactjs-api</loc><lastmod>2023-02-21T21:16:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/550527773-79fcee3ae0dfacfdebb33b80cd38971e2c10e212df550a224eb063202a7eaed9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[ReactJS talks to your API]]></video:title><video:description><![CDATA[Remove the link. In `base.html.twig`, we already have a few JavaScript files that are included on every page. But now, I want to include some JavaScript on *just* this page - I don't need this stuff...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/150920349/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=af75bcca6bddeb183fec05399a7429abb21b3b915dec9d9ebf5697c07e62fcff</video:content_loc><video:duration>313</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony3-upgrade/upgrade-2.8</loc><lastmod>2023-02-21T21:16:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/546071500-cc3901d258177ec0ad795446de4cf8cd1ca05760d1677f3e8b2e18cae658f468-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[How to Upgrade to Symfony 2.8]]></video:title><video:description><![CDATA[**Confused by the First Paragraph? https://www.youtube.com/watch?v=K7zNY0I5JNI** The Symfony Demo: example app: a project barely alive... on Symfony 2.7. Ladies and gentlemen, we can rebuild it, we...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/147413926/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c6f816add65d8a2d49da98c7f0219bce4ae817e18a07afd750d43ce036e85f58</video:content_loc><video:duration>182</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/new-in-symfony3/new-dir-structure</loc><lastmod>2023-02-21T21:16:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/544393200-56505bf2e0cae98d74021960bace8314d7fffbe621389263a6ae02559854b17a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Shiny new Directory Structure]]></video:title><video:description><![CDATA[Well hey guys! Symfony 3 is around the corner, ah, or maybe even released if you're watching this later! Hello from the past! Anyways, it's time to talk about all the new cool shiny stuff. But first,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/146033664/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f5d2a3102fc327192ef18c3e0678ea1daf11213b91e812134701015e8eacd239</video:content_loc><video:duration>201</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/drupal8-under-the-hood/installation-web-server</loc><lastmod>2023-02-21T21:16:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/544256580-b627ddce2be12fae634a6b326f0ae11cd5c607caefaf5c7fc7f9852651904da2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Installation, Composer and Git!]]></video:title><video:description><![CDATA[Hello Drupal people! I'm Ryan, and I come from the magical world of Symfony, full of gumdrops, rainbows, interfaces, services, dependency injection and lollipops. Along with a few other oompa...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/145949214/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2b3af11c8193e35e574e1891ebd5b460f5a65214108bbc0cf83eabc6b6eb2ead</video:content_loc><video:duration>408</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/drupal8-under-the-hood/modules-routes-controllers</loc><lastmod>2023-02-21T21:16:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/544265165-40abee1e3453afbd09e94eafe2040279ae8cdbbe52d8cba566a9daac6b15f290-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Modules, Routes and Controllers]]></video:title><video:description><![CDATA[## Creating a Module Let's do something fun, like create a custom page. Like always, any custom code will live in a module. And modules live in the `modules/` directory. Create a new one called...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/145955300/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e53848fe78c92085091dfcbbe26b3baa7513606941114d822ba2dbbd83bed57c</video:content_loc><video:duration>384</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/behat/install</loc><lastmod>2023-04-12T10:47:24+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/623890766-b2db1412c1e2a7d9d10943a2f093da625ff45e2a1b02c9cf9302d305827df2f5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[From Install to JS Testing]]></video:title><video:description><![CDATA[Welcome to the magical world of Behat, my favorite library. No joke this thing is the best. Behat is about two things: ## BDD, Functional Testing and... Planning a Feature??? First, functionally...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/208541697/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=07fcac2e39e50a6f99938aae19a90f2da157129a6033f9127c58071bebb137c6</video:content_loc><video:duration>447</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/behat/bdd-features</loc><lastmod>2023-02-21T21:16:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/538943224-e4230df3fd8e21e1a307d9a003c285a36f5e0e07b2f517660d18dfd22df80c09-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[BDD Features]]></video:title><video:description><![CDATA[I'm sure you've heard of "Test Driven Development" where you write the tests first, and you code until those tests pass. That process is really cool! But we're talking about "Behavior Driven...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/141809968/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=36b08acfea7458480f9c38a29e0e2a6b5b800c9299d1c7c9f8d792a135a21607</video:content_loc><video:duration>356</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/oo-ep3/extends</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/537341261-7db1192e3b81c9f5bef38f270cb4d3ba8a086478a18539ccb3386b78c0ad8dd8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Extends]]></video:title><video:description><![CDATA[Welcome back for Episode 3 of our Object Oriented Series! We're ready to get serious about Inheritance. And not just from that rich uncle of yours. I'm talking about extending classes, abstract...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140701988/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=434d408e965ae0878a9d8247038e4df30e7e9c45d0e09de971012aff9e3395a5</video:content_loc><video:duration>283</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/oo-ep3/override</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/537333025-57188139a8e1bdb3f2f7a0482c9041900d991f3609d26dcd8a8f0ae0a093df02-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Override]]></video:title><video:description><![CDATA[Let's take out this dummy code and get to the real stuff. Our database is created via this `init_db` script which you can execute from the command line whenever the mood strikes to make sure that...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140703255/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=60bf913ce41d755173b32f8887773904198e30738abf4aa8ff06ab5ad0d72c12</video:content_loc><video:duration>282</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/micro-symfony/bootstrap</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536906824-a68e038b9b0cccc7ff696b1f4e2a2674a97adc3d339479003391b1e5b6dfba79-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bootstrapping Micro-Symfony]]></video:title><video:description><![CDATA[Inspiration strikes! You've just come up with a crazy awesome idea - the kind of idea that's sure to save the world and impress your friends all at once. Now all you need to do is start coding. Of...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140091212/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2d7396680d95e8b601dc5ac45a8bd9af556c8050271198eb201453de2c1d43dd</video:content_loc><video:duration>556</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpstorm/setup</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/906864716-f35c7bb79af8d960b52a821c3d1ddadee6b12f98ee255ef9494c5c0d5c9f7e61-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Setup]]></video:title><video:description><![CDATA[Hey guys! If you've watched even one video on KnpU - please tell me that you have - then you've seen me using PHPStorm. Now think about how much you use your editor. If you work 40 hours a week I bet...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/427766124/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8b9f06249eeacfbfa0dd2a83bcd62aa012dbced27b4e5ed0626f1850de1630f5</video:content_loc><video:duration>314</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpstorm/annotations</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1135535329-2e0f1bd153d048cb419b1326ec35bd04e0982de88221b5677c393701c84fe8a6-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Annotations]]></video:title><video:description><![CDATA[We've got a big project today, a site about movies. But only movies that have Samuel L. Jackson. ***TIP The "Controller" option when you create a new file is no longer available. However, you can use...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/548472266/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d3a34dda95947beaa5dc2eb80c4e016d9012a3a684dfea6d9de47b71ce108d02</video:content_loc><video:duration>167</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpstorm/twig</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536387506-844e477a72443a8b52a124a9edfa4783faed57988367474233af42bb6d2152bf-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig]]></video:title><video:description><![CDATA[The Symfony Plugin has all kinds of awesome setup for Twig integration. So let's render a template here, `movie/new.html.twig`: [[[ code('8526e13420') ]]] PHPStorm highlights this immediately because...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140094424/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=45865f2328ad39a1f1e97e31e4f2df63e014725c511b5713342e31e9429b0727</video:content_loc><video:duration>301</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpstorm/namespaces</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536906231-e67910c3117cec7521b45ea9ac4350769be89667f3ed2e910604ff9478df1fd0-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Namespaces]]></video:title><video:description><![CDATA[Since we have this new movie form, we're going to want to save the data to the database. To do this let's create a `Movie` entity. I'm not going to generate it, let's just do this by creating a good...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140094426/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8e189256c8c5a1d1eefb6de3a4525ea03ebc41995c176ec942e5896c9a97ba27</video:content_loc><video:duration>245</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpstorm/doctrine</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536906228-6bfcef5f1f8052974ce62b43842c44be328b608ed72c660496c7938087a4deff-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Doctrine]]></video:title><video:description><![CDATA[We have a `Movie` class, but its missing all of its annotations! Yikes! I *really* don't feel like typing all of that. Let me introduce you to another really important shortcut: generate. You can get...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140094417/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7c1e464f1f0cd8a4f32d81d1d9d17a6c44598ea989826cf10422edf8883eb145</video:content_loc><video:duration>300</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpstorm/forms</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/623911286-3b2d7cb5e5bfde6843656f377079f2172467179a7e817cced0cdd930496cd443-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Forms]]></video:title><video:description><![CDATA[***TIP This screencast shows the *old*, 2.7 and earlier form syntax. But, the code blocks below have been updated to show the new syntax! *** Now that we've got our entity let's create a form! Click...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/208561978/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=29393804a9710905e6438f0b07fa57796da12d0ea7ff1d41a0fc1263ae237fe7</video:content_loc><video:duration>305</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpstorm/live-templates</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536910554-6c95ec103d290fbb6f6650a8946d9f8891ee753ca7b792eaa480e8ebf5c7d5a4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Live Templates]]></video:title><video:description><![CDATA[Now that we have our form rendering, we want to be able to submit it! Crazy idea, I know but let's see what we can do. We'll use our standard code for this `$form->handleRequest($request);`. Now we...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140094419/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c8ce1ed1d7c4586221be2d7dcddebd668a9e6b9240b89ec291ea447f0a0e2794</video:content_loc><video:duration>321</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpstorm/fast-navigating</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536910631-890d4b9c7dd393125cbd2f2565a5ca1a953a9d7eee43eedb85daf9964db5a408-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Fast Navigating]]></video:title><video:description><![CDATA[I just hate seeing developers click manually into their directory tree to search for things. Most projects are too big to be opening files like this. Really, you want to have your hands off your...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140094421/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=049c6a1385a1cc3f43ab0fb5805bcb5742390ed4b35e0d4b4600d4851f8687f1</video:content_loc><video:duration>250</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpstorm/refactoring</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536276995-593be2448ac0594853686b7ddc248c43152ab39e867421fa9741c3bbad627f46-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Refactoring]]></video:title><video:description><![CDATA[Ok back to work, let's finish up this `MovieController`. `Command+O`, `MovieController`, and now we've got that file open. We need to save the POST'ed movie to the database. Start with getting our...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140094418/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=85eb404affab75d80d393438b20bac2e9dc81292a6f765f98f1b74ce5db7d1fb</video:content_loc><video:duration>416</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/phpstorm/service-shortcuts</loc><lastmod>2023-02-21T21:16:00+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/647889700-52ba0d1c8d4d27b7cc6408da72c7b5eb705d90db14d77437aefe0edd63559d80-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Services]]></video:title><video:description><![CDATA[Alright, remember this hardcoded quote? Let's create a new class that can replace this with a random Samuel L Jackson quote instead. In `AppBundle` I'll create a new directory called `Service`....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/227962961/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8f1c3743717b911f3439abaada20d4ddb68d5e3e4f23b111e4ca51044d117ecd</video:content_loc><video:duration>318</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/oo-ep2/service-classes</loc><lastmod>2023-02-21T21:15:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536384559-e66b6050fef9c2319329cb05cb129b45f800612b879be075384b462f215e4b60-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Service Classes]]></video:title><video:description><![CDATA[Well hey! Welcome back! It's time to put our new object-oriented skills into practice. We're working on the same out of this world project: it has ships, you choose them, then they engage in epic...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140093157/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ea2c53f4e35cfe648a46794d00f7e39557dd38e00bf7fc37a2239f2c9c099bf6</video:content_loc><video:duration>346</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/oo-ep2/army-of-services</loc><lastmod>2023-02-21T21:15:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536910074-7e33cc10cc404e37b75a987919907b0d02105e86a161fbfd3bdfaa8711b8eb8f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[An Army of Service Classes]]></video:title><video:description><![CDATA[Yay! We got rid of a flat function. Woh - not so fast: inside `battle()`, we're *calling* a flat function: `didJediDestroyShipUsingTheForce()`: [[[ code('261d176cc4') ]]] No bueno! ## Refactoring to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140093160/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=30cbfe6b401d0f630398402be149f340bcc858cf3161f407db3de7f9b635b9a9</video:content_loc><video:duration>253</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-rest5/battle-resource</loc><lastmod>2023-02-21T21:15:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/571361987-090940dc74f9eee6f192fc37af4dad9d0036538954568c34714280db30fafb6d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Battle Resource]]></video:title><video:description><![CDATA[Hey guys! Finally part 5 - and it's *special*! It's my chance to take on some buzzwords directly: like hypermedia & HATEOAS. Now, defining these terms is easy... but putting them into practice? For...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/167123939/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5998224407427ed06d5c6b8edf7d4310775f65fdb3d7cb6a054fa9359ec256b2</video:content_loc><video:duration>174</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-rest5/create-battle-test</loc><lastmod>2023-02-21T21:15:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/571371723-de44a027a003e953bbd7a5234c5981f5c2ba11071e64c53792ae43647b3f5b6a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Designing (Testing) the Create Battle Endpoint]]></video:title><video:description><![CDATA[In the controller test directory, create a new class: `BattleControllerTest`. Make it extend the fancy `ApiTestCase` we've been working on: [[[ code('e5f018d96d') ]]] Start with `public function...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/167131648/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6d5dda78b2c20dc8fbb9ff4841c798342789258db01fe637c6a8c6f346dac43c</video:content_loc><video:duration>236</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-rest5/saving-related-resources-via-form</loc><lastmod>2023-02-21T21:15:59+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/571377354-7501311b7a3dc5590c743e5d62bf97ad8ef5c3a86ab8cd184b5780ec3723631a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Saving Related Resources in a Form]]></video:title><video:description><![CDATA[In the `Controller/Api` directory, create a new `BattleController`. Make it extend the same `BaseController` as before: we've put a lot of shortcuts in this: [[[ code('ff68936a3e') ]]] Then, add...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/167136677/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=44ba6e282b9854cd4a7c3110aec765ecd8b82dd0065b2f7d5d5ae3191cd2bbc8</video:content_loc><video:duration>284</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-rest3/pagination-test</loc><lastmod>2023-02-21T21:15:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/552265294-5c8bc48e037011a60d0fd6dce0a5cbb9c10b5ede7b9b4a1ce9c104d17264b941-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Pagination Design and Test]]></video:title><video:description><![CDATA[***TIP In this course we're using Symfony 2, but starting in [episode 4][episode_4], we use Symfony 3. If you'd like to see the finished code for this tutorial in Symfony 3, [download the code from...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/152305257/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=5640beebb84eb52a4b5c103aee92ba549e7dd1cd9257d8a014291e598f7077a6</video:content_loc><video:duration>380</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-rest3/pagerfanta-pagination</loc><lastmod>2023-02-21T21:15:58+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/554217141-6a7f55403d73f6b5580739773342e1f82ccd8bcb06b45717a88878dcb4cec7eb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Pagerfanta Pagination]]></video:title><video:description><![CDATA[## Installing Pagerfanta To handle pagination, we're going to install the WhiteOctoberPagerfantaBundle. To install the bundle, run: ```bash composer require white-october/pagerfanta-bundle ```...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/153824766/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=47f231899cbf6b152eb5d3f7e86b9fcf9732342a878e0749a04b1595fcd98602</video:content_loc><video:duration>389</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-rest2/validation-errors-test</loc><lastmod>2023-02-21T21:15:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536910768-47761d768770f13d783646e2f14efdd6ee4eb9da91fe60feeee28fab814aef9a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Validation Errors Test]]></video:title><video:description><![CDATA[***TIP In this course we're using Symfony 2, but starting in [episode 4][episode_4], we use Symfony 3. If you'd like to see the finished code for this tutorial in Symfony 3, [download the code from...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140091830/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2193afd8407da9b86f26eb0fa90c158da15c204f2b7a6e83e95ea7fe9a1d5f4c</video:content_loc><video:duration>226</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-rest2/validation-errors-response</loc><lastmod>2023-02-21T21:15:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/679425360-ade6727140ff9f8d62f5fb8b03388f92265c8b9cc39d89878311194433ab4164-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Sending back Validation Errors]]></video:title><video:description><![CDATA[Time to add validation errors and get this test passing. First, add the validation. Open the `Programmer` class. There's no validation stuff here yet, so we need the `use` statement for it. I'll...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/252719717/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6b8cc646e645fc1afeafa865ece736e867dddaa0514fd9c3702792574463d5e0</video:content_loc><video:duration>313</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-rest2/put-validation-and-csrf</loc><lastmod>2023-02-21T21:15:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536272862-d5a0f89c178fa2d1f986a8e9c941270f5667f463041a8037265948678e223b47-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[PUT Validation and CSRF Tokens]]></video:title><video:description><![CDATA[Validation for `newAction()`, check! Now let's repeat for `updateAction`. And that's not much work - we just need to add the whole `if (!$form->isValid())` block. I know you hate duplication, so copy...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140091834/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4634590d2ae74b0aff2f64890253945065040a42d9082693510b900867bb93c2</video:content_loc><video:duration>176</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-journey-di/container-in-the-wild</loc><lastmod>2023-02-21T21:15:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536470744-52f5ca640ebb41deabf1a83365744b41c21d0bb8d323f4c120a7cccb25b81e3b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Creating a Container in the Wild]]></video:title><video:description><![CDATA[A whole mini-series on Symfony's Dependency Injection Container? Yes! Do you want to *really* understand how Symfony works - and also Drupal 8? Then you're in the right place. That's because Symfony...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140216510/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b8dbff955e2bb0a93548db471457a46c0bc5a5f7bf06e2a807de92c7951e579d</video:content_loc><video:duration>344</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-journey-di/definition</loc><lastmod>2023-02-21T21:15:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536470580-bc0017005b2a7de0508dcdb094aba073c30822c30facc9325516b2a10ba6bc79-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Definitions: Teach the Container]]></video:title><video:description><![CDATA[We've got two problems. First, our services are *always* created. What if we had a `mailer` service? You only need to mail something on a very small percentage of requests. With this setup, we'll...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140216512/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=1ef5ebcf0a77b144ad27ebbc651d30bb00268362ae57be9c72847be18113b253</video:content_loc><video:duration>254</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-journey-di/definition-unlocked</loc><lastmod>2023-02-21T21:15:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536628341-2db9fac0e98659030893f1098ca87e8aca1e011e6a960cf87df237c60c63767f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Definition Unlocked]]></video:title><video:description><![CDATA[This `Definition` object is massively important to Symfony's container, and in the framework, they're built behind-the-scenes all over the place. I'll show you how in a bit. Beyond using the class...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140216513/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8019a6765cd028a28e30f6942f7590a9c443bee2804c416108bd84f4385eaa3d</video:content_loc><video:duration>245</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-rest/post</loc><lastmod>2023-02-21T21:15:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/679417983-0602543b7e2d4728515ee1a85a92413b193b24d123656a79e0615267cc4c190a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[POST To Create]]></video:title><video:description><![CDATA[***TIP In this course we're using Symfony 2, but starting in [episode 4][episode_4], we use Symfony 3. If you'd like to see the finished code for this tutorial in Symfony 3, [download the code from...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/252713836/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ff042520252a601f34dfb1a9ef24a0bd367a80f84ed062468eb2384fc9977ffb</video:content_loc><video:duration>467</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-rest/post-json-body</loc><lastmod>2023-02-21T21:15:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536922043-fd4052c3377732496ae588532065da4b59c27726edb4f391a3ee7a5cfa37da33-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Finish POST with a Form]]></video:title><video:description><![CDATA[To create a programmer, our client needs to send up some data. And while you can send that data as JSON, XML, form-encoded or any insane format you dream up, you'll probably want your clients to send...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140193425/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=107f37c3a43852dca6b9ac1bdaec5e2f8d973eac732d937644bea62c44e50edc</video:content_loc><video:duration>282</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-rest/form-post</loc><lastmod>2023-02-21T21:15:57+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536921811-10a6a19886b86a78b5ec544cfa4852b602ea3cd9072ad9b38968141b71bcd117-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Handling data with a Form]]></video:title><video:description><![CDATA[So what's different between this API controller and one that handles an HTML form submit? Really, not much. The biggest difference is that an HTML form sends us POST parameters and an API sends us a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140193424/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f484989cf948430a7ebce0f8c92be77a5eee82c273d3db26fb257a3659f2fcac</video:content_loc><video:duration>303</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/gulp/first-gulp</loc><lastmod>2023-02-21T21:15:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/537353520-78de22a36173479b338fe309c8e25f6c65dc2c1db4544b9c3f218cae6b30e783-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Your First Gulp]]></video:title><video:description><![CDATA[Hey guys! Yes! In this tutorial, we get to play with Gulp! And that's got me excited for 3 reasons. First, it has an adorable name. Second, it's going to solve real problems - like processing SASS...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140716277/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3127bfe06bf9f79b4d0c62422b8e04b9c5d6a8e89df546937652b1082d11c1eb</video:content_loc><video:duration>271</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/gulp/sass</loc><lastmod>2023-02-21T21:15:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/537353567-da3faa2896822a0981ae0d66ac0358a1d8190743558be94385e4e7e8708185cd-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Sass to CSS]]></video:title><video:description><![CDATA[Dinosaurs! Actually, these are our test project, and it's written in Symfony. But everything we'll do translates to any PHP project. But this look bad - it's messed up. And that's totally my fault....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140716276/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7c42e9a3a0e953b3f6f07f87fc58bff303bd3b787b9d5bdf8a7441b529d68d19</video:content_loc><video:duration>286</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/gulp/sourcemaps</loc><lastmod>2023-02-21T21:15:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/537353183-32638360615c966932b7cdbc8200be289b083589925c15166e0aadc85104ce96-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Sourcemaps]]></video:title><video:description><![CDATA[Check out the source `style.scss` file. We're giving an element a fancy cursive font on lines 4 and 5. And that's what makes the `Dinosaurs` text look so awesome. But if we inspect that element, it...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140716278/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f86de1001f506b29943d644be79e319c079cdeaebddda961d95b4b7c16d7205c</video:content_loc><video:duration>166</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/doctrine-queries-legacy/dql</loc><lastmod>2023-02-21T21:15:56+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536630819-de0ecaef7b1b8b1d1d4000ffe0fc8d483bfbe3728cef0352cba20f871f7a2853-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Doctrine DQL]]></video:title><video:description><![CDATA[Look, I know you already understand how to do queries in SQL - maybe you dream of JOINs, orders and sub-queries. That's really dorky, but I get it. But when you look at Doctrine, it's totally...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140217450/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=932569f2350c9bd4f50a5cafb93c75f24c03bd9d6d36f628b6d2f48547601672</video:content_loc><video:duration>298</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/oo/the-project</loc><lastmod>2023-02-21T21:15:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536925504-fe9593042d33c9b8dcdef16c1b76b5e307c8d045188c46d11393ec9e68416ded-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Project]]></video:title><video:description><![CDATA[Welcome KnpU Peeps! I am *so* glad you're here today - I am *not* kidding - because we're intro'ing into one of my absolute favorite topics: object-oriented programming. This is what gets me up in...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140214288/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=72fcee3af35785f67f8de0f44be8eb38867b7ca36179b549028bfaa53e287fa7</video:content_loc><video:duration>224</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/oo/basic-class</loc><lastmod>2023-10-09T15:47:46+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536467502-9459f144c02ea92ee8820de6d282894bea549db2902074c2559ca0576a4eaf6a-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[A Class and an Object]]></video:title><video:description><![CDATA[Let's create a fresh file that we can play around with - call it `play.php`. Now we can warn the rebels that It's a TRAAAP! [[[ code('03f3146a85') ]]] Put `play.php` in the URL... and there it is!...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140214286/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7660afc41d5fa74ad8f55629919b3cd7ea60afd543fc79593972d3ff09b9673b</video:content_loc><video:duration>427</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-journey/event-subscriber</loc><lastmod>2023-02-21T21:15:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536564448-7852c0ee702cec2b4aabaae7790c03f25faac4c5eca752f362314216100525eb-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Interrupt Symfony with an Event Subscriber]]></video:title><video:description><![CDATA[Hey guys! Welcome to a series that we're calling: Journey to the Center of Symfony! In this first part, we'll be talking about the deep, dark core piece called the HttpKernel, a wondrous component...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140191188/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=41f572a8bd7e685bf514c3877f0c7ab35edc8d068c63eeaee2b34c795f4c75be</video:content_loc><video:duration>520</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-journey/httpkernel-handle</loc><lastmod>2023-02-21T21:15:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536435023-bcb5807e847763cf35ebf865465e9ec13e960719846a7fe030ccada4cc0beee5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[HttpKernel::handle() The Heart of Everything]]></video:title><video:description><![CDATA[HttpKernel::handle() The Heart of Everything¶ We know we start with the request, we have a routing layer, eventually something calls the controller, and the controller returns a Response. Let&#8217;s...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140191190/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b223206554e375cc7b91813b94a3545d68a6490bca09550c842bdc97671646c9</video:content_loc><video:duration>346</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/alice-fixtures/fixtures</loc><lastmod>2023-02-21T21:15:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536926358-40712bcdac558fa7acc849f649f31c54a7a6abf6ad8889b55a9ee78fdd5fb819-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Making Fixtures Awesome with Alice]]></video:title><video:description><![CDATA[***TIP A newer version of HauteLookAliceBundle has been released and portions of this tutorial won't apply to that new version. *** Fixtures, those nice little bits of data that you can put into your...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140213820/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7ad274aa78673ba87cf953d61711e37c8f0edb0afd55553fc93399977a00e3bb</video:content_loc><video:duration>743</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-voters/voters</loc><lastmod>2023-02-21T21:15:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536617842-f48a60fe2dd694a52cb129af932136ed483c498cc74183ddf220de1cdbf10c9d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Symfony Security Voters (free cookies!)]]></video:title><video:description><![CDATA[Symfony Security Voters (free cookies!)¶ See also Voters have been updated in Symfony 2.8! Check out our updated tutorial about them: The new Voter Class. Hey guys! It&#8217;s getting a little colder...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140213221/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=015e6b40685c357540634ef8c8b8a4c0f9965ec2373946d67c69f947ff1d99cc</video:content_loc><video:duration>868</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony-best-practices/route-annotation-templates</loc><lastmod>2023-02-21T21:15:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536926090-fe86b13b0b70a98f73073441178d8882626679b867da09879253063b7bd21b3c-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Symfony: Keep it Simple with @Route and Templates]]></video:title><video:description><![CDATA[Symfony: Keep it Simple with &#64;Route and Templates¶ Hey Symfony world. So you probably saw that Symfony released these best practices and I&#8217;ll admit I was partially responsible for these....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140212859/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=db10468bdfeb61b60acb59cb7fc29b43bb37c03d96f4f66c560d1690dd199e98</video:content_loc><video:duration>522</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/php-ep3/how-to-speak-database</loc><lastmod>2023-02-21T21:15:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/844394626-778e9069f7af15167eeba6cb14ebf345aa057b862979373213b4329233e42300-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[How to Speak Database]]></video:title><video:description><![CDATA[How to Speak Database¶ Hey there! Things are about to get crazy because it&#8217;s time to learn all about databases. We already have a data source that makes our application dynamic. It reads and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/383076505/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=ee7d38836470045aa827b561e73dd4a8f2573571d803c802d7add511faae3c58</video:content_loc><video:duration>260</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/php-ep3/queries-databases-tables</loc><lastmod>2023-10-19T14:37:29+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536906069-436e6565f8be506bee25f28f681fb2df8fe9e700bcbcb35280fc093b418cdb9b-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Queries, Databases and Tables: Oh My!]]></video:title><video:description><![CDATA[Queries, Databases and Tables: Oh My!¶ On this screen, we&#8217;re now talking directly to the MySQL database software that&#8217;s running on our computer. It&#8217;s kind of like talking to a dumb...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140088339/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=85c91c784fb1aeda5b0802690d3db9e984d1880e62cb041c1b149fd36ad08f59</video:content_loc><video:duration>297</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/rest-ep2/serializer</loc><lastmod>2023-02-21T21:15:54+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536905244-441dca755c0b6a429dbdea9e4de4652e9dee2747c41733c24faaee2f0a8ad556-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The Serializer: Swiss-Army Knife of APIs]]></video:title><video:description><![CDATA[The Serializer: Swiss-Army Knife of APIs¶ Hey guys! Welcome to episode 2 of our RESTFUL API&#8217;s in the real world series. In episode 1 we covered a lot of the basics. Phew! And explained really...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140085840/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=cb0710df614cc9fc0d2f8bf61848e45f0c14cc63cc813182a1696502fe5b65f2</video:content_loc><video:duration>478</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/rest-ep2/serializer-configuration</loc><lastmod>2023-02-21T21:15:54+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536371413-434582854de6ea0c127cb3ee0f33ea0003cc710777f94abdcec6d44d93388d5f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Serializer Configuration (SerializationContext)]]></video:title><video:description><![CDATA[Serializer Configuration (SerializationContext)¶ Time to tackle that test failure! You can see that there is one strange problem. The &#8220;GET one programmer&#8221; scenario says it&#8217;s...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140085835/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=03943d83e56b167d4f10b0e91c967393ff83b8bf1cb4570ca7cc84a49ebe592c</video:content_loc><video:duration>286</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/rest-ep2/serializer-annotations</loc><lastmod>2023-02-21T21:15:54+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536905986-38636d2f6e94d62d7d90837fffd819616c8ef5c7d4e0fd33f742537c89056950-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Serializer Annotations]]></video:title><video:description><![CDATA[Serializer Annotations¶ Alright, now let me show you one other powerful thing about the serializer. The control you have over your objects! By default, it serializes all of your properties. But...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140085836/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f41193161346c8d047077e364971f3814881ea99f5d2444507c6733a7d296073</video:content_loc><video:duration>179</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/php-ep2/request-new-page</loc><lastmod>2023-02-21T21:15:54+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536562141-68d7e8d966f1ac44193c4cee4d3000df4dad952480ffa2ff82268c2f5e425eb2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Request, New Page and - Hey, You Welcome Back!]]></video:title><video:description><![CDATA[Request, New Page and - Hey, You Welcome Back!¶ Hi there! I knew you&#8217;d be back! Learning to be a PHP programmer is a lot of work, but totally worth it. So, keep going: you&#8217;re getting more...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140189925/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c1d29fbd9458ba202f927f6e4d69f2f12a434da9e302c8da6dc46f1a8410d536</video:content_loc><video:duration>293</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/javascript/js-class-prefix</loc><lastmod>2023-02-21T21:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/611131984-f610a5e7c66855bd6db80e26edfbf7ba7791beca341b851e3cdc74a6fe1d7572-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Lift Stuff! The js- Prefix]]></video:title><video:description><![CDATA[Guys, get ready to pump up... on your JavaScript skills! No, no, I'm not talking about the basics. Look, I get it: you know how to write JavaScript, you're a ninja and a rock star all at once with...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/198210067/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a8b0635fbaed820edd120a4eac4cebe16cf539131151ac7d916793d4df73a7db</video:content_loc><video:duration>459</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/javascript/document-ready-ordering</loc><lastmod>2023-02-21T21:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/1047419254-ce4b889bc3e2cadbd3938b6daf982245b34b2f5989610f879b853f8b2b0264b2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[(document).ready() & Ordering]]></video:title><video:description><![CDATA[When we use this `javascripts` block thing: [[[ code('a3e3e17e79') ]]] It adds our new JavaScript code right *after* the main script tags in the base layout: [[[ code('38cdfb0238') ]]] View the HTML...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/506165235/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d8cac06ad18a9bd73c498ba4b6d9de36494e36d295c94d54ae117e045ece035b</video:content_loc><video:duration>285</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/javascript/event-bubbling</loc><lastmod>2023-02-21T21:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/611127703-efbd9898a1c1ed428f855be86314bbcd0bec9ca0514a83f1fe05801aa5518de9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[All about Event Bubbling]]></video:title><video:description><![CDATA[I'm feeling so good about our first click listener, let's add another! When I click *anywhere* on a row, I also want to log a message. Back in the template, give the entire table a `js` class so we...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/198206660/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=dfbecd9dda802694480e1a849b060f84940df2bf06fff5a79806e17b64d7bd7b</video:content_loc><video:duration>271</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/php-namespaces/namespaces</loc><lastmod>2024-04-10T17:38:55+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/861493871-36ae3e7825c3d7eb95274b9acf1d2071454a61aaf20733a640246c2f4017d2c5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[PHP Namespaces in under 5 Minutes]]></video:title><video:description><![CDATA[I've an idea! Let's *master* PHP namespaces... and let's do it in *under* 5 minutes. Sip some coffee... let's go! ## Meet Foo Meet `Foo`: a *perfectly* boring PHP class: [[[ code('b56fd29496') ]]]...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/395275926/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=3515490fdefda3435fda6674ee98fd10457f7ef218a74447ca6f6ac3bb003763</video:content_loc><video:duration>289</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/fosuserbundle-1.3/fos-user-bundle</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536625855-879353048a0be9551c5a50f02c4f3b51242112a4617eba816d6873878a164ea5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[FOSUserBundle]]></video:title><video:description><![CDATA[FOSUserBundle!¶ If you&#8217;re using Symfony2 and need to load users from your database, then you&#8217;re in the right place! In the next few minutes, we&#8217;re going to learn the most important...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140215944/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=45b86ffab2929d51885d272889f3305c566b9f805652ce05bada3c6dba31f076</video:content_loc><video:duration>795</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/composer/composer</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536928030-44ea0357b16b7f1b5acb8c1515945f8e5e90b274ceb296a8c9de83ee01e39eb3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Composer]]></video:title><video:description><![CDATA[Composer: Because using external Libraries should be Fun!¶ Welcome to the brand new world of PHP with Composer! One of the great things about PHP is that we&#8217;re huge! But how big are we really?...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140216313/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=00a15de5afeda9fdb665ac39475c80aad90389d945c75afb873fe105f834fec4</video:content_loc><video:duration>840</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/behat-v25/intro</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/537351397-266c3f571c1739df5e56bff86cc81605a7d89cebb9a4fb8ac933a0aea0f94374-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Introduction]]></video:title><video:description><![CDATA[Introduction¶ Hey! Welcome to the tutorial that we&#8217;re calling &#8220;All about the World of Behat&#8221;. Our goal is simple: to understand the Behavior-Driven Development philosophy and master...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140685541/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=27467227faa188e5f9e91bc6a483d97251f45f8d2aa2892f395e67e837690202</video:content_loc><video:duration>511</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/dependency-injection/intro</loc><lastmod>2023-12-20T18:24:46+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536924855-c38c8a3f72c6b12a32efbf926516807721c8265e92d07f90ee8f8674b9ef5d87-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Dependency Injection]]></video:title><video:description><![CDATA[Hi guys! In this tutorial, we're going to talk about dependency injection, services, and dependency injection containers by looking at a simple one called Pimple. The great news is that understanding...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140212051/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=02943d09804dd157a28f0ca27c05b087aa48552990439f77872766b66a7aa5ab</video:content_loc><video:duration>96</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/dependency-injection/services</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536924854-2ce6326ff4827259a3f8701a63685323be8180f2a52fb2c179d3aac79ea3f87d-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Services and Dependency Injection]]></video:title><video:description><![CDATA[Our app is small now, but as it grows, the `app.php` file will get harder and harder to read. The best way to fix this is to separate each different chunk of functionality into different PHP classes...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140212054/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=174176d4eb772e7297168b111ce95adfc29d2486898be3da01165815304b6a16</video:content_loc><video:duration>259</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/dependency-injection/injection-interfaces</loc><lastmod>2023-12-20T18:23:08+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536926135-c780275d06c4c942749f0f2e42cc4234d8c541faf6920e6f9ee5ae63a451e80e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Injecting Config & Services and using Interfaces]]></video:title><video:description><![CDATA[We've already created our first service *and* used dependency injection, we're even closer to getting this money out! One problem with the `FriendHarvester` is that we've hardcoded the SMTP...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140212052/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6bb9ea3faf72e680f041402f781547234f8107cd11191d8da856a40f93b537e0</video:content_loc><video:duration>328</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/dependency-injection/container</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536614757-0fd86679f4f650fb5b1e127e26cf9f6fef2974e843dea5e32c62a9b071d30133-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Dependency Injection Container]]></video:title><video:description><![CDATA[Our project now has services, an interface, and is fully using dependency injection. Nice work! One of the downsides of DI is that all the complexity of creating and configuring objects is now your...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140212064/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=343a7c015b8e6f1448a1701771b94dde52533343aadb2514268eca69be36b7b9</video:content_loc><video:duration>623</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/dependency-injection/container-in-your-project</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536926996-cb00c4525aced3231b8350bcc333367873776a56f196200df783a7d562b48e59-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[A Container in your Project]]></video:title><video:description><![CDATA[Ok, time to get to emailing! No matter what framework or system you work on, you can start applying these principles immediately. You may already have a dependency injection container available to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140212053/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7e28eeaf14118bb86adc94d4bf5f26ed4bbca9fde3d6b81d41c53e53a3689130</video:content_loc><video:duration>64</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/new-symfony-2.2/upgrade</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536611489-726f2ef8027a2efd172d727b8dbdcaf37f3953cc73c4650d553c53100b4558df-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Woh! 2.2 is here!]]></video:title><video:description><![CDATA[Upgrade!¶ So, we heard you like Symfony, so we&#8217;re showing you how to put more Symfony in your Symfony! Now that 2.2 has been released, we wanted to take some time to show you how to upgrade and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140211556/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=16d247e4677a57054140e18947ba0f001dbdefe6655ee634ab17d7ba187aa5dc</video:content_loc><video:duration>83</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/new-symfony-2.2/upgrading</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536463108-bbdc4fd7d94a7c193e725fad5b5bca1de216165b6847db2f7db900822a8709ba-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Upgrading to 2.2]]></video:title><video:description><![CDATA[Upgrading to 2.2¶ To find details about this release, the actual blog post about it is a great spot. Upgrading a Symfony2 project actually means upgrading the libraries in your vendor/ directory. The...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140211554/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c7dc59868b59ac88bd8091ba6ffc923ca0891f0b24cb63006bf79666c83ec987</video:content_loc><video:duration>226</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/new-symfony-2.2/fragments-esi-caching</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536463115-4f94d293b66bb29672df3bb029f7c2c22717710feff84374dce10f0c3050e431-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Fragments, ESI and Caching]]></video:title><video:description><![CDATA[Fragments, ESI and Caching¶ Symfony 2.2 comes with a brand new fragments sub-framework, which allows you to render small parts of your page - like our inner box - independently. Actually, this has...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140211553/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=7cb9d35c26ef1f91e8d0ec13800c352df11c23ed6e535ae20ebe1b8a386e27ed</video:content_loc><video:duration>457</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/new-symfony-2.2/host-routing</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536926038-7de0831a1d6d80fd24044b310ea02d3c6f986dce8b48475b20f917210bd18137-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Hostname Routing]]></video:title><video:description><![CDATA[Hostname Routing¶ A lot of people wanted it, so brand new in Symfony 2.2 is the ability to match route names based on the host parameter. To see it in action, let&#8217;s duplicate the fragments...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140211555/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a3cb27468a85430d7aefdaa637e5afd37ad7477b9d61a4ebe914c9d55ad2c96f</video:content_loc><video:duration>109</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/new-symfony-2.2/dialog-progress-autocomplete</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536463112-792419be6955c691a7251456cc7ea6a618b0ddc3238663e7e7bb69f7b53c0e04-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[New Dialog Goodies: Autocomplete, Progress]]></video:title><video:description><![CDATA[New Dialog Goodies: Autocomplete, Progress¶ Now let&#8217;s turn to something completely different: custom console commands. Creating commands in Symfony has always been easy and powerful and if...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140211557/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4d6bee8443d8085c54560ee2d4eb45b2f981a8863f2bd803c71cc8cae51ad5c9</video:content_loc><video:duration>281</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/new-symfony-2.2/symfony3</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536925890-c0f62f435b68fcfe684d8107a818f6525b36528183e5ebbc37c0c4e3366556f7-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Upgrade to Symfony 3.0?]]></video:title><video:description><![CDATA[Upgrade to Symfony 3.0?¶ Now that we are upgraded to Symfony 2.2 it&#8217;s time to start preparing your application to work with 3.0! On each release of Symfony, some functionality is deprecated and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140211552/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=d231ba0133ee66b48c7ca566c6eb16cbf186a569f79c8b2e35c08a63be0da55e</video:content_loc><video:duration>115</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/new-symfony-2.2/extras</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536924697-9761a8019b1d24960c2725a78d7e7ec2cb06c2f842b762d925155d3ea289e864-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Extras]]></video:title><video:description><![CDATA[Extras¶ There have been a lot of other wonderful changes as well, and fortunately, there are a lot of great places to learn about them. New in Symfony 2.2 Blog Series¶ First, Fabien did a fantastic...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140211560/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=f254b19185b371a185f6609b065f050e2d43df3c2225eeb6fc17b1cb086b3d51</video:content_loc><video:duration>94</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/question-answer-day/questions</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536464504-381a2cfc8c47830f110c90630361e0014c6dbc872363c65c22ae544eb80c9810-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Ask Questions!]]></video:title><video:description><![CDATA[Ask Questions!¶ Hi guys! It&#8217;s time for KnpU Question and Answer day: your chance to submit your burning programming questions and our chance to listen for a change! Here&#8217;s how it works:...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140212671/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=b0d6477dfb0610f6da1d864490e3fa6746d6a9551298e1263d6c048bb0d5183c</video:content_loc><video:duration>55</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/question-answer-day/symfony2-dynamic-subdomains</loc><lastmod>2023-02-21T21:15:49+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536464499-256b98e34be93794686157502aa50c1b37a9bf860200a91fc59abe07a96faca5-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[How to handle dynamic Subdomains in Symfony]]></video:title><video:description><![CDATA[How to handle dynamic Subdomains in Symfony¶ From Rafael: Hi, Symfony 2.2 has released hostname pattern for urls, I would like to know how can I create a url pattern that match domains loaded from a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140212672/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=60c4de310547af5bb657586595cda104a4dd64dc03ea3f0e1e5066c8c26f1064</video:content_loc><video:duration>703</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony2-ep1/intro</loc><lastmod>2023-02-21T21:15:50+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536440686-fbafd5054c0a1b88223f4b520de8d257256ebf0f3fc87b2efa8fd07a2d7a38d3-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Welcome to Symfony!]]></video:title><video:description><![CDATA[***SEEALSO This tutorial has been upgraded! Check out the [Symfony 3 Tutorial][symfony3]. *** PHP has been on a wild ride over the past few years, with new things like namespaces, our package manager...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140195211/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0f2ca774c8bca50cd12ff10d785ca5f6171657766b3032ec0c76e88ed8d16862</video:content_loc><video:duration>171</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony2-ep1/installation</loc><lastmod>2023-02-21T21:15:50+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536922676-af7e5ac35e36bef32e07d087aeffcfc30570e2e325b1ad904f2979894b1d314f-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Downloading & Configuration]]></video:title><video:description><![CDATA[***SEEALSO This tutorial has been upgraded! Check out the [Symfony 3 Installation][Symfony 3 Installation]. *** Ok, let's get Symfony downloaded and setup. Head over to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140195215/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a471a57736fed8e28522df1712a7bf1fecd31eaee5db65bb77ac9eeb2c0bc0a5</video:content_loc><video:duration>602</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony2-ep1/bundles</loc><lastmod>2023-02-21T21:15:50+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536922088-70be7e5331b3ad2566d2021bf51d52eeb9f3694154e99ac2fcf7bc4af6975de0-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Bundles of Joy!]]></video:title><video:description><![CDATA[*Bundles* are a hipster buzzword in the Symfony world. Yea, they're cool but we really deserve all the credit! A bundle is just a place for us to put our hard-earned code. We might make an...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140195216/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=04acf154abde564e7aa177100c6130cb21a0e0c29378651396a94671d36e39d3</video:content_loc><video:duration>199</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony2-ep1/routing</loc><lastmod>2023-02-21T21:15:50+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536922514-77df56a62a01e310da8277bbb95f7100fce7a64e4f2bd5bec48b73c61962b5d9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Routing: The URLs of the World]]></video:title><video:description><![CDATA[***SEEALSO This tutorial has been upgraded! Check out the [Symfony 3 Routing][Symfony 3 Routing]. *** Let's face it, every page needs a URL. When you need a new page, we always start by creating a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140195214/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=01d7b2961dbb639e944225a657d8eface9f0719e2cffcc27a561ff3e56b8f90f</video:content_loc><video:duration>344</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony2-ep2/intro</loc><lastmod>2023-02-21T21:15:50+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536585736-b6e64c535d2e04d2c25fdc1a54695f7032c1398c051d165e68cca31d56889d35-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Introduction]]></video:title><video:description><![CDATA[Introduction¶ Well hi again! And congrats on getting through everything in episode 1. Seriously, that was a lot of work - so find a stranger and give them a high-five. Then come back and let&#8217;s...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140200505/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=4131e5e59240aa12032cdbff21fdad7e141810d39f433cdbc595610bff783c94</video:content_loc><video:duration>44</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony2-ep2/basic-security</loc><lastmod>2023-02-21T21:15:50+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536925015-aa4cabdd9f506165fd0439ad477e12a453c3ad7e613faeb2af866d2664c76f58-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Security Fundamentals]]></video:title><video:description><![CDATA[Security Fundamentals¶ Symfony comes with a security component that&#8217;s really powerful. Honestly, it&#8217;s also really complex. It can connect with other authentication systems - like Facebook...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140200506/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=9d69b04102ad949c56623adc5f894ae2d3984096a728a4b5e456e833e70c2c75</video:content_loc><video:duration>227</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony2-ep2/authorization-access-control</loc><lastmod>2023-02-21T21:15:50+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536923680-46b6425aa17c27609664feba0758d9478c3ebd1df69f7975cc4c0630a31f6fcc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Authorization with Access Control]]></video:title><video:description><![CDATA[Authorization with Access Control¶ Before we keep going with authentication and make it possible to login, let&#8217;s try out our first piece of authorization and start denying access! Head back to...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140200507/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=91dd647342aa77b180ba51a27bacdf588ebfb4c02bcdcc94775a1ce171e2512c</video:content_loc><video:duration>128</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/twig/basics</loc><lastmod>2023-02-21T21:15:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536920137-3f8f1618cac512434cf4a36e382982e338b1e69e79b224eda4678b12c954fd35-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Twig: The Basics]]></video:title><video:description><![CDATA[Welcome to the world of Twig! Twig is a templating language for PHP, which is a boring way of saying that it's a tool used to output variables inside HTML. If a project you're working on uses Twig,...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140192811/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e8ef0fc185739f9d2d2204b5618ba898323e3e5e36e9488d707a7c8968c985d9</video:content_loc><video:duration>367</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/rest/intro</loc><lastmod>2023-02-21T21:15:52+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536547902-6d8382872272815595f93501b23a8db8b420743a302747a3ca0862db8bf583c9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[The REST API Tutorial]]></video:title><video:description><![CDATA[The REST API Tutorial¶ Well hey there! I hope you&#8217;re ready to work, because we&#8217;re going to build an API from the ground up! It&#8217;s not going to be easy: there&#8217;s a lot to do and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140181413/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=12ce63037374a8eda1516e75c37ac6f9364c3c8b4b2dbf7f9410d4251eca72ea</video:content_loc><video:duration>187</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/rest/http</loc><lastmod>2023-02-21T21:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536419726-2af1a476343f4a0422ce818afb68627901da9423c34c1be8001ad43906b03dd4-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[HTTP Basics]]></video:title><video:description><![CDATA[HTTP Basics¶ Yep, we need cover a bit of theory. Wait, come back! This stuff is super important and fascinating too. Put on your thinking cap and let&#8217;s get to it! HTTP¶ Everything starts with...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140181410/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=e00715aeb534509019fe7139343d9c2f17332e7913ad43be2f12273e333138ca</video:content_loc><video:duration>130</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/rest/rest</loc><lastmod>2023-02-21T21:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536419878-22e9acbbb829bd8eb467b7224fe778c9161e25872766acd3cfe242a6a0072146-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[REST: Resources and Representations]]></video:title><video:description><![CDATA[REST: Resources and Representations¶ REST: Representational state transfer. The term was coined famously by Roy Fielding in his doctoral dissertation in 2000. It&#8217;s complex, and a lot of what...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140181415/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=11b3b99bb6cd2aafc379997f72cdc2750c8755bd1881ba524e7dc8e5e7fd92e4</video:content_loc><video:duration>192</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/rest/client-state</loc><lastmod>2023-02-21T21:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536547815-0d614c40b6fe77b1cdb26b4f6e4bef2974070fbc7e7e65798ee02ccb17136681-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Transitions and Client State]]></video:title><video:description><![CDATA[Transitions and Client State¶ Ok, just one more thing: state transitions. We already know about resource state, and how a client can change the resource state by sending a representation with its new...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140181414/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=0ed059b6b9de2abfdbbd15177967170050b3296484f168b0a4f756eb1dce6131</video:content_loc><video:duration>131</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/rest/project-routing</loc><lastmod>2023-02-21T21:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536420203-7b9f3da0582f331ab54f92984511e4516af37108b9ba08562aefc56e4e72bdc8-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Project Routing]]></video:title><video:description><![CDATA[Project Routing¶ Ok, let&#8217;s get start by downloading (see the Download button for subscribers) or cloning the CodeBattles project. Now, follow the README.md file to get things working. It...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140181411/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=bb75b3bc4e73955759488f382151ad082a39bddb18ceed9286e04c136186a4f9</video:content_loc><video:duration>322</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/rest/post</loc><lastmod>2023-02-21T21:15:53+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536420204-ae740794a34aab9fb34e094cec51225248dceef86f5ff8cd694b3a4aebafc3f2-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[POST: Creation, Location Header and 201]]></video:title><video:description><![CDATA[POST: Creation, Location Header and 201¶ Once the POST endpoint works, the client will send programmer details to the server. In REST-speak, it will send a representation of a programmer, which can...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140181412/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=45fec20f9be41940a1c7a1963479a817eba43bc2f8749afab605325577552649</video:content_loc><video:duration>293</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/oauth/intro</loc><lastmod>2023-02-21T21:15:52+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536424493-ba2b0e01a14be236fdc91af0f27da35ad0caca3234fd8414ddb814bef32e2fbc-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Serious OAuth in 8 Steps]]></video:title><video:description><![CDATA[Hey guys and gals! In this tutorial, we're going to get serious with OAuth by building an app with some complex and real-life features, like Facebook authentication, dealing with refresh tokens and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140184467/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=6b8d8bee1700d91985e269d0e36b23352fdd610f8f2a962a90cfa01fe05c6db2</video:content_loc><video:duration>163</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/oauth/client-credentials</loc><lastmod>2023-02-21T21:15:52+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/623913039-905a68fa2517726ec57079f61384de090ad15e859a14c1240ace77149da93f08-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Client Credentials]]></video:title><video:description><![CDATA[Meet Brent. He's the hardworking, beard-growing, kale-munching type who has a coop of the nicest, smartest, and best egg-laying chickens this side o' the Mississippi! But feeding his chickens and...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/208563493/rendition/1080p/file.mp4%20%281080p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=8ba2dad032249bc36949c268a11e7d880600dbd209183bb9f1c04268a0c68b28</video:content_loc><video:duration>537</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/php-ep1/lets-write-php</loc><lastmod>2023-09-05T21:22:38+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536919658-35b8394bf6ee16cc689fabf1e7d0049528977e30caa73cfc8e8bd0f296e19069-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Let’s Write some PHP!]]></video:title><video:description><![CDATA[Let&#8217;s Write some PHP!¶ Welcome! We&#8217;re glad you&#8217;re here with us to learn how to become an Epic PHP developer. PHP is a programming language that runs a large percentage of the web...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140189285/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=555a029191acce33268d9879bf3f7f2462b66ea3bf52c2cdcdcfaccbee71c893</video:content_loc><video:duration>347</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony2-ep4/intro</loc><lastmod>2023-02-21T21:15:52+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536461007-274a108463c62cd16c05056e166e8675908c29f10cf14353fd0c8bda11a46f59-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Introduction]]></video:title><video:description><![CDATA[The Final Stretch¶ Ok guys, welcome to the last episode. We&#8217;ll be working on the project from where we left off in episode 3. You can get that from the code download on this tutorial. I&#8217;m...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140210042/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=a61ed1d35a4ee8a56a4e2f23df7e781df57cb2a69c5e63e98715a4afc2fc3063</video:content_loc><video:duration>50</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony2-ep4/assets</loc><lastmod>2023-02-21T21:15:52+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536608701-654c4d9736cecc54dc813ad8a04c2235a6f9b313a786bf83962cec42994460b9-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Assets and Cache Busting]]></video:title><video:description><![CDATA[We (mostly) don&#8217;t care about your CSS/JS¶ We&#8217;ll start by talking about CSS and JS files, and just how much Symfony doesn&#8217;t care about these. I mean that in a good way - you...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140210039/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=c9ae8b8feda7e9f1ab1369b69c290bedf95daff904d2039167494986b2416cec</video:content_loc><video:duration>153</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony2-ep3/intro</loc><lastmod>2023-02-21T21:15:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536457381-2e67054828fce6fa357788203d320f4a4ad3c9280885a3de9cc27e5c09084f2e-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[Introduction]]></video:title><video:description><![CDATA[Introduction¶ Well hey friend! You&#8217;ve made it to part 3, so high-five a stranger and then keep going! In this episode, I want us to really start to learn how Symfony works under the hood....]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140207115/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=2cc219d7524ff8fe8254e93557a51171c683558054cd1a508f80a124556567a2</video:content_loc><video:duration>60</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url><url><loc>https://symfonycasts.com/screencast/symfony2-ep3/doctrine-relationship</loc><lastmod>2023-02-21T21:15:51+00:00</lastmod><changefreq>yearly</changefreq><priority>1.0</priority><video:video><video:thumbnail_loc>https://i.vimeocdn.com/video/536604798-36e2e8296a93955f4221d44012379587d12fe33da0797c4912bd50714a2cd661-d_1108x624?r=pad</video:thumbnail_loc><video:title><![CDATA[ManyToOne Doctrine Relationships]]></video:title><video:description><![CDATA[ManyToOne Doctrine Relationships¶ Right now, if I creat an Event, there&#8217;s no database link back to my user. We don&#8217;t know which user created each Event. To fix this, we need to create a...]]></video:description><video:content_loc>https://player.vimeo.com/progressive_redirect/playback/140207117/rendition/720p/file.mp4%20%28720p%29.mp4?loc=external&amp;oauth2_token_id=1793638673&amp;signature=107002d50ccf8e6cbd87113fd0cbff815a2bda8ac18b3e65e77420fb1ecbe711</video:content_loc><video:duration>280</video:duration><video:requires_subscription>no</video:requires_subscription><video:publication_date>2015-12-31T23:59:59+00:00</video:publication_date></video:video></url></urlset>