如何在Symfony2中使用misc函数?

时间:2014-01-26 13:11:38

标签: php symfony dependency-injection

我在哪里存储misc功能?我该如何使用它们?它应该是DependencyInjection吗?它应该只是一个班级,我做的是use Acme\Bundle\AcmeBundle\Misc\ClientIPChecker吗?

说我有一个功能:

<?php
class ClientIPChecker {
    public static function isLocal(Request $request){
        return in_array('127.0.0.1', $request->getClientIp())
    }
}

我想在两个控制器中使用此功能。我如何在Symfony2中执行此操作?

1 个答案:

答案 0 :(得分:1)

如果您有一组一致的函数,则将它们放在类/服务中。如果函数执行不同的操作,则将它们放在适当的类/服务中。在这种特殊情况下,我会选择自定义Request或自定义Controller(可能是后者,包含混乱app.phpapp_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 Request

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.phpweb/app_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:解释here

的自定义服务