我现在开始探索Symfony 2的世界,并面临一些非常奇怪的问题,我认为它们在这样的专业框架中不会发生。我将一一向您展示我面临的问题:
1)如何获取最近的动作名称?我只找到了这个恕我直言半专业的解决方案:
$request->attributes->get('_controller');
// will get yourBundle'Controller'yourController::CreateAction
$params = explode('::',$request->attributes->get('_controller'));
// $params[1] = 'createAction';
$actionName = substr($params[1],0,-6);
这是认真的吗,我必须做一些额外的工作才能得到它,为什么..有没有更好的解决方案?使用方法(例如getActionName())创建一个基本控制器类,但是为什么我必须在框架中实现这些基本功能。还有其他方法吗?
2)当我转发请求时,1)中的代码将不起作用。
$request = $this->container->get('request');
$getParameterList = $request->query->all();
if (!empty($getParameterList['mode'])
&& $getParameterList['mode'] == 1) {
return $this->forward('AcmeDemoBundle:Routing:lawyersearch', array(), $getParameterList);
}
它不起作用的原因是"AcmeDemoBundle:Routing:lawyersearch"是一种与我直接从路线上来时的另一种格式。这里的第二个问题是我还必须转发 GET 参数(我认为也是 POST)。有没有办法我不必关心它?
3) 如何在不使用此注释的情况下使用默认模板:
/**
* @Template()
*/
public function indexAction()
{
return array();
}
我不想在我的所有方法之上都有这个注释;我知道我可以把它放在类定义的顶部。有没有办法实现这一目标?我看到的唯一解决方案是编写一个 BaseController,它通过模块/控制器/操作中的方法确定默认模板。
4)我发现了使用公共属性的类,例如Symfony''Component''Validator''Constraint''Length,例如公共$max;
如何解决这个问题?很奇怪,因为这使用公共属性并不专业。
我希望有人对此有简单的解决方案。如果Symfony 2在这么多情况下有这么多奇怪的行为,那将是真的令人失望。4 奇怪的事情我 2 天开始探索它。它让我觉得当我继续时还有更多。
请确认框架没有其他解决方案或哪个是解决方案。谢谢
1)通过访问请求的'_controller'
参数,你正在深入研究Symfony2的内部结构。 他们很少在路由之外记录与此相关的任何内容。 您应该更明确地使用控制器操作,不要尝试在此级别上自动化太多。
2)Symfony2不能解释高度动态的控制器。 您知道可以在同一控制器操作中多次调用->forward
。 这造成了一个嵌套的噩梦,而Symfony开发人员没有准备好应对。
这是现在弃用$request = $this->container->get('request');
以支持$stack = $this->container->get('request_stack');
的原因之一。因为转发需要创建新的内部请求。
3) 也已弃用。 Symfony2最佳实践现在不鼓励使用带有空参数的@Template()
,因为操作/模板的开发可能会不稳定。 您应该明确定义要使用的模板(如果您使用的话)。 这在处理仅数据响应时会派上用场。 您不希望您的响应自动使用模板,因为这会导致您的设计中出现意外行为。
1) 使用常量:__FUNCTION__
http://php.net/manual/en/language.constants.predefined.php
2) 在$request上尝试设置方法: $this->get('request')->setMethod('POST');
3)我不知道,可能不可能。
4)Symfony'Component'Validator'Constraints'Length
是约束之一:http://symfony.com/doc/current/book/validation.html#constraints