-
-
Save tentacode/ef4d19b390a599be74a6 to your computer and use it in GitHub Desktop.
<?php | |
namespace Tentacode\App\Security; | |
trait ConnectedUser | |
{ | |
/** | |
* @Inject | |
* @var Symfony\Component\Security\Core\SecurityContext | |
*/ | |
private $securityContext; | |
public function getConnectedUser() | |
{ | |
$token = $this->securityContext->getToken(); | |
if (!$token) { | |
throw new \RuntimeException('No user is connected.'); | |
} | |
return $token->getUser(); | |
} | |
} |
<?php | |
return [ | |
'Symfony\Component\Security\Core\SecurityContext' => DI\link('security.context'), | |
// ... | |
]; |
<?php | |
namespace Tentacode\App\Controller\Person; | |
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | |
use Tentacode\App\Security\ConnectedUser; | |
use Tentacode\App\Templating\Templating; | |
use Tentacode\Domain\Person\PersonRepository; | |
use Tentacode\Domain\User; | |
class ProfileController | |
{ | |
use ConnectedUser; | |
protected $templating; | |
protected $personRepository; | |
public function __construct(Templating $templating, PersonRepository $personRepository) | |
{ | |
$this->templating = $templating; | |
$this->personRepository = $personRepository; | |
} | |
public function myProfileAction() | |
{ | |
$user = $this->getConnectedUser(); | |
return $this->templating->render('TentacodeAppBundle:Person:profile.html.twig', [ | |
'user' => $user | |
]); | |
} | |
} |
Why not move the other two dependencies to traits to follow this to its conclusion. Here traits are just making up for the fact that it's overly verbose to have a property and a constructor arg and and assignment for every damn dependency. The bad is that it does cause your constructor to lie about dependencies so this can only be safely built in a PHP-DI environment. So it would be somewhat better to move ALL dependencies to PHP-DI-injected and make the constructor private (or have it throw an exception).
Cleaner would be to move getConnectedUser to a direct dependency and inject that instead of security context. Then you really just have a clean set of dependencies each in a trait for less verbosity.
yeah, that's what I'll be doing in practice, @Inject on properties, and utility services
But yeah, the solution is probably the best, but I won't use a single Utils class, more like several services that do their own stuff.