sehummel
sehummel

Reputation: 5568

Get Laravel 5 controller name in view

Our old website CSS was set up so that the body tag had an id of the controller name and a class of the action name, using Zend Framework 1. Now we're switching to Laravel 5. I found a way to get the action name through the Route class, but can't find a method for the controller name. I don't see anything in the Laravel docs like this. Any ideas?

This is how you do with action. You inject the Route class, and then call:

$route->getActionName().

I'm looking for something similar for controllers. I've checked the entire route class and found nothing.

Upvotes: 22

Views: 41176

Answers (8)

Rex Bengil
Rex Bengil

Reputation: 60

You can use this to just simply display in the title like "Customer - My Site" (laravel 9)

{{ str_replace('Controller', '', strtok(substr(strrchr(request()->route()->getActionName(), '\\'), 1), '@'))}} - {{ config('app.name') }}

Upvotes: 0

Harsh Patel
Harsh Patel

Reputation: 1344

You can add this (tested with Laravel v7+)

<?php
    use Illuminate\Support\Facades\Route;

    echo Route::getCurrentRoute()->getActionMethod();
?>

or

You can use helper function

<?php echo request()->route()->getActionMethod(); ?>

for example :-

Route::get('test', [\App\Http\Controllers\ExampleController::class, 'exampleTest'])->name('testExample');

Now If I request {app_url}/test then it will return exampleTest

Upvotes: -1

user1156124
user1156124

Reputation: 1

To add to Martin Bean answer, using Route::view in your routes will cause the list function to throw an Undefined offset error when this code runs;

list($controller, $action) = explode('@', $controller);

Instead use this, which assigns null to $action if not present

list($controller, $action) = array_pad(explode('@', $controller), 2, null);

Upvotes: 0

Fahrettin Aksoy
Fahrettin Aksoy

Reputation: 119

use this

strtok(substr(strrchr($request->route()->getActionName(), '\\'), 1), '@')

Upvotes: 0

Vahid Montazer
Vahid Montazer

Reputation: 1311

I use a simple solution. You can test and use it in everywhere, also in your views:

{{ dd(request()->route()->getAction()) }}

Upvotes: 17

vrkansagara
vrkansagara

Reputation: 626

I will simply use as bellow

$request->route()->getActionMethod()

Upvotes: 4

Ilario Engler
Ilario Engler

Reputation: 2479

To get something like PostController try following ...

preg_match('/([a-z]*)@/i', $request->route()->getActionName(), $matches);
$controllerName = $matches[1];

$matches[1] includes the first group while $matches[0] includes everything matched. So also the @ which isn't desired.

Upvotes: 2

Martin Bean
Martin Bean

Reputation: 39429

If your layout is a Blade template, you could create a view composer that injects those variables into your layout. In app/Providers/AppServiceProvider.php add something like this:

public function boot()
{
    app('view')->composer('layouts.master', function ($view) {
        $action = app('request')->route()->getAction();

        $controller = class_basename($action['controller']);

        list($controller, $action) = explode('@', $controller);

        $view->with(compact('controller', 'action'));
    });
}

You will then have two variables available in your layout template: $controller and $action.

Upvotes: 53

Related Questions