Symfony 2 geçerli güzergahını nasıl alabilirim ?
Örneğin routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Bu somePage
değeri nasıl alabilirim ?
Symfony 2 geçerli güzergahını nasıl alabilirim ?
Örneğin routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Bu somePage
değeri nasıl alabilirim ?
Yanıtlar:
ContainerAware olan bir şeyden (denetleyici gibi):
$request = $this->container->get('request');
$routeName = $request->get('_route');
Dal ile: {{ app.request.attributes.get('_route') }}
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
özgü css uygulamak için kullanıyorum :)
Bence bunu yapmanın en kolay yolu:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
'_internal' değerini tekrar alacağınız gibi alt isteklerle çalışmaz.
Symfony 2.0-2.1
Bunu kullanın:
$router = $this->get("router");
$route = $router->match($this->getRequest()->getPathInfo());
var_dump($route['_route']);
Bu bir olacak değil size _internal
.
Symfony 2.2+ için güncelleştirme: Bu Symfony 2.2+ sürümünden başlayarak çalışmıyor. Ben bir hata açtım ve cevap "tasarım gereğiydi". Rotayı bir alt eylemde almak istiyorsanız, onu bir argüman olarak iletmeniz gerekir
{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}
Ve kontrolörünüz:
public function menuAction($route) { ... }
$route['_route']
sorunlu gözüküyor ama symfony dev hakkında konuşmuyor olabilir. Hakkında söz etmez yemek kitabı _route
ait $router->match()
çıktı ..
$router->match()
"@return array Çok dahili görünen bir parametre dizisi" diyor . Buna güvenmek istemiyorum, ancak şu anda, alt taleplerle uğraşırken tek uygulanabilir çözüm gibi görünüyor.
Tüm kullanım durumları için çalışan bir çözüm yoktur. $ Request-> get ('_ route') yöntemini veya varyantlarını kullanırsanız, yönlendirmenin gerçekleştiği durumlar için '_internal' döndürülür .
Yönlendirme ile bile çalışan bir çözüme ihtiyacınız varsa, 2.4'te gelen yeni RequestStack hizmetini kullanmanız gerekir, ancak bu ESI desteğini bozacaktır :
$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
echo $masterRequest->attributes->get('_route');
}
Şablonlarda ihtiyacınız varsa bir dal uzantısı yapabilirsiniz.
_route
gitmek için bir yol değil ve asla değildi . Symfony'yi yaratan Fabien'e göre her zaman hata ayıklama amaçlıydı . Yönlendirme ve kısmi oluşturma gibi denetleyicilere diğer doğrudan çağrılar gibi şeylerle çalışmayacağı için güvenilir değildir.
Rotanızın adını denetleyicinize bir parametre olarak enjekte etmeniz gerekir, buradaki dokümana bakın
Ayrıca, $request->get('');
esnekliğe ihtiyacınız yoksa, ihtiyacınız olan belirli özellik çantasını (öznitelikler, sorgu veya istek) kullanmaktan çok daha yavaş olduğu için lütfen $request->attributes->get('_route');
bu durumda kullanmayın.
$request->attributes->get('_route');
Yol adını istek nesnesinden denetleyicinin içinden alabilirsiniz.
Bundan aldığım tek şey
_internal
$this->getRequest()->get('_route').
Tuxedo25 kodu bile döndüren bir denetleyicinin içinden yol adını alıyorum_internal
Bu kod Symfony 1.X 'Bileşen' olarak adlandırılan kod içinde yürütülür; Bir sayfanın denetleyicisi değil, sayfanın bir kısmı mantık gerektiren bir kısmı.
Symfony 1.X içindeki eşdeğer kod: sfContext::getInstance()->getRouting()->getCurrentRouteName();
$view['request']->getParameter('_route');
{% render... %}
ile aramaları kullanmanızdır standalone=true
. Önbelleğe alma (AppCache.php veya ESI ile vernik) etkinleştirildiğinde, bu, _internal
bağımsız olarak önbelleğe alınabilmesi için bağımsız görünümlerin ayrı bir HTTP İsteği ile istenmesine neden olur (bu, rotanın devreye girdiği yerdir ).
Symfony 3.3 ile bu yöntemi kullandım ve iyi çalışıyorum.
4 rotam var
admin_category_index, admin_category_detail, admin_category_create, admin_category_update
Ve sadece bir satır tüm rotalar için aktif bir sınıf oluşturur.
<li {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
<a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
Geçerli rotayı URL'ye göre almak için (ileriye dönük durumlarda daha güvenilir):
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;
}
Symfony 4.2.7 ile, denetleyicilerimde tanımladığım özel rota adını gösteren dal şablonuma aşağıdakileri uygulayabiliyorum.
İndex.html.twig içinde
<div class="col">
{% set current_path = app.request.get('_route') %}
{{ current_path }}
</div>
Kontrol cihazımda
...
class ArticleController extends AbstractController {
/**
* @Route("/", name="article_list")
* @Method({"GET"})
*/
public function index() {
...
}
...
}
Sonuç, tarayıcımda istenen sayfaya "makale_listesi" yazdırılır.
Symfony 3 için geçerli rotaya ihtiyaç duyan herkes için, bunu kullanıyorum
<?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.
?>
denetleyicinizde rota adını almak istiyorsanız isteği enjekte etmeniz gerekir ( Symfony UPGRADE nedeniyle konteynırdan almak yerine get ('_ route') çağırın.
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
Eğer rota adını dalda almak istiyorsanız,
{{ app.request.attributes.get('_route') }}
$request->get()
Yavaş olduğu için doğrudan kullanılması önerilmez : github.com/symfony/http-foundation/blob/2.8/Request.php#L712