Laravel: วิธีรับชื่อเส้นทางปัจจุบันได้อย่างไร (v5 … v7)


226

ใน Laravel v4 ฉันสามารถรับชื่อเส้นทางปัจจุบันโดยใช้ ...

Route::currentRouteName()

ฉันจะทำได้ในLaravel v5และLaravel v6 ได้อย่างไร


เนมสเปซใดที่ฉันควรใช้เพื่อค้นหาชื่อเส้นทาง ฉันใช้ Illuminate \ Support \ Facades \ Route แล้ว แต่ผลลัพธ์เป็นโมฆะ
Md Rashedul Hoque Bhuiyan

นั่นคือคลาสที่ถูกต้อง เส้นทางของคุณอาจไม่มีชื่อที่กำหนดไว้ โปรดทราบว่าชื่อเส้นทางและ URI นั้นไม่เหมือนกัน
Lukasgeiter

นี่คือคำตอบที่ถูกต้องstackoverflow.com/questions/27397487/ …
Kamil Kiełczewski

1
ทำไมคุณต้องการมัน
Yevgeniy Afanasyev

คำตอบ:


439

ลองสิ่งนี้

Route::getCurrentRoute()->getPath();

หรือ

\Request::route()->getName()

จาก v5.1

use Illuminate\Support\Facades\Route;
$currentPath= Route::getFacadeRoot()->current()->uri();

Laravel v5.2

Route::currentRouteName(); //use Illuminate\Support\Facades\Route;

หรือถ้าคุณต้องการชื่อการกระทำ

Route::getCurrentRoute()->getActionName();

เอกสารเส้นทาง Laravel 5.2

การดึง URI คำขอ

วิธีการเส้นทางส่งกลับ URI ของคำขอ ดังนั้นหากการร้องขอเข้ามาเป็นเป้าหมายที่http://example.com/foo/barวิธีการเส้นทางที่จะกลับfoo/bar:

$uri = $request->path();

isวิธีช่วยให้คุณสามารถตรวจสอบว่าการร้องขอที่เข้า URI ตรงกับรูปแบบที่กำหนด คุณอาจใช้*อักขระเป็นอักขระตัวแทนเมื่อใช้วิธีนี้:

if ($request->is('admin/*')) {
    //
}

ในการรับ URL แบบเต็มไม่เพียง แต่ข้อมูลเส้นทางคุณสามารถใช้วิธี URL ในตัวอย่างคำขอ:

$url = $request->url();

Laravel v5.3 ... v5.8

$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();

เอกสารเส้นทาง Laravel 5.3

Laravel v6.x ... 7.x

$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();

** เป็นปัจจุบัน ณ วันที่ 11 พ.ย. 2562 - รุ่น 6.5 **

เอกสารเส้นทาง Laravel 6.x

มีตัวเลือกในการใช้คำขอเพื่อรับเส้นทาง

$request->route()->getName();

คุณมีความคิดว่าจะกรองสิ่งนี้ได้อย่างไรถ้ามีเพียงต้องการพิมพ์ในเส้นทางของมุมมอง apiapi/...
utdev

6
Route::currentRouteName();perfect :)
EM-Creations

$request::route()->getName()ถ้าคุณกำลังใช้คำขอ $ request()::route()->getName()หรือคุณสามารถใช้ผู้ช่วยโลก
Daniel Dewhurst

@Daniel Dewhurst: อาจจะใช้งานได้กับ v <5.7 แต่ด้วย v5.7 คุณต้องไม่ใช้สแตติกแทนrequest()->route()->getName()เป็นวิธีที่จะไป
1stthomas

5
การใช้request()ฟังก์ชันตัวช่วยมีประโยชน์อย่างยิ่งในมุมมอง request()->route()->getName()เป็นตัวเลือกที่ดีที่สุด
Samuel Shifterovich

38

ใช้ Laravel 5.1 คุณสามารถใช้

\Request::route()->getName()

2
{{ route(\Request::route()->getName()) }}นี้ยังทำงานเมื่อคุณใส่ไว้ในมุมมองเป็น ขอบคุณมาก!
bonbon.langes

24

พบวิธีค้นหาชื่อเส้นทางปัจจุบันที่ใช้งานได้กับ laravel v5 , v5.1.28และv5.2.10

namespace

use Illuminate\Support\Facades\Route;

และ

$currentPath= Route::getFacadeRoot()->current()->uri();

สำหรับ Laravel Laravel V5.3คุณก็สามารถใช้:

use Illuminate\Support\Facades\Route;

Route::currentRouteName();

@ Jonathan ฉันเชื่อว่าการใช้เนมสเปซเต็มรูปแบบดีกว่าเสมอเพื่อหลีกเลี่ยงความขัดแย้งที่อาจเกิดขึ้น
Amir Asyraf

23

หากคุณต้องการurlไม่ใช่ชื่อเส้นทางคุณไม่จำเป็นต้องใช้ / ต้องการคลาสอื่น ๆ :

url()->current();

สิ่งนี้ส่งคืนข้อผิดพลาด: "การเรียกฟังก์ชั่นสมาชิกปัจจุบัน () บนสิ่งที่ไม่ใช่วัตถุ" url () คืนค่าสตริงไม่ใช่วัตถุดังนั้นฉันไม่คิดว่ามันจะใช้งานได้ บางทีคุณคิดเกี่ยวกับวิธีการหรือวัตถุอื่นแทนที่จะเป็น url ()?
thelogix

1
ไม่ฉันใช้มันทุกวัน ตรวจสอบเอกสารอย่างเป็นทางการ
ฟิวชั่น

3
ฉันเห็น. ใช้งานได้ในเวอร์ชัน 5.2 หรือสูงกว่าเท่านั้น แต่มันค่อนข้างดี
thelogix

23

หากคุณต้องการเลือกเมนูในหลายเส้นทางคุณอาจทำสิ่งนี้:

<li class="{{ (Request::is('products/*') || Request::is('products') || Request::is('product/*') ? 'active' : '') }}"><a href="{{url('products')}}"><i class="fa fa-code-fork"></i>&nbsp; Products</a></li>

หรือถ้าคุณต้องการเลือกเพียงเมนูเดียวคุณก็สามารถทำได้เช่นนี้:

<li class="{{ (Request::is('/users') ? 'active' : '') }}"><a href="{{url('/')}}"><i class="fa fa-envelope"></i>&nbsp; Users</a></li>

มีการทดสอบในLaravel 5.2 ด้วย

หวังว่าจะช่วยคนได้


ยังได้ทดสอบใน Laravel 5.3
Renato Liibke

ทดสอบใน Laravel 7.5.2
aspirinemaga

ทดสอบใน Laravel 5.7
Tariqul Islam

13

Laravel 5.2 คุณสามารถใช้ได้

$request->route()->getName()

มันจะให้ชื่อเส้นทางปัจจุบันแก่คุณ


7
สิ่งนี้ไม่ถูกต้องจริงๆ name()วิธีการจะเพิ่มหรือเปลี่ยนชื่อในขณะที่getName()วิธีการส่งกลับมัน
Aron Rotteveel

9

ใน 5.2 คุณสามารถใช้คำขอโดยตรงกับ:

$request->route()->getName();

หรือผ่านวิธีการช่วยเหลือ:

request()->route()->getName();

ตัวอย่างผลลัพธ์:

"home.index"

2
วิธีการช่วยเหลือที่ดีที่สุด ทำงานร่วมกับ laravel-5.6
Yevgeniy Afanasyev

6

วิธีที่สั้นที่สุดคือซุ้มทางเดิน \Route::current()->getName()

สิ่งนี้ยังทำงานใน laravel 5.4 ด้วย *


5

ในการดำเนินการควบคุมคุณสามารถทำได้:

public function someAction(Request $request)
{
    $routeName = $request->route()->getName();
}

$request ที่นี่แก้ไขได้ด้วยคอนเทนเนอร์บริการของ Laravel

getName()ส่งคืนชื่อเส้นทางสำหรับเส้นทางที่มีชื่อเท่านั้นnullมิฉะนั้น (แต่คุณยังสามารถสำรวจ\Illuminate\Routing\Routeวัตถุเพื่อสิ่งอื่นที่น่าสนใจ)

กล่าวอีกนัยหนึ่งคุณควรกำหนดเส้นทางของคุณเช่นนี้เพื่อให้ "nameOfMyRoute" กลับมา:

Route::get('my/some-action', [
    'as' => 'nameOfMyRoute',
    'uses' => 'MyController@someAction'
]);

5

คุณสามารถใช้ในเทมเพลต:

<?php $path = Route::getCurrentRoute()->getPath(); ?>
<?php if (starts_with($path, 'admin/')) echo "active"; ?>


4

การเข้าถึงเส้นทางปัจจุบัน

รับชื่อเส้นทางปัจจุบันในเทมเพลต Blade

{{ Route::currentRouteName() }}

สำหรับข้อมูลเพิ่มเติมhttps://laravel.com/docs/5.5/routing#accessing-the-current-route


ขอขอบคุณสำหรับคำตอบที่ถูกต้องลองทำตามคำแนะนำที่ไร้ประโยชน์ 30 นาที
Crasher

3

การเข้าถึงเส้นทางปัจจุบัน (v5.3 เป็นต้นไป)

คุณสามารถใช้วิธีการปัจจุบัน, currentRouteName และ currentRouteAction บนเส้นทางส่วนหน้าเพื่อเข้าถึงข้อมูลเกี่ยวกับเส้นทางที่จัดการคำขอที่เข้ามา:

$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();

อ้างถึงเอกสาร API สำหรับทั้งคลาสพื้นฐานของซุ้มเส้นทางและอินสแตนซ์เส้นทางเพื่อทบทวนวิธีการที่เข้าถึงได้ทั้งหมด

การอ้างอิง: https://laravel.com/docs/5.2/routing#accessing-the-current-route





1

ดูที่\Illuminate\Routing\Router.phpคุณสามารถใช้วิธีการcurrentRouteNamed()โดยการฉีดเราเตอร์ในวิธีการควบคุมของคุณ ตัวอย่างเช่น:

use Illuminate\Routing\Router;
public function index(Request $request, Router $router) {
   return view($router->currentRouteNamed('foo') ? 'view1' : 'view2');
}

หรือใช้ซุ้มเส้นทาง:

public function index(Request $request) {
   return view(\Route::currentRouteNamed('foo') ? 'view1' : 'view2');
}

คุณสามารถใช้วิธีนี้is()เพื่อตรวจสอบว่าเส้นทางนั้นมีชื่อพารามิเตอร์ใด ๆ ที่กำหนดไว้หรือไม่ แต่ระวังวิธีนี้ใช้preg_match()และฉันเคยพบว่ามันทำให้เกิดพฤติกรรมแปลก ๆ ด้วยชื่อเส้นทางที่เป็นจุด (เช่น'foo.bar.done') นอกจากนี้ยังมีเรื่องของประสิทธิภาพการทำงานpreg_match() ซึ่งเป็นเรื่องใหญ่ในชุมชน PHP

public function index(Request $request) {
    return view(\Route::is('foo', 'bar') ? 'view1' : 'view2');
}


1

คุณสามารถใช้วิธีการด้านล่าง:

Route::getCurrentRoute()->getPath();

ในรุ่น Laravel> 6.0 คุณสามารถใช้วิธีการด้านล่าง:

$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();


0

ในไฟล์ผู้ช่วย

คุณสามารถใช้Route::current()->uri()เพื่อรับ URL ปัจจุบัน

ดังนั้นหากคุณเปรียบเทียบชื่อเส้นทางของคุณเพื่อตั้งค่าคลาสที่ใช้งานบนเมนูมันจะดีถ้าคุณใช้

Route::currentRouteName() เพื่อรับชื่อเส้นทางและเปรียบเทียบ


0

ด้วยเหตุผลบางอย่างฉันไม่สามารถใช้วิธีแก้ไขปัญหาเหล่านี้ได้ ดังนั้นฉันเพิ่งประกาศเส้นทางของฉันweb.phpเป็น$router->get('/api/v1/users', ['as' => 'index', 'uses' => 'UserController@index'])และในตัวควบคุมของฉันฉันได้รับชื่อของเส้นทางที่ใช้$routeName = $request->route()[1]['as'];ซึ่ง$requestเป็น\Illuminate\Http\Request $requestพารามิเตอร์ประเภทพิมพ์ในindexวิธีการUserController

ใช้ Lumen 5.6 หวังว่ามันจะช่วยใครซักคน


0

สารละลาย :

$routeArray = app('request')->route()->getAction();
$controllerAction = class_basename($routeArray['controller']);
list($controller, $route) = explode('@', $controllerAction);
echo $route;

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.