Php 如何在Symfony2中使用misc函数?

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

我在哪里存储其他函数?我如何使用它们?应该是依赖性注射吗?它是否应该只是一个类,我是否应该像使用Acme\Bundle\AcmeBundle\Misc\ClientIPChecker那样执行
操作

假设我有一个函数:

<?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无关。您还可以扩展Symfony
Request
adding
isLocal
函数,或者只需输入一个
BaseController
。请注意,问题中给出的函数就是一个示例。这样的函数可能需要也可能不需要连接到控制器。例如数据处理,或将int转换为字母数字表示。虽然,选项3可能是一个选项,但我并不清楚如何将其付诸实施。@jeroenvisser101我明白了。然后只需使用
JMSDiExtraBundle
(这是可选的,但会使事情变得更简单),并像往常一样定义类。然后添加
jmsdiextranble
注释,使其成为服务。在中,您可以根据服务的名称检索该服务。看看文档,没那么难。