【问题标题】:How to solve some problems in symfony 2?如何解决 symfony 2 中的一些问题?
【发布时间】:2014-11-27 16:23:25
【问题描述】:

我现在开始探索 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 与例如公共 $max;

如何解决这个问题?很奇怪,因为这样使用公共属性不专业。

我希望有人对此有简单的解决方案。如果 Symfony 2 在这么多情况下有这么多奇怪的行为,那真是令人失望。自从我开始探索 2 天以来,我遇到了 4 件奇怪的事情。它让我觉得当我继续时还有更多。

请确认框架没有其他解决方案或解决方案。谢谢你

【问题讨论】:

  • Symfony2 只是一个框架,它不应该提供你需要的所有功能。如果找不到,请自行制作该功能。

标签: php symfony frameworks


【解决方案1】:

1) 通过访问请求的'_controller' 参数,您正在深入研究 Symfony2 的内部结构。除了路由之外,他们很少记录与此相关的任何内容。您应该更明确地使用控制器操作,不要尝试在此级别上过多地自动化。

2) Symfony2 无法解释高度动态的控制器。您知道可以在同一个控制器操作中多次调用->forward。这造成了 Symfony 开发人员没有准备好应对的嵌套噩梦。

这是$request = $this->container->get('request'); 现在被$stack = $this->container->get('request_stack'); 弃用的原因之一。因为转发需要创建新的内部请求。

3) 也已弃用。 Symfony2 最佳实践现在不鼓励使用带有空参数的@Template(),因为动作/模板的潜在发展不稳定。如果您使用一个模板,您应该明确定义要使用的模板。这在处理仅数据响应时会派上用场。您不希望您的响应自动使用模板,因为这会导致您的设计出现意外行为。

【讨论】:

  • Thx Flosculus,1) 悲伤就是这样,我必须支持旧 URL 并需要这样的功能,2) 比这不起作用 => 我必须自己做 3 ) 还可以 4) 编程比 ...
  • @Gizzmo 虽然 4) 可能与 symfony 的一般设计有些不一致,但这是一个不错的做法。公共属性的使用是旧 OOP 语言的一种范式,并已合并到 PHP 中。如果 PHP 实现了真正的 getter 和 setter,您将不再认为它是糟糕的设计。
  • wut;-) 这不是坏习惯吗?肯定是坏ihmo。但是你所说的“真正的 getter 和 setter……”是什么意思?
  • @Gizzmo stackoverflow.com/a/17881367/1692906 这些是理想的。与我们习惯创建的当前get*set* 方法相反。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-12-11
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多