Access Controller method from another controller in Laravel 5

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Title: Accessing Controller Methods from Another Controller in Laravel 5 - A Comprehensive Guide

Introduction:
In Laravel 5, accessing controller methods from another controller is a crucial skill for any developer. This article will delve into the various techniques to achieve this, focusing on best practices and code examples. We will also explore how to use dependency injection, routes, and middleware to ensure smooth communication between controllers and maintain cleaner code.

Accessing Controller Methods Directly:
The simplest way to access a controller method from another controller is by using the Facade class or static methods directly. Let's consider our initial example with two controllers - SubmitPerformanceController and PrintReportController. We want to call the getPrintReport method inside SubmitPerformanceController.

  1. Include the required namespace in both controllers:
    for SubmitPerformanceController, add "use App\Http\Controllers\PrintReportController;";
    for PrintReportController, add "use App\Http\Controllers\SubmitPerformanceController;";
  2. Create a method to call 'getPrintReport' in the SubmitPerformanceController:
    public function submitPerformances() {
    $printReport = new PrintReportController();
    return $printReport->getPrintReport();
    }

This approach is straightforward but not very scalable, as it requires us to instantiate a controller object and then invoke the desired method. It's also error-prone if we forget to include the necessary namespaces or dependencies.

Accessing Controller Methods Using Dependency Injection:
An improved solution would be using dependency injection (DI) to pass necessary data between controllers instead of directly accessing methods. This approach provides better encapsulation, promotes reusability and scalability, and enhances testability. Let's apply this method to the previous example.

  1. Make both classes dependent on one another:
    In SubmitPerformanceController, add a private property for the PrintReportController object and modify the submitPerformances() method:
    private $printReport;

    public function __construct(PrintReportController $printReport) {
    $this->printReport = $printReport;

    }

    public function submitPerformances() {
    return $this->printReport->getPrintReport();

    }

    In PrintReportController, add a constructor accepting the SubmitPerformanceController object and modify getPrintReport():
    private $submitPerformanceController;

    public function __construct(SubmitPerformanceController $submitPerformanceController) {
    $this->submitPerformanceController = $submitPerformanceController;

    }

    public function getPrintReport() {
    // Perform any necessary operations
    return 'Generated Report';

    }

This implementation ensures that both controllers are aware of each other and can properly communicate. The dependency injection approach allows for better modularity, easier testing, and improved scalability as the application grows in complexity.

Accessing Controller Methods via Routes:
Alternatively, we could use named routes to access controller methods without defining a direct dependency between controllers. This approach is useful if the codebase already has an established routing structure or if the communication should be more abstracted from the classes themselves. Let's follow these steps for our example:

  1. Define the route in web.php:
    Route::get('submit-performances', 'SubmitPerformanceController@submitPerformances')
    ->name('submit_performances');

    Route::get('print-reports/{reportId}', 'PrintReportController@show')
    ->name('print_reports')
    ->middleware('auth:api');

  2. Modify the submitPerformance() method in SubmitPerformanceController to use the route:
    public function submitPerformances() {
    return redirect()->route('submit_performances', [false]);
    // Here, second argument is optional and sets a query string to false, which means no query strings will be added
    }

    If we need to access the PrintReportController's getPrintReport() method from another controller using this approach, we can use:
    return redirect()->route('print_reports', ['reportId' => $yourReportId]);

This solution provides a more abstracted way of managing controller communications and keeps routes separate from controllers. It allows for better readability and flexibility in the application.

Accessing Controller Methods via Middleware:
Middleware is another useful tool to access controller methods without direct dependencies or routing. Middleware can be used to run specific code before, after, or both before and after a request has been handled by a particular controller. Let's see how we can use it in our example:

  1. Create a new middleware called PrintReportMiddleware:

  2. Apply the middleware to the appropriate routes in web.php:
    Route::get('submit-performances', [SubmitPerformanceController::class, 'submitPerformances'])
    ->middleware(PrintReportMiddleware::class);

    Route::get('print-reports/{reportId}', [...]
    ->middleware(PrintReportMiddleware::class);

  3. Modify the submitPerformances() method in SubmitPerformanceController to use a closure:
    public function submitPerformances() {
    return function () {
    // Your controller logic here
    return redirect()->route('submit_performances', [false]);

    };
    }

This approach allows for more fine-grained control over the execution order of various controllers and operations. It promotes better reusability, maintainability, and can be used in conjunction with other techniques to create robust solutions for complex applications.

Conclusion:
In summary, there are multiple methods to access controller methods from another controller in Laravel 5. The best approach depends on the specific requirements of your application and team. By understanding each technique and the trade-offs involved, you can make an informed decision on how to handle controller communications effectively. Make use of dependency injection, routes, or middleware as appropriate, keeping the codebase clean, scalable, and maintainable for future development.