Symfony 2 geçerli güzergahını nasıl alabilirim ?
Örneğin routing.yml:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Bu somePagedeğ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 somePagedeğ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ı _routeait $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.
_routegitmek 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, _internalbağı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