Php 如何在Symfony2中使用misc函数?
我在哪里存储其他函数?我如何使用它们?应该是依赖性注射吗?它是否应该只是一个类,我是否应该像使用Acme\Bundle\AcmeBundle\Misc\ClientIPChecker那样执行Php 如何在Symfony2中使用misc函数?,php,symfony,dependency-injection,Php,Symfony,Dependency Injection,我在哪里存储其他函数?我如何使用它们?应该是依赖性注射吗?它是否应该只是一个类,我是否应该像使用Acme\Bundle\AcmeBundle\Misc\ClientIPChecker那样执行操作 假设我有一个函数: <?php class ClientIPChecker { public static function isLocal(Request $request){ return in_array('127.0.0.1', $request->getCl
操作
假设我有一个函数:
<?php
class ClientIPChecker {
public static function isLocal(Request $request){
return in_array('127.0.0.1', $request->getClientIp())
}
}
如果您有一组一致的函数,请将它们放在类/服务中。如果函数执行不同的操作,则将它们放入相应的类/服务中。在这种特殊情况下,我将选择定制请求
或定制控制器
(可能是后者,避免混淆app.php
或app\u dev.php
)
对于自定义控制器,这不起作用:
// Automatic binding of $request parameter
public function indexAction(Request $request)
{
// Won't work with custom controller
if ($request->isLocal)) {
// ...
}
// You have to do
if ($this->getRequest()->isLocal()) {
// stuff
}
}
选项1:扩展Symfony请求
namespace My\HttpFoundation;
use Symfony\Component\HttpFoundation\Request as BaseRequest;
class Request extends BaseRequest
{
public function isLocal()
{
return in_array('127.0.0.1', $this->getClientIp());
}
}
然后在web/app.php
和web/app\u dev.php
中修改:
use Symfony\Component\HttpFoundation\Request;
将是:
use My\HttpFoundation\Request;
选项2:创建一个BaseAbstractController
并使用它而不是Symfony控制器
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
abstract class BaseAbstractController extends Controller
{
public function isRequestLocal()
{
return in_array('127.0.0.1', $this->getRequest()->getClientIp())
}
}
选项3:如上所述的自定义服务使用具有类似于Util的命名空间的服务。请参见@gremo is right,定义这个类有一个服务,在服务定义中添加“scope:request”以允许它访问请求。然后可以执行$this->get('util.ipchecker)->isLocal();如果你不同意@gremo和Thomas Piard,这只是一个放在类中的函数,类不是对象。只需将它放在Misc或Util名称空间中,并直接在类中使用它,顺便说一句,此讨论证明此问题是基于主要观点的,这意味着它与SO无关。您还可以扩展SymfonyRequest
addingisLocal
函数,或者只需输入一个BaseController
。请注意,问题中给出的函数就是一个示例。这样的函数可能需要也可能不需要连接到控制器。例如数据处理,或将int转换为字母数字表示。虽然,选项3可能是一个选项,但我并不清楚如何将其付诸实施。@jeroenvisser101我明白了。然后只需使用JMSDiExtraBundle
(这是可选的,但会使事情变得更简单),并像往常一样定义类。然后添加jmsdiextranble
注释,使其成为服务。在中,您可以根据服务的名称检索该服务。看看文档,没那么难。