我现在开始探索Symfony 2的世界,面对一些奇怪的问题我不认为它们可以在这样一个专业的框架中出现。我会逐一向你展示我面临的问题:
1)如何获取最近的actionName? 我发现只有这种解决方案才是非常适合的:
$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 \ Constraints \ Length with eg public $ max;
如何解决这个问题?非常奇怪,因为使用公共属性并不专业。
我希望有人能为此提供简单的解决方案。如果Symfony 2在如此多的情况下有如此多的奇怪行为,那将是非常令人失望的。自从我开始探索它以来,我发现了4件奇怪的事情。当我继续时,它让我感觉还有更多。
请确认框架没有其他解决方案或解决方案。谢谢
答案 0 :(得分:1)
1)使用常数:__FUNCTION__
http://php.net/manual/en/language.constants.predefined.php
2)在$ request上尝试setMethod:
$this->get('request')->setMethod('POST');
3)我不知道,可能不可能。
4)Symfony\Component\Validator\Constraints\Length
是约束之一:
http://symfony.com/doc/current/book/validation.html#constraints
答案 1 :(得分:1)
1)通过访问请求的'_controller'
参数,您将深入研究Symfony2的内部结构。他们很少在路由之外记录与此相关的任何内容。您应该更明确地使用控制器操作,不要尝试在此级别上自动化太多。
2)Symfony2无法解释高动态控制器。您知道可以在同一个控制器操作中多次调用->forward
。这造成了一个嵌套的噩梦,Symfony的开发者并没有准备好应对。
这是$request = $this->container->get('request');
现在弃用$stack = $this->container->get('request_stack');
的原因之一。因为转发需要创建新的内部请求。
3)也弃用了。 Symfony2最佳实践现在不鼓励将@Template()
与空参数一起使用,因为动作/模板可能会发生不稳定的变化。如果您使用一个模板,则应该明确定义要使用的模板。在处理仅数据响应时,这很方便。您不希望自己的回复自动使用模板,因为这会导致您的设计出现意外行为。