Laravel: Your First Real Application Routes, Controllers and Where Things Live
1 / 5
Next
Routes, Controllers and Where Things Live ~16min

One entry point, not one file per page

In plain PHP, courses.php is a URL. In Laravel every request enters through public/index.php and the router decides what runs.

// routes/web.php
Route::get('/courses', [CourseController::class, 'index']);
Route::get('/courses/{slug}', [CourseController::class, 'show']);
Route::post('/courses', [CourseController::class, 'store'])->middleware('auth');

The controller

class CourseController extends Controller
{
    public function index()
    {
        $courses = Course::where('is_published', true)->get();
        return view('courses.index', compact('courses'));
    }
}

The folders that matter

  • routes/web.php, URLs
  • app/Http/Controllers/, request handling
  • app/Models/, database tables
  • resources/views/, Blade templates
  • database/migrations/, schema history
  • .env. Credentials, never committed

Only public/ is web-accessible

Your code, config and .env sit ABOVE the web root and cannot be requested by URL. That structural separation is worth a great deal on its own.

Name your routes

Route::get('/courses/{slug}', ...)->name('courses.show');
// then: route('courses.show', $course->slug)

Change the URL later and every link updates itself.

Tasks
Preview