如何在Symfony 2中获取当前路线?
例如,routing.yml:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得这个somePage价值?
我想直接在我的控制器中生成一个Url.我想使用我的routing.yml文件中定义的需要参数的URL.
我在Cookbook(Routage部分)中找到了代码:
$params = $router->match('/blog/my-blog-post');
// array('slug' => 'my-blog-post', '_controller' => 'AcmeBlogBundle:Blog:show')
$uri = $router->generate('blog_show', array('slug' => 'my-blog-post'));
// /blog/my-blog-post
Run Code Online (Sandbox Code Playgroud)
但我不明白什么是$ router.显然,它不起作用.有一种简单的方法可以在控制器中生成带有参数的路由URL吗?
我正在研究具有以下路由代码的symfony 2.3项目
just2_frontend_logincheck:
pattern: /login_check
Run Code Online (Sandbox Code Playgroud)
它没有
defaults:{ _controller: testBundle:User:login }
Run Code Online (Sandbox Code Playgroud)
但它正在发挥作用.但我不知道路由是如何工作的.可能吗?请告诉我有关路由的信息.
我开始教程(作为新手),并且每件事都可以正常工作,直到:
http://symfony.com/doc/current/book/page_creation.html#creating-a-page-route-and-controller at step 创建页面:路由和控制器
我创建了一个名为的文件 /var/www/html/[projekt]/src/AppBundle/Controller/LuckyController.php
但是当我打开http:// [Server-IP]:8000/app_dev.php/lucky/number总是得到404:
No route found for "GET /lucky/number"
404 Not Found - NotFoundHttpException
1 linked Exception: ResourceNotFoundException »
[2/2] NotFoundHttpException: No route found for "GET /lucky/number" +
[1/2] ResourceNotFoundException: +
Run Code Online (Sandbox Code Playgroud)
使用routing.yml
app:
resource: "@AppBundle/Controller/"
type: annotation
Run Code Online (Sandbox Code Playgroud)
调节器
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
class LuckyController
{
/**
* @Route("/lucky/number")
*/
public function numberAction()
{
$number = rand(0, 100);
return new Response( '<html><body>Lucky number: '.$number.'</body></html>' );
}
}
Run Code Online (Sandbox Code Playgroud)
不知道错误在哪里......
错误 …
好的,所以我刚刚安装了最新版本的Symfony 4.安装完成后运行浏览器并显示一个不错的欢迎问候语.都好!
然后我使用创建了一个新的控制器make:controller.我将此控制器命名为Client,并使用Annotations,与其他默认控制器相同.我按如下方式配置了路由:
/**
* @Route("/client", name="client")
*/
public function index()
{
// replace this line with your own code!
return $this->render('@Maker/demoPage.html.twig', [ 'path' => str_replace($this->getParameter('kernel.project_dir').'/', '', __FILE__) ]);
}
Run Code Online (Sandbox Code Playgroud)
我刷新浏览器,一切都很好,没有错误.
然后我手动在浏览器中键入路径以检查它是否真的有效:
localhost:8000/client
Run Code Online (Sandbox Code Playgroud)
问题.该网址返回标准apache 404
Not Found
The requested URL /client was not found on this server.
Apache/2.4.18 (Ubuntu) Server at new.staff-fdr.dev Port 80
Run Code Online (Sandbox Code Playgroud)
调试路径看到了这一点:
-------------------------- -------- -------- ------ ------------------
Name Method Scheme Host Path
-------------------------- -------- -------- ------ -----------------
client ANY ANY ANY /client
index ANY ANY …Run Code Online (Sandbox Code Playgroud) 所以在routing.yml中我定义了以下路由以编辑和删除特定设置:
routing.yml中:
settings.editDefaults:
path: settings/{id}/defaults/edit/{widgetType}
defaults: { _controller: AppBundle:Settings:editDefaults }
methods: [POST, PUT]
settings.deleteDefaults:
path: settings/{id}/defaults/delete/{widgetType}
defaults: { _controller: AppBundle:Settings:deleteDefaults }
methods: [DELETE]
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我定义了正确的操作: SettingController.php:
/**
* edit the default settings of a hotel/widget
*/
public function editDefaultsAction(Request $request)
{
//Edit logic
}
/**
* delete a default setting of a hotel/widget
*/
public function deleteDefaultsAction($hotelId, $widgetType)
{
//Delete logic
}
Run Code Online (Sandbox Code Playgroud)
在第二个动作,我只需要id和widgetType经过这样我就可以查询和删除选定的记录.
当我去任何一条路线时,我得到以下内容:
编辑路线错误:
找不到"GET/settings/2b2acd55-0dd6-11e5-8107-621ae3320fd4/defaults/edit/default"的路由:不允许的方法(允许:POST,PUT)
删除路线错误:
找不到"GET/settings/2b2acd55-0dd6-11e5-8107-621ae3320fd4/defaults/delete/default"的路由:不允许的方法(允许:DELETE)
但当我删除一个并离开另一个他们工作正常.我假设它的路径定义相似吗?我可以保持相同的路径而不会出现此错误吗?我不明白的是什么?
感谢你的帮助,Anth
StorefrontController我正在尝试向我的客户发送有关最新 Shopware 的请求6.2.2,但收到以下错误:
PageController can't be requested via XmlHttpRequest.
Run Code Online (Sandbox Code Playgroud)
我正在httpClient从自定义 JS 插件发出常规请求:
export default class MyCustomPlugin extends Plugin {
static options = {
dataUrl: '', // comes from the twig as "path('frontend.path.to.route')"
product: null,
params: {},
loadingIndicatorClass: 'is-loading',
responseSelector: 'some-selector-class'
}
init () {
// this.el.innerHTML = LoadingIndicator.getTemplate()
this.httpClient = new HttpClient()
const query = querystring.stringify(this.options.product)
this.sendDataRequest(query)
}
/**
* Add classes to add loading styling.
* Prevents the user from clicking filter labels during …Run Code Online (Sandbox Code Playgroud) 以下是自定义捆绑包中定义的简单路由
my_admin_route:
pattern: /admin/{name}
defaults: { _controller: NamespaceCustomBundle:CustomControl:login }
Run Code Online (Sandbox Code Playgroud)
上面的路由代码将调用CustomControlController方法loginAction()我的问题是我如何自动化路由中的函数名称,就像每个函数一样,我没有再次定义路由应该有一个路由并自动调用函数作为定义的参数{name}在路线如下
my_admin_route:
pattern: /admin/{name}
defaults: { _controller: NamespaceCustomBundle:CustomControl:{name} }
Run Code Online (Sandbox Code Playgroud) 我经常发现自己的路线需要2个(有时4个以上)参数来生成路线.只要我只需要在几个位置生成路线,这就没问题了.但我经常发现自己在Twig和PHP(控制器和服务)中的许多位置都重现了参数列表.参数通常不仅仅是记录ID.
例如,假设我有以下路线:
/product/{id}/{category_slug}/{category_sub_slug}/{product_slug}
Run Code Online (Sandbox Code Playgroud)
要在Twig中生成这个,我需要这样的东西:
path('product_view', {
id: product.id,
category_slug: product.subCategory.category.slug,
category_sub_slug: product.subCategory.slug,
product_slug: product.slug
})
Run Code Online (Sandbox Code Playgroud)
这在一个地方已经足够糟糕了,但是一旦你开始在任何地方处理它就会很糟糕,甚至当有人决定他们不想再包含ID时更糟糕.
问题:有没有办法添加可重用的方法,比如product_path($product)可以在Twig和Controllers/Services中使用?或者扩展Router或UrlGenerator以确定实体/对象应如何用于路由生成?
我可以提供服务然后进行Twig扩展,但看起来很常见,需要完成很多工作/代码.
一个想法是我可以在哪里:
path('product_view', { product: product })
$this->generateUrl('product_view', ['product': product]);
Run Code Online (Sandbox Code Playgroud)
从那里它可以弄清楚如何生成URL.当然逻辑是我写的东西,但我只需要通过路由器.
我将所有控制器移至/src/Web/Controller我的 Symfony 6 项目中,如下所示
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Web\n\xe2\x94\x82 | \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Controller\n\xe2\x94\x82 | \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ....\n| |\xe2\x94\x80\xe2\x94\x80 Kernel.php\nRun Code Online (Sandbox Code Playgroud)\n我的routes.yaml作相应修改
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Web\n\xe2\x94\x82 | \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Controller\n\xe2\x94\x82 | \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ....\n| |\xe2\x94\x80\xe2\x94\x80 Kernel.php\nRun Code Online (Sandbox Code Playgroud)\n现在的问题是我所有的路线都有一个前缀为的名称app_web。我想这是由于这种结构。
$ php bin/console debug:router命令输出如下:
...\n...\napp_web_post_index GET|HEAD ANY ANY /post/ \napp_web_post_create GET|HEAD|POST ANY ANY /post/create \nRun Code Online (Sandbox Code Playgroud)\n在这里我只想要名字post_indexHow do I摆脱这个前缀?
symfony-routing ×10
symfony ×9
php ×5
symfony-2.3 ×2
ajax ×1
javascript ×1
routing ×1
shopware ×1
symfony-2.7 ×1
symfony-3.4 ×1
symfony4 ×1
symfony6 ×1
yaml ×1