在Symfony程序中,controller利用控制器基类而能够通过getUser()快捷方法得到代表着当前用户的对象:

1
2
3
4
5
6
7
8
9
10
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 
class DefaultController extends Controller
{
    public function indexAction()
    {
        $user = $this->getUser();
       // ...
    }
}

以前,你还可以通过getRequest()快捷方法得到当前的request对象,但在Symfony 2.4中被弱化了,改以Request类型提示(type-hint):

1
2
3
4
5
6
7
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
 
class DefaultController extends Controller
{
    public function indexAction(Request $request) { ... }
}

在Symfony 3.2中,我们添加了一个全新的User解析器(user resolver),它可以在任何控制器中通过类型提示直接得到当前用户,并且我们决定弱化Controller::getUser()快捷方法,在Symfony 4.0中它将被移除:

1
2
3
4
5
6
7
8
9
10
11
12
13
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\User\UserInterface;
 
class DefaultController extends Controller
{
    // when the user is mandatory (e.g. behind a firewall)
    // 防火墙下的任意用户到来时
    public function fooAction(UserInterface $user) { ... }
 
    // when the user is optional (e.g. can be anonymous)
    // 用户可选时(可不登录,token为anonymous)
    public function barAction(UserInterface $user = null) { ... }
}

这个功能是通过argument resolver extension参数解析器扩展机制来实现的,该机制从Symfony 3.1起被引入,允许对控制器的参数注册你自己的value resolvers。