Dependency injection helps your controller get the things it needs automatically. This makes your code cleaner and easier to manage.
When your controller needs to use a service or class like a database handler or a mailer.
When you want to write tests easily by replacing real services with fake ones.
When you want to keep your controller code simple and focused on handling requests.
When you want Laravel to create and manage objects for you automatically.
Syntax
Laravel
public function __construct(ServiceClass $service) {
$this->service = $service;
}
Laravel automatically provides the correct object for the type you ask for.
You just need to type hint the class in the constructor or method parameters.
Examples
This example shows injecting a PaymentService into the controller constructor.
Laravel
use App\Services\PaymentService;
class OrderController extends Controller {
protected $paymentService;
public function __construct(PaymentService $paymentService) {
$this->paymentService = $paymentService;
}
}
Here, the UserRepository is injected directly into a controller method.
Laravel
use App\Repositories\UserRepository;
class UserController extends Controller {
public function show(UserRepository $userRepo, $id) {
return $userRepo->find($id);
}
}
Sample Program
This controller uses dependency injection to get a NotificationService. When the send method is called, it uses the service to send a message.
Laravel
<?php
namespace App\Http\Controllers;
use App\Services\NotificationService;
use Illuminate\Http\Request;
class NotificationController extends Controller
{
protected NotificationService $notificationService;
public function __construct(NotificationService $notificationService)
{
$this->notificationService = $notificationService;
}
public function send(Request $request)
{
$message = $request->input('message', 'Hello!');
return $this->notificationService->sendNotification($message);
}
}
// NotificationService.php
namespace App\Services;
class NotificationService
{
public function sendNotification(string $message): string
{
// Imagine sending a notification here
return"Notification sent: " . $message;
}
}
OutputSuccess
Important Notes
Laravel uses a service container to automatically create and inject dependencies.
You can inject dependencies in the constructor or directly in controller methods.
Make sure the classes you inject are properly imported and registered if needed.
Summary
Dependency injection lets Laravel provide needed objects automatically.
It keeps controllers clean and easy to test.
You just type hint the class in the constructor or method parameters.
Practice
(1/5)
1. What is the main purpose of dependency injection in Laravel controllers?
easy
A. To automatically provide required objects to the controller
B. To manually create objects inside controller methods
C. To make controllers dependent on global variables
D. To avoid using any external classes in controllers
Solution
Step 1: Understand dependency injection concept
Dependency injection means Laravel automatically gives the controller the objects it needs without manual creation.
Step 2: Identify the purpose in Laravel controllers
This keeps controllers clean and easy to test by providing dependencies automatically.
Final Answer:
To automatically provide required objects to the controller -> Option A
Hint: Dependency injection means Laravel gives needed objects automatically [OK]
Common Mistakes:
Thinking you must create objects manually inside controllers
Confusing dependency injection with global variables
Believing dependency injection removes use of external classes
2. Which of the following is the correct way to inject a service into a Laravel controller constructor?
easy
A. public function __construct($service) { $this->service = new Service(); }
B. public function __construct(Service $service) { $this->service = $service; }
C. public function __construct() { $this->service = Service::class; }
D. public function __construct(Service $service) { $service = new Service(); }
Solution
Step 1: Check constructor parameter type hinting
public function __construct(Service $service) { $this->service = $service; } correctly type hints the Service class in the constructor parameter.
Step 2: Verify assignment to class property
public function __construct(Service $service) { $this->service = $service; } assigns the injected service to a class property for later use, which is correct.
Final Answer:
public function __construct(Service $service) { $this->service = $service; } -> Option B
Quick Check:
Constructor injection = type hint + assign property [OK]
Hint: Type hint service in constructor and assign to property [OK]
Common Mistakes:
Not type hinting the service class in constructor
Creating new service instance inside constructor instead of injecting
Assigning class name string instead of object
3. Given this controller method, what will be the output if the injected service returns 'Hello' from its greet() method?
public function show(Service $service) {
return $service->greet();
}
medium
A. "Hello"
B. Error: Service not found
C. null
D. "greet"
Solution
Step 1: Understand method injection
The Service object is injected automatically into the show method by Laravel.
Step 2: Call the greet() method on the injected service
The greet() method returns the string "Hello", so the method returns "Hello".
Final Answer:
"Hello" -> Option A
Quick Check:
Injected service method output = "Hello" [OK]
Hint: Injected method returns service method result directly [OK]
Common Mistakes:
Assuming service is not injected and causes error
Expecting method name instead of method return value
Confusing null with empty string output
4. What is wrong with this controller constructor for dependency injection?
public function __construct(Service $service) {
$service = new Service();
$this->service = $service;
}
medium
A. It lacks type hinting for the service parameter
B. It does not assign the service to a class property
C. It creates a new Service instance instead of using the injected one
D. It should not use $this keyword inside constructor
Solution
Step 1: Analyze the constructor parameter and assignment
The constructor receives a Service object but immediately overwrites it by creating a new instance.
Step 2: Understand why this is wrong
This defeats dependency injection because the injected object is ignored and a new one is created manually.
Final Answer:
It creates a new Service instance instead of using the injected one -> Option C
Quick Check:
Overwriting injected service = wrong [OK]
Hint: Do not create new instance; use injected object directly [OK]
Common Mistakes:
Overwriting injected parameter with new instance
Forgetting to assign injected object to property
Confusing type hinting with variable assignment
5. You want to inject two services, Logger and Mailer, into a Laravel controller and use them in a method. Which constructor and method setup is correct?
hard
A. public function __construct() { $this->logger = new Logger(); $this->mailer = new Mailer(); } public function notify() { $this->logger->log('Notify'); $this->mailer->send(); }
B. public function __construct(Mailer $mailer) { $this->mailer = $mailer; } public function notify(Logger $logger) { $logger->log('Notify'); }
C. public function __construct(Logger $logger) { $this->logger = $logger; } public function notify(Mailer $mailer) { $mailer->send(); }
D. public function __construct(Logger $logger, Mailer $mailer) { $this->logger = $logger; $this->mailer = $mailer; } public function notify() { $this->logger->log('Notify'); $this->mailer->send(); }
Solution
Step 1: Check constructor injection of both services
public function __construct(Logger $logger, Mailer $mailer) { $this->logger = $logger; $this->mailer = $mailer; } public function notify() { $this->logger->log('Notify'); $this->mailer->send(); } correctly injects both Logger and Mailer in the constructor and assigns them to properties.
Step 2: Verify method usage of injected services
The notify method uses the injected properties to call log and send methods, which is correct.
Final Answer:
public function __construct(Logger $logger, Mailer $mailer) { $this->logger = $logger; $this->mailer = $mailer; } public function notify() { $this->logger->log('Notify'); $this->mailer->send(); } -> Option D
Quick Check:
Inject all services in constructor, use properties in methods [OK]
Hint: Inject all services in constructor, use $this->property in methods [OK]
Common Mistakes:
Injecting services only in methods instead of constructor
Creating new instances inside constructor instead of injecting
Mixing constructor and method injection inconsistently
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.