title
Laravel From Scratch 2022 | 4+ Hour Course

description
Learn the Laravel PHP framework from scratch by building a job listings application with Laravel 9 and MySQL. ⭐ Sponsor: https://linode.com/traversy 💻 Github Repo: https://github.com/bradtraversy/laragigs 💻 Gists: Laravel Valet Setup: https://gist.github.com/bradtraversy/b58f74cd863a465068eaeaae1544d9be Laravel Xampp Setup: https://gist.github.com/bradtraversy/7485f928e3e8f08ee6bccbe0a681a821 MySQL Cheat Sheet: https://gist.github.com/bradtraversy/c831baaad44343cc945e76c2e30927b3 💻 My Courses & More https://traversymedia.com 👇 PHP OOP MVC Udemy Course: https://www.udemy.com/course/object-oriented-php-mvc 💖 Show Support Patreon: https://www.patreon.com/traversymedia PayPal: https://paypal.me/traversymedia 👇 Follow Me On Social Media: Twitter: https://twitter.com/traversymedia Instagram: https://www.instagram.com/traversymedia Linkedin: https://www.linkedin.com/in/bradtraversy Timestamps: 0:00 - Intro 1:30 - Linode Sponsor 2:13 - Project Demo 6:21 - Setting Up Laravel 13:50 - Routing & Responses 19:28 - Wildcard Endpoints 20:16 - Route Constraints 21:06 - Die Dump Helpers 22:30 - Request & Query Params 26:26 - API Routes 28:26 - View Basics & Passing Data 32:36 - Blade Templates & Basic Directives 36:42 - Creating a Basic Model 43:46 - Database Setup & Config 46:03 - Create Database & User 48:44 - Creating Database Migrations 52:44 - Running Migrations 54:06 - Database Seeding 58:29 - Create an Eloquent Model 1:02:49 - Creating a Factory 1:07:18 - Creating a Layout & Sections 1:09:54 - Adding the Theme HTML 1:19:02 - Template Partials 1:22:54 - Single Listing Formatting 1:26:00 - Route Model Binding 1:28:18 - Blade Components 1:32:53 - Component Attributes 1:35:20 - Tags Component 1:40:38 - Controllers 1:44:09 - Resource Method Naming 1:46:34 - Using a Layout Component 1:49:08 - Tag Filter 1:57:31 - Search Filter 2:01:29 - Clockwork Package 2:04:05 - Create Listing Form 2:10:39 - Validation & Store Listing 2:23:30 - Mass Assignment Rule 2:27:20 - Flash Messages 2:32:49 - Alpine.js For Message Removal 2:36:33 - Keep Old Data In Form 2:38:46 - Pagination 2:45:20 - File Upload 2:57:24 - Edit Listing 3:09:16 - Delete Listing 3:13:32 - User Registration 3:30:00 - Auth Links 3:32:46 - User Logout 3:37:20 - User Login 3:47:02 - Auth & Guest Middleware 3:51:30 - Relationships 3:59:05 - Tinker Tinkering 4:01:35 - Add Ownership to Listings 4:05:31 - Manage Listings Page 4:14:22 - User Authorization

detail
{'title': 'Laravel From Scratch 2022 | 4+ Hour Course', 'heatmap': [{'end': 2487.628, 'start': 2320.09, 'weight': 1}, {'end': 3262.943, 'start': 3104.705, 'weight': 0.735}, {'end': 3732.257, 'start': 3414.146, 'weight': 0.706}, {'end': 4193.809, 'start': 4036.456, 'weight': 0.726}, {'end': 5436.278, 'start': 5272.458, 'weight': 0.834}, {'end': 6839.325, 'start': 6678.764, 'weight': 0.79}, {'end': 9788.221, 'start': 9629.864, 'weight': 0.753}, {'end': 10562.483, 'start': 10405.181, 'weight': 0.951}, {'end': 11036.854, 'start': 10715.376, 'weight': 0.885}, {'end': 12894.264, 'start': 12732.597, 'weight': 0.724}, {'end': 13833.449, 'start': 13666.197, 'weight': 0.765}, {'end': 14448.726, 'start': 14286.178, 'weight': 0.865}], 'summary': 'This 4+ hour course on laravel 9 in mysql covers creating a job listing app, laravel crash course, development essentials, database setup, web development, tag listing, form implementation, alpine.js usage, file upload, crud functionality, user authentication, and model relationships.', 'chapters': [{'end': 61.346, 'segs': [{'end': 43.493, 'src': 'embed', 'start': 0.458, 'weight': 0, 'content': [{'end': 1.459, 'text': "hey, what's going on, guys?", 'start': 0.458, 'duration': 1.001}, {'end': 7.123, 'text': 'so my initial plan was to create a laravel crash course about an hour hour and a half,', 'start': 1.459, 'duration': 5.664}, {'end': 10.286, 'text': 'but i ended up doing a project that took a lot more time than that.', 'start': 7.123, 'duration': 3.163}, {'end': 18.533, 'text': "so this will be a free four hour course slash project and we're going to be building a job listing application from scratch using laravel 9 in mysql.", 'start': 10.286, 'duration': 8.247}, {'end': 21.275, 'text': 'So Laravel is a PHP framework.', 'start': 19.253, 'duration': 2.022}, {'end': 24.157, 'text': "It's honestly one of, if not my favorite framework.", 'start': 21.435, 'duration': 2.722}, {'end': 28.341, 'text': 'It just includes so much and makes it easy to do just about anything.', 'start': 24.558, 'duration': 3.783}, {'end': 36.628, 'text': "And we will stop and look at things outside of the scope of the project that we'll be building just so I can kind of show you how things work.", 'start': 28.941, 'duration': 7.687}, {'end': 43.493, 'text': "Now, I know that these days it's all about quick content, you know, YouTube shorts and TikTok and so on.", 'start': 37.648, 'duration': 5.845}], 'summary': 'Free 4-hour laravel course to build a job listing app using laravel 9 in mysql, covering additional aspects outside project scope.', 'duration': 43.035, 'max_score': 0.458, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY458.jpg'}], 'start': 0.458, 'title': 'Creating a laravel job listing app', 'summary': 'Covers a free four-hour course on building a job listing application using laravel 9 in mysql, focusing on immersive learning and viewer engagement.', 'chapters': [{'end': 61.346, 'start': 0.458, 'title': 'Laravel job listing application', 'summary': 'Entails a free four-hour course on building a job listing application from scratch using laravel 9 in mysql, emphasizing the immersive learning process and the time commitment for viewers to code along.', 'duration': 60.888, 'highlights': ['The chapter entails a free four-hour course on building a job listing application from scratch using Laravel 9 in MySQL, emphasizing the immersive learning process and the time commitment for viewers to code along.', 'Laravel is a PHP framework known for its comprehensive features and ease of use, making it suitable for various tasks.', 'The content encourages viewers to sit down in a quiet place, code along, and immerse themselves in learning, acknowledging that the learning process may take a week, a month, or even longer.']}], 'duration': 60.888, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY458.jpg', 'highlights': ['The chapter covers a free four-hour course on building a job listing application using Laravel 9 in MySQL, emphasizing immersive learning and viewer engagement.', 'Laravel is a PHP framework known for its comprehensive features and ease of use, suitable for various tasks.', 'Viewers are encouraged to sit down in a quiet place, code along, and immerse themselves in learning, acknowledging that the learning process may take a week, a month, or even longer.']}, {'end': 883.554, 'segs': [{'end': 172.365, 'src': 'embed', 'start': 147.393, 'weight': 6, 'content': [{'end': 154.075, 'text': 'So user authentication will be implementing this after and all of our forms have validation, as you can see.', 'start': 147.393, 'duration': 6.682}, {'end': 160.636, 'text': 'And then we have this hero image, which will just our hero area where it just takes us to the register page.', 'start': 154.635, 'duration': 6.001}, {'end': 163.498, 'text': 'And then we can filter listings as well.', 'start': 161.216, 'duration': 2.282}, {'end': 167.161, 'text': 'So basically we have tags that we can add.', 'start': 164.159, 'duration': 3.002}, {'end': 172.365, 'text': "And if I click on one of these like view, then it's going to show me all the listings that have the view tag.", 'start': 167.201, 'duration': 5.164}], 'summary': 'Implementing user authentication, validating forms, adding hero image, and filtering listings with tags.', 'duration': 24.972, 'max_score': 147.393, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY147393.jpg'}, {'end': 407.558, 'src': 'embed', 'start': 382.242, 'weight': 1, 'content': [{'end': 387.687, 'text': 'So the very first thing we need to do is get set up so we can run Laravel on our local machine.', 'start': 382.242, 'duration': 5.445}, {'end': 389.608, 'text': 'So you need a development environment.', 'start': 387.727, 'duration': 1.881}, {'end': 396.975, 'text': "Now, this is one of the tough things about making Laravel tutorials, because I'm someone that always likes to start from absolute scratch.", 'start': 390.069, 'duration': 6.906}, {'end': 401.496, 'text': "And it's tough to do that with Laravel because there's so many different ways to get set up.", 'start': 397.675, 'duration': 3.821}, {'end': 405.737, 'text': "And it can be different on, you know, if you're on Windows or if you're on Mac.", 'start': 401.956, 'duration': 3.781}, {'end': 407.558, 'text': 'So it can be tough.', 'start': 406.257, 'duration': 1.301}], 'summary': 'Setting up laravel on local machine can be tough due to different ways of setup and platforms.', 'duration': 25.316, 'max_score': 382.242, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY382242.jpg'}, {'end': 445.632, 'src': 'embed', 'start': 420.221, 'weight': 2, 'content': [{'end': 429.284, 'text': 'declare a certain directory as your for your projects, for your laravel projects, and then you get a local domain, like whatever my website, dot test,', 'start': 420.221, 'duration': 9.063}, {'end': 430.965, 'text': 'and that will you know.', 'start': 429.284, 'duration': 1.681}, {'end': 434.566, 'text': "that'll be your laravel site or your local site, uh.", 'start': 430.965, 'duration': 3.601}, {'end': 436.226, 'text': "but again it's only for mac.", 'start': 434.566, 'duration': 1.66}, {'end': 437.447, 'text': "you can't use it on windows.", 'start': 436.226, 'duration': 1.221}, {'end': 445.632, 'text': 'so for windows, what i usually recommend for beginners is xampp or xampp, and this gives you apache, which is a web server.', 'start': 438.167, 'duration': 7.465}], 'summary': "Declare a directory for laravel projects, get a local domain like 'my website.test', for mac use only, for windows use xampp with apache web server.", 'duration': 25.411, 'max_score': 420.221, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY420221.jpg'}, {'end': 868.395, 'src': 'embed', 'start': 841.753, 'weight': 0, 'content': [{'end': 846.757, 'text': "because this is where we load all of our views or controllers, which we're going to get to later on.", 'start': 841.753, 'duration': 5.004}, {'end': 855.324, 'text': "If you're creating an API like a backend JSON API, then you would probably be using this API dot PHP.", 'start': 847.618, 'duration': 7.706}, {'end': 857.086, 'text': "And I'll show you a little bit how that works.", 'start': 855.424, 'duration': 1.662}, {'end': 860.709, 'text': "But this is not we're not creating it in API.", 'start': 857.166, 'duration': 3.543}, {'end': 868.395, 'text': 'I actually do have a complete Laravel eight API project where we use sanctum, which is an authentication library.', 'start': 860.729, 'duration': 7.666}], 'summary': 'The transcript discusses loading views and controllers for an api project using laravel 8 and sanctum for authentication.', 'duration': 26.642, 'max_score': 841.753, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY841753.jpg'}], 'start': 61.346, 'title': 'Laravel crash course and local setup', 'summary': "Covers a laravel crash course sponsored by linode, showcasing 'lara gigs' project with user authentication, form validation, and file uploads. it also explains setting up a local development environment for laravel using laravel valet, xampp, and homestead, with mysql and sqlite support.", 'chapters': [{'end': 335.973, 'start': 61.346, 'title': 'Laravel crash course with linode sponsorship', 'summary': "Covers the laravel crash course sponsored by linode, highlighting the benefits of using linode for cloud hosting and providing a quick demo of the 'lara gigs' project showcasing features such as user authentication, form validation, filtering, pagination, and managing listings with the use of alpine js and file uploads.", 'duration': 274.627, 'highlights': ["Laravel crash course sponsored by Linode, offering a quick demo of 'Lara gigs' project with user authentication, form validation, and filtering features. Laravel crash course sponsored by Linode, quick demo of 'Lara gigs' project, user authentication, form validation, filtering features", 'Linode offers cloud hosting with monthly caps, ensuring predictable billing and control panel for easy project deployment and management. Linode offers cloud hosting with monthly caps, predictable billing, easy project deployment and management', "Introduction of 'Lara gigs' project, demonstrating features such as pagination, theme design using tailwind, and single listing details including image, position, company name, tags, location, and contact information. 'Lara gigs' project introduction, pagination, theme design using tailwind, single listing details", 'Demonstration of user authentication, interactive functionality using Alpine JS, and managing listings with features for editing, file upload, and deletion. User authentication, interactive functionality using Alpine JS, managing listings with features for editing, file upload, and deletion']}, {'end': 883.554, 'start': 335.993, 'title': 'Setting up laravel on local machine', 'summary': 'Covers setting up a local development environment for laravel using tools like laravel valet, xampp, and homestead, emphasizing the foundation for building laravel projects and the various options for getting set up, including mysql and sqlite support.', 'duration': 547.561, 'highlights': ['The chapter emphasizes the foundation for building Laravel projects and covers topics like authentication, CRUD functionality, filtering, pagination, and creating database seeders. The tutorial provides a foundation for building Laravel projects, covering authentication, CRUD functionality, filtering, pagination, and creating database seeders.', 'Various options for setting up a local development environment are discussed, including Laravel Valet, XAMPP, and Homestead, with recommendations for different operating systems. The chapter discusses various options for setting up a local development environment, including Laravel Valet, XAMPP, and Homestead, with recommendations for different operating systems.', 'Instructions are provided for setting up Laravel using Laravel Valet, including the installation steps and usage for Mac users, while also offering a resource for XAMPP installation on Windows and Mac. The tutorial offers instructions for setting up Laravel using Laravel Valet, including installation steps and usage for Mac users, along with a resource for XAMPP installation on Windows and Mac.']}], 'duration': 822.208, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY61346.jpg', 'highlights': ["Laravel crash course sponsored by Linode, quick demo of 'Lara gigs' project, user authentication, form validation, filtering features", "Introduction of 'Lara gigs' project, demonstrating features such as pagination, theme design using tailwind, single listing details", 'Demonstration of user authentication, interactive functionality using Alpine JS, managing listings with features for editing, file upload, and deletion', 'The tutorial provides a foundation for building Laravel projects, covering authentication, CRUD functionality, filtering, pagination, and creating database seeders', 'Various options for setting up a local development environment, including Laravel Valet, XAMPP, and Homestead, with recommendations for different operating systems', 'Instructions for setting up Laravel using Laravel Valet, including installation steps and usage for Mac users, along with a resource for XAMPP installation on Windows and Mac', 'Linode offers cloud hosting with monthly caps, predictable billing, easy project deployment and management']}, {'end': 2623.716, 'segs': [{'end': 1249.75, 'src': 'embed', 'start': 1221.148, 'weight': 2, 'content': [{'end': 1225.586, 'text': "I shouldn't say that, but in a lot of cases it's only going to be numbers.", 'start': 1221.148, 'duration': 4.438}, {'end': 1227.568, 'text': "so maybe you don't want to be able to pass.", 'start': 1225.586, 'duration': 1.982}, {'end': 1235.915, 'text': 'you know letters or symbols, so what we could do is add a constraint onto this by saying where and we can do where the id,', 'start': 1227.568, 'duration': 8.347}, {'end': 1242.407, 'text': 'And then we could put any regular expression that we want in here.', 'start': 1238.826, 'duration': 3.581}, {'end': 1249.75, 'text': "So, for instance, let's say we just want from zero, you know, numbers from zero to nine.", 'start': 1242.547, 'duration': 7.203}], 'summary': 'Restrict input to numbers only using regular expression.', 'duration': 28.602, 'max_score': 1221.148, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY1221148.jpg'}, {'end': 1371.046, 'src': 'embed', 'start': 1341.898, 'weight': 0, 'content': [{'end': 1344.46, 'text': "so we'll be using usually DD I use.", 'start': 1341.898, 'duration': 2.562}, {'end': 1348.423, 'text': "I don't usually use this unless I have to, but yeah.", 'start': 1344.46, 'duration': 3.963}, {'end': 1350.204, 'text': "so that's available.", 'start': 1348.423, 'duration': 1.781}, {'end': 1357.682, 'text': "and now what I want to show you is sometimes we have a value like let's say, or let's say,", 'start': 1350.204, 'duration': 7.478}, {'end': 1363.724, 'text': 'we have a route like search and then we have a query string of, maybe, name.', 'start': 1357.682, 'duration': 6.042}, {'end': 1367.985, 'text': 'so say name equals brad and we can have another one with ampersand.', 'start': 1363.724, 'duration': 4.261}, {'end': 1371.046, 'text': "we'll say i don't know city.", 'start': 1367.985, 'duration': 3.061}], 'summary': 'Demonstrating the use of query strings in a route with examples.', 'duration': 29.148, 'max_score': 1341.898, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY1341898.jpg'}, {'end': 1779.22, 'src': 'embed', 'start': 1753.271, 'weight': 1, 'content': [{'end': 1760.054, 'text': "we should be able to just return the view of listings all right, and that's going to be the home page.", 'start': 1753.271, 'duration': 6.783}, {'end': 1763.175, 'text': 'so if i reload, we just see listings Now.', 'start': 1760.054, 'duration': 3.121}, {'end': 1766.316, 'text': "in most cases you're going to want to pass data into your view.", 'start': 1763.175, 'duration': 3.141}, {'end': 1768.997, 'text': "Right And ultimately, that's going to come from a database.", 'start': 1766.516, 'duration': 2.481}, {'end': 1770.117, 'text': "It's going to go through a model.", 'start': 1769.017, 'duration': 1.1}, {'end': 1779.22, 'text': 'But for now, just to show you how to pass the data, we can pass in a second argument here of an array and then whatever values we want.', 'start': 1770.678, 'duration': 8.542}], 'summary': 'Pass data into view to display listings on home page.', 'duration': 25.949, 'max_score': 1753.271, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY1753271.jpg'}, {'end': 1842.124, 'src': 'embed', 'start': 1816.316, 'weight': 3, 'content': [{'end': 1823.4, 'text': "so if we come over here and reload, um oh, never mind it's heading.", 'start': 1816.316, 'duration': 7.084}, {'end': 1825.001, 'text': 'i passed in a value of heading.', 'start': 1823.4, 'duration': 1.601}, {'end': 1827.322, 'text': 'sorry, all right.', 'start': 1825.001, 'duration': 2.321}, {'end': 1829.624, 'text': 'so now we get latest listings.', 'start': 1827.322, 'duration': 2.302}, {'end': 1833.266, 'text': 'now, as far as the data, like i said ultimately that that will come from a database.', 'start': 1829.624, 'duration': 3.642}, {'end': 1834.787, 'text': "but let's pass in here now.", 'start': 1833.266, 'duration': 1.521}, {'end': 1842.124, 'text': "Now we'll have a variable called listings and let's make that an array of listings.", 'start': 1836.502, 'duration': 5.622}], 'summary': 'Developed code to retrieve latest listings as an array from a database.', 'duration': 25.808, 'max_score': 1816.316, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY1816316.jpg'}, {'end': 1964.655, 'src': 'embed', 'start': 1937.359, 'weight': 6, 'content': [{'end': 1944.201, 'text': "later on we'll be dealing with collections, so it'll be this syntax, but for now it'll be like this.", 'start': 1937.359, 'duration': 6.842}, {'end': 1951.175, 'text': 'alright, so and that OK.', 'start': 1944.201, 'duration': 6.974}, {'end': 1955.481, 'text': 'so if I come over here and I reload now, we see listing one and listing two.', 'start': 1951.175, 'duration': 4.306}, {'end': 1963.073, 'text': 'So now what I want to do is change this listing template or view to a blade view or a blade template.', 'start': 1956.363, 'duration': 6.71}, {'end': 1964.655, 'text': "So I'm going to rename this.", 'start': 1963.153, 'duration': 1.502}], 'summary': 'Introduction to collections and renaming a template.', 'duration': 27.296, 'max_score': 1937.359, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY1937359.jpg'}, {'end': 2487.628, 'src': 'heatmap', 'start': 2320.09, 'weight': 1, 'content': [{'end': 2330.756, 'text': "we're going to create a public static function and we'll call it all because we want this to get all listings and then obviously i mean this is would come from a database.", 'start': 2320.09, 'duration': 10.666}, {'end': 2335.959, 'text': "but just for now, let's go ahead and return and i'm going to grab from this file here.", 'start': 2330.756, 'duration': 5.203}, {'end': 2342.682, 'text': "I'm going to grab this and let's return that semicolon there.", 'start': 2336.84, 'duration': 5.842}, {'end': 2344.042, 'text': 'All right.', 'start': 2342.702, 'duration': 1.34}, {'end': 2347.063, 'text': 'So now we have this method of all that returns these listings.', 'start': 2344.082, 'duration': 2.981}, {'end': 2351.745, 'text': "So to get this, let's actually get rid of that.", 'start': 2347.143, 'duration': 4.602}, {'end': 2356.006, 'text': 'And then we want to bring in our model.', 'start': 2353.185, 'duration': 2.821}, {'end': 2361.708, 'text': 'So remember, the namespace we use was app slash models and then slash listing.', 'start': 2356.126, 'duration': 5.582}, {'end': 2367.013, 'text': 'And then down here, we should be able to use the listing model.', 'start': 2363.072, 'duration': 3.941}, {'end': 2372.694, 'text': "And to use the method, the all method, we're going to use double colon because it's a static method.", 'start': 2367.573, 'duration': 5.121}, {'end': 2374.554, 'text': 'So this is the PHP syntax.', 'start': 2372.714, 'duration': 1.84}, {'end': 2375.735, 'text': 'And we want to get all.', 'start': 2374.654, 'duration': 1.081}, {'end': 2379.415, 'text': "All right, so I'll go ahead and save that.", 'start': 2376.015, 'duration': 3.4}, {'end': 2381.736, 'text': 'And if I reload, again, we should see the same thing.', 'start': 2379.435, 'duration': 2.301}, {'end': 2387.157, 'text': 'All right, but now we have our data is coming from our model.', 'start': 2381.756, 'duration': 5.401}, {'end': 2389.77, 'text': "So now let's go back into our model.", 'start': 2388.089, 'duration': 1.681}, {'end': 2392.812, 'text': "Let's create a function to just fetch a single listing.", 'start': 2389.79, 'duration': 3.022}, {'end': 2399.517, 'text': "So come down here and let's say public static function.", 'start': 2393.413, 'duration': 6.104}, {'end': 2401.438, 'text': "And we'll call this one find.", 'start': 2399.837, 'duration': 1.601}, {'end': 2405.221, 'text': "And it's going to take in an ID because we want to find it by its ID.", 'start': 2401.598, 'duration': 3.623}, {'end': 2411.165, 'text': "And again, when we use eloquent, it's going to be a lot easier than this.", 'start': 2406.081, 'duration': 5.084}, {'end': 2412.586, 'text': "We don't have to.", 'start': 2411.205, 'duration': 1.381}, {'end': 2416.949, 'text': "you don't even have to write code to to find a listing, because it's our.", 'start': 2412.586, 'duration': 4.363}, {'end': 2422.113, 'text': "you already have an eloquent method, but for us for now, let's just say listings.", 'start': 2416.949, 'duration': 5.164}, {'end': 2427.377, 'text': 'we want to get all the listings first, which we can get from the method right above the all method.', 'start': 2422.113, 'duration': 5.264}, {'end': 2429.058, 'text': 'so i could use self.', 'start': 2427.377, 'duration': 1.681}, {'end': 2438.245, 'text': 'so when you have a class and you want to call another method or property, you can use self in a static function here or to call a static function,', 'start': 2429.058, 'duration': 9.187}, {'end': 2443.462, 'text': "and let's say self all, So that'll get all the listings.", 'start': 2438.245, 'duration': 5.217}, {'end': 2446.403, 'text': "Then we're going to loop through the listings.", 'start': 2443.502, 'duration': 2.901}, {'end': 2449.703, 'text': "So we'll say as listing.", 'start': 2447.763, 'duration': 1.94}, {'end': 2451.044, 'text': 'All right.', 'start': 2449.723, 'duration': 1.321}, {'end': 2455.925, 'text': "And then what we want to do is get the one with the ID that's passed in.", 'start': 2451.224, 'duration': 4.701}, {'end': 2464.266, 'text': "So we'll say if the current listing, the current listings ID is equal to the ID that's passed in to find.", 'start': 2455.965, 'duration': 8.301}, {'end': 2466.146, 'text': "Then, of course, that's the one we want.", 'start': 2464.326, 'duration': 1.82}, {'end': 2468.587, 'text': "So we'll return that listing.", 'start': 2466.246, 'duration': 2.341}, {'end': 2472.861, 'text': "all. right now, let's use this in our routes file.", 'start': 2469.54, 'duration': 3.321}, {'end': 2474.962, 'text': "we'll create a new route.", 'start': 2472.861, 'duration': 2.101}, {'end': 2487.628, 'text': "let's just say single listing and let's add a comment here, and we'll say all listings.", 'start': 2474.962, 'duration': 12.666}], 'summary': 'Creating php static methods to retrieve and display listings from a database.', 'duration': 167.538, 'max_score': 2320.09, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY2320090.jpg'}], 'start': 884.034, 'title': 'Laravel development essentials', 'summary': 'Covers vs code route navigation, laravel routing basics including handling root endpoint, creating custom routes, utilizing wildcards and constraints, debugging with helper methods, accessing query string parameters, creating blade templates, and laravel model creation and usage with eloquent orm, static methods, and route creation.', 'chapters': [{'end': 930.514, 'start': 884.034, 'title': 'Vs code route navigation', 'summary': 'Explains how to navigate to a class in vs code using the control or command click feature, and discusses the route class and its method get for handling http requests.', 'duration': 46.48, 'highlights': ["The chapter discusses the use of VS Code's control or command click feature to navigate to a class, emphasizing its utility for learning about specific classes and their extensions.", 'It introduces the route class and its method get for handling HTTP requests, assuming the reader has basic knowledge of HTTP and mentions the ability to use various HTTP methods.']}, {'end': 1684.595, 'start': 930.554, 'title': 'Laravel routing basics', 'summary': 'Explains the basics of laravel routing, including handling root endpoint, creating custom routes, utilizing wildcards and constraints, debugging with helper methods, accessing query string parameters, and creating routes for building an api.', 'duration': 754.041, 'highlights': ['The chapter explains the basics of Laravel routing, including handling root endpoint, creating custom routes, utilizing wildcards and constraints, debugging with helper methods, accessing query string parameters, and creating routes for building an API. The summary encompasses the key points of the transcript, providing an overview of the topics covered and the quantifiable data of the concepts explained.', 'The endpoint for root is defined as just slash, and a closure function is used for handling the request, similar to ExpressJS. This highlights the explanation of defining the root endpoint and using a closure function for request handling, showcasing the fundamental aspect of Laravel routing.', "Creation of custom routes, such as defining a 'get' request for 'slash hello' and returning a string response, is demonstrated. This emphasizes the demonstration of creating custom routes and returning specific responses, providing practical insights into custom route creation.", 'Utilizing wildcards with constraints for passing parameters and handling them within the route is explained, showcasing the versatility of route handling. This highlights the explanation of using wildcards with constraints to handle parameters within the route, illustrating the flexibility and control offered by Laravel routing.', "The functionality of debugging with helper methods like 'dd' and 'ddd' is showcased, providing insights into effectively debugging and displaying values. This emphasizes the demonstration of using helper methods for debugging, providing practical insights into effectively debugging and displaying values during development.", "Accessing query string parameters through the 'request' object and utilizing the values for processing is demonstrated. This highlights the explanation of accessing query string parameters using the 'request' object, showcasing the practical implementation of processing query string values within the route.", 'Creating routes for building an API, including prefixing the route and returning JSON responses, is showcased. This emphasizes the demonstration of creating routes for building an API, showcasing the process of prefixing routes and returning JSON responses for API development.']}, {'end': 2197.026, 'start': 1684.595, 'title': 'Creating blade templates', 'summary': 'Discusses creating a blade template for a laravel application, passing data into views, using blade directives like for each and conditionals, and cleaning up php syntax for cleaner output and readability.', 'duration': 512.431, 'highlights': ['The chapter discusses creating a blade template for a Laravel application The speaker explains the process of creating a blade template for a Laravel application, emphasizing the approach of taking it slow to ensure thorough understanding of the process.', 'Passing data into views and using blade directives like for each and conditionals The speaker demonstrates passing data into views by using an array and passing values, and also showcases the usage of blade directives such as for each and conditionals for cleaner and more efficient code.', 'Cleaning up PHP syntax for cleaner output and readability The speaker highlights the advantage of using blade templates to clean up PHP syntax, providing examples of using curly braces and directives like for each and conditionals for improved readability and presentation of output.']}, {'end': 2623.716, 'start': 2197.546, 'title': 'Laravel model creation and usage', 'summary': 'Explains the process of creating and using a laravel model to interact with a database, including the use of eloquent orm, static methods for fetching all listings and finding a single listing, and creating routes for displaying single listings, with examples and code snippets provided.', 'duration': 426.17, 'highlights': ['The chapter explains the process of creating and using a Laravel model to interact with a database It details the usage of Eloquent ORM, static methods for fetching all listings, and finding a single listing.', "Creating a Laravel model using Eloquent ORM and static methods The process involves creating a model file, defining a namespace, creating a class with static methods like 'all' and 'find', and accessing the model from other files.", 'Creating routes for displaying single listings The chapter demonstrates the creation of routes to display single listings, with examples of passing parameters and returning a view with data from the model.']}], 'duration': 1739.682, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY884034.jpg', 'highlights': ['The chapter explains the process of creating and using a Laravel model to interact with a database, detailing the usage of Eloquent ORM and static methods for fetching all listings and finding a single listing.', "Creating a Laravel model using Eloquent ORM and static methods, involving creating a model file, defining a namespace, creating a class with static methods like 'all' and 'find', and accessing the model from other files.", 'Creating routes for displaying single listings, demonstrating the creation of routes to display single listings, with examples of passing parameters and returning a view with data from the model.', 'The chapter discusses creating a blade template for a Laravel application, emphasizing the approach of taking it slow to ensure thorough understanding of the process.', 'Passing data into views and using blade directives like for each and conditionals, demonstrating passing data into views by using an array and passing values, and showcasing the usage of blade directives such as for each and conditionals for cleaner and more efficient code.', 'Cleaning up PHP syntax for cleaner output and readability, highlighting the advantage of using blade templates to clean up PHP syntax, providing examples of using curly braces and directives like for each and conditionals for improved readability and presentation of output.', 'The chapter explains the basics of Laravel routing, including handling the root endpoint, creating custom routes, utilizing wildcards and constraints, debugging with helper methods, accessing query string parameters, and creating routes for building an API.']}, {'end': 4360.199, 'segs': [{'end': 3095.06, 'src': 'embed', 'start': 3056.843, 'weight': 3, 'content': [{'end': 3058.664, 'text': 'So right here, create listings table.', 'start': 3056.843, 'duration': 1.821}, {'end': 3063.247, 'text': "And by default, we're going to have our class and the up and down method.", 'start': 3059.324, 'duration': 3.923}, {'end': 3068.929, 'text': "now it'll create the listings table and right now we just will have an id and timestamps.", 'start': 3063.826, 'duration': 5.103}, {'end': 3071.291, 'text': 'and obviously we want more than that.', 'start': 3068.929, 'duration': 2.362}, {'end': 3073.992, 'text': "so let's go ahead and add the fields we're going to want.", 'start': 3071.291, 'duration': 2.701}, {'end': 3077.014, 'text': 'so we can just say table and then the type.', 'start': 3073.992, 'duration': 3.022}, {'end': 3084.759, 'text': "so let's say string and we're going to want a listing, a title for our listing.", 'start': 3077.014, 'duration': 7.745}, {'end': 3095.06, 'text': "so let's say title, all right, and then we're going to copy this down a bunch of times and we want, in addition to title, we're going to want tags.", 'start': 3084.759, 'duration': 10.301}], 'summary': 'Creating a listings table with fields like title and tags.', 'duration': 38.217, 'max_score': 3056.843, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY3056843.jpg'}, {'end': 3262.943, 'src': 'heatmap', 'start': 3104.705, 'weight': 0.735, 'content': [{'end': 3107.286, 'text': 'string and email.', 'start': 3104.705, 'duration': 2.581}, {'end': 3110.188, 'text': "so that's going to be the contact email website.", 'start': 3107.286, 'duration': 2.902}, {'end': 3114.31, 'text': 'maybe they have an application on their website and description.', 'start': 3110.188, 'duration': 4.122}, {'end': 3118.049, 'text': 'Now description is going to be longer.', 'start': 3116.348, 'duration': 1.701}, {'end': 3121.992, 'text': "So instead of string, we're going to use long text for that.", 'start': 3118.189, 'duration': 3.803}, {'end': 3124.414, 'text': "That'll allow for more characters.", 'start': 3122.052, 'duration': 2.362}, {'end': 3127.737, 'text': "And also later on, we're going to add to this.", 'start': 3125.475, 'duration': 2.262}, {'end': 3131.66, 'text': "We're going to add a logo field, which is going to be the location of an image,", 'start': 3127.797, 'duration': 3.863}, {'end': 3138.425, 'text': 'because we will have the functionality to upload images or upload a logo to a gig or a listing.', 'start': 3131.66, 'duration': 6.765}, {'end': 3140.346, 'text': 'But this is all we need for now.', 'start': 3139.005, 'duration': 1.341}, {'end': 3141.287, 'text': "So let's save it.", 'start': 3140.427, 'duration': 0.86}, {'end': 3151.229, 'text': 'And now if we open up our terminal here, the way that we can because nothing has been done to the database yet.', 'start': 3142.268, 'duration': 8.961}, {'end': 3153.75, 'text': "Right There's no tables added, nothing.", 'start': 3151.329, 'duration': 2.421}, {'end': 3156.692, 'text': 'We need to actually run the migrate command to do that.', 'start': 3154.11, 'duration': 2.582}, {'end': 3164.577, 'text': "And when we run migrate, it's going to run all the migrations that are in that folder, including the users table, including the listings, all that.", 'start': 3156.732, 'duration': 7.845}, {'end': 3166.318, 'text': "So let's go ahead and try it.", 'start': 3165.157, 'duration': 1.161}, {'end': 3170.1, 'text': "So PHP artisan and we're going to run migrate.", 'start': 3166.398, 'duration': 3.702}, {'end': 3173.612, 'text': 'OK, so no errors.', 'start': 3171.872, 'duration': 1.74}, {'end': 3174.153, 'text': "That's good.", 'start': 3173.652, 'duration': 0.501}, {'end': 3176.293, 'text': "Let's I'm going to check it now.", 'start': 3174.293, 'duration': 2}, {'end': 3178.393, 'text': 'You can open up like PHP admin.', 'start': 3176.353, 'duration': 2.04}, {'end': 3182.874, 'text': "I'm going to use workbench in a few minutes, but we can check it through here as well.", 'start': 3178.774, 'duration': 4.1}, {'end': 3184.935, 'text': "So let's say it's a MySQL.", 'start': 3182.934, 'duration': 2.001}, {'end': 3186.495, 'text': 'I want to open.', 'start': 3185.715, 'duration': 0.78}, {'end': 3190.596, 'text': 'I want to use the user Brad and enter my password.', 'start': 3186.515, 'duration': 4.081}, {'end': 3193.557, 'text': "OK, and let's say.", 'start': 3190.616, 'duration': 2.941}, {'end': 3199.585, 'text': "I'm going to say use and then the name of my database, which is Lara gigs.", 'start': 3195.083, 'duration': 4.502}, {'end': 3200.685, 'text': 'All right.', 'start': 3200.365, 'duration': 0.32}, {'end': 3202.326, 'text': "And then I'm going to say show.", 'start': 3200.825, 'duration': 1.501}, {'end': 3205.788, 'text': "Let's say show tables.", 'start': 3203.887, 'duration': 1.901}, {'end': 3214.931, 'text': 'OK, so now we can see all the tables, including users, including all this other stuff that came with Laravel and our listings table.', 'start': 3207.088, 'duration': 7.843}, {'end': 3216.212, 'text': 'All right.', 'start': 3214.951, 'duration': 1.261}, {'end': 3217.813, 'text': "And obviously there's nothing there.", 'start': 3216.332, 'duration': 1.481}, {'end': 3219.453, 'text': 'I mean, we could say select.', 'start': 3217.833, 'duration': 1.62}, {'end': 3223.175, 'text': 'Say select all from.', 'start': 3221.134, 'duration': 2.041}, {'end': 3234.432, 'text': "uh, listings, and it's empty, of course, but we know that the migration worked out, so let's exit that now.", 'start': 3224.68, 'duration': 9.752}, {'end': 3244.776, 'text': "we should probably talk about seeding data and factories, because that's how we can quickly get stuff in the database, just to test things with.", 'start': 3234.432, 'duration': 10.344}, {'end': 3251.179, 'text': "So if we look in the database folder, there's a seeders folder and there's this database seeder file.", 'start': 3245.337, 'duration': 5.842}, {'end': 3256.701, 'text': 'So this will run if we run php artisan db colon seed.', 'start': 3251.899, 'duration': 4.802}, {'end': 3262.943, 'text': "And by default, so you see there's this run method, and by default there's this factory, this user's factory.", 'start': 3257.341, 'duration': 5.602}], 'summary': 'Developing a database schema with long text description and image upload functionality using laravel. migrations and seeding data for testing.', 'duration': 158.238, 'max_score': 3104.705, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY3104705.jpg'}, {'end': 3732.257, 'src': 'heatmap', 'start': 3414.146, 'weight': 0.706, 'content': [{'end': 3419.488, 'text': "I think there's even a VS Code extension where you can see the data in your SQLite database.", 'start': 3414.146, 'duration': 5.342}, {'end': 3421.409, 'text': 'So you can you can use that if you want.', 'start': 3419.548, 'duration': 1.861}, {'end': 3427.712, 'text': "So what's the one I use? I think it's SQLite Explorer or something like that.", 'start': 3422.967, 'duration': 4.745}, {'end': 3434.54, 'text': "But anyway, so what I'd like to do is be able to seed some listings.", 'start': 3428.533, 'duration': 6.007}, {'end': 3442.248, 'text': "We don't even need these users now to get rid of these users to basically to refresh the database.", 'start': 3435.361, 'duration': 6.887}, {'end': 3443.87, 'text': 'I could comment this back out.', 'start': 3442.408, 'duration': 1.462}, {'end': 3456.459, 'text': "And actually, we don't even have to comment it out, but let's run PHP and we want to run migrate, migrate colon refresh.", 'start': 3445.974, 'duration': 10.485}, {'end': 3461.221, 'text': 'So if I do that, whoops, sorry, PHP artisan.', 'start': 3457.48, 'duration': 3.741}, {'end': 3469.185, 'text': "My great refresh now that's going to just run the migrations again, and this should be cleared out.", 'start': 3462.962, 'duration': 6.223}, {'end': 3476.071, 'text': "So if I refresh this somehow, how do I refresh this? Let's say refresh all.", 'start': 3469.265, 'duration': 6.806}, {'end': 3480.24, 'text': 'And click that again.', 'start': 3476.091, 'duration': 4.149}, {'end': 3482.866, 'text': "And now you can see there's no users in the database.", 'start': 3480.26, 'duration': 2.606}, {'end': 3486.333, 'text': 'right. so anytime you want to refresh, you can do that now.', 'start': 3483.971, 'duration': 2.362}, {'end': 3491.658, 'text': 'you can also refresh and run the seeder and you can do that by.', 'start': 3486.333, 'duration': 5.325}, {'end': 3493.96, 'text': "i'm actually going to uncomment this.", 'start': 3491.658, 'duration': 2.302}, {'end': 3496.022, 'text': 'you can do that by the same command.', 'start': 3493.96, 'duration': 2.062}, {'end': 3503.068, 'text': 'we just did migrate refresh, but then you can do dash, dash seed and it will refresh and seed.', 'start': 3496.022, 'duration': 7.046}, {'end': 3508.053, 'text': "so if i go ahead and refresh this again and click this icon, now there's 10 more users.", 'start': 3503.068, 'duration': 4.985}, {'end': 3511.952, 'text': "Now I'd like to make it so that we can seed some listings.", 'start': 3509.028, 'duration': 2.924}, {'end': 3516.077, 'text': "However, the model we have, we don't want to keep this model.", 'start': 3512.452, 'duration': 3.625}, {'end': 3522.525, 'text': 'We want an eloquent model, which will have a whole bunch of methods like this, like all and find and so on.', 'start': 3516.117, 'duration': 6.408}, {'end': 3527.151, 'text': "So what we're going to do is just completely delete this listing.", 'start': 3522.986, 'duration': 4.165}, {'end': 3529.993, 'text': 'uh, this this model of listing.', 'start': 3528.092, 'duration': 1.901}, {'end': 3535.154, 'text': "and then we're going to create a model with php artisan.", 'start': 3529.993, 'duration': 5.161}, {'end': 3545.658, 'text': "so let's say artisan, make colon model and we want to call it listing and you'll see if we run that it creates a listing.php.", 'start': 3535.154, 'duration': 10.504}, {'end': 3548.759, 'text': "now this class itself doesn't have anything in it.", 'start': 3545.658, 'duration': 3.101}, {'end': 3551.58, 'text': "it doesn't have any methods, but it extends model.", 'start': 3548.759, 'duration': 2.821}, {'end': 3553.961, 'text': 'okay. so we have.', 'start': 3551.58, 'duration': 2.381}, {'end': 3556.502, 'text': 'if you look at the side here, look how big this file is.', 'start': 3553.961, 'duration': 2.541}, {'end': 3560.277, 'text': 'So we have all of these.', 'start': 3557.535, 'duration': 2.742}, {'end': 3566.603, 'text': "you know all these methods that do all kinds of things and we don't have to really touch this file much.", 'start': 3560.277, 'duration': 6.326}, {'end': 3570.746, 'text': "I mean, when we add relationships and stuff, this this there's a couple of things to add.", 'start': 3566.663, 'duration': 4.083}, {'end': 3574.929, 'text': "But for the most part, we don't have to really do much to the model.", 'start': 3570.826, 'duration': 4.103}, {'end': 3577.832, 'text': 'And if we come back to our site.', 'start': 3575.77, 'duration': 2.062}, {'end': 3581.658, 'text': "Let's close the cheat sheet up.", 'start': 3580.177, 'duration': 1.481}, {'end': 3591.361, 'text': "If we come back here and I reload, we don't get any errors or anything, because if I go back to our view, so our web.php,", 'start': 3581.678, 'duration': 9.683}, {'end': 3592.901, 'text': "there's nothing we have to change here.", 'start': 3591.361, 'duration': 1.54}, {'end': 3595.282, 'text': 'All is actually part of Eloquent.', 'start': 3593.221, 'duration': 2.061}, {'end': 3600.784, 'text': "So we can actually click on it and you'll see that it actually gets all the queries.", 'start': 3595.602, 'duration': 5.182}, {'end': 3602.43, 'text': 'All right.', 'start': 3602.13, 'duration': 0.3}, {'end': 3603.291, 'text': 'So really cool.', 'start': 3602.47, 'duration': 0.821}, {'end': 3613.415, 'text': 'So if we did have listings in the database, they would they would show here because all and find are both valid, you know, valid methods.', 'start': 3604.011, 'duration': 9.404}, {'end': 3620.958, 'text': "So let's now go back to our database folder here and in the Cedars.", 'start': 3614.295, 'duration': 6.663}, {'end': 3628.182, 'text': "I'm going to show you first how we can just add some static data with our seeder.", 'start': 3622.259, 'duration': 5.923}, {'end': 3633.945, 'text': "And then I'm going to show you how we can actually create a listing factory and use Faker, much like the user does.", 'start': 3628.342, 'duration': 5.603}, {'end': 3638.847, 'text': "Now, I have a file called data.php, which I'm going to just put in the root here.", 'start': 3634.485, 'duration': 4.362}, {'end': 3641.709, 'text': "And it's not going to be used by our app in any way.", 'start': 3639.248, 'duration': 2.461}, {'end': 3645.331, 'text': "It's just some sample data, some sample listings that we can use.", 'start': 3641.769, 'duration': 3.562}, {'end': 3647.452, 'text': "So I'm going to grab this first item.", 'start': 3645.711, 'duration': 1.741}, {'end': 3650.278, 'text': 'with the brackets here, just copy that.', 'start': 3648.356, 'duration': 1.922}, {'end': 3659.689, 'text': "And in our Cedar I'm going to go under where we bring in the users and let's take the listing model and we're going to call the create method,", 'start': 3651.099, 'duration': 8.59}, {'end': 3662.331, 'text': 'which obviously creates in the database.', 'start': 3659.689, 'duration': 2.642}, {'end': 3666.076, 'text': "That's going to take in that item that I just copied.", 'start': 3662.692, 'duration': 3.384}, {'end': 3668.077, 'text': 'now we need to bring in the model.', 'start': 3666.616, 'duration': 1.461}, {'end': 3672.098, 'text': 'we could do this app models, user, or we could just import the class.', 'start': 3668.077, 'duration': 4.021}, {'end': 3676.679, 'text': 'okay, so now you can see that the listing model is being brought in.', 'start': 3672.098, 'duration': 4.581}, {'end': 3677.76, 'text': "we're going to call create.", 'start': 3676.679, 'duration': 1.081}, {'end': 3679.58, 'text': "it's going to create this one item.", 'start': 3677.76, 'duration': 1.82}, {'end': 3682.601, 'text': "now i want to create two, so i'm just going to grab that.", 'start': 3679.58, 'duration': 3.021}, {'end': 3683.802, 'text': "actually i'm not going to grab it.", 'start': 3682.601, 'duration': 1.201}, {'end': 3692.204, 'text': "we'll just do listing, create, because we're going to copy it from from that data right here, data php.", 'start': 3683.802, 'duration': 8.402}, {'end': 3698.825, 'text': "we'll just grab the second item here and copy that and put that in there.", 'start': 3692.204, 'duration': 6.621}, {'end': 3703.106, 'text': "so now, when we run seed, it's going to create 10 users and you can change this.", 'start': 3698.825, 'duration': 4.281}, {'end': 3710.007, 'text': "we could do like five users and then it's going to manually create these two listings with our hard-coded data.", 'start': 3703.106, 'duration': 6.901}, {'end': 3711.027, 'text': "so let's try it out.", 'start': 3710.007, 'duration': 1.02}, {'end': 3711.987, 'text': "i'm going to come down here.", 'start': 3711.027, 'duration': 0.96}, {'end': 3715.988, 'text': "we're going to run the same thing migrate, refresh, dash, dash seed.", 'start': 3711.987, 'duration': 4.001}, {'end': 3717.068, 'text': 'make sure you do the seeder.', 'start': 3715.988, 'duration': 1.08}, {'end': 3719.169, 'text': "it's not going to add the data.", 'start': 3717.068, 'duration': 2.101}, {'end': 3720.789, 'text': 'so we get database seeded.', 'start': 3719.169, 'duration': 1.62}, {'end': 3724.642, 'text': 'uh, database seating completed successfully.', 'start': 3720.789, 'duration': 3.853}, {'end': 3732.257, 'text': "So now I'm going to open up a workbench here and for this is the users right here.", 'start': 3724.662, 'duration': 7.595}], 'summary': 'Using vs code extension to manage sqlite database, refreshing database with migrations, and seeding listings with eloquent model and static data.', 'duration': 318.111, 'max_score': 3414.146, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY3414146.jpg'}, {'end': 3794.34, 'src': 'embed', 'start': 3770.003, 'weight': 2, 'content': [{'end': 3777.266, 'text': "now the what i'm going to do now is is completely optional, but i'm going to show you how we can create our own factory,", 'start': 3770.003, 'duration': 7.263}, {'end': 3779.467, 'text': 'just like we have a user factory.', 'start': 3777.266, 'duration': 2.201}, {'end': 3791.355, 'text': "so down here in the terminal, let's say php, artisan, and we're going to say make Factory and let's call this listing.", 'start': 3779.467, 'duration': 11.888}, {'end': 3794.34, 'text': "Yeah, we'll call it listing factory.", 'start': 3792.177, 'duration': 2.163}], 'summary': 'Optional: demonstrating creation of a custom factory for listings', 'duration': 24.337, 'max_score': 3770.003, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY3770003.jpg'}, {'end': 3932.145, 'src': 'embed', 'start': 3892.317, 'weight': 1, 'content': [{'end': 3894.059, 'text': "And we'll just copy this down a little bit.", 'start': 3892.317, 'duration': 1.742}, {'end': 3904.085, 'text': "So then we also have email and there's actually a company email method that we can use.", 'start': 3894.759, 'duration': 9.326}, {'end': 3904.786, 'text': 'Just cool.', 'start': 3904.325, 'duration': 0.461}, {'end': 3906.427, 'text': "Let's see.", 'start': 3906.047, 'duration': 0.38}, {'end': 3913.832, 'text': "Website So website and there's a method called URL.", 'start': 3906.527, 'duration': 7.305}, {'end': 3918.157, 'text': 'And then what else do we have? Location.', 'start': 3915.956, 'duration': 2.201}, {'end': 3921.939, 'text': 'So location.', 'start': 3918.177, 'duration': 3.762}, {'end': 3925.882, 'text': "And there's a city that we can generate.", 'start': 3922.14, 'duration': 3.742}, {'end': 3927.523, 'text': 'And then description.', 'start': 3926.042, 'duration': 1.481}, {'end': 3932.145, 'text': 'Now description is going to be longer.', 'start': 3929.064, 'duration': 3.081}], 'summary': 'Introduction to different methods including email, website, location, and description.', 'duration': 39.828, 'max_score': 3892.317, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY3892317.jpg'}, {'end': 4012.272, 'src': 'embed', 'start': 3983.632, 'weight': 0, 'content': [{'end': 3987.573, 'text': "yeah, so same thing that we did up here, and we'll save that.", 'start': 3983.632, 'duration': 3.941}, {'end': 3992.454, 'text': "and now let's run the same command, the migrate refresh seed.", 'start': 3987.573, 'duration': 4.881}, {'end': 3997.375, 'text': "let's run that and if i come over here and reload now we have six entries.", 'start': 3992.454, 'duration': 4.921}, {'end': 3999.426, 'text': 'OK, and the title.', 'start': 3998.385, 'duration': 1.041}, {'end': 4003.428, 'text': "like I said, this stuff is going to look weird, but it's going to add it.", 'start': 3999.426, 'duration': 4.002}, {'end': 4006.469, 'text': 'You know, we can get six entries really quick.', 'start': 4003.488, 'duration': 2.981}, {'end': 4012.272, 'text': "And then this it's only going to show the description and the title because that's all we put in the template.", 'start': 4007.449, 'duration': 4.823}], 'summary': "Executing 'migrate refresh seed' command resulted in six entries being added, displaying only description and title.", 'duration': 28.64, 'max_score': 3983.632, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY3983632.jpg'}, {'end': 4193.809, 'src': 'heatmap', 'start': 4036.456, 'weight': 0.726, 'content': [{'end': 4041.598, 'text': 'you know, build out the layout now, before we open up the theme and start bringing in.', 'start': 4036.456, 'duration': 5.142}, {'end': 4045.519, 'text': 'you know all the html and and the tailwind classes and all that.', 'start': 4041.598, 'duration': 3.921}, {'end': 4053.963, 'text': 'i first want to show you how we can create a layout, because obviously, when you have your html head, you have your menu and stuff like that.', 'start': 4045.519, 'duration': 8.444}, {'end': 4060.505, 'text': "that's going to be on every page, the footer, That stuff is going to go in your layout and then you're going to show your views,", 'start': 4053.963, 'duration': 6.542}, {'end': 4064.226, 'text': 'depending on what the URL is inside of that layout.', 'start': 4060.505, 'duration': 3.721}, {'end': 4071.168, 'text': "So what we'll do now is in views, let's create a layout.blade.php file.", 'start': 4064.666, 'duration': 6.502}, {'end': 4077.71, 'text': "And like I said, we're going to deal with the theme in a little bit, in a few minutes.", 'start': 4072.129, 'duration': 5.581}, {'end': 4082.692, 'text': "But for now, let's just put like a basic wrapper here, a basic template.", 'start': 4077.77, 'duration': 4.922}, {'end': 4085.993, 'text': "And I don't know, we'll just say, we'll say lara gigs.", 'start': 4083.452, 'duration': 2.541}, {'end': 4089.152, 'text': "Ultimately, we're going to copy from the theme.", 'start': 4087.051, 'duration': 2.101}, {'end': 4091.393, 'text': "But for now, let's take that.", 'start': 4089.212, 'duration': 2.181}, {'end': 4093.954, 'text': 'And what I want to do is render.', 'start': 4092.113, 'duration': 1.841}, {'end': 4098.697, 'text': "Let's just put an H1 here and we'll say Lara gigs.", 'start': 4093.974, 'duration': 4.723}, {'end': 4101.997, 'text': 'And I want to render my my view here.', 'start': 4098.957, 'duration': 3.04}, {'end': 4106, 'text': 'Right So this is where my view should output.', 'start': 4102.318, 'duration': 3.682}, {'end': 4109.122, 'text': 'So here I want to use the yield directive.', 'start': 4106.52, 'duration': 2.602}, {'end': 4111.563, 'text': "So I'm going to say yield and then content.", 'start': 4109.142, 'duration': 2.421}, {'end': 4115.211, 'text': 'OK, now my views.', 'start': 4112.95, 'duration': 2.261}, {'end': 4124.194, 'text': 'I want to extend this layout and put my view here so that all this, so this stuff, is all around it, which would be like your style sheet,', 'start': 4115.211, 'duration': 8.983}, {'end': 4125.174, 'text': 'anything in the head.', 'start': 4124.194, 'duration': 0.98}, {'end': 4131.276, 'text': 'You could have your menu here as well, anything you want on every page and then in the individual views.', 'start': 4125.514, 'duration': 5.762}, {'end': 4136.518, 'text': "So let's go to listings and up here we can now say extends.", 'start': 4131.356, 'duration': 5.162}, {'end': 4138.479, 'text': 'We want to extend the layout.', 'start': 4136.837, 'duration': 1.642}, {'end': 4142.843, 'text': 'then we want to wrap this in a section directive.', 'start': 4139.622, 'duration': 3.221}, {'end': 4146.625, 'text': "so we'll say section and the section is going to be the content.", 'start': 4142.843, 'duration': 3.782}, {'end': 4149.206, 'text': 'so whatever this is should match this.', 'start': 4146.625, 'duration': 2.581}, {'end': 4153.008, 'text': 'okay. so both content and then we also want to end the section.', 'start': 4149.206, 'duration': 3.802}, {'end': 4160.106, 'text': "So and section, and later on I'm going to show you how we can use components and we can actually use.", 'start': 4154.863, 'duration': 5.243}, {'end': 4165.448, 'text': 'we can make our layout a component, which makes it easier to extend without having to do this, you know.', 'start': 4160.106, 'duration': 5.342}, {'end': 4168.129, 'text': "But for now, we'll do it this way.", 'start': 4166.149, 'duration': 1.98}, {'end': 4177.013, 'text': "And if I reload, we should now see you can see we have a title up here and we see the H1 of Lara gigs because that's what's in our layout.", 'start': 4168.71, 'duration': 8.303}, {'end': 4180.194, 'text': "And then let's do the same thing with the listing view.", 'start': 4177.453, 'duration': 2.741}, {'end': 4181.854, 'text': "So I'm going to copy those two lines.", 'start': 4180.254, 'duration': 1.6}, {'end': 4184.691, 'text': "And we're going to paste that in here.", 'start': 4183.107, 'duration': 1.584}, {'end': 4186.854, 'text': 'And then we just want to end our section.', 'start': 4184.81, 'duration': 2.044}, {'end': 4191.926, 'text': 'And now if I go to the listing view, same thing, we have the title.', 'start': 4186.875, 'duration': 5.051}, {'end': 4193.809, 'text': 'So we have that layout wrapper.', 'start': 4192.006, 'duration': 1.803}], 'summary': 'Creating a layout with a wrapper and rendering views using yield directive.', 'duration': 157.353, 'max_score': 4036.456, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY4036456.jpg'}, {'end': 4342.612, 'src': 'embed', 'start': 4313.771, 'weight': 4, 'content': [{'end': 4319.055, 'text': "so yeah, that's what this is going to look like now, as far as the files go here.", 'start': 4313.771, 'duration': 5.284}, {'end': 4322.417, 'text': "the first thing we should do, let's just take this step by step.", 'start': 4319.055, 'duration': 3.362}, {'end': 4328.441, 'text': "so there's a couple images like the logo, the um, this laravel logo.", 'start': 4322.417, 'duration': 6.024}, {'end': 4336.486, 'text': "this is a background image for the hero, and then this is what i'm using when listings don't have an image will just be the laravel logo.", 'start': 4328.441, 'duration': 8.045}, {'end': 4342.612, 'text': "So let's go over here and you'll see there's a public folder and that's going to be our public assets.", 'start': 4337.25, 'duration': 5.362}], 'summary': 'Setting up public assets including logo and background image for hero section in laravel.', 'duration': 28.841, 'max_score': 4313.771, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY4313771.jpg'}], 'start': 2625.498, 'title': 'Database setup and website layout integration', 'summary': 'Discusses setting up mysql database, configuring databases and users in laravel, database migration and seeding, creating database seeders and listing factories, and integrating website layout and theme, with a total of 16 entries in the database.', 'chapters': [{'end': 2675.911, 'start': 2625.498, 'title': 'Setting up mysql database', 'summary': 'Discusses setting up a mysql database, outlining different methods for installation including using xampp, downloading the installer for windows, and installing it with homebrew for mac.', 'duration': 50.413, 'highlights': ['You can download the installer for Windows from MySQL.com by going to Community Downloads and installing separately if not using XAMPP.', "For Mac users, MySQL can be installed with Homebrew by using the command 'brew.com install MySQL'.", 'If using XAMPP, MySQL is pre-installed on the machine.']}, {'end': 3131.66, 'start': 2675.911, 'title': 'Setting up database and user in laravel', 'summary': 'Discusses setting up a database in laravel, including options for mysql and sqlite, creating a new user, granting privileges, creating a new database, utilizing migrations, and creating a migration for listings.', 'duration': 455.749, 'highlights': ['Options for MySQL and SQLite The speaker explains the options for MySQL and SQLite for setting up the database, providing flexibility for users.', 'Creating a new user and granting privileges The speaker demonstrates the process of creating a new user and granting privileges, offering practical guidance for users who need to set up new users in the database.', 'Utilizing migrations in Laravel The discussion emphasizes the use of migrations in Laravel to create and modify database tables, showcasing the efficiency and convenience of this approach for developers.']}, {'end': 3603.291, 'start': 3131.66, 'title': 'Database migration and seeding in laravel', 'summary': 'Covers the process of database migration, including running migrations to create tables and seeding data using factories, as well as creating eloquent models, resulting in a refreshed database with 10 dummy users and the ability to seed listings in laravel.', 'duration': 471.631, 'highlights': ['The chapter covers the process of database migration, including running migrations to create tables and seeding data using factories. The transcript explains the process of running migrations in Laravel to create tables and seeding data using factories to quickly populate the database.', 'Resulting in a refreshed database with 10 dummy users and the ability to seed listings in Laravel. After running migrations and seeding data using factories, the database is refreshed with 10 dummy users and the ability to seed listings in Laravel.', 'Creating Eloquent models, resulting in a refreshed database with 10 dummy users and the ability to seed listings in Laravel. The process involves creating Eloquent models to replace existing models, resulting in a refreshed database with 10 dummy users and the ability to seed listings in Laravel.']}, {'end': 4033.594, 'start': 3604.011, 'title': 'Database seeder and listing factory', 'summary': 'Covers creating static data with a seeder, manually creating listings in the database, and creating a listing factory using faker, resulting in 6 entries in the database.', 'duration': 429.583, 'highlights': ['The chapter covers creating a seeder to add static data to the database and manually creating listings, resulting in 2 hard-coded listings and 5 users in the database.', 'It explains the process of creating a listing factory using Faker, which results in 6 entries in the database with titles, tags, company, location, description, and other fields.', 'The process involves creating a public function definition in the listing factory, using Faker to generate data for fields like title, tags, company, location, email, website, and description.']}, {'end': 4360.199, 'start': 4033.594, 'title': 'Building website layout and theme integration', 'summary': "Covers creating a layout for the website using blade, incorporating the theme's html and css into the views and layout, and setting up public assets like images within the public folder.", 'duration': 326.605, 'highlights': ['Blade layout creation and usage Demonstrates creating a layout.blade.php file, using the yield directive to render views within the layout, and explaining the purpose of layout for elements to be displayed on every page.', "Integrating theme's HTML and CSS into views and layout Describes the process of integrating the HTML and CSS from the theme into the views and layout, emphasizing the need for precision to avoid visual discrepancies and the use of components for easier extension.", 'Setting up public assets Guides through the process of creating a folder for public assets, specifically images, within the public directory, and instructions for placing logo and background images in the images folder.']}], 'duration': 1734.701, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY2625498.jpg', 'highlights': ['The chapter covers the process of database migration, including running migrations to create tables and seeding data using factories. The transcript explains the process of running migrations in Laravel to create tables and seeding data using factories to quickly populate the database.', 'Creating a new user and granting privileges The speaker demonstrates the process of creating a new user and granting privileges, offering practical guidance for users who need to set up new users in the database.', 'Options for MySQL and SQLite The speaker explains the options for MySQL and SQLite for setting up the database, providing flexibility for users.', 'Blade layout creation and usage Demonstrates creating a layout.blade.php file, using the yield directive to render views within the layout, and explaining the purpose of layout for elements to be displayed on every page.', 'The chapter covers creating a seeder to add static data to the database and manually creating listings, resulting in 2 hard-coded listings and 5 users in the database.']}, {'end': 5699.153, 'segs': [{'end': 5326.154, 'src': 'embed', 'start': 5272.458, 'weight': 8, 'content': [{'end': 5283.192, 'text': "so what i'll do is copy this return right here and just replace all this right, so that all we have is, you know, loading our view,", 'start': 5272.458, 'duration': 10.734}, {'end': 5284.293, 'text': 'passing in the listing.', 'start': 5283.192, 'duration': 1.101}, {'end': 5287.077, 'text': 'This is coming from here, from this function.', 'start': 5284.814, 'duration': 2.263}, {'end': 5291.283, 'text': 'So now if I go over here and reload, we still get the 404.', 'start': 5287.898, 'duration': 3.385}, {'end': 5295.548, 'text': 'And if I go to a listing that actually does exist, then that works.', 'start': 5291.283, 'duration': 4.265}, {'end': 5297.331, 'text': 'Okay, so much cleaner.', 'start': 5296.229, 'duration': 1.102}, {'end': 5300.732, 'text': 'Now, I think what we should do next is look at components.', 'start': 5298.109, 'duration': 2.623}, {'end': 5303.535, 'text': "So I'm going to close up the view for now.", 'start': 5301.112, 'duration': 2.423}, {'end': 5310.121, 'text': "I'm sorry, the routes for now, the single listing page and in the we'll close the layout, too.", 'start': 5303.575, 'duration': 6.546}, {'end': 5311.743, 'text': 'But in the listings.', 'start': 5310.602, 'duration': 1.141}, {'end': 5317.188, 'text': 'Right So this page here, I want each of these to be a component.', 'start': 5312.183, 'duration': 5.005}, {'end': 5326.154, 'text': "so we have the grid right here and then we're looping through the listings and then this here is what we're.", 'start': 5318.289, 'duration': 7.865}], 'summary': 'Refactoring code to use components for better organization and functionality.', 'duration': 53.696, 'max_score': 5272.458, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY5272458.jpg'}, {'end': 5566.972, 'src': 'heatmap', 'start': 5272.458, 'weight': 1, 'content': [{'end': 5283.192, 'text': "so what i'll do is copy this return right here and just replace all this right, so that all we have is, you know, loading our view,", 'start': 5272.458, 'duration': 10.734}, {'end': 5284.293, 'text': 'passing in the listing.', 'start': 5283.192, 'duration': 1.101}, {'end': 5287.077, 'text': 'This is coming from here, from this function.', 'start': 5284.814, 'duration': 2.263}, {'end': 5291.283, 'text': 'So now if I go over here and reload, we still get the 404.', 'start': 5287.898, 'duration': 3.385}, {'end': 5295.548, 'text': 'And if I go to a listing that actually does exist, then that works.', 'start': 5291.283, 'duration': 4.265}, {'end': 5297.331, 'text': 'Okay, so much cleaner.', 'start': 5296.229, 'duration': 1.102}, {'end': 5300.732, 'text': 'Now, I think what we should do next is look at components.', 'start': 5298.109, 'duration': 2.623}, {'end': 5303.535, 'text': "So I'm going to close up the view for now.", 'start': 5301.112, 'duration': 2.423}, {'end': 5310.121, 'text': "I'm sorry, the routes for now, the single listing page and in the we'll close the layout, too.", 'start': 5303.575, 'duration': 6.546}, {'end': 5311.743, 'text': 'But in the listings.', 'start': 5310.602, 'duration': 1.141}, {'end': 5317.188, 'text': 'Right So this page here, I want each of these to be a component.', 'start': 5312.183, 'duration': 5.005}, {'end': 5326.154, 'text': "so we have the grid right here and then we're looping through the listings and then this here is what we're.", 'start': 5318.289, 'duration': 7.865}, {'end': 5327.115, 'text': 'each one of these are.', 'start': 5326.154, 'duration': 0.961}, {'end': 5329.356, 'text': 'so i want this to be a component.', 'start': 5327.115, 'duration': 2.241}, {'end': 5337.781, 'text': "so what we can do is grab this div right here and let's cut that, and then in the views folder,", 'start': 5329.356, 'duration': 8.425}, {'end': 5340.263, 'text': "we're going to create another folder called components.", 'start': 5337.781, 'duration': 2.482}, {'end': 5347.928, 'text': "Okay, and then in components, let's create a new file here and we'll call this.", 'start': 5342.884, 'duration': 5.044}, {'end': 5351.471, 'text': "let's call it a listing dash card component.", 'start': 5347.928, 'duration': 3.543}, {'end': 5353.893, 'text': "So it's going to be .blade.php.", 'start': 5351.491, 'duration': 2.402}, {'end': 5359.737, 'text': "All right, and then here I'm going to go ahead and paste this in.", 'start': 5355.494, 'duration': 4.243}, {'end': 5366.223, 'text': 'Now we need access to listing, right? So this component is actually going to take in a prop.', 'start': 5360.298, 'duration': 5.925}, {'end': 5368.682, 'text': 'And we define our props up here.', 'start': 5366.94, 'duration': 1.742}, {'end': 5369.943, 'text': 'We say at props.', 'start': 5368.722, 'duration': 1.221}, {'end': 5374.607, 'text': 'And then we can pass in here an array of props.', 'start': 5370.743, 'duration': 3.864}, {'end': 5376.108, 'text': 'And we want the listing prop.', 'start': 5374.647, 'duration': 1.461}, {'end': 5377.47, 'text': "That's going to be passed in.", 'start': 5376.148, 'duration': 1.322}, {'end': 5385.277, 'text': 'So back in our listings, in this for each, the way we can access that component is like this.', 'start': 5378.631, 'duration': 6.646}, {'end': 5391.522, 'text': 'We can say x dash and then the name of the component, which is listing dash card.', 'start': 5385.317, 'duration': 6.205}, {'end': 5393.224, 'text': 'And we can end it like that.', 'start': 5392.043, 'duration': 1.181}, {'end': 5400.301, 'text': 'Now, if I wanted to pass in just like a regular string, I could say listing and, you know, I could do this.', 'start': 5393.993, 'duration': 6.308}, {'end': 5412.076, 'text': 'However, since I want to pass in a variable like that listing, then to bind that to this this prop, we have to add this colon right here.', 'start': 5400.822, 'duration': 11.254}, {'end': 5417.884, 'text': "So if you're going to pass in a variable, then you want to have this prefix with a colon.", 'start': 5412.096, 'duration': 5.788}, {'end': 5419.606, 'text': "So let's go ahead and save that.", 'start': 5418.405, 'duration': 1.201}, {'end': 5421.509, 'text': "Let's make sure our component is saved.", 'start': 5419.626, 'duration': 1.883}, {'end': 5422.61, 'text': "And let's reload this.", 'start': 5421.549, 'duration': 1.061}, {'end': 5425.193, 'text': 'And you can see we get the same result.', 'start': 5423.531, 'duration': 1.662}, {'end': 5427.194, 'text': "Now what I'd also like to do.", 'start': 5425.914, 'duration': 1.28}, {'end': 5436.278, 'text': "if we look in the listing card, there's this div with the background gray, the border, the border gray and rounded and padding six.", 'start': 5427.194, 'duration': 9.084}, {'end': 5438.678, 'text': "So that's this right here, this gray background.", 'start': 5436.318, 'duration': 2.36}, {'end': 5443.14, 'text': 'We also have this in some other areas on the listing page.', 'start': 5439.118, 'duration': 4.022}, {'end': 5450.484, 'text': "You can see, it's around this whole thing and uh, we don't have the form set up yet, but those will also have that background.", 'start': 5443.18, 'duration': 7.304}, {'end': 5455.829, 'text': 'so i think what we should do is have a card component that wraps around whatever we want.', 'start': 5450.484, 'duration': 5.345}, {'end': 5463.075, 'text': "so in components in that folder, let's create another file and we'll just call it card dot blade dot php.", 'start': 5455.829, 'duration': 7.246}, {'end': 5471.381, 'text': "And then what we're going to do is take this div, just this div right here and grab that, paste that in close it.", 'start': 5464.556, 'duration': 6.825}, {'end': 5479.866, 'text': "Now, if you want a component where you want to wrap it and have, because with the card we just did it, it's self-closing.", 'start': 5472.321, 'duration': 7.545}, {'end': 5488.331, 'text': 'But if we want to be able to do something like this X card and wrap it and have a closing tag and then put something in it,', 'start': 5480.366, 'duration': 7.965}, {'end': 5489.872, 'text': 'what we can do is use a slot.', 'start': 5488.331, 'duration': 1.541}, {'end': 5490.872, 'text': 'All right.', 'start': 5490.552, 'duration': 0.32}, {'end': 5495.296, 'text': "So inside here, we're just going to have a variable called slot.", 'start': 5490.912, 'duration': 4.384}, {'end': 5500.06, 'text': 'And whatever we pass in, whatever we surround the tags with will be output here.', 'start': 5495.376, 'duration': 4.684}, {'end': 5501.201, 'text': 'All right.', 'start': 5500.9, 'duration': 0.301}, {'end': 5509.327, 'text': "So let me show you if we go back to listing card and we replace this div here with, let's say, X dash card.", 'start': 5501.221, 'duration': 8.106}, {'end': 5513.31, 'text': 'And then we want to make sure that we close it down here.', 'start': 5510.468, 'duration': 2.842}, {'end': 5516.133, 'text': "So let's see, we have.", 'start': 5513.33, 'duration': 2.803}, {'end': 5519.328, 'text': 'that div.', 'start': 5518.166, 'duration': 1.162}, {'end': 5520.349, 'text': 'so this right here.', 'start': 5519.328, 'duration': 1.021}, {'end': 5528.821, 'text': 'we want to get rid of that and we want to have our ending x card and save, and we should have the same thing all right.', 'start': 5520.349, 'duration': 8.472}, {'end': 5531.805, 'text': 'and now we should be also be able to go to our listing page.', 'start': 5528.821, 'duration': 2.984}, {'end': 5535.428, 'text': "So let's go over to views and then listing.", 'start': 5532.867, 'duration': 2.561}, {'end': 5540.691, 'text': "And right here, you can see it's the same kind of thing.", 'start': 5535.448, 'duration': 5.243}, {'end': 5543.113, 'text': 'Now, it does have a little more padding.', 'start': 5541.272, 'duration': 1.841}, {'end': 5547.855, 'text': "So I'm going to show you how we can also we can pass in extra classes if we want.", 'start': 5543.133, 'duration': 4.722}, {'end': 5550.557, 'text': "But let's just get rid of actually this whole thing.", 'start': 5547.875, 'duration': 2.682}, {'end': 5551.917, 'text': 'So this div ends.', 'start': 5551.257, 'duration': 0.66}, {'end': 5554.74, 'text': 'Right here.', 'start': 5554.059, 'duration': 0.681}, {'end': 5557.243, 'text': "Right It's a second to last div, I believe.", 'start': 5555.08, 'duration': 2.163}, {'end': 5559.925, 'text': 'Yeah So we have this MX four around it.', 'start': 5557.863, 'duration': 2.062}, {'end': 5566.972, 'text': "So what we'll do is replace this with X dash card and down here that's already replaced for me.", 'start': 5559.985, 'duration': 6.987}], 'summary': 'Refactoring to create components for listings and cards.', 'duration': 139.778, 'max_score': 5272.458, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY5272458.jpg'}, {'end': 5675.684, 'src': 'embed', 'start': 5640.11, 'weight': 0, 'content': [{'end': 5649.775, 'text': "So now what will happen is it'll use these classes by default, but it'll also merge any any other classes, excuse me, any other classes that we add.", 'start': 5640.11, 'duration': 9.665}, {'end': 5653.757, 'text': 'So now if I come over here and reload, it breaks.', 'start': 5650.236, 'duration': 3.521}, {'end': 5655.638, 'text': "Let's see.", 'start': 5654.958, 'duration': 0.68}, {'end': 5662.522, 'text': 'Attributes that I misspell, I did misspell it.', 'start': 5659.7, 'duration': 2.822}, {'end': 5665.178, 'text': 'all right.', 'start': 5664.818, 'duration': 0.36}, {'end': 5666.739, 'text': "so let's try that again.", 'start': 5665.178, 'duration': 1.561}, {'end': 5672.862, 'text': 'and now you can see we have that wide padding, because in the listing i passed in.', 'start': 5666.739, 'duration': 6.123}, {'end': 5675.684, 'text': 'uh, where is it?', 'start': 5672.862, 'duration': 2.822}], 'summary': 'Demonstrating merging of default and added classes for styling.', 'duration': 35.574, 'max_score': 5640.11, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY5640110.jpg'}], 'start': 4360.399, 'title': 'Web development and dynamic content implementation', 'summary': 'Covers working with html files, fixing image display, and implementing dynamic content with laravel. it also explains creating a card component with dynamic styling, achieving functional layouts, and utilizing route model binding for handling 404 functionality.', 'chapters': [{'end': 4655.783, 'start': 4360.399, 'title': 'Html files and web development', 'summary': 'Discusses working with html files in sublime text and vs code, modifying div tags and implementing dynamic content for a listings page in a web project.', 'duration': 295.384, 'highlights': ['Implementing dynamic content for a listings page in a web project The speaker discusses modifying div tags and implementing dynamic content for a listings page, using eloquent models and collections to display dynamic content.', 'Working with HTML files in Sublime Text and VS Code The speaker differentiates between working with HTML files in Sublime Text and VS Code, highlighting the specific contexts for each.', 'Modifying div tags for layout and components The speaker explains the process of modifying div tags for layout, including creating a hero partial and a search form component within the main tag.']}, {'end': 4995.749, 'start': 4657.364, 'title': 'Fixing image display and implementing partials', 'summary': 'Discusses fixing the display of images by using asset helper and implementing partials for the hero section and search form, achieving a functional layout with images and components.', 'duration': 338.385, 'highlights': ['Using asset helper to display public images The speaker suggests using the asset helper to display public images, which can improve the functionality and presentation of the website.', 'Implementing partials for the hero section and search form The chapter explains the process of creating partials for the hero section and search form, enabling their inclusion in the layout and ensuring their presence on specific pages.', 'Fixing the display of images by showing no-image PNG The transcript outlines the process of fixing the display of images by replacing Acme PNG with no-image PNG, ensuring proper visibility on different screen sizes.']}, {'end': 5427.194, 'start': 4995.749, 'title': 'Implementing dynamic content with laravel', 'summary': 'Discusses implementing dynamic content with laravel, including replacing hard-coded elements with dynamic data such as image, title, company name, location, description, contact email, and website. additionally, it explains how to use route model binding to handle 404 functionality and create a component for the listing card.', 'duration': 431.445, 'highlights': ['The chapter discusses implementing dynamic content with Laravel, including replacing hard-coded elements with dynamic data such as image, title, company name, location, description, contact email, and website. dynamic content implementation, replacing hard-coded elements, dynamic data usage, image, title, company name, location, description, contact email, website', 'It explains how to use route model binding to handle 404 functionality and create a component for the listing card. route model binding, 404 functionality handling, listing card component creation']}, {'end': 5699.153, 'start': 5427.194, 'title': 'Creating a card component with dynamic styling', 'summary': 'Discusses creating a card component in a php file with dynamic styling using a slot for wrapping content and the ability to pass in extra classes and attributes, allowing for flexible and customized usage.', 'duration': 271.959, 'highlights': ['Creating a card component in a PHP file with dynamic styling. The speaker suggests creating a card component in a PHP file to wrap around desired content, providing a consistent gray background, border, and padding of six.', 'Utilizing a slot for wrapping content with a closing tag. The speaker explains the use of a slot to enable wrapping content with a closing tag, allowing for flexibility in the usage of the card component.', "Demonstrating the ability to pass in extra classes and attributes for customized usage. The speaker demonstrates passing in extra classes and attributes, such as 'P-10' and 'bg-black', to customize the styling of the card component and tailor it to specific requirements."]}], 'duration': 1338.754, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY4360399.jpg', 'highlights': ['Implementing dynamic content for a listings page using eloquent models and collections', 'Working with HTML files in Sublime Text and VS Code', 'Modifying div tags for layout and components, including creating a hero partial and a search form component', 'Using asset helper to display public images for improved website functionality', 'Implementing partials for the hero section and search form for inclusion in the layout', 'Fixing the display of images by replacing Acme PNG with no-image PNG for proper visibility', 'Implementing dynamic content with Laravel, replacing hard-coded elements with dynamic data', 'Using route model binding to handle 404 functionality and creating a component for the listing card', 'Creating a card component in a PHP file with dynamic styling for consistent presentation', 'Utilizing a slot for wrapping content with a closing tag to enable flexibility', 'Demonstrating the ability to pass in extra classes and attributes for customized usage of the card component']}, {'end': 6536.852, 'segs': [{'end': 6279.707, 'src': 'embed', 'start': 6235.009, 'weight': 3, 'content': [{'end': 6238.431, 'text': 'and then we want to pass in the method name which is going to be show.', 'start': 6235.009, 'duration': 3.422}, {'end': 6243.966, 'text': 'And now, if we save that, hopefully if I reload now, we get the same exact thing.', 'start': 6239.42, 'duration': 4.546}, {'end': 6248.151, 'text': 'We just move the functionality into a controller.', 'start': 6244.627, 'duration': 3.524}, {'end': 6252.416, 'text': 'Now I want to talk a little bit about naming conventions.', 'start': 6249.332, 'duration': 3.084}, {'end': 6254.899, 'text': "So I'm going to paste something in here.", 'start': 6252.997, 'duration': 1.902}, {'end': 6263.579, 'text': 'So when we have a resource like a blog post, a user, a listing, an employee, whatever that resource is,', 'start': 6255.996, 'duration': 7.583}, {'end': 6271.762, 'text': "there's seven common resource routes that we have, routes and methods that we have to deal with those, and they do specific things.", 'start': 6263.579, 'duration': 8.183}, {'end': 6274.304, 'text': 'So we already have index and show.', 'start': 6272.382, 'duration': 1.922}, {'end': 6275.865, 'text': 'Index will show our listings.', 'start': 6274.424, 'duration': 1.441}, {'end': 6278.046, 'text': 'Show will show a single listing.', 'start': 6276.365, 'duration': 1.681}, {'end': 6279.707, 'text': 'We also have create.', 'start': 6278.626, 'duration': 1.081}], 'summary': 'Moving functionality into a controller and discussing naming conventions for resource routes and methods.', 'duration': 44.698, 'max_score': 6235.009, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY6235009.jpg'}, {'end': 6442.152, 'src': 'embed', 'start': 6414.063, 'weight': 5, 'content': [{'end': 6418.167, 'text': 'And then whenever we have a page where we want to use the layout, we have to extend it.', 'start': 6414.063, 'duration': 4.104}, {'end': 6421.41, 'text': 'And then we have this section that wraps around it.', 'start': 6418.647, 'duration': 2.763}, {'end': 6430.078, 'text': "So section and section in a way that I like to do it, that I think is easier, especially if you're going to have a lot of different views,", 'start': 6421.75, 'duration': 8.328}, {'end': 6433.08, 'text': 'a lot of pages, instead of having to keep doing all this.', 'start': 6430.078, 'duration': 3.002}, {'end': 6437.624, 'text': 'Another way to do it is to have your layout be an actual component.', 'start': 6434.121, 'duration': 3.503}, {'end': 6442.152, 'text': "So what I mean is we can take this layout and you don't have to do this.", 'start': 6438.465, 'duration': 3.687}], 'summary': 'Using layout as a component can simplify page creation and management.', 'duration': 28.089, 'max_score': 6414.063, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY6414063.jpg'}, {'end': 6512.861, 'src': 'embed', 'start': 6458.295, 'weight': 0, 'content': [{'end': 6461.278, 'text': 'So if we want to wrap this around something.', 'start': 6458.295, 'duration': 2.983}, {'end': 6468.463, 'text': "So we'll put a slot here and then in the views that we want to use, so in listings we have index and show, instead of..", 'start': 6461.758, 'duration': 6.705}, {'end': 6477.753, 'text': "uh, instead of doing this like extends and then the section and the end section, we'll just wrap the layout component around that.", 'start': 6469.564, 'duration': 8.189}, {'end': 6492.359, 'text': 'so x layout oops, x dash layout and then down here x layout, okay, and then the same thing on the show page.', 'start': 6477.753, 'duration': 14.606}, {'end': 6501.942, 'text': "instead of doing the extends and section, we'll just simply do x layout and down here get rid of that and x layout.", 'start': 6492.359, 'duration': 9.583}, {'end': 6507.297, 'text': 'and now, if i come over and i reload, we should have the same exact thing, right.', 'start': 6501.942, 'duration': 5.355}, {'end': 6512.861, 'text': "so again, it's just another way of doing things this way, anytime you add a new view,", 'start': 6507.297, 'duration': 5.564}], 'summary': 'Implementing layout component to wrap views for improved efficiency.', 'duration': 54.566, 'max_score': 6458.295, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY6458295.jpg'}], 'start': 5699.713, 'title': 'Creating tag listing component and implementing php explode function', 'summary': 'Covers creating a component for listing tags from a comma-separated value list stored in the database, using props to pass the tags and converting them into an array for display. it also discusses the usage of php explode function to split a string into an array by a comma, implementing a tag filtering feature in a web application, and creating a controller for managing listings, as well as demonstrating a different layout approach using components.', 'chapters': [{'end': 5857.383, 'start': 5699.713, 'title': 'Creating listing tags component', 'summary': 'Covers creating a component for listing tags from a comma-separated value list stored in the database, using props to pass the tags and converting them into an array for display.', 'duration': 157.67, 'highlights': ["Creating a component for listing tags The chapter focuses on creating a new component, 'listing-tags.blade.php', to display tags retrieved from the database as an unordered list.", 'Using props to pass tags from the database The instructor explains the use of props to pass the comma-separated value list of tags from the database to the new component for display.', 'Converting comma-separated value list into an array for display The chapter demonstrates the process of converting the comma-separated value list of tags into an array to loop through and display them as individual list items.']}, {'end': 6536.852, 'start': 5857.563, 'title': 'Php explode function and creating a controller', 'summary': 'Discusses the usage of php explode function to split a string into an array by a comma, implementing a tag filtering feature in a web application, and creating a controller for managing listings, as well as demonstrating a different layout approach using components.', 'duration': 679.289, 'highlights': ['The chapter discusses the usage of PHP explode function to split a string into an array by a comma. The speaker explains the process of using the explode function in PHP to split a comma-separated value list into an array, demonstrating the practical application of the function in a web development context.', 'Implementing a tag filtering feature in a web application. The speaker describes the process of implementing a tag filtering feature, allowing users to filter posts or listings by a specific tag, and demonstrates the creation of query parameters for tag filtering, enhancing user experience and functionality of the web application.', 'Creating a controller for managing listings. The speaker guides the audience through the process of creating a listing controller using PHP artisan, highlighting the organization of controllers for different resources, such as listings and users, to efficiently manage functionalities within a web application.', "Demonstrating a different layout approach using components. The speaker demonstrates an alternative layout approach using components, simplifying the process of applying a consistent layout to multiple views, improving maintainability and flexibility of the web application's design."]}], 'duration': 837.139, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY5699713.jpg', 'highlights': ['Creating a component for listing tags from a comma-separated value list stored in the database', 'Using props to pass the tags and converting them into an array for display', 'The chapter discusses the usage of PHP explode function to split a string into an array by a comma', 'Implementing a tag filtering feature in a web application', 'Creating a controller for managing listings', 'Demonstrating a different layout approach using components']}, {'end': 7819.727, 'segs': [{'end': 6839.325, 'src': 'heatmap', 'start': 6678.764, 'weight': 0.79, 'content': [{'end': 6681.765, 'text': "I mean, some people might say different, but there really isn't.", 'start': 6678.764, 'duration': 3.001}, {'end': 6683.285, 'text': "It's it's it's just preference.", 'start': 6681.845, 'duration': 1.44}, {'end': 6686.806, 'text': 'So now we know how to get our request.', 'start': 6684.125, 'duration': 2.681}, {'end': 6691.107, 'text': "Right now to get the actual tag, there's a couple of ways we can do it.", 'start': 6687.745, 'duration': 3.362}, {'end': 6692.567, 'text': 'We can do it like this.', 'start': 6691.147, 'duration': 1.42}, {'end': 6695.008, 'text': "So if I reload, you'll see that.", 'start': 6693.428, 'duration': 1.58}, {'end': 6701.871, 'text': "Or what I'm going to do is we can just pass in tag like this and reload.", 'start': 6695.288, 'duration': 6.583}, {'end': 6702.872, 'text': 'We get the same thing.', 'start': 6701.891, 'duration': 0.981}, {'end': 6705.593, 'text': 'So we know we can get whatever that tag is.', 'start': 6703.412, 'duration': 2.181}, {'end': 6712.176, 'text': 'Now we want to filter the listings by that tag, and we can do that with a scope filter.', 'start': 6705.653, 'duration': 6.523}, {'end': 6720.513, 'text': "So in our model, we actually want to create a function so it's a public uh..", 'start': 6712.916, 'duration': 7.597}, {'end': 6731.176, 'text': "public function and we're going to call this scope filter and what this is going to take in is a query.", 'start': 6720.513, 'duration': 10.663}, {'end': 6741.579, 'text': "so it's a query and then it's going to take in an array of filters all right now i'm not going to put anything in here just yet,", 'start': 6731.176, 'duration': 10.403}, {'end': 6750.323, 'text': 'but what this will allow us to do just by creating this is on our listing model will now be able to filter.', 'start': 6741.579, 'duration': 8.744}, {'end': 6761.75, 'text': 'And by the way, instead of just doing all here, we can do listing latest and then and this latest is a function.', 'start': 6751.183, 'duration': 10.567}, {'end': 6764.932, 'text': 'So at our parentheses and then we can do get.', 'start': 6761.83, 'duration': 3.102}, {'end': 6771.896, 'text': "So if I do latest, get let's let's actually get rid of this die dump.", 'start': 6766.052, 'duration': 5.844}, {'end': 6774.052, 'text': 'and reload.', 'start': 6773.251, 'duration': 0.801}, {'end': 6777.074, 'text': "it's going to do the same thing, except now it's actually it's.", 'start': 6774.052, 'duration': 3.022}, {'end': 6783.278, 'text': "it's sorted by the latest to get the latest first and it's sorted as opposed to just, I don't know.", 'start': 6777.074, 'duration': 6.204}, {'end': 6788.161, 'text': "I think all is just random order, but it's basically the same thing as all it's just sorted.", 'start': 6783.278, 'duration': 4.883}, {'end': 6799.862, 'text': 'now. since I created that scope filter, what I should be able to do is add on to this and say filter like that, all right,', 'start': 6788.161, 'duration': 11.701}, {'end': 6812.567, 'text': 'and what i want to pass in here is going to be request and then in here we want to pass in tag and that is going to get passed in as this this filters.', 'start': 6799.862, 'duration': 12.705}, {'end': 6814.888, 'text': 'now this, it has to be an array.', 'start': 6812.567, 'duration': 2.321}, {'end': 6818.589, 'text': 'so we actually just want to wrap tag here in brackets.', 'start': 6814.888, 'duration': 3.701}, {'end': 6829.597, 'text': "so we're going to get an error, all right, and then in i'll save that and then in listing, let's just close this up For the scope filter.", 'start': 6818.589, 'duration': 11.008}, {'end': 6832.439, 'text': 'what we can do is first of all, check.', 'start': 6829.597, 'duration': 2.842}, {'end': 6839.325, 'text': "Actually, I'm just going to do a die dump here real quick and pass in filters.", 'start': 6833.84, 'duration': 5.485}], 'summary': 'Demonstrating how to filter listings by tag and create a scope filter function.', 'duration': 160.561, 'max_score': 6678.764, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY6678764.jpg'}, {'end': 7124.711, 'src': 'embed', 'start': 7099.056, 'weight': 2, 'content': [{'end': 7103.758, 'text': 'And you just want to make sure I mean, if you copied the template, then this should be fine.', 'start': 7099.056, 'duration': 4.702}, {'end': 7109.321, 'text': "But you want to make sure that it has a name because that's what is actually showing up here, the name of search.", 'start': 7103.798, 'duration': 5.523}, {'end': 7111.982, 'text': "And it's going to be a get request by default.", 'start': 7109.941, 'duration': 2.041}, {'end': 7113.764, 'text': "We don't have to specify the method.", 'start': 7112.002, 'duration': 1.762}, {'end': 7115.345, 'text': 'All right, cool.', 'start': 7114.764, 'duration': 0.581}, {'end': 7124.711, 'text': "So I mean, if we search for Laravel search and then that's going to show up here so that we don't have to do anything else to that.", 'start': 7115.425, 'duration': 9.286}], 'summary': 'Ensure template has a name for search, defaults to get request.', 'duration': 25.655, 'max_score': 7099.056, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY7099056.jpg'}, {'end': 7162.986, 'src': 'embed', 'start': 7140.074, 'weight': 3, 'content': [{'end': 7147.439, 'text': "Save that and now let's go into our model where we have our scope filter and we're pretty much going to do the same thing.", 'start': 7140.074, 'duration': 7.365}, {'end': 7149.201, 'text': "Let's copy this.", 'start': 7148.24, 'duration': 0.961}, {'end': 7154.565, 'text': 'And now on filters we should also have search.', 'start': 7152.083, 'duration': 2.482}, {'end': 7162.986, 'text': "OK, or we shouldn't, you know, if we submit the form, we should have a search on it and this should be available.", 'start': 7157.041, 'duration': 5.945}], 'summary': 'The model will have a search filter available after form submission.', 'duration': 22.912, 'max_score': 7140.074, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY7140074.jpg'}, {'end': 7516.287, 'src': 'embed', 'start': 7475.394, 'weight': 1, 'content': [{'end': 7480.897, 'text': "That's basically like the the workflow when you're going to add a new piece of functionality.", 'start': 7475.394, 'duration': 5.503}, {'end': 7486.626, 'text': "so let's see, let's add down here.", 'start': 7482.325, 'duration': 4.301}, {'end': 7495.389, 'text': "i'll say show, show, create, form.", 'start': 7486.626, 'duration': 8.763}, {'end': 7497.569, 'text': "so we're going to do actually just grab one of the.", 'start': 7495.389, 'duration': 2.18}, {'end': 7504.111, 'text': "i'll just copy this all right.", 'start': 7497.569, 'duration': 6.542}, {'end': 7512.864, 'text': 'so the actual row is going to be slash, listings, slash, create.', 'start': 7504.111, 'duration': 8.753}, {'end': 7516.287, 'text': 'okay, and this is, this is a common convention you always want to do.', 'start': 7512.864, 'duration': 3.423}], 'summary': 'Workflow for adding new functionality with url convention and common practice.', 'duration': 40.893, 'max_score': 7475.394, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY7475394.jpg'}, {'end': 7785.47, 'src': 'embed', 'start': 7757.674, 'weight': 0, 'content': [{'end': 7763.296, 'text': "the reason it's not sure it doesn't have the styling is because we need to wrap this in.", 'start': 7757.674, 'duration': 5.622}, {'end': 7765.657, 'text': 'remember, we have a layout component.', 'start': 7763.296, 'duration': 2.361}, {'end': 7773.719, 'text': 'so we just simply need to say X layout and wrap this whole thing, X layout.', 'start': 7765.657, 'duration': 8.062}, {'end': 7778.42, 'text': 'now, if we come over here and reload, there we go.', 'start': 7773.719, 'duration': 4.701}, {'end': 7783.522, 'text': 'now this the styling here is very similar to what we have in our card.', 'start': 7778.42, 'duration': 5.102}, {'end': 7785.47, 'text': 'Remember our card component?', 'start': 7784.209, 'duration': 1.261}], 'summary': 'To ensure styling, wrap the content in an x layout component for consistency with the card component.', 'duration': 27.796, 'max_score': 7757.674, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY7757674.jpg'}], 'start': 6538.994, 'title': 'Implementing web application functionality', 'summary': 'Covers implementing tag filtering, search functionality, clockwork installation, and job listings creation in a web application, providing insights into the process and emphasizing the importance of proper routing and styling.', 'chapters': [{'end': 6935.01, 'start': 6538.994, 'title': 'Implementing tag filtering for post listings', 'summary': 'Explains how to implement tag filtering for post listings by using scope filter method in the controller and creating a function in the model, allowing the user to filter the listings based on the clicked tag from the query string.', 'duration': 396.016, 'highlights': ['The chapter explains how to implement tag filtering for post listings It covers the process of implementing tag filtering for post listings, allowing users to filter the listings based on the clicked tag from the query string.', 'Using scope filter method in the controller The tutorial discusses using a scope filter method in the controller to filter the post listings based on the clicked tag from the query string.', 'Creating a function in the model to filter the listings The transcript explains the creation of a function in the model to filter the listings based on the clicked tag from the query string.', 'Demonstrating the usage of dependency injection and request helper It demonstrates the usage of dependency injection and request helper to retrieve the tag value from the query string, providing multiple options for implementation.']}, {'end': 7272.718, 'start': 6935.01, 'title': 'Implementing filtering and search', 'summary': 'Demonstrates how to implement filtering by tags and search functionality in a web application, enabling the user to filter content based on tags and search terms, with a simple code and database update process.', 'duration': 337.708, 'highlights': ['The process of filtering by tags and implementing a search functionality is demonstrated, allowing the user to filter content based on tags and search terms, with a simple code and database update process.', 'The speaker updates the database by changing tags within MySQL Workbench, showing the process of modifying tags and applying the changes, resulting in the ability to filter content based on the updated tags.', 'A demonstration of implementing search functionality by creating a scope filter in the controller and modifying the model to search for the input term in the title, description, and tags, showcasing the process of enabling search capability in the application.']}, {'end': 7450.521, 'start': 7274.821, 'title': 'Installing clockwork and analyzing sql queries', 'summary': 'Explains the installation of clockwork, a tool that shows exact sql queries being run, and demonstrates how it can filter and analyze queries, providing insight into the process of installing and using it with laravel.', 'duration': 175.7, 'highlights': ['Clockwork is a tool that can show the exact SQL queries being run, providing insights into the database operations. Clockwork provides insights into SQL queries.', 'The speaker demonstrates the process of installing Clockwork with Composer and the Chrome extension, highlighting its utility in analyzing SQL queries and filtering results. Demonstration of installing and using Clockwork for analyzing SQL queries.', 'The speaker shows how Clockwork can filter and display the SQL queries being run, providing a practical example of its utility in analyzing database operations. Practical example of using Clockwork to filter and display SQL queries.']}, {'end': 7819.727, 'start': 7450.521, 'title': 'Creating job listings and gigs', 'summary': 'Discusses the process of creating job listings and gigs, emphasizing the need for proper routing, controller methods, and views. it highlights the importance of adhering to naming conventions and the steps involved in integrating styling for the create form.', 'duration': 369.206, 'highlights': ['The process of adding a new piece of functionality involves creating a new route, a new controller method, and a new view.', "Emphasizing the importance of adhering to naming conventions, such as prefixing anything related to listings with 'listings', and maintaining consistency in using plural form ('listings') for routes.", "The need to ensure proper route ordering, as the route to 'listing/create' should be placed at the bottom for correct functionality.", "The steps involved in integrating styling for the create form, including utilizing the content from a theme's HTML file and wrapping it within the X-layout component to achieve the desired styling."]}], 'duration': 1280.733, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY6538994.jpg', 'highlights': ['Demonstrating the usage of dependency injection and request helper to retrieve the tag value from the query string, providing multiple options for implementation.', 'The process of filtering by tags and implementing a search functionality is demonstrated, allowing the user to filter content based on tags and search terms, with a simple code and database update process.', 'Clockwork provides insights into SQL queries.', 'The process of adding a new piece of functionality involves creating a new route, a new controller method, and a new view.']}, {'end': 9211.997, 'segs': [{'end': 8455.933, 'src': 'embed', 'start': 8429.508, 'weight': 0, 'content': [{'end': 8441.75, 'text': "so these messages are generated and automatically we can just output them with this, and it's only, it's just from from this block of code.", 'start': 8429.508, 'duration': 12.242}, {'end': 8446.111, 'text': 'so what else do we have here like, uh, email?', 'start': 8441.75, 'duration': 4.361}, {'end': 8447.931, 'text': "so let's, let's go to the.", 'start': 8446.111, 'duration': 1.82}, {'end': 8448.932, 'text': 'where is the email?', 'start': 8447.931, 'duration': 1.001}, {'end': 8450.512, 'text': 'do we not have an email field?', 'start': 8448.932, 'duration': 1.58}, {'end': 8455.933, 'text': "i don't, okay, looks like i'm gonna have to add that.", 'start': 8450.512, 'duration': 5.421}], 'summary': 'Automated message generation for output, discussing email field addition.', 'duration': 26.425, 'max_score': 8429.508, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY8429508.jpg'}, {'end': 8673.908, 'src': 'embed', 'start': 8634.785, 'weight': 7, 'content': [{'end': 8644.133, 'text': 'we can go to our model, which is right here listing, and we can add the fillable properties.', 'start': 8634.785, 'duration': 9.348}, {'end': 8652.92, 'text': 'so i could go right here and i could say protected, and we want to call this fillable.', 'start': 8644.133, 'duration': 8.787}, {'end': 8662.466, 'text': "And then what we want to do is set that to an array and have any properties that we want to allow mass assignment to, which is what we're doing.", 'start': 8654.764, 'duration': 7.702}, {'end': 8666.686, 'text': "So it's a title, it's a company.", 'start': 8662.566, 'duration': 4.12}, {'end': 8673.908, 'text': 'Location What else? Website.', 'start': 8670.007, 'duration': 3.901}], 'summary': 'Adding fillable properties to the model for mass assignment, including title, company, location, and website.', 'duration': 39.123, 'max_score': 8634.785, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY8634785.jpg'}, {'end': 8887.761, 'src': 'embed', 'start': 8858.754, 'weight': 3, 'content': [{'end': 8865.605, 'text': "OK, so once it shows If you reload the page or you go to a different page, it's not going to show anymore.", 'start': 8858.754, 'duration': 6.851}, {'end': 8866.406, 'text': "It's going to be gone.", 'start': 8865.665, 'duration': 0.741}, {'end': 8868.587, 'text': "It's just stored a memory for that one page load.", 'start': 8866.466, 'duration': 2.121}, {'end': 8871.469, 'text': "And there's a couple of ways we can do it.", 'start': 8869.508, 'duration': 1.961}, {'end': 8876.493, 'text': 'So one we could use, we could say session and then flash.', 'start': 8871.569, 'duration': 4.924}, {'end': 8881.256, 'text': "Actually, is that I believe that's how we do it.", 'start': 8878.314, 'duration': 2.942}, {'end': 8887.761, 'text': "I don't usually use this, but I'm pretty sure we would go like that and say message and then like.", 'start': 8881.356, 'duration': 6.405}], 'summary': 'Data stored in memory for one page load using session and flash', 'duration': 29.007, 'max_score': 8858.754, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY8858754.jpg'}, {'end': 8945.224, 'src': 'embed', 'start': 8915.219, 'weight': 5, 'content': [{'end': 8916.8, 'text': 'and this can be anything you want.', 'start': 8915.219, 'duration': 1.581}, {'end': 8921.425, 'text': 'You might have like different types of alerts.', 'start': 8917.201, 'duration': 4.224}, {'end': 8925.269, 'text': 'Maybe you have one for errors, one for successful message messages.', 'start': 8921.505, 'duration': 3.764}, {'end': 8927.552, 'text': 'So you might put success or error.', 'start': 8925.35, 'duration': 2.202}, {'end': 8931.416, 'text': "But I'm just going to use message, just a general message.", 'start': 8928.032, 'duration': 3.384}, {'end': 8932.337, 'text': 'All right.', 'start': 8932.057, 'duration': 0.28}, {'end': 8934.019, 'text': 'Now, if I save that, if we were to.', 'start': 8932.417, 'duration': 1.602}, {'end': 8941.003, 'text': "create a new listing, we're not going to see anything, because this just fires off the message.", 'start': 8935.322, 'duration': 5.681}, {'end': 8945.224, 'text': 'we now need somewhere in our view, to actually show it.', 'start': 8941.003, 'duration': 4.221}], 'summary': 'Creating alerts for different message types, such as errors and successes, and implementing them in the view.', 'duration': 30.005, 'max_score': 8915.219, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY8915219.jpg'}, {'end': 9124.699, 'src': 'embed', 'start': 9093.332, 'weight': 6, 'content': [{'end': 9097.015, 'text': "It doesn't really matter because it's it's position fixed.", 'start': 9093.332, 'duration': 3.683}, {'end': 9099.516, 'text': "So I'm just going to put it right above the body tag here.", 'start': 9097.115, 'duration': 2.401}, {'end': 9101.217, 'text': 'So X dash.', 'start': 9100.097, 'duration': 1.12}, {'end': 9105.08, 'text': 'Flash dash message.', 'start': 9102.638, 'duration': 2.442}, {'end': 9109.425, 'text': 'and that should do it all right.', 'start': 9107.083, 'duration': 2.342}, {'end': 9111.828, 'text': "so let's save that, let's try it out.", 'start': 9109.425, 'duration': 2.403}, {'end': 9124.699, 'text': "so i'm just going to reload this page and let's add let's see, if we look at the data that i have here, we'll add uh, what's this wayne enterprises?", 'start': 9111.828, 'duration': 12.871}], 'summary': 'Positioned x dash flash dash message above body tag.', 'duration': 31.367, 'max_score': 9093.332, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY9093332.jpg'}, {'end': 9211.997, 'src': 'embed', 'start': 9188.135, 'weight': 1, 'content': [{'end': 9197.462, 'text': "it's a very minimal framework to do just simple things like if you want to click a button and have something pop up somewhere else and just have some interactive functionality,", 'start': 9188.135, 'duration': 9.327}, {'end': 9200.744, 'text': "but you don't want to reach for a full framework like react or view.", 'start': 9197.462, 'duration': 3.282}, {'end': 9204.847, 'text': "And it's awesome to work with with Laravel and with blade.", 'start': 9201.485, 'duration': 3.362}, {'end': 9211.997, 'text': "So let's say Alpine I don't know the domain, alpinejs.dev.", 'start': 9205.407, 'duration': 6.59}], 'summary': 'Alpine.js: minimal framework for interactive functionality, integrates well with laravel and blade.', 'duration': 23.862, 'max_score': 9188.135, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY9188135.jpg'}], 'start': 7819.727, 'title': 'Laravel form implementation', 'summary': 'Covers creating, validating, and submitting forms in laravel, including form submission, route creation, form validation, and submission, mass assignment in laravel models, and creating a flash message component with interactive functionality using css and alpine js.', 'chapters': [{'end': 8018.233, 'start': 7819.727, 'title': 'Form submission and route creation', 'summary': 'Covers creating a form for submitting data to the store using laravel, setting the form method to post, adding csrf protection, and creating a route for storing listing data.', 'duration': 198.506, 'highlights': ['The chapter explains the process of setting up a form to submit data to the store in Laravel, emphasizing the importance of naming fields and setting the method to post for the form submission.', 'It highlights the use of CSRF protection to prevent cross-site scripting attacks when handling post requests in Laravel forms.', 'The process of creating a route for storing listing data is outlined, including specifying the method as post and defining the corresponding controller method for handling the submitted form data.']}, {'end': 8610.247, 'start': 8020.875, 'title': 'Laravel form validation and submission', 'summary': 'Explains how to validate and submit form data in laravel, using minimal code to specify rules for form fields and show error messages for failed validation, before finally creating and saving the data in the database.', 'duration': 589.372, 'highlights': ['The Laravel framework provides a convenient way to validate and submit form data with minimal code, simplifying the process of specifying rules for form fields and handling validation errors.', "Form validation in Laravel involves creating a variable to hold the form fields and using the 'validate' method to specify rules for each field, such as 'required' and 'unique' for specific fields like company name and email, ensuring data integrity and accuracy.", "Error messages for failed validation are automatically generated and can be displayed in the view using the 'error' directive, providing a user-friendly way to indicate and handle validation errors for each form field.", "Submitting the form data involves using the 'create' method with the model to save the validated data in the database, demonstrating a straightforward process for creating and persisting form data after successful validation."]}, {'end': 8881.256, 'start': 8610.747, 'title': 'Mass assignment in laravel models', 'summary': 'Explains how to add fillable properties for mass assignment in laravel models, providing an alternative approach using model on guard and highlighting the importance of implementing it correctly, as well as demonstrating the creation of a flash message for the listing creation.', 'duration': 270.509, 'highlights': ['The chapter explains the process of adding fillable properties in a Laravel model to allow mass assignment, including specifying the fields to be included in the fillable property array, such as title, company, location, website, email, description, and tags.', 'It also discusses an alternative approach using model on guard to enable mass assignment without explicitly defining fillable properties, emphasizing the importance of understanding the data being inserted into the database when utilizing this method.', 'Additionally, the chapter demonstrates the creation of a flash message to notify the user of a new listing creation, explaining that the message is stored in memory for one page load and providing an example of using the session flash method to achieve this.']}, {'end': 9211.997, 'start': 8881.356, 'title': 'Creating flash message component', 'summary': 'Discusses creating a flash message component in laravel, including adding a message to be displayed upon successful creation of a listing and styling the message using css. it also mentions the implementation of alpine js for interactive functionality.', 'duration': 330.641, 'highlights': ['Creating a flash message component in Laravel The chapter discusses the process of creating a flash message component in Laravel to display a message upon successful listing creation.', 'Styling the message using CSS It includes details on styling the flash message using CSS, specifying the position and appearance of the message.', 'Implementing Alpine JS for interactive functionality Mentions the implementation of Alpine JS, a minimal framework, to provide interactive functionality without the need for a full framework like React or Vue.']}], 'duration': 1392.27, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY7819727.jpg', 'highlights': ['The Laravel framework simplifies form validation and submission with minimal code.', "Form validation in Laravel involves creating a variable to hold the form fields and using the 'validate' method to specify rules for each field.", "Error messages for failed validation are automatically generated and can be displayed in the view using the 'error' directive.", 'The process of adding fillable properties in a Laravel model to allow mass assignment is explained, including specifying the fields to be included in the fillable property array.', 'The chapter demonstrates the creation of a flash message to notify the user of a new listing creation, explaining that the message is stored in memory for one page load.', 'The chapter discusses the process of creating a flash message component in Laravel to display a message upon successful listing creation.', 'It includes details on styling the flash message using CSS, specifying the position and appearance of the message.', 'Mentions the implementation of Alpine JS, a minimal framework, to provide interactive functionality without the need for a full framework like React or Vue.']}, {'end': 10056.055, 'segs': [{'end': 9326.44, 'src': 'embed', 'start': 9298.848, 'weight': 1, 'content': [{'end': 9301.49, 'text': "And we're actually not going to pass anything in here.", 'start': 9298.848, 'duration': 2.642}, {'end': 9305.855, 'text': 'We just want to say show is going to be equal to false.', 'start': 9301.53, 'duration': 4.325}, {'end': 9307.632, 'text': 'All right.', 'start': 9307.332, 'duration': 0.3}, {'end': 9314.035, 'text': 'And then it takes in a second parameter, which is going to be the number of milliseconds where we want to wait until it goes away.', 'start': 9307.752, 'duration': 6.283}, {'end': 9316.476, 'text': "I'm going to say 3000, which is three seconds.", 'start': 9314.055, 'duration': 2.421}, {'end': 9319.917, 'text': 'And then we just need to add an X show onto this.', 'start': 9317.176, 'duration': 2.741}, {'end': 9321.818, 'text': 'So X dash show.', 'start': 9320.177, 'duration': 1.641}, {'end': 9325.879, 'text': 'And we want to set that to the show value.', 'start': 9323.158, 'duration': 2.721}, {'end': 9326.44, 'text': 'All right.', 'start': 9325.899, 'duration': 0.541}], 'summary': 'Setting show to false, and specifying 3000 milliseconds wait time before x show is added.', 'duration': 27.592, 'max_score': 9298.848, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY9298848.jpg'}, {'end': 9451.625, 'src': 'embed', 'start': 9421.297, 'weight': 0, 'content': [{'end': 9422.698, 'text': 'Laravel makes this really easy.', 'start': 9421.297, 'duration': 1.401}, {'end': 9426.82, 'text': "All we have to do is go to the input and we're going to put a value here.", 'start': 9423.118, 'duration': 3.702}, {'end': 9431.974, 'text': "let's say value and then we're going to open up our curly braces and we can have.", 'start': 9428.152, 'duration': 3.822}, {'end': 9433.635, 'text': 'we have this old helper.', 'start': 9431.974, 'duration': 1.661}, {'end': 9439.178, 'text': 'so we can say old and then pass in whatever the field is, in this case, company.', 'start': 9433.635, 'duration': 5.543}, {'end': 9444.641, 'text': "so now, if i come over here and i fill in the company, actually let's just reload this.", 'start': 9439.178, 'duration': 5.463}, {'end': 9448.343, 'text': 'i come over here and i fill in the company and we have an error.', 'start': 9444.641, 'duration': 3.702}, {'end': 9449.724, 'text': 'now you can see the company.', 'start': 9448.343, 'duration': 1.381}, {'end': 9451.625, 'text': 'the text stays in there all right.', 'start': 9449.724, 'duration': 1.901}], 'summary': 'Laravel simplifies input handling, utilizing the old helper to preserve filled data.', 'duration': 30.328, 'max_score': 9421.297, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY9421297.jpg'}, {'end': 9788.221, 'src': 'heatmap', 'start': 9629.864, 'weight': 0.753, 'content': [{'end': 9631.085, 'text': 'So we get the total.', 'start': 9629.864, 'duration': 1.221}, {'end': 9633.328, 'text': "That's from using paginate.", 'start': 9631.445, 'duration': 1.883}, {'end': 9640.416, 'text': "If we just do get, like if I just do get like we had it before, then we don't get that stuff.", 'start': 9633.408, 'duration': 7.008}, {'end': 9641.357, 'text': 'We just get items.', 'start': 9640.456, 'duration': 0.901}, {'end': 9643.059, 'text': "So that's what paginate gives us.", 'start': 9641.417, 'duration': 1.642}, {'end': 9645.159, 'text': "So let's get rid of that.", 'start': 9644.278, 'duration': 0.881}, {'end': 9646.2, 'text': 'I just wanted to show you that.', 'start': 9645.179, 'duration': 1.021}, {'end': 9650.723, 'text': 'Now, obviously, we need a way to get to the next page.', 'start': 9646.82, 'duration': 3.903}, {'end': 9657.749, 'text': "And the way it works is there's just, if we go to the URL bar here, we can just say page equals, let's say page equals two.", 'start': 9651.103, 'duration': 6.646}, {'end': 9659.41, 'text': 'That gives us page two.', 'start': 9658.169, 'duration': 1.241}, {'end': 9667.336, 'text': 'Okay But like I said, we need a way to actually see the numbers to click on the page numbers down here.', 'start': 9659.43, 'duration': 7.906}, {'end': 9668.937, 'text': "And that's really, really easy.", 'start': 9667.576, 'duration': 1.361}, {'end': 9671.68, 'text': 'All we have to do is go into.', 'start': 9669.438, 'duration': 2.242}, {'end': 9676.084, 'text': "let's see, we're going to do this in, should we?", 'start': 9671.68, 'duration': 4.404}, {'end': 9678.626, 'text': 'where should we put this in the index?', 'start': 9676.084, 'duration': 2.542}, {'end': 9685.313, 'text': "yeah, so let's go to listings and in our index.", 'start': 9678.626, 'duration': 6.687}, {'end': 9697.086, 'text': 'all right, so we have our end, unless So we want to put this right after the last div.', 'start': 9685.313, 'duration': 11.773}, {'end': 9699.707, 'text': "Yeah, so let's go under here.", 'start': 9697.106, 'duration': 2.601}, {'end': 9702.148, 'text': "And I'm just going to have a div here.", 'start': 9700.547, 'duration': 1.601}, {'end': 9704.809, 'text': "I'm just going to do margin top to push it down a little bit.", 'start': 9702.188, 'duration': 2.621}, {'end': 9706.109, 'text': 'So margin top six.', 'start': 9704.849, 'duration': 1.26}, {'end': 9707.87, 'text': "And then let's do padding four.", 'start': 9706.249, 'duration': 1.621}, {'end': 9713.502, 'text': 'And then all we have to do to show the pagination links is simply do listings.', 'start': 9708.999, 'duration': 4.503}, {'end': 9719.506, 'text': "And then we have this links, links, and that's actually a function.", 'start': 9714.303, 'duration': 5.203}, {'end': 9720.927, 'text': 'All right.', 'start': 9719.526, 'duration': 1.401}, {'end': 9723.709, 'text': "So let's save that and then come over here and reload.", 'start': 9721.007, 'duration': 2.702}, {'end': 9725.01, 'text': 'And there we go.', 'start': 9724.41, 'duration': 0.6}, {'end': 9730.054, 'text': 'So we have it shows us the results showing one to two of 10 results.', 'start': 9725.03, 'duration': 5.024}, {'end': 9735.976, 'text': "If I click on two, you'll see up here it takes me to page equals two.", 'start': 9731.869, 'duration': 4.107}, {'end': 9739.301, 'text': "Now we're showing three to four of 10 results.", 'start': 9736.537, 'duration': 2.764}, {'end': 9742.166, 'text': 'Click on page three and there we go.', 'start': 9740.062, 'duration': 2.104}, {'end': 9744.964, 'text': "Now, there's also a simple paginate.", 'start': 9742.782, 'duration': 2.182}, {'end': 9749.728, 'text': "If you don't want to show the numbers and you just want like a next and previous, we can do this.", 'start': 9745.024, 'duration': 4.704}, {'end': 9752.43, 'text': "It's a simple paginate.", 'start': 9750.429, 'duration': 2.001}, {'end': 9756.834, 'text': 'And if I reload that now, we just have next and previous.', 'start': 9753.691, 'duration': 3.143}, {'end': 9760.057, 'text': "So, I mean, it's up to you on the style you want.", 'start': 9757.395, 'duration': 2.662}, {'end': 9761.898, 'text': "But I'm going to go back to paginate.", 'start': 9760.117, 'duration': 1.781}, {'end': 9763.42, 'text': "I'm going to change it to six.", 'start': 9762.179, 'duration': 1.241}, {'end': 9766.008, 'text': 'All right.', 'start': 9765.748, 'duration': 0.26}, {'end': 9772.612, 'text': "And if I reload that, we're not seeing any because page three doesn't exist anymore because I put six per page.", 'start': 9766.348, 'duration': 6.264}, {'end': 9773.553, 'text': 'All right.', 'start': 9773.312, 'duration': 0.241}, {'end': 9775.234, 'text': 'So now we just have these two.', 'start': 9773.593, 'duration': 1.641}, {'end': 9776.835, 'text': "That's page two.", 'start': 9775.874, 'duration': 0.961}, {'end': 9777.735, 'text': "That's page one.", 'start': 9776.915, 'duration': 0.82}, {'end': 9779.916, 'text': 'All right.', 'start': 9777.755, 'duration': 2.161}, {'end': 9783.198, 'text': 'I think we have 10 listings or I have 10 listings altogether.', 'start': 9779.976, 'duration': 3.222}, {'end': 9788.221, 'text': 'Now, if you do want to change the styling, like I said, it uses tailwind by default.', 'start': 9783.919, 'duration': 4.302}], 'summary': 'Using paginate allows for easy pagination of 10 results, with options for showing page numbers or simple next/previous buttons.', 'duration': 158.357, 'max_score': 9629.864, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY9629864.jpg'}, {'end': 9894.858, 'src': 'embed', 'start': 9864.229, 'weight': 4, 'content': [{'end': 9866.01, 'text': 'You can see it has the tailwind classes.', 'start': 9864.229, 'duration': 1.781}, {'end': 9868.811, 'text': 'And you can also use bootstrap.', 'start': 9866.73, 'duration': 2.081}, {'end': 9871.552, 'text': 'You can use semantic UI.', 'start': 9869.311, 'duration': 2.241}, {'end': 9877.533, 'text': 'And of course, you could edit this as well if you want to use your own custom CSS.', 'start': 9872.652, 'duration': 4.881}, {'end': 9879.734, 'text': 'Now to change the template.', 'start': 9878.293, 'duration': 1.441}, {'end': 9891.197, 'text': 'I believe, if we do control or command P and we search for app service provider, I believe what we do is in boot we can do like paginator.', 'start': 9879.734, 'duration': 11.463}, {'end': 9894.858, 'text': 'Yeah, it would be paginator.', 'start': 9891.217, 'duration': 3.641}], 'summary': 'Discussing usage of tailwind, bootstrap, and semantic ui in editing templates, including implementing paginator.', 'duration': 30.629, 'max_score': 9864.229, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY9864229.jpg'}, {'end': 10059.516, 'src': 'embed', 'start': 10029.44, 'weight': 3, 'content': [{'end': 10030.681, 'text': 'This is kind of a pain in the ass.', 'start': 10029.44, 'duration': 1.241}, {'end': 10034.859, 'text': 'I could use a browser extension to fill the stuff in.', 'start': 10031.917, 'duration': 2.942}, {'end': 10035.88, 'text': 'Should have did that.', 'start': 10035.199, 'duration': 0.681}, {'end': 10039.302, 'text': "But let's see, I'm going to choose a file now.", 'start': 10036.661, 'duration': 2.641}, {'end': 10044.566, 'text': "I do have like all the images for the companies that I'm using.", 'start': 10039.322, 'duration': 5.244}, {'end': 10046.808, 'text': 'Is it on my desktop??', 'start': 10044.586, 'duration': 2.222}, {'end': 10054.073, 'text': "Yeah, I have the theme on my desktop images and you can upload any image, but I'm going to grab.", 'start': 10047.929, 'duration': 6.144}, {'end': 10056.055, 'text': "I'm just going to grab this Skynet.", 'start': 10054.073, 'duration': 1.982}, {'end': 10059.516, 'text': "And let's say open create.", 'start': 10056.955, 'duration': 2.561}], 'summary': 'Struggling with manual data entry, considering browser extension, uploading company images.', 'duration': 30.076, 'max_score': 10029.44, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY10029440.jpg'}], 'start': 9212.158, 'title': 'Web development with alpine.js, pagination, and file upload', 'summary': "Covers creating interactive elements with alpine.js, utilizing x-data, x init, and x show, adding pagination with laravel's paginate method, and incorporating file upload functionality into the create page.", 'chapters': [{'end': 9524.572, 'start': 9212.158, 'title': 'Interactive web development tutorial', 'summary': 'Explains how to use alpine.js to create interactive elements, such as flash messages with auto-dismissal and preserving form input data, with a focus on setting states and utilizing specific attributes like x-data, x init, and x show.', 'duration': 312.414, 'highlights': ['The chapter explains how to use Alpine.js to create interactive elements, such as flash messages with auto-dismissal and preserving form input data. Alpine.js is demonstrated for creating interactive elements like flash messages with auto-dismissal and preserving form input data.', 'Focus on setting states and utilizing specific attributes like x-data, X init, and X show. The tutorial emphasizes setting states and utilizing specific attributes like x-data, X init, and X show in Alpine.js for interactive element creation.', 'Demonstration of setting a flash message to automatically disappear after three seconds. The tutorial demonstrates setting a flash message to automatically disappear after three seconds using Alpine.js.', "Preserving form input data using the 'old' helper in Laravel framework. The tutorial illustrates preserving form input data using the 'old' helper in the Laravel framework, making it easy to retain input values even after an error."]}, {'end': 10056.055, 'start': 9525.848, 'title': 'Adding pagination and file upload', 'summary': "Covers adding pagination to the listings page, using laravel's paginate method to display a specified number of listings per page, and incorporating file upload functionality into the create page, including adding a file input and handling file submission in the controller.", 'duration': 530.207, 'highlights': ["Adding pagination using Laravel's paginate method The speaker demonstrates how to implement pagination by using Laravel's paginate method, specifying the number of listings per page, and showing the pagination links.", "Demonstrating file upload functionality in the create page The transcript details the process of enabling file upload functionality in the create page, including adding a file input, setting the form attribute to multipart/form-data, and handling the file submission in the controller using Laravel's request method."]}], 'duration': 843.897, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY9212158.jpg', 'highlights': ["Demonstrating file upload functionality in the create page, including adding a file input and handling the file submission in the controller using Laravel's request method.", "Adding pagination using Laravel's paginate method, specifying the number of listings per page, and showing the pagination links.", "Illustrating preserving form input data using the 'old' helper in the Laravel framework, making it easy to retain input values even after an error.", 'Demonstrating setting a flash message to automatically disappear after three seconds using Alpine.js.', 'Emphasizing setting states and utilizing specific attributes like x-data, X init, and X show in Alpine.js for interactive element creation.']}, {'end': 11869.4, 'segs': [{'end': 10562.483, 'src': 'heatmap', 'start': 10405.181, 'weight': 0.951, 'content': [{'end': 10411.613, 'text': "so i'll paste that in and create gig.", 'start': 10405.181, 'duration': 6.432}, {'end': 10416.958, 'text': "now let's look over here in the storage folder.", 'start': 10411.613, 'duration': 5.345}, {'end': 10424.104, 'text': "so storage app public and now you'll see that there's a folder called logos and then we have the image.", 'start': 10416.958, 'duration': 7.146}, {'end': 10428.228, 'text': "it doesn't keep the same image name and we take a look.", 'start': 10424.104, 'duration': 4.124}, {'end': 10430.29, 'text': 'we have our acme image.', 'start': 10428.228, 'duration': 2.062}, {'end': 10431.731, 'text': "now let's look in the database.", 'start': 10430.29, 'duration': 1.441}, {'end': 10438.277, 'text': "So I'm going to come here and let's refresh listings and let's take a look.", 'start': 10432.912, 'duration': 5.365}, {'end': 10446.743, 'text': "And here you'll see under logo, this listing has a path of logos slash and then the image.", 'start': 10439.057, 'duration': 7.686}, {'end': 10449.645, 'text': "Now this isn't publicly accessible yet.", 'start': 10447.804, 'duration': 1.841}, {'end': 10460.872, 'text': 'What we need to do is create a sim link from the storage public folder to this public folder right here, because these images are directly accessible.', 'start': 10450.706, 'duration': 10.166}, {'end': 10464.954, 'text': 'And we do that by just running a simple artisan command.', 'start': 10461.252, 'duration': 3.702}, {'end': 10475.301, 'text': "So down here, we're going to say PHP artisan, and then we can just do storage colon and then link.", 'start': 10465.575, 'duration': 9.726}, {'end': 10478.763, 'text': 'And it says, yeah, the links have been created.', 'start': 10476.761, 'duration': 2.002}, {'end': 10490.711, 'text': "so now i should be able to view it if i go to our website and then let's say slash, storage, slash.", 'start': 10479.785, 'duration': 10.926}, {'end': 10494.474, 'text': 'i think it will be logos and then the name of the file.', 'start': 10490.711, 'duration': 3.763}, {'end': 10497.996, 'text': 'let me just grab that real quick.', 'start': 10494.474, 'duration': 3.522}, {'end': 10502.178, 'text': "i'll get it from the database.", 'start': 10497.996, 'duration': 4.182}, {'end': 10502.398, 'text': 'you know.', 'start': 10502.178, 'duration': 0.22}, {'end': 10510.552, 'text': "actually just copy this whole thing And let's see storage, slash logos.", 'start': 10502.398, 'duration': 8.154}, {'end': 10511.712, 'text': 'And there it is.', 'start': 10511.232, 'duration': 0.48}, {'end': 10512.873, 'text': 'All right.', 'start': 10511.732, 'duration': 1.141}, {'end': 10515.874, 'text': 'So that is the path to our logo.', 'start': 10512.933, 'duration': 2.941}, {'end': 10518.616, 'text': 'Now we need to change.', 'start': 10517.295, 'duration': 1.321}, {'end': 10521.578, 'text': "The reason it's not showing up here is because we need to change.", 'start': 10518.656, 'duration': 2.922}, {'end': 10527.741, 'text': 'We need to do it in two areas, the card where the images and also on the single page here.', 'start': 10521.598, 'duration': 6.143}, {'end': 10536.161, 'text': "So let's open up the card component, or I should say the listing card, and this is where we have the image.", 'start': 10528.456, 'duration': 7.705}, {'end': 10545.468, 'text': 'Now I do want the dummy image or the Laravel logo, I want that to show if there is no image.', 'start': 10536.241, 'duration': 9.227}, {'end': 10547.509, 'text': "So we'll use a ternary.", 'start': 10545.848, 'duration': 1.661}, {'end': 10548.47, 'text': "So let's..", 'start': 10548.109, 'duration': 0.361}, {'end': 10552.018, 'text': "i'll just clear this out here.", 'start': 10550.217, 'duration': 1.801}, {'end': 10554.539, 'text': "we'll just clear this out and do this from scratch.", 'start': 10552.018, 'duration': 2.521}, {'end': 10562.483, 'text': "so for the source of the image, let's say if there is a listing logo, then we'll have.", 'start': 10554.539, 'duration': 7.944}], 'summary': 'Setting up public access to images in storage folder using sim link and artisan command.', 'duration': 157.302, 'max_score': 10405.181, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY10405181.jpg'}, {'end': 10527.741, 'src': 'embed', 'start': 10497.996, 'weight': 10, 'content': [{'end': 10502.178, 'text': "i'll get it from the database.", 'start': 10497.996, 'duration': 4.182}, {'end': 10502.398, 'text': 'you know.', 'start': 10502.178, 'duration': 0.22}, {'end': 10510.552, 'text': "actually just copy this whole thing And let's see storage, slash logos.", 'start': 10502.398, 'duration': 8.154}, {'end': 10511.712, 'text': 'And there it is.', 'start': 10511.232, 'duration': 0.48}, {'end': 10512.873, 'text': 'All right.', 'start': 10511.732, 'duration': 1.141}, {'end': 10515.874, 'text': 'So that is the path to our logo.', 'start': 10512.933, 'duration': 2.941}, {'end': 10518.616, 'text': 'Now we need to change.', 'start': 10517.295, 'duration': 1.321}, {'end': 10521.578, 'text': "The reason it's not showing up here is because we need to change.", 'start': 10518.656, 'duration': 2.922}, {'end': 10527.741, 'text': 'We need to do it in two areas, the card where the images and also on the single page here.', 'start': 10521.598, 'duration': 6.143}], 'summary': 'The transcript involves accessing a logo from a database and making changes in two areas for it to display properly.', 'duration': 29.745, 'max_score': 10497.996, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY10497996.jpg'}, {'end': 11036.854, 'src': 'heatmap', 'start': 10676.778, 'weight': 6, 'content': [{'end': 10680.682, 'text': 'so listing and then edit.', 'start': 10676.778, 'duration': 3.904}, {'end': 10690.539, 'text': 'and then we want to do the listing controller class and the method we want is is called edit, all right.', 'start': 10680.682, 'duration': 9.857}, {'end': 10694.621, 'text': "so we'll save that and let's go to the um.", 'start': 10690.539, 'duration': 4.082}, {'end': 10697.183, 'text': "let's go to the should.", 'start': 10694.621, 'duration': 2.562}, {'end': 10698.924, 'text': 'we do the controller first.', 'start': 10697.183, 'duration': 1.741}, {'end': 10700.265, 'text': "now let's create the edit link.", 'start': 10698.924, 'duration': 1.341}, {'end': 10708.071, 'text': "so ultimately we're going to have a link up here to go to all of our gigs or all of our listings and we'll have an edit and delete there,", 'start': 10700.265, 'duration': 7.806}, {'end': 10714.896, 'text': "but just for now, because we don't have user authentication yet, we're just going to put an edit and delete down at the bottom of the show page.", 'start': 10708.071, 'duration': 6.825}, {'end': 10719.788, 'text': "So let's go to our show and let's see right under the X card.", 'start': 10715.376, 'duration': 4.412}, {'end': 10721.814, 'text': "I'm going to create another X card.", 'start': 10719.828, 'duration': 1.986}, {'end': 10727.853, 'text': "all right, and then we're going to just pass in a couple extra classes here.", 'start': 10724.451, 'duration': 3.402}, {'end': 10740.362, 'text': "so let's do mt4 and padding 2 will display as flex and let's do space between everything on the x-axis.", 'start': 10727.853, 'duration': 12.509}, {'end': 10743.304, 'text': "we'll do six and then we'll have an a tag.", 'start': 10740.362, 'duration': 2.942}, {'end': 10753.332, 'text': "here it's going to go to slash, listing, slash, and then we want to get the listing id and then slash edit,", 'start': 10743.304, 'duration': 10.028}, {'end': 10756.435, 'text': "and then here i'm actually going to put a font awesome icon.", 'start': 10753.332, 'duration': 3.103}, {'end': 10760.799, 'text': "so i'm going to do fa dash solid.", 'start': 10756.435, 'duration': 4.364}, {'end': 10761.68, 'text': 'and what is it?', 'start': 10760.799, 'duration': 0.881}, {'end': 10766.064, 'text': 'fa, fa dash pencil, i believe.', 'start': 10761.68, 'duration': 4.384}, {'end': 10775.903, 'text': "and then next to that we'll say edit, and the font awesome cdn is is being brought in in the layout, All right.", 'start': 10766.064, 'duration': 9.839}, {'end': 10778.185, 'text': "So if I click that right now, we're going to get this.", 'start': 10775.943, 'duration': 2.242}, {'end': 10779.966, 'text': "The controller method doesn't exist.", 'start': 10778.325, 'duration': 1.641}, {'end': 10788.972, 'text': "So let's create that and go to listing controller and let's say show edit form.", 'start': 10779.986, 'duration': 8.986}, {'end': 10792.695, 'text': 'And this is going to be a public function called edit.', 'start': 10789.233, 'duration': 3.462}, {'end': 10798.179, 'text': "It's going to take in a listing with the variable name of listing.", 'start': 10793.275, 'duration': 4.904}, {'end': 10802.302, 'text': 'And then all we want to do is return a view.', 'start': 10799.36, 'duration': 2.942}, {'end': 10810.162, 'text': "So let's return, we'll say listings dot edit, which we haven't created just yet.", 'start': 10804.858, 'duration': 5.304}, {'end': 10818.328, 'text': "And then we're going to pass in here the listing itself, which is going to come from here.", 'start': 10810.743, 'duration': 7.585}, {'end': 10820.15, 'text': 'All right.', 'start': 10818.348, 'duration': 1.802}, {'end': 10821.171, 'text': "So let's save that.", 'start': 10820.19, 'duration': 0.981}, {'end': 10828.576, 'text': "Actually, let's do a die dump of listing just so we can see if this is hooked up.", 'start': 10821.231, 'duration': 7.345}, {'end': 10830.277, 'text': 'Yeah OK, looks good.', 'start': 10828.856, 'duration': 1.421}, {'end': 10833.52, 'text': 'We should be able to get specific fields like title.', 'start': 10830.678, 'duration': 2.842}, {'end': 10837.292, 'text': 'alright cool.', 'start': 10835.231, 'duration': 2.061}, {'end': 10842.914, 'text': 'so now we want view, which is gonna be in views, and then we have the listings folder.', 'start': 10837.292, 'duration': 5.622}, {'end': 10843.994, 'text': "we're gonna create a file.", 'start': 10842.914, 'duration': 1.08}, {'end': 10849.216, 'text': "they're called edit dot blade dot PHP.", 'start': 10843.994, 'duration': 5.222}, {'end': 10857.958, 'text': 'now I think the easiest thing to do here is gonna be to just copy the whole create form and paste that in,', 'start': 10849.216, 'duration': 8.742}, {'end': 10860.379, 'text': "and then let's just change some stuff up here.", 'start': 10857.958, 'duration': 2.421}, {'end': 10871.595, 'text': 'so this will be edit gig and here we could say like edit colon and then the title.', 'start': 10860.379, 'duration': 11.216}, {'end': 10877.318, 'text': 'because remember, we have access to this listing.', 'start': 10871.595, 'duration': 5.723}, {'end': 10883.861, 'text': "and let's see for the form, the action is going to be listing, slash, and then we want the id.", 'start': 10877.318, 'duration': 6.543}, {'end': 10892.365, 'text': 'um, yeah, so listings, is that right?', 'start': 10883.861, 'duration': 8.504}, {'end': 10899.131, 'text': 'uh, yeah, we want listings and then the id.', 'start': 10896.61, 'duration': 2.521}, {'end': 10902.612, 'text': "so listing id now we can't.", 'start': 10899.131, 'duration': 3.481}, {'end': 10905.753, 'text': "we want this to be a put request because it's a, it's an update.", 'start': 10902.612, 'duration': 3.141}, {'end': 10911.195, 'text': "however, we can't just in the method, we can't do put right, we can only do get and post.", 'start': 10905.753, 'duration': 5.442}, {'end': 10916.317, 'text': 'so laravel gives us a very handy directive called method.', 'start': 10911.195, 'duration': 5.122}, {'end': 10927.063, 'text': "so right under our CSRF directive, let's say method and then we're gonna pass in here we want this to be a put request.", 'start': 10916.317, 'duration': 10.746}, {'end': 10933.745, 'text': 'okay, so then it will get sent as a put and Now we want the the form to be prefilled.', 'start': 10927.063, 'duration': 6.682}, {'end': 10941.907, 'text': "So instead of these old values here, we're going to replace that with listing and then whatever the field.", 'start': 10933.785, 'duration': 8.122}, {'end': 10943.188, 'text': 'So in this case, company.', 'start': 10941.947, 'duration': 1.241}, {'end': 10944.148, 'text': 'All right.', 'start': 10943.828, 'duration': 0.32}, {'end': 10948.049, 'text': "Then I'll just copy this and we're going to do that to all of these.", 'start': 10944.208, 'duration': 3.841}, {'end': 10951.13, 'text': 'So this one here is going to be the title.', 'start': 10948.149, 'duration': 2.981}, {'end': 10954.711, 'text': "And let's see this one.", 'start': 10951.15, 'duration': 3.561}, {'end': 10959.689, 'text': "Let's replace that with location.", 'start': 10956.988, 'duration': 2.701}, {'end': 10964.532, 'text': 'Then we have email.', 'start': 10959.709, 'duration': 4.823}, {'end': 10975.397, 'text': 'Email And then what else? Website.', 'start': 10972.356, 'duration': 3.041}, {'end': 10981.941, 'text': 'And tags.', 'start': 10975.417, 'duration': 6.524}, {'end': 10995.664, 'text': "logo. i'm going to skip that for a minute and then description is going to go in here for the logo.", 'start': 10987.481, 'duration': 8.183}, {'end': 10998.465, 'text': "i'm actually going to show the current image.", 'start': 10995.664, 'duration': 2.801}, {'end': 11004.507, 'text': "so let's go right under the input and i'll copy from the show.", 'start': 10998.465, 'duration': 6.042}, {'end': 11011.909, 'text': "i'll copy the image so this right here let's grab that and we'll put that right here.", 'start': 11004.507, 'duration': 7.402}, {'end': 11016.777, 'text': "save that and then let's reload All right.", 'start': 11011.909, 'duration': 4.868}, {'end': 11018.459, 'text': 'so we have all the fields here.', 'start': 11016.777, 'duration': 1.682}, {'end': 11024.544, 'text': 'And you can see the logo, the current logo is also showing.', 'start': 11018.479, 'duration': 6.065}, {'end': 11027.707, 'text': 'All right, cool, so.', 'start': 11024.564, 'duration': 3.143}, {'end': 11036.854, 'text': "In order to submit this, we need to have another route, so let's go to our web routes.", 'start': 11029.488, 'duration': 7.366}], 'summary': 'Creating a listing controller class with an edit method and edit form, including route and view setup.', 'duration': 45.036, 'max_score': 10676.778, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY10676778.jpg'}, {'end': 11182.904, 'src': 'embed', 'start': 11150.354, 'weight': 13, 'content': [{'end': 11156.681, 'text': "let's get rid of this rule here, because if you're editing and you try to submit a company you know this,", 'start': 11150.354, 'duration': 6.327}, {'end': 11161.527, 'text': "your same company this is gonna fire off and we're not gonna be able to because it's already there.", 'start': 11156.681, 'duration': 4.846}, {'end': 11165.451, 'text': 'so you want to make sure you get rid of that and I think that should do it.', 'start': 11161.527, 'duration': 3.924}, {'end': 11173.318, 'text': "and then, as far as As far as the logo goes, we'll just keep that so the logo can be updated.", 'start': 11165.451, 'duration': 7.867}, {'end': 11182.904, 'text': 'And then instead of listing, instead of taking listing and create, we need the current listing, which we can get from right here.', 'start': 11173.999, 'duration': 8.905}], 'summary': 'Removing a conflicting rule for company submission and updating the logo for current listing.', 'duration': 32.55, 'max_score': 11150.354, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY11150354.jpg'}, {'end': 11470.597, 'src': 'embed', 'start': 11436.564, 'weight': 0, 'content': [{'end': 11442.868, 'text': "We'll do a class here of text dash red dash 500.", 'start': 11436.564, 'duration': 6.304}, {'end': 11444.849, 'text': "And I'm going to put an icon in here as well.", 'start': 11442.868, 'duration': 1.981}, {'end': 11451.453, 'text': "So let's do F a solid and then F a dash trash.", 'start': 11444.909, 'duration': 6.544}, {'end': 11455.775, 'text': "And then next to that, we'll say delete.", 'start': 11452.773, 'duration': 3.002}, {'end': 11456.776, 'text': 'Save that.', 'start': 11456.175, 'duration': 0.601}, {'end': 11457.376, 'text': 'Take a look.', 'start': 11456.816, 'duration': 0.56}, {'end': 11458.857, 'text': 'Go to show.', 'start': 11458.016, 'duration': 0.841}, {'end': 11460.618, 'text': 'And there we go.', 'start': 11460.118, 'duration': 0.5}, {'end': 11463.139, 'text': "So we have this delete and it's going to submit.", 'start': 11460.658, 'duration': 2.481}, {'end': 11470.597, 'text': 'going to submit to listing, slash listing id as a delete.', 'start': 11465.535, 'duration': 5.062}], 'summary': 'Creating a class with text-red-500, adding an icon, and implementing a delete function.', 'duration': 34.033, 'max_score': 11436.564, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY11436564.jpg'}, {'end': 11581.629, 'src': 'embed', 'start': 11539.153, 'weight': 1, 'content': [{'end': 11543.254, 'text': 'So now in here, this is going to be really simple.', 'start': 11539.153, 'duration': 4.101}, {'end': 11546.575, 'text': 'All we have to do is take that listing and just call delete.', 'start': 11543.294, 'duration': 3.281}, {'end': 11553.236, 'text': "And then we'll go ahead and just redirect semicolon and then we'll we'll return.", 'start': 11548.335, 'duration': 4.901}, {'end': 11562.978, 'text': "Redirect and let's just redirect to the home page, and we want to do that with a flash message, so let's say with.", 'start': 11555.337, 'duration': 7.641}, {'end': 11566.019, 'text': 'And say message.', 'start': 11564.859, 'duration': 1.16}, {'end': 11575.38, 'text': "We'll say listing deleted successfully.", 'start': 11570.192, 'duration': 5.188}, {'end': 11581.629, 'text': 'All right.', 'start': 11575.4, 'duration': 6.229}], 'summary': 'Deleting a listing and redirecting to home with success message.', 'duration': 42.476, 'max_score': 11539.153, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY11539153.jpg'}, {'end': 11701.13, 'src': 'embed', 'start': 11611.998, 'weight': 3, 'content': [{'end': 11615.381, 'text': 'So now I think we can move on to user authentication.', 'start': 11611.998, 'duration': 3.383}, {'end': 11618.255, 'text': "Now we already have a user's table.", 'start': 11616.454, 'duration': 1.801}, {'end': 11624.14, 'text': "Let's just close all this up so we can talk about what we're going to do next.", 'start': 11618.276, 'duration': 5.864}, {'end': 11628.924, 'text': "So we know we have a user's table because of that migration that Laravel comes with.", 'start': 11624.821, 'duration': 4.103}, {'end': 11631.446, 'text': "We don't need to add any extra fields or anything.", 'start': 11629.284, 'duration': 2.162}, {'end': 11634.508, 'text': 'We already have email password name and so on.', 'start': 11631.486, 'duration': 3.022}, {'end': 11635.869, 'text': "So that's all set.", 'start': 11634.969, 'duration': 0.9}, {'end': 11640.253, 'text': 'Now we want this register to go to slash register.', 'start': 11636.37, 'duration': 3.883}, {'end': 11642.655, 'text': 'Right now it goes to register dot html.', 'start': 11640.333, 'duration': 2.322}, {'end': 11646.437, 'text': "But we'll change that and then we'll show the form to register.", 'start': 11643.535, 'duration': 2.902}, {'end': 11653.841, 'text': "We'll be able to create a new user and then we'll move on to the login and the relationship with the listings and so on.", 'start': 11646.837, 'duration': 7.004}, {'end': 11654.922, 'text': 'All right.', 'start': 11654.622, 'duration': 0.3}, {'end': 11666.168, 'text': "So let's start off in our routes web file and let's say show register create form.", 'start': 11655.062, 'duration': 11.106}, {'end': 11677.078, 'text': 'So route get and The endpoint that I want is going to be slash register.', 'start': 11667.529, 'duration': 9.549}, {'end': 11683.86, 'text': "And then we're going to have a user controller, which we don't have yet, but we will.", 'start': 11677.098, 'duration': 6.762}, {'end': 11687.221, 'text': "And let's say class.", 'start': 11685.361, 'duration': 1.86}, {'end': 11692.663, 'text': "And then the method that we're going to have for this is going to be called create.", 'start': 11688.421, 'duration': 4.242}, {'end': 11696.904, 'text': 'You can call it register if you want, but I like to try to stick to these if I can.', 'start': 11692.703, 'duration': 4.201}, {'end': 11701.13, 'text': "Now let's create the user controller.", 'start': 11698.447, 'duration': 2.683}], 'summary': 'Planning to implement user authentication, creating user controller and showing registration form at /register endpoint.', 'duration': 89.132, 'max_score': 11611.998, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY11611998.jpg'}, {'end': 11775.544, 'src': 'embed', 'start': 11736.458, 'weight': 14, 'content': [{'end': 11743.501, 'text': 'So layout and right here should get rid of the dot HTML slash register.', 'start': 11736.458, 'duration': 7.043}, {'end': 11745.101, 'text': "Let's do the same for login.", 'start': 11743.541, 'duration': 1.56}, {'end': 11746.982, 'text': 'Get rid of that.', 'start': 11746.282, 'duration': 0.7}, {'end': 11755.404, 'text': 'okay. and now, if we come over here and reload click, that just says create does not exist.', 'start': 11748.795, 'duration': 6.609}, {'end': 11767.98, 'text': "so we need to go now into our controller, user, controller and let's say show, Register, slash, create form.", 'start': 11755.404, 'duration': 12.576}, {'end': 11771.982, 'text': 'And this is going to be public function.', 'start': 11769.121, 'duration': 2.861}, {'end': 11775.544, 'text': 'Did I call it? Yeah, create.', 'start': 11772.002, 'duration': 3.542}], 'summary': "Adjust urls, fix 'create' function to resolve 'create does not exist' issue in the user controller.", 'duration': 39.086, 'max_score': 11736.458, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY11736458.jpg'}, {'end': 11869.4, 'src': 'embed', 'start': 11815.207, 'weight': 2, 'content': [{'end': 11819.308, 'text': "This is why I like using a layout component is because it's so easy to add.", 'start': 11815.207, 'duration': 4.101}, {'end': 11823.602, 'text': 'All right, so if we save that, now we come back over here.', 'start': 11820.68, 'duration': 2.922}, {'end': 11824.503, 'text': 'There we go.', 'start': 11824.003, 'duration': 0.5}, {'end': 11826.685, 'text': 'Now we have the form.', 'start': 11825.544, 'duration': 1.141}, {'end': 11830.868, 'text': 'You could copy one of the post forms or listing forms if you want,', 'start': 11827.646, 'duration': 3.222}, {'end': 11839.455, 'text': "but I'm just going to grab from the register HTML this div right here that has the BG gray and the border and stuff.", 'start': 11830.868, 'duration': 8.587}, {'end': 11843.378, 'text': 'I want that whole div, which ends right here.', 'start': 11840.095, 'duration': 3.283}, {'end': 11852.05, 'text': "All right, so we're going to grab that, copy it, and then put that within the layout.", 'start': 11845.106, 'duration': 6.944}, {'end': 11860.875, 'text': 'And then this div, this is actually going to be that card component, but there are some extra classes here.', 'start': 11854.572, 'duration': 6.303}, {'end': 11869.4, 'text': "So let's see, rounded is included in the thing, in the card component, so these classes are not.", 'start': 11861.816, 'duration': 7.584}], 'summary': 'Using layout component for easy addition of form; copying from register html and integrating into layout.', 'duration': 54.193, 'max_score': 11815.207, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY11815207.jpg'}], 'start': 10056.955, 'title': 'Laravel application development', 'summary': 'Discusses file storage, database update, refresh, file uploads, laravel listings update, edit, crud functionality, delete process, user authentication, and registration process. it covers configuring file systems, public image storage, database schema update, database seeding, image uploading, symlink creation, crud implementation, and user authentication setup.', 'chapters': [{'end': 10223.77, 'start': 10056.955, 'title': 'File storage and database update', 'summary': 'Discusses file storage and database update in a laravel application, including configuring file systems, setting up public image storage, and updating the database schema to include a field for the file path.', 'duration': 166.815, 'highlights': ['Configuring file systems in Laravel, including changing the default disk from local to public for storing images. The default location for storing images is in the storage/app/public folder, and it is possible to configure different disks such as Amazon S3 for storage.', "Updating the database schema to include a nullable field for the file path, allowing for flexibility in storing images. A new field 'logo' is added to the 'listings' table as a string type to store the path of the image file, with the option to be nullable if no image is present.", "Demonstrating the process of creating and storing files in a Laravel application using the 'store' method. The 'store' method is used to store the file, capturing its name, type (e.g., image/png), and file size, facilitating storage of relevant data."]}, {'end': 10614.893, 'start': 10223.79, 'title': 'Database refresh and file uploads', 'summary': 'Details the process of refreshing the database, seeding it with sample data, uploading images to the storage folder, storing image paths in the database, and creating a symlink for public access, demonstrating the process with code examples and a practical walkthrough.', 'duration': 391.103, 'highlights': ['Demonstrating the process of refreshing the database, seeding it with sample data, and preparing it for file uploads. The transcript covers the steps involved in refreshing the database, seeding it with sample data, and preparing it for file uploads.', 'Explaining the process of uploading images to the storage folder and storing their paths in the database with practical code examples. The speaker explains the process of uploading images to the storage folder and storing their paths in the database with practical code examples.', 'Walkthrough of creating a symlink for public access and demonstrating its functionality with a practical example. The transcript includes a walkthrough of creating a symlink for public access and demonstrates its functionality with a practical example.']}, {'end': 11173.318, 'start': 10614.893, 'title': 'Laravel listings update and edit', 'summary': 'Covers adding edit and update functionality to laravel listings, including creating edit links, setting up edit form, and submitting updates, with specific details on routes, controller methods, and form actions.', 'duration': 558.425, 'highlights': ["Creating edit link and setting up edit form for Laravel listings The chapter discusses creating an edit link to go to the edit form for Laravel listings, setting up the edit form for editing gig details, and using the 'method' directive for a put request in Laravel.", "Submitting updates and setting up routes for Laravel listings The process of submitting updates for Laravel listings by setting up routes for edit form submission, using the 'route put' directive for a put request, and creating an 'update' method in the listing controller to handle the update functionality.", 'Handling form validation and logo update for Laravel listings The details include handling form validation during listing updates, making changes to form validation rules to accommodate editing, and discussing the process of updating the logo for Laravel listings.']}, {'end': 11610.336, 'start': 11173.999, 'title': 'Crud functionality and delete process', 'summary': 'Discusses the process of implementing crud functionality, including creating, updating, and deleting listings, with a focus on the delete process, culminating in complete crud functionality and tag-based filtering.', 'duration': 436.337, 'highlights': ['Complete CRUD functionality The chapter covers the implementation of complete CRUD functionality, including creating, updating, and deleting listings.', 'Focus on the delete process The chapter emphasizes the process of implementing the delete functionality, including creating a form, setting up the delete request, defining the route, and adding the destroy method in the controller.', 'Tag-based filtering The chapter mentions the ability to filter listings by tags and search functionality, indicating the inclusion of additional features beyond basic CRUD operations.']}, {'end': 11869.4, 'start': 11611.998, 'title': 'User authentication and registration process', 'summary': 'Covers setting up user authentication and registration process, including creating a user controller, updating routes, and creating a registration form, facilitating the transition to user registration and login functionalities for a web application.', 'duration': 257.402, 'highlights': ['The chapter covers setting up user authentication and registration process Key point: user authentication and registration process. No quantifiable data available.', 'including creating a user controller, updating routes, and creating a registration form Key points: creating a user controller, updating routes, and creating a registration form. No quantifiable data available.', 'facilitating the transition to user registration and login functionalities for a web application Key point: transition to user registration and login functionalities. No quantifiable data available.']}], 'duration': 1812.445, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY10056955.jpg', 'highlights': ['Configuring file systems in Laravel, including changing the default disk from local to public for storing images.', 'Updating the database schema to include a nullable field for the file path, allowing for flexibility in storing images.', "Demonstrating the process of creating and storing files in a Laravel application using the 'store' method.", 'Demonstrating the process of refreshing the database, seeding it with sample data, and preparing it for file uploads.', 'Explaining the process of uploading images to the storage folder and storing their paths in the database with practical code examples.', 'Walkthrough of creating a symlink for public access and demonstrating its functionality with a practical example.', 'Creating edit link and setting up edit form for Laravel listings.', 'Submitting updates and setting up routes for Laravel listings.', 'Handling form validation and logo update for Laravel listings.', 'Complete CRUD functionality.', 'Focus on the delete process.', 'Tag-based filtering.', 'The chapter covers setting up user authentication and registration process.', 'Including creating a user controller, updating routes, and creating a registration form.', 'Facilitating the transition to user registration and login functionalities for a web application.']}, {'end': 13529.395, 'segs': [{'end': 12169.041, 'src': 'embed', 'start': 12134.769, 'weight': 4, 'content': [{'end': 12138.392, 'text': 'Or actually, what did I do in the listings? I want to try to stay consistent.', 'start': 12134.769, 'duration': 3.623}, {'end': 12141.795, 'text': 'So in store for the listings, no, I use this.', 'start': 12138.953, 'duration': 2.842}, {'end': 12143.557, 'text': "All right, so we'll do that here as well.", 'start': 12142.095, 'duration': 1.462}, {'end': 12151.077, 'text': 'and then we want to do our validation.', 'start': 12148.756, 'duration': 2.321}, {'end': 12164.24, 'text': "so we'll say form fields, set that to request, let's do request and then validate,", 'start': 12151.077, 'duration': 13.163}, {'end': 12169.041, 'text': "and this is going to take in an array and we're going to pass in our fields that we want.", 'start': 12164.24, 'duration': 4.801}], 'summary': 'Consistently used form validation in the listings by setting fields to request and validating with an array.', 'duration': 34.272, 'max_score': 12134.769, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY12134769.jpg'}, {'end': 12390.504, 'src': 'embed', 'start': 12353.529, 'weight': 0, 'content': [{'end': 12375.197, 'text': "so that will actually create the user and then actually i'll put a So create user and then we want to then log in so we can do that with the off helper and then we can call log in and pass in that user that was just created.", 'start': 12353.529, 'duration': 21.668}, {'end': 12378.038, 'text': 'Then we just want to redirect.', 'start': 12376.578, 'duration': 1.46}, {'end': 12379.959, 'text': "So let's return.", 'start': 12378.679, 'duration': 1.28}, {'end': 12387.462, 'text': "Redirect and we want to return with a message, so we'll say with.", 'start': 12381.46, 'duration': 6.002}, {'end': 12390.504, 'text': 'And message.', 'start': 12389.723, 'duration': 0.781}], 'summary': 'Create user, log in, and redirect with a message.', 'duration': 36.975, 'max_score': 12353.529, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY12353529.jpg'}, {'end': 12894.264, 'src': 'heatmap', 'start': 12732.597, 'weight': 0.724, 'content': [{'end': 12736.399, 'text': 'so laravel makes it really easy to to just do stuff like this.', 'start': 12732.597, 'duration': 3.802}, {'end': 12738.901, 'text': "now i only want this shown if we're logged in.", 'start': 12736.399, 'duration': 2.502}, {'end': 12746.545, 'text': "so i'm going to go right above this li and just say off and then right here, above the links that are for guests,", 'start': 12738.901, 'duration': 7.644}, {'end': 12756.049, 'text': "i'm going to do an else And then after those two links or list items we're going to do at end off.", 'start': 12746.545, 'duration': 9.504}, {'end': 12757.49, 'text': "And that's it.", 'start': 12756.989, 'duration': 0.501}, {'end': 12758.13, 'text': "Let's save.", 'start': 12757.53, 'duration': 0.6}, {'end': 12759.73, 'text': 'Come back over here and reload.', 'start': 12758.25, 'duration': 1.48}, {'end': 12761.151, 'text': 'And there we go.', 'start': 12760.591, 'duration': 0.56}, {'end': 12762.331, 'text': 'So we see welcome.', 'start': 12761.211, 'duration': 1.12}, {'end': 12765.632, 'text': 'We see our name and then the manage listings link.', 'start': 12762.511, 'duration': 3.121}, {'end': 12767.373, 'text': 'All right.', 'start': 12766.973, 'duration': 0.4}, {'end': 12770.414, 'text': 'Oh, we need a logout link to forgot about that.', 'start': 12767.993, 'duration': 2.421}, {'end': 12779.99, 'text': "uh, that's obviously going to go up here where, um, our auth links are, and i think that's probably what we should do.", 'start': 12771.463, 'duration': 8.527}, {'end': 12782.332, 'text': 'next is the log out.', 'start': 12779.99, 'duration': 2.342}, {'end': 12785.495, 'text': "um, yeah, let's do that.", 'start': 12782.332, 'duration': 3.163}, {'end': 12794.342, 'text': "now. the logo it's not going to be a link, it's going to be a form, because it needs to be a post request, or we're going to make it a post request.", 'start': 12785.495, 'duration': 8.847}, {'end': 12798.185, 'text': 'so after this list item of the manage,', 'start': 12794.342, 'duration': 3.843}, {'end': 12812.562, 'text': "let's create another one and then this is going to be a form and actually I'm going to give it a class of inline and the method.", 'start': 12798.185, 'duration': 14.377}, {'end': 12817.505, 'text': 'so method is going to be post and then the action.', 'start': 12812.562, 'duration': 4.943}, {'end': 12820.887, 'text': "let's do, we'll do slash logo.", 'start': 12817.505, 'duration': 3.382}, {'end': 12829.23, 'text': "All right, now inside the form tags, We're going to have, first of all, we need our CSRF.", 'start': 12822.188, 'duration': 7.042}, {'end': 12831.671, 'text': "And then we're going to have a button.", 'start': 12830.29, 'duration': 1.381}, {'end': 12837.114, 'text': "And let's see.", 'start': 12833.432, 'duration': 3.682}, {'end': 12840.476, 'text': "Let's actually make this a type of submit.", 'start': 12837.314, 'duration': 3.162}, {'end': 12844.778, 'text': "And we'll put an icon here as well.", 'start': 12843.097, 'duration': 1.681}, {'end': 12848.5, 'text': "Let's do fa-solid.fa-door-closed.", 'start': 12844.798, 'duration': 3.702}, {'end': 12859.664, 'text': "then next to that we'll say log out, all right, let's check that, okay.", 'start': 12853.721, 'duration': 5.943}, {'end': 12861.645, 'text': 'so now we have a logout link.', 'start': 12859.664, 'duration': 1.981}, {'end': 12864.826, 'text': 'now we need to handle that route.', 'start': 12861.645, 'duration': 3.181}, {'end': 12873.53, 'text': "so let's go to our routes and then say log, user out.", 'start': 12864.826, 'duration': 8.704}, {'end': 12880.893, 'text': "so route, get All right, and then that's going to be slash log out.", 'start': 12873.53, 'duration': 7.363}, {'end': 12884.836, 'text': 'And then from there, we want the user controller.', 'start': 12882.094, 'duration': 2.742}, {'end': 12890.661, 'text': "Class and then the method that we're going to use is going to be called log out as well.", 'start': 12886.257, 'duration': 4.404}, {'end': 12894.264, 'text': "Now, in the controller, we're going to create a log out.", 'start': 12891.381, 'duration': 2.883}], 'summary': 'Using laravel to create a logout link as a form with a post request and handling the log out route in the user controller.', 'duration': 161.667, 'max_score': 12732.597, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY12732597.jpg'}, {'end': 13205.449, 'src': 'embed', 'start': 13098.93, 'weight': 1, 'content': [{'end': 13104.612, 'text': "And then we just want to return the view, which we haven't created yet, but we'll do users dot login.", 'start': 13098.93, 'duration': 5.682}, {'end': 13107.393, 'text': 'All right.', 'start': 13104.632, 'duration': 2.761}, {'end': 13108.554, 'text': "And then let's create that.", 'start': 13107.433, 'duration': 1.121}, {'end': 13113.955, 'text': "So down here we have users and let's create a file called Login.Blade.PHP.", 'start': 13108.594, 'duration': 5.361}, {'end': 13120.589, 'text': "right and then for this we can copy the register form because it's very similar.", 'start': 13116.385, 'duration': 4.204}, {'end': 13123.131, 'text': "so we'll grab that, paste that in.", 'start': 13120.589, 'duration': 2.542}, {'end': 13128.656, 'text': "let's change this to login.", 'start': 13123.131, 'duration': 5.525}, {'end': 13132.099, 'text': 'instead of create an account to post gigs.', 'start': 13128.656, 'duration': 3.443}, {'end': 13140.607, 'text': "let's say log into your account and then post request and it's going to go to.", 'start': 13132.099, 'duration': 8.508}, {'end': 13149.59, 'text': "uh, now login is a little different because it's not part of like crud functionality.", 'start': 13143.188, 'duration': 6.402}, {'end': 13159.634, 'text': "so i think what we'll do here is just users slash login all right, and then we don't need the name.", 'start': 13149.59, 'duration': 10.044}, {'end': 13161.055, 'text': 'so we can get rid of that.', 'start': 13159.634, 'duration': 1.421}, {'end': 13163.816, 'text': 'we just need the email and password.', 'start': 13161.055, 'duration': 2.761}, {'end': 13170.845, 'text': 'so we also want to get rid of the confirm the password confirmation and then instead of sign up,', 'start': 13163.816, 'duration': 7.029}, {'end': 13176.287, 'text': 'we can say sign in and down here instead of already have an account.', 'start': 13170.845, 'duration': 5.442}, {'end': 13187.611, 'text': "let's say don't have an account, then register all right.", 'start': 13176.287, 'duration': 11.324}, {'end': 13190.813, 'text': 'so if we come over here and click login, we see our form.', 'start': 13187.611, 'duration': 3.202}, {'end': 13193.614, 'text': 'what is that?', 'start': 13190.813, 'duration': 2.801}, {'end': 13200.128, 'text': 'why do we have See email?', 'start': 13193.614, 'duration': 6.514}, {'end': 13205.449, 'text': 'Oh, you know, I did this happened to me before.', 'start': 13203.408, 'duration': 2.041}], 'summary': 'Creating a login view, modifying form, and updating functionality.', 'duration': 106.519, 'max_score': 13098.93, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY13098930.jpg'}, {'end': 13285.491, 'src': 'embed', 'start': 13230.496, 'weight': 5, 'content': [{'end': 13233.718, 'text': "Yeah So let's make sure that in the register we do the same thing.", 'start': 13230.496, 'duration': 3.222}, {'end': 13239.622, 'text': 'So anywhere where we have value equals old, we should have the quotes.', 'start': 13235.88, 'duration': 3.742}, {'end': 13252.531, 'text': 'Here Confirmation.', 'start': 13242.504, 'duration': 10.027}, {'end': 13253.091, 'text': 'All right.', 'start': 13252.551, 'duration': 0.54}, {'end': 13257.655, 'text': 'All right, cool.', 'start': 13255.794, 'duration': 1.861}, {'end': 13258.315, 'text': "So let's see.", 'start': 13257.675, 'duration': 0.64}, {'end': 13263.698, 'text': 'This is going to get submitted to user slash log in.', 'start': 13259.896, 'duration': 3.802}, {'end': 13265.399, 'text': 'So now we need to create that route.', 'start': 13263.738, 'duration': 1.661}, {'end': 13276.105, 'text': 'So log in user route going to be post.', 'start': 13268.721, 'duration': 7.384}, {'end': 13282.288, 'text': "And it's going to be slash users slash.", 'start': 13279.426, 'duration': 2.862}, {'end': 13285.491, 'text': "Let's see.", 'start': 13285.111, 'duration': 0.38}], 'summary': 'Discussing updating the register and creating a new user login route.', 'duration': 54.995, 'max_score': 13230.496, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY13230496.jpg'}, {'end': 13529.395, 'src': 'embed', 'start': 13499.026, 'weight': 8, 'content': [{'end': 13504.809, 'text': 'so whether the email is there or not or the password fails, you just want just one message that says invalid.', 'start': 13499.026, 'duration': 5.783}, {'end': 13510.855, 'text': "So with errors, that's going to take in an array and we want to put it in the email field.", 'start': 13505.749, 'duration': 5.106}, {'end': 13516.821, 'text': "OK, and then we'll say invalid credentials.", 'start': 13510.875, 'duration': 5.946}, {'end': 13526.171, 'text': 'OK, and then, like I said, we want it to just show in the in the email so we can do only input.', 'start': 13519.724, 'duration': 6.447}, {'end': 13529.395, 'text': 'And then in here, pass an email.', 'start': 13527.313, 'duration': 2.082}], 'summary': "System will display 'invalid credentials' message for email/password errors.", 'duration': 30.369, 'max_score': 13499.026, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY13499026.jpg'}], 'start': 11869.42, 'title': 'User form update, validation, and authentication', 'summary': 'Covers updating form with new fields, handling user form submission and routing, validating user input with laravel, user registration, authentication, log out functionality, and creating a secure user authentication process.', 'chapters': [{'end': 12169.041, 'start': 11869.42, 'title': 'Updating form and handling user submission', 'summary': 'Details the process of updating a form with new fields, setting up form submission handling, and routing for creating a new user, including adding validation for form fields and handling post requests to /users.', 'duration': 299.621, 'highlights': ['The process of updating a form with new fields and setting up form submission handling is detailed. The speaker discusses adding new fields to a form, such as name, email, and password confirmation, along with setting up error handling and submission handling for the form.', 'Routing for creating a new user and adding validation for form fields is explained. The chapter covers creating a route for a post request to /users and setting up a user controller class with a store method for storing a new user, including adding validation for form fields using the request helper.']}, {'end': 12602.449, 'start': 12169.041, 'title': 'Laravel form validation and user registration', 'summary': 'Explains the process of validating user input with laravel, including setting required fields, minimum character limits, unique email validation, password confirmation, and hashing passwords with bcrypt. it also demonstrates the creation and automatic login of users, with examples of validation error handling and retaining form field values.', 'duration': 433.408, 'highlights': ['The chapter explains the process of validating user input with Laravel, including setting required fields, minimum character limits, unique email validation, password confirmation, and hashing passwords with bcrypt. The chapter covers setting required fields, minimum character limits, unique email validation, password confirmation, and hashing passwords with bcrypt for user input validation.', 'It also demonstrates the creation and automatic login of users, with examples of validation error handling and retaining form field values. The chapter demonstrates the creation and automatic login of users, along with examples of validation error handling and retaining form field values.', 'The validation process includes checking for required fields, minimum character limits, unique email validation, and password confirmation. The validation process includes checking for required fields, minimum character limits, unique email validation, and password confirmation.', 'The example includes demonstrating error handling for validation and retaining form field values after submission. The example includes demonstrating error handling for validation and retaining form field values after submission.', 'The chapter also showcases the use of bcrypt for hashing passwords and automatically logging in users after registration. The chapter also showcases the use of bcrypt for hashing passwords and automatically logging in users after registration.']}, {'end': 13205.449, 'start': 12602.469, 'title': 'Adding user authentication and log out', 'summary': 'Discusses adding user authentication and log out functionality using laravel, including showing different links based on login status, adding a welcome message, creating a log out form, handling the log out process, and creating a login form for users.', 'duration': 602.98, 'highlights': ['Adding a welcome message and manage listings link for logged-in users The speaker explains how to display a welcome message and a link to manage listings for logged-in users, enhancing user experience.', 'Creating a log out form and handling the log out process The process of creating a log out form using a post request and handling the log out process in the user controller is detailed, resulting in successful log out functionality.', 'Creating a login form for users and showing the login form The steps for creating a login form for users, including creating a new route, a method in the user controller, and the corresponding login form, are explained.']}, {'end': 13529.395, 'start': 13206.229, 'title': 'User authentication process', 'summary': 'Discusses the process of creating a user authentication route and controller method, including validation and handling of login attempts, making user login more secure by not revealing whether the email or password is incorrect.', 'duration': 323.166, 'highlights': ['The chapter discusses the process of creating a user authentication route and controller method. Creation of user authentication route and controller method.', 'The method includes validation and handling of login attempts. Inclusion of validation and handling of login attempts.', 'Making user login more secure by not revealing whether the email or password is incorrect. Enhancing security by not revealing incorrect email or password during login.']}], 'duration': 1659.975, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY11869420.jpg', 'highlights': ['The process of updating a form with new fields and setting up form submission handling is detailed.', 'Routing for creating a new user and adding validation for form fields is explained.', 'The chapter explains the process of validating user input with Laravel, including setting required fields, minimum character limits, unique email validation, password confirmation, and hashing passwords with bcrypt.', 'It also demonstrates the creation and automatic login of users, with examples of validation error handling and retaining form field values.', 'Adding a welcome message and manage listings link for logged-in users.', 'Creating a log out form and handling the log out process.', 'Creating a login form for users and showing the login form.', 'The chapter discusses the process of creating a user authentication route and controller method.', 'The method includes validation and handling of login attempts.', 'Making user login more secure by not revealing whether the email or password is incorrect.']}, {'end': 14157.01, 'segs': [{'end': 13843.015, 'src': 'heatmap', 'start': 13655.39, 'weight': 3, 'content': [{'end': 13660.233, 'text': "And then on the other hand, when I'm logged in, I don't want to be able to go to register or log in.", 'start': 13655.39, 'duration': 4.843}, {'end': 13664.696, 'text': 'So Laravel has middleware that we can use to prevent this from happening.', 'start': 13660.633, 'duration': 4.063}, {'end': 13666.177, 'text': "And it's really simple to use.", 'start': 13665.096, 'duration': 1.081}, {'end': 13672.022, 'text': "We can just go to the routes And let's say for this create form, I only want authenticated users.", 'start': 13666.197, 'duration': 5.825}, {'end': 13678.207, 'text': 'I can just put an arrow here and then middleware and then the middleware that I want to use for that route, which is off.', 'start': 13672.162, 'duration': 6.045}, {'end': 13679.919, 'text': 'All right.', 'start': 13679.639, 'duration': 0.28}, {'end': 13683.123, 'text': "Now I'm going to save this and I'm going to run into a small issue.", 'start': 13680.079, 'duration': 3.044}, {'end': 13687.187, 'text': 'If I click on post job, it says route login not defined.', 'start': 13683.283, 'duration': 3.904}, {'end': 13688.007, 'text': 'All right.', 'start': 13687.767, 'duration': 0.24}, {'end': 13690.17, 'text': "And I'm going to show you where this middleware is.", 'start': 13688.067, 'duration': 2.103}, {'end': 13693.813, 'text': "It's in your app folder middleware and then authenticate.", 'start': 13690.25, 'duration': 3.563}, {'end': 13696.556, 'text': 'It uses this function called redirect to.', 'start': 13694.294, 'duration': 2.262}, {'end': 13699.959, 'text': "Now here it's saying return route login.", 'start': 13697.137, 'duration': 2.822}, {'end': 13701.301, 'text': 'Now we do have a.', 'start': 13700.52, 'duration': 0.781}, {'end': 13710.39, 'text': "an endpoint called slash login, but what this means, route login, is a route that's named login.", 'start': 13703.483, 'duration': 6.907}, {'end': 13715.234, 'text': "Now we haven't used names, but to add a name to your route is really simple.", 'start': 13710.81, 'duration': 4.424}, {'end': 13719.178, 'text': 'We come down to the login, so show login form.', 'start': 13715.895, 'duration': 3.283}, {'end': 13724.844, 'text': 'If we go to the end here, we can say an arrow name, and we can name this.', 'start': 13719.979, 'duration': 4.865}, {'end': 13726.526, 'text': 'So we can call it login.', 'start': 13725.304, 'duration': 1.222}, {'end': 13731.142, 'text': "now, if i come back and reload, we're going to see the login page.", 'start': 13727.958, 'duration': 3.184}, {'end': 13735.388, 'text': 'so if i try to go to post job, we get redirected to login.', 'start': 13731.142, 'duration': 4.246}, {'end': 13741.877, 'text': 'if you wanted to change the functionality to do something else, you could edit this file, but yeah.', 'start': 13735.388, 'duration': 6.489}, {'end': 13750.084, 'text': "so now Let's add the off middleware to wherever we don't want guests to access.", 'start': 13741.877, 'duration': 8.207}, {'end': 13751.565, 'text': "So I'm going to just copy this.", 'start': 13750.104, 'duration': 1.461}, {'end': 13754.207, 'text': 'So we have store listings.', 'start': 13752.566, 'duration': 1.641}, {'end': 13757.689, 'text': "We don't want, you know, you want to be authenticated for that.", 'start': 13754.247, 'duration': 3.442}, {'end': 13759.691, 'text': 'Show the edit form, yes.', 'start': 13758.25, 'duration': 1.441}, {'end': 13761.872, 'text': 'Update listing, yes.', 'start': 13760.511, 'duration': 1.361}, {'end': 13764.975, 'text': 'Delete listing, yes.', 'start': 13762.673, 'duration': 2.302}, {'end': 13766.976, 'text': 'Single listing, no.', 'start': 13765.855, 'duration': 1.121}, {'end': 13768.037, 'text': 'Guests can see that.', 'start': 13767.096, 'duration': 0.941}, {'end': 13771.92, 'text': 'Register, obviously no, because you need to be a guest to register.', 'start': 13768.677, 'duration': 3.243}, {'end': 13774.482, 'text': 'Create new register a new user.', 'start': 13772.54, 'duration': 1.942}, {'end': 13777.325, 'text': 'Nope Log out user.', 'start': 13775.042, 'duration': 2.283}, {'end': 13782.71, 'text': 'Yes And yeah, so that should be good.', 'start': 13777.405, 'duration': 5.305}, {'end': 13785.092, 'text': 'Now the same goes for guests.', 'start': 13783.25, 'duration': 1.842}, {'end': 13787.635, 'text': "I'm going to show you if I log in now.", 'start': 13785.172, 'duration': 2.463}, {'end': 13799.361, 'text': "So I'm logged in.", 'start': 13798.28, 'duration': 1.081}, {'end': 13807.867, 'text': 'Now, the register and login links do not show, but if I go to slash register, I can access this.', 'start': 13799.861, 'duration': 8.006}, {'end': 13815.012, 'text': 'So what we can do is on the register form route, we can go ahead and add middleware.', 'start': 13808.487, 'duration': 6.525}, {'end': 13820.436, 'text': "And then we can add in here guest because there's guest middleware.", 'start': 13816.553, 'duration': 3.883}, {'end': 13833.449, 'text': "All right, so I'm going to put that on the show register, and let's also put it on the show login, which is right here.", 'start': 13821.621, 'duration': 11.828}, {'end': 13843.015, 'text': 'Yeah, and even though we did name, you can still chain it on to this, chain the middleware on.', 'start': 13837.971, 'duration': 5.044}], 'summary': 'Using laravel middleware to restrict access for authenticated and guest users, defining named routes, and adding middleware to specific routes based on user authentication status.', 'duration': 187.625, 'max_score': 13655.39, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY13655390.jpg'}, {'end': 13771.92, 'src': 'embed', 'start': 13741.877, 'weight': 5, 'content': [{'end': 13750.084, 'text': "so now Let's add the off middleware to wherever we don't want guests to access.", 'start': 13741.877, 'duration': 8.207}, {'end': 13751.565, 'text': "So I'm going to just copy this.", 'start': 13750.104, 'duration': 1.461}, {'end': 13754.207, 'text': 'So we have store listings.', 'start': 13752.566, 'duration': 1.641}, {'end': 13757.689, 'text': "We don't want, you know, you want to be authenticated for that.", 'start': 13754.247, 'duration': 3.442}, {'end': 13759.691, 'text': 'Show the edit form, yes.', 'start': 13758.25, 'duration': 1.441}, {'end': 13761.872, 'text': 'Update listing, yes.', 'start': 13760.511, 'duration': 1.361}, {'end': 13764.975, 'text': 'Delete listing, yes.', 'start': 13762.673, 'duration': 2.302}, {'end': 13766.976, 'text': 'Single listing, no.', 'start': 13765.855, 'duration': 1.121}, {'end': 13768.037, 'text': 'Guests can see that.', 'start': 13767.096, 'duration': 0.941}, {'end': 13771.92, 'text': 'Register, obviously no, because you need to be a guest to register.', 'start': 13768.677, 'duration': 3.243}], 'summary': "Adding 'off' middleware to restrict guest access to certain parts of the application, such as store listings and registration.", 'duration': 30.043, 'max_score': 13741.877, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY13741877.jpg'}, {'end': 13961.427, 'src': 'embed', 'start': 13930.666, 'weight': 0, 'content': [{'end': 13935.309, 'text': 'and then we want to also make this constrained.', 'start': 13930.666, 'duration': 4.643}, {'end': 13945.256, 'text': "so constrained, and then i'm also going to make it so that on delete, let's say on delete, we're going to pass in here cascade.", 'start': 13935.309, 'duration': 9.947}, {'end': 13954.763, 'text': 'what that means is that if we have a user that creates a bunch of listings and then that user is is deleted for some reason,', 'start': 13945.256, 'duration': 9.507}, {'end': 13958.065, 'text': 'then the listings will also cascade.', 'start': 13954.763, 'duration': 3.302}, {'end': 13961.427, 'text': "those will also delete, OK, so let's save that.", 'start': 13958.065, 'duration': 3.362}], 'summary': 'Making the system constrained, with cascade deletion on user deletion.', 'duration': 30.761, 'max_score': 13930.666, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY13930666.jpg'}, {'end': 14015.405, 'src': 'embed', 'start': 13986.722, 'weight': 1, 'content': [{'end': 13992.307, 'text': "instead of that, I'm going to create a single user and have that user own all six listings.", 'start': 13986.722, 'duration': 5.585}, {'end': 13996.771, 'text': "So let's let's let's comment that out.", 'start': 13993.008, 'duration': 3.763}, {'end': 14000.755, 'text': "And I'm going to set a variable here of user set to user.", 'start': 13997.572, 'duration': 3.183}, {'end': 14005.777, 'text': 'factory. so the same thing that we did above.', 'start': 14002.634, 'duration': 3.143}, {'end': 14015.405, 'text': "it's just going to create a single user and and since i'm just doing user and not including app models user, then i do have to bring that in.", 'start': 14005.777, 'duration': 9.628}], 'summary': 'Creating a single user to own six listings using a user factory.', 'duration': 28.683, 'max_score': 13986.722, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY13986722.jpg'}, {'end': 14133.175, 'src': 'embed', 'start': 14106.849, 'weight': 6, 'content': [{'end': 14110.552, 'text': "I'm going to refresh this and then look at the table.", 'start': 14106.849, 'duration': 3.703}, {'end': 14116.657, 'text': "And you'll see that there's one user, the name John Doe, the email of John at Gmail.", 'start': 14111.413, 'duration': 5.244}, {'end': 14118.779, 'text': 'And the ID is obviously one.', 'start': 14117.117, 'duration': 1.662}, {'end': 14129.432, 'text': "Now if we go to our listings and we check those out, You'll see that now there's a user ID field and there's a one for all of these.", 'start': 14119.299, 'duration': 10.133}, {'end': 14133.175, 'text': 'So that John Doe user owns all of these listings now.', 'start': 14129.492, 'duration': 3.683}], 'summary': 'John doe has 1 user id and owns all listings.', 'duration': 26.326, 'max_score': 14106.849, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY14106849.jpg'}], 'start': 13530.397, 'title': 'Laravel authentication and user-listing relationship', 'summary': 'Covers the implementation of user authentication and middleware in laravel, including the ability to authenticate, create users, implement full crud functionality, and restrict access to certain routes based on user authentication status. it also outlines the process of creating a relationship between listings and users, including adding a user id field in the database, assigning all listings to a single user, and refreshing the database to reflect the changes.', 'chapters': [{'end': 13872.416, 'start': 13530.397, 'title': 'User authentication and middleware in laravel', 'summary': 'Covers the implementation of user authentication and middleware in laravel, including the ability to authenticate, create users, implement full crud functionality, and restrict access to certain routes based on user authentication status.', 'duration': 342.019, 'highlights': ['User authentication and CRUD functionality are implemented, providing the ability to authenticate, create users, and perform CRUD operations. The system has the functionality to authenticate users, create new users, and perform CRUD operations.', 'Implementation of middleware to restrict access to specific routes based on user authentication status, ensuring that only authenticated users can access certain features. Middleware is used to restrict access to specific routes based on user authentication status, ensuring that only authenticated users can access certain features.', 'The use of middleware enables the prevention of unauthorized access to certain functionalities, such as creating new listings and accessing registration and login forms. Middleware prevents unauthorized access to functionalities like creating new listings and accessing registration and login forms.']}, {'end': 14157.01, 'start': 13873.516, 'title': 'Creating user-listing relationship', 'summary': 'Outlines the process of creating a relationship between listings and users, including adding a user id field in the database, assigning all listings to a single user, and refreshing the database to reflect the changes.', 'duration': 283.494, 'highlights': ['The chapter outlines the process of creating a relationship between listings and users. Describes the intention to establish a relationship between listings and users, indicating the need for a user ID field in the database.', 'Adding a user ID field in the database and defining it as a foreign key with cascading delete. Explains the addition of a user ID field as a foreign key in the database, with the constraint of cascading delete if the user is deleted, ensuring data integrity.', "Assigning all six listings to a single user by creating a single user and associating the listings with the user's ID. Describes the process of creating a single user, specifying their details, and associating all six listings with the user's ID, ensuring that the user owns all the listings.", 'Refreshing the database to reflect the changes made, with the user now owning all the listings. Explains the action of refreshing the database to reflect the changes, where the single user is shown to own all the listings after the process is completed.']}], 'duration': 626.613, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY13530397.jpg', 'highlights': ['User authentication and CRUD functionality are implemented, providing the ability to authenticate, create users, and perform CRUD operations.', 'Implementation of middleware to restrict access to specific routes based on user authentication status, ensuring that only authenticated users can access certain features.', 'The use of middleware enables the prevention of unauthorized access to certain functionalities, such as creating new listings and accessing registration and login forms.', 'The chapter outlines the process of creating a relationship between listings and users, indicating the need for a user ID field in the database.', 'Adding a user ID field in the database and defining it as a foreign key with cascading delete, ensuring data integrity.', "Assigning all six listings to a single user by creating a single user and associating the listings with the user's ID, ensuring that the user owns all the listings.", 'Refreshing the database to reflect the changes made, with the user now owning all the listings.']}, {'end': 15530.718, 'segs': [{'end': 14448.726, 'src': 'heatmap', 'start': 14286.178, 'weight': 0.865, 'content': [{'end': 14291.823, 'text': 'so now we create a function here called listings, just like in in list.', 'start': 14286.178, 'duration': 5.645}, {'end': 14298.668, 'text': 'in the listings model we created a function called users and here we want to specify the relationship.', 'start': 14291.823, 'duration': 6.845}, {'end': 14302.812, 'text': 'so return this and the relationship is going to be has many.', 'start': 14298.668, 'duration': 4.144}, {'end': 14308.688, 'text': 'So a listing has many users.', 'start': 14304.882, 'duration': 3.806}, {'end': 14313.254, 'text': "So we want to do here, I'm sorry, listing has many listings.", 'start': 14308.768, 'duration': 4.486}, {'end': 14320.104, 'text': 'So listing class and we can specify that user ID is the field in the database.', 'start': 14313.715, 'duration': 6.389}, {'end': 14321.692, 'text': 'All right.', 'start': 14321.271, 'duration': 0.421}, {'end': 14326.678, 'text': 'so when you think about it, you just look at the file and the file name is listing.', 'start': 14321.692, 'duration': 4.986}, {'end': 14337.111, 'text': 'so the relationship to a user is listing belongs to a user, and then user has many listings.', 'start': 14326.678, 'duration': 10.433}, {'end': 14338.093, 'text': 'All right.', 'start': 14337.812, 'duration': 0.281}, {'end': 14341.193, 'text': "And there's other relationships as well.", 'start': 14339.352, 'duration': 1.841}, {'end': 14344.775, 'text': 'And of course, you can look at the eloquent documentation for that.', 'start': 14341.253, 'duration': 3.522}, {'end': 14353.761, 'text': "Now, since we did that, we can now easily get a user's listings or we can easily get the user of a specific listing.", 'start': 14345.396, 'duration': 8.365}, {'end': 14356.163, 'text': "And I'm going to show you that within a tool called Tinker.", 'start': 14353.781, 'duration': 2.382}, {'end': 14365.811, 'text': 'so tinker is, uh, is a command line tool that we can use to work with models you can even create, you can write queries, you can create, you know,', 'start': 14356.923, 'duration': 8.888}, {'end': 14367.993, 'text': 'add, add things to the database.', 'start': 14365.811, 'duration': 2.182}, {'end': 14372.858, 'text': 'you can pretty much do anything you can do within, within your code.', 'start': 14367.993, 'duration': 4.865}, {'end': 14374.679, 'text': "so let's, uh, let's do that.", 'start': 14372.858, 'duration': 1.821}, {'end': 14381.783, 'text': "let's say php artisan, And you're going to see this shell open here.", 'start': 14374.679, 'duration': 7.104}, {'end': 14384.764, 'text': "Let's say we want to get the first listing.", 'start': 14382.304, 'duration': 2.46}, {'end': 14389.746, 'text': 'So we could say app models listing.', 'start': 14384.924, 'duration': 4.822}, {'end': 14393.627, 'text': "So from the listing model, let's use the first method.", 'start': 14389.966, 'duration': 3.661}, {'end': 14398.809, 'text': "So if I go ahead and run that, you'll see it'll actually get me the first listing.", 'start': 14394.307, 'duration': 4.502}, {'end': 14400.369, 'text': 'So this has the ID of one.', 'start': 14398.869, 'duration': 1.5}, {'end': 14403.771, 'text': 'If I wanted to find a specific listing, I could do find.', 'start': 14400.99, 'duration': 2.781}, {'end': 14407.974, 'text': "And let's say I want to find the one with the ID of three.", 'start': 14405.433, 'duration': 2.541}, {'end': 14411.554, 'text': 'So this returns the one with the ID of three.', 'start': 14408.834, 'duration': 2.72}, {'end': 14416.155, 'text': "Now, what's cool is we can take the listing.", 'start': 14412.835, 'duration': 3.32}, {'end': 14422.537, 'text': "Now, let's say this this particular listing, we want to know the user and we want to get all the data of the user that owns it.", 'start': 14416.195, 'duration': 6.342}, {'end': 14429.418, 'text': "We can now go like this and it's going to give me the specific user that owns that listing.", 'start': 14422.577, 'duration': 6.841}, {'end': 14433.699, 'text': "And that's because of what we just did within the models creating that relationship.", 'start': 14429.458, 'duration': 4.241}, {'end': 14439.118, 'text': 'And then if we have a user, we can get all the listings of that user.', 'start': 14434.454, 'duration': 4.664}, {'end': 14440.599, 'text': 'And with Tinker, I can do this.', 'start': 14439.138, 'duration': 1.461}, {'end': 14441.94, 'text': 'So I could do app.', 'start': 14440.719, 'duration': 1.221}, {'end': 14448.726, 'text': "Let's say app models slash user.", 'start': 14444.282, 'duration': 4.444}], 'summary': 'Creating relationships between listings and users to easily access data using tinker', 'duration': 162.548, 'max_score': 14286.178, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY14286178.jpg'}, {'end': 14904.384, 'src': 'embed', 'start': 14827.305, 'weight': 0, 'content': [{'end': 14833.631, 'text': "And then from here, we're going to want to create a manage manage function.", 'start': 14827.305, 'duration': 6.326}, {'end': 14845.414, 'text': 'So public function manage.', 'start': 14841.252, 'duration': 4.162}, {'end': 14854.56, 'text': "All right, and then we're gonna return our view, which we haven't created yet.", 'start': 14845.434, 'duration': 9.126}, {'end': 14862.017, 'text': "and let's see, the view is going to be listings, dot, manage.", 'start': 14856.335, 'duration': 5.682}, {'end': 14866.139, 'text': 'now we have to pass in the users listings.', 'start': 14862.017, 'duration': 4.122}, {'end': 14868.22, 'text': "okay, so let's pass in here.", 'start': 14866.139, 'duration': 2.081}, {'end': 14872.621, 'text': "uh, we'll call it listings.", 'start': 14868.22, 'duration': 4.401}, {'end': 14874.602, 'text': 'and then the way we can do this.', 'start': 14872.621, 'duration': 1.981}, {'end': 14879.664, 'text': 'this is where you know creating our relationships in with eloquent.', 'start': 14874.602, 'duration': 5.062}, {'end': 14883.925, 'text': 'it comes in handy, we can do off And then user.', 'start': 14879.664, 'duration': 4.261}, {'end': 14891.832, 'text': 'what that does is it gives us the logged in user and then we can simply do listings and then get.', 'start': 14883.925, 'duration': 7.907}, {'end': 14894.395, 'text': 'All right.', 'start': 14891.852, 'duration': 2.543}, {'end': 14902.642, 'text': 'So that should get all the currently logged in users listings and pass them into pass them into this view as listings.', 'start': 14894.515, 'duration': 8.127}, {'end': 14904.384, 'text': "So let's save that.", 'start': 14903.363, 'duration': 1.021}], 'summary': 'Creating a manage function to display user listings using eloquent relationships.', 'duration': 77.079, 'max_score': 14827.305, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY14827305.jpg'}, {'end': 15339.632, 'src': 'embed', 'start': 15259.898, 'weight': 3, 'content': [{'end': 15266.441, 'text': "Let's let's go to our control, our listing control, and this this should be pretty easy.", 'start': 15259.898, 'duration': 6.543}, {'end': 15271.202, 'text': "And we're going to want to go.", 'start': 15270.062, 'duration': 1.14}, {'end': 15275.264, 'text': 'To see update.', 'start': 15271.222, 'duration': 4.042}, {'end': 15282.527, 'text': "So update, this is where obviously where it updates, so it's going to do the checks.", 'start': 15276.684, 'duration': 5.843}, {'end': 15288.309, 'text': "And we update right here, so let's put this.", 'start': 15284.727, 'duration': 3.582}, {'end': 15293.068, 'text': "Let's just let's put this before anything.", 'start': 15290.765, 'duration': 2.303}, {'end': 15295.49, 'text': 'So before the validation and stuff like that.', 'start': 15293.128, 'duration': 2.362}, {'end': 15312.089, 'text': "Yeah, let's say make sure logged in user is owner and we can do that simply by doing an if statement and we'll say if the listing.", 'start': 15296.411, 'duration': 15.678}, {'end': 15320.799, 'text': 'The listing user underscore ID, if that field is not equal to off.', 'start': 15313.857, 'duration': 6.942}, {'end': 15339.632, 'text': "ID Right, because that's the logged in user's ID, so if that is if that's not equal, then what's doing abort? So we'll abort, let's say 403.", 'start': 15323.319, 'duration': 16.313}], 'summary': 'Updating the listing control to validate user ownership, aborting if not the owner with a 403 error code.', 'duration': 79.734, 'max_score': 15259.898, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY15259898.jpg'}, {'end': 15530.718, 'src': 'embed', 'start': 15509.63, 'weight': 5, 'content': [{'end': 15512.291, 'text': "but that's it, guys, if you follow this through all the way.", 'start': 15509.63, 'duration': 2.661}, {'end': 15517.453, 'text': 'i really appreciate it and congratulations on finishing your app.', 'start': 15512.291, 'duration': 5.162}, {'end': 15521.655, 'text': 'i will be doing a deployment video soon with linode.', 'start': 15517.453, 'duration': 4.202}, {'end': 15527.957, 'text': "it might be this project, it might be a different one, i'm not sure, but that should be coming up soon as well.", 'start': 15521.655, 'duration': 6.302}, {'end': 15530.718, 'text': 'all right, thanks, guys, and i will see you later.', 'start': 15527.957, 'duration': 2.761}], 'summary': 'Completion of app development and future deployment video with linode announced.', 'duration': 21.088, 'max_score': 15509.63, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY15509630.jpg'}], 'start': 14157.01, 'title': 'Laravel model relationships and listing management', 'summary': 'Discusses creating relationships in laravel models, including belongs to and has many relationships, and demonstrates using tinker tool. it also covers adding user id to the database, resulting in successful listing creation. additionally, it explains dynamically rendering a table, implementing crud functionality, and securing user actions with laravel, providing a practical foundation for building projects.', 'chapters': [{'end': 14499.319, 'start': 14157.01, 'title': 'Creating relationships in laravel models', 'summary': 'Discusses creating relationships between the listing and user models in laravel, explaining the belongs to and has many relationships, and demonstrates using the tinker tool to interact with the models and their relationships.', 'duration': 342.309, 'highlights': ['Explaining the belongs to and has many relationships in Laravel models Clarifies the belongs to and has many relationships between the listing and user models in Laravel, detailing how the relationships are defined and the significance of specifying the relationships in the models.', 'Demonstrating the use of Tinker tool to interact with models and their relationships Illustrates how to use the Tinker tool to work with models, run queries, and manipulate data, showcasing examples of retrieving specific listings, accessing the user that owns a listing, and retrieving all listings of a user.']}, {'end': 14994.193, 'start': 14501.448, 'title': 'Adding user id to database', 'summary': 'Covers the process of adding the user id to the database when creating a listing, including updating the form and checking the database, resulting in the successful creation and management of listings.', 'duration': 492.745, 'highlights': ['The process of adding the user ID to the database when creating a listing, updating the form, and checking the database. This ensures that the database associates the listing with the correct user, ultimately allowing for the successful management of listings.', 'The successful creation of a new listing with the user ID included in the database. The user ID is successfully associated with the created listing, demonstrating the functionality of the updated form.', 'The creation of the manage listings page to display the listings of the logged-in user. This page aims to provide a personalized view for users to manage their own listings, contributing to a more user-friendly experience.']}, {'end': 15530.718, 'start': 14995.012, 'title': 'Laravel listing management tutorial', 'summary': 'Covers the process of dynamically rendering a table, implementing create, read, update, and delete functionality, and securing user actions with laravel, showcasing a practical foundation for building projects.', 'duration': 535.706, 'highlights': ['The tutorial demonstrates dynamically rendering a table, showcasing the process of looping through listings and handling empty listings with an unless statement.', 'The chapter presents the implementation of create, read, update, and delete functionality, including displaying and editing listings, as well as protecting user actions by ensuring the logged-in user is the owner of the listing.', 'The instructor emphasizes the practical foundation for building projects with Laravel, highlighting the potential for applying the concepts to various projects and the importance of understanding low-level implementation for a better grasp of the concepts.']}], 'duration': 1373.708, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/MYyJ4PuL4pY/pics/MYyJ4PuL4pY14157010.jpg', 'highlights': ['The instructor emphasizes the practical foundation for building projects with Laravel, highlighting the potential for applying the concepts to various projects and the importance of understanding low-level implementation for a better grasp of the concepts.', 'The chapter presents the implementation of create, read, update, and delete functionality, including displaying and editing listings, as well as protecting user actions by ensuring the logged-in user is the owner of the listing.', 'The creation of the manage listings page to display the listings of the logged-in user. This page aims to provide a personalized view for users to manage their own listings, contributing to a more user-friendly experience.', 'The process of adding the user ID to the database when creating a listing, updating the form, and checking the database. This ensures that the database associates the listing with the correct user, ultimately allowing for the successful management of listings.', 'The successful creation of a new listing with the user ID included in the database. The user ID is successfully associated with the created listing, demonstrating the functionality of the updated form.', 'The tutorial demonstrates dynamically rendering a table, showcasing the process of looping through listings and handling empty listings with an unless statement.', 'Explaining the belongs to and has many relationships in Laravel models Clarifies the belongs to and has many relationships between the listing and user models in Laravel, detailing how the relationships are defined and the significance of specifying the relationships in the models.', 'Demonstrating the use of Tinker tool to interact with models and their relationships Illustrates how to use the Tinker tool to work with models, run queries, and manipulate data, showcasing examples of retrieving specific listings, accessing the user that owns a listing, and retrieving all listings of a user.']}], 'highlights': ['The chapter covers a free four-hour course on building a job listing application using Laravel 9 in MySQL, emphasizing immersive learning and viewer engagement.', 'Laravel is a PHP framework known for its comprehensive features and ease of use, suitable for various tasks.', 'The tutorial provides a foundation for building Laravel projects, covering authentication, CRUD functionality, filtering, pagination, and creating database seeders.', 'The chapter explains the process of creating and using a Laravel model to interact with a database, detailing the usage of Eloquent ORM and static methods for fetching all listings and finding a single listing.', 'The chapter covers the process of database migration, including running migrations to create tables and seeding data using factories.', 'Implementing dynamic content for a listings page using eloquent models and collections.', 'Creating a component for listing tags from a comma-separated value list stored in the database.', 'Demonstrating the usage of dependency injection and request helper to retrieve the tag value from the query string, providing multiple options for implementation.', 'The Laravel framework simplifies form validation and submission with minimal code.', "Demonstrating file upload functionality in the create page, including adding a file input and handling the file submission in the controller using Laravel's request method.", 'Configuring file systems in Laravel, including changing the default disk from local to public for storing images.', 'User authentication and CRUD functionality are implemented, providing the ability to authenticate, create users, and perform CRUD operations.', 'The instructor emphasizes the practical foundation for building projects with Laravel, highlighting the potential for applying the concepts to various projects and the importance of understanding low-level implementation for a better grasp of the concepts.']}