Bagaimana saya mendapatkan rute saat ini di Symfony 2?
Sebagai contoh, routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Bagaimana saya bisa mendapatkan somePage
nilai ini ?
Bagaimana saya mendapatkan rute saat ini di Symfony 2?
Sebagai contoh, routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Bagaimana saya bisa mendapatkan somePage
nilai ini ?
Jawaban:
Dari sesuatu yang ContainerAware (seperti pengontrol):
$request = $this->container->get('request');
$routeName = $request->get('_route');
Dengan ranting: {{ app.request.attributes.get('_route') }}
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
untuk menerapkan css khusus laman :)
Saya pikir ini adalah cara termudah untuk melakukan ini:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
, di mana Anda akan mendapatkan nilai '_internal' lagi.
Symfony 2.0-2.1
Gunakan ini:
$router = $this->get("router");
$route = $router->match($this->getRequest()->getPathInfo());
var_dump($route['_route']);
Yang itu tidak akan memberimu _internal
.
Pembaruan untuk Symfony 2.2+: Ini tidak berfungsi memulai Symfony 2.2+. Saya membuka bug dan jawabannya "sesuai desain". Jika Anda ingin mendapatkan rute dalam sub-aksi, Anda harus meneruskannya sebagai argumen
{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}
Dan pengontrol Anda:
public function menuAction($route) { ... }
$route['_route']
tampaknya bermasalah tetapi mungkin tidak membahas tentang symfony dev. Masak tidak menyebutkan tentang _route
dari $router->match()
output ..
$router->match()
kata "@return array Sebuah array parameter" yang tampaknya sangat internal. Saya tidak ingin bergantung pada itu, tetapi saat ini, tampaknya menjadi satu-satunya solusi yang layak ketika berhadapan dengan sub-permintaan.
Tidak ada solusi yang berfungsi untuk semua kasus penggunaan. Jika Anda menggunakan metode $ request-> get ('_ route'), atau variannya, ia akan mengembalikan '_internal' untuk kasus-kasus di mana penerusan berlangsung.
Jika Anda memerlukan solusi yang berfungsi bahkan dengan penerusan, Anda harus menggunakan layanan RequestStack baru, yang tiba di 2.4, tetapi ini akan mematahkan dukungan ESI :
$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
echo $masterRequest->attributes->get('_route');
}
Anda dapat membuat ekstensi ranting dari ini jika Anda membutuhkannya di templat.
_route
bukan cara untuk pergi dan tidak pernah ada . Itu selalu dimaksudkan untuk keperluan debugging menurut Fabien yang menciptakan Symfony. Ini tidak dapat diandalkan karena tidak akan bekerja dengan hal-hal seperti penerusan dan panggilan langsung lainnya ke pengontrol seperti rendering parsial.
Anda perlu menyuntikkan nama rute Anda sebagai parameter di controller Anda, lihat dokumen di sini
Juga, tolong jangan pernah gunakan $request->get('');
jika Anda tidak memerlukan fleksibilitas itu jauh lebih lambat daripada menggunakan mendapatkan pada tas properti tertentu yang Anda butuhkan (atribut, permintaan atau permintaan) jadi $request->attributes->get('_route');
dalam hal ini.
$request->attributes->get('_route');
Anda bisa mendapatkan nama rute dari objek permintaan dari dalam pengontrol.
Semua yang saya dapat dari itu
_internal
Saya mendapatkan nama rute dari dalam controller dengan $this->getRequest()->get('_route').
kode Even tuxedo25 menyarankan untuk dikembalikan_internal
Kode ini dieksekusi dalam apa yang disebut 'Komponen' di Symfony 1.X; Bukan pengontrol halaman tetapi bagian dari halaman yang membutuhkan logika.
Kode yang setara di Symfony 1.X adalah: sfContext::getInstance()->getRouting()->getCurrentRouteName();
$view['request']->getParameter('_route');
{% render... %}
panggilan dengan standalone=true
. Dengan caching (AppCache.php atau pernis dengan ESI) diaktifkan, ini akan menyebabkan tampilan mandiri diminta dengan Permintaan HTTP terpisah (ini adalah rute yang _internal
berperan) agar ro dapat di-cache secara independen.
Dengan Symfony 3.3, saya telah menggunakan metode ini dan berfungsi dengan baik.
Saya punya 4 rute
admin_category_index, admin_category_detail, admin_category_create, admin_category_update
Dan hanya satu baris membuat kelas aktif untuk semua rute.
<li {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
<a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
Untuk mendapatkan rute saat ini berdasarkan pada URL (lebih dapat diandalkan dalam hal ke depan):
public function getCurrentRoute(Request $request)
{
$pathInfo = $request->getPathInfo();
$routeParams = $this->router->match($pathInfo);
$routeName = $routeParams['_route'];
if (substr($routeName, 0, 1) === '_') {
return;
}
unset($routeParams['_route']);
$data = [
'name' => $routeName,
'params' => $routeParams,
];
return $data;
}
Dengan Symfony 4.2.7, saya dapat mengimplementasikan yang berikut ini di templat ranting saya, yang menampilkan nama rute kustom yang saya definisikan di controller saya.
Di index.html.twig
<div class="col">
{% set current_path = app.request.get('_route') %}
{{ current_path }}
</div>
Di controller saya
...
class ArticleController extends AbstractController {
/**
* @Route("/", name="article_list")
* @Method({"GET"})
*/
public function index() {
...
}
...
}
Hasilnya mencetak "article_list" ke halaman yang diinginkan di browser saya.
Bagi siapa pun yang membutuhkan rute saat ini untuk Symfony 3, inilah yang saya gunakan
<?php
$request = $this->container->get('router.request_context');
//Assuming you are on user registration page like https://www.yoursite.com/user/registration
$scheme = $request->getScheme(); //This will return https
$host = $request->getHost(); // This will return www.yoursite.com
$route = $request->getPathInfo(); // This will return user/registration(don't forget this is registrationAction in userController
$name = $request->get('_route'); // This will return the name.
?>
jika Anda ingin mendapatkan nama rute di controller Anda daripada Anda harus menyuntikkan permintaan (alih-alih mendapatkan dari wadah karena Symfony UPGRADE dan daripada panggilan panggilan ('_ rute').
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
jika Anda ingin mendapatkan nama rute dalam ranting daripada Anda harus mendapatkannya seperti
{{ app.request.attributes.get('_route') }}
$request->get()
secara langsung karena lambat: github.com/symfony/http-foundation/blob/2.8/Request.php#L712