symfony2 전역 도우미 함수 (서비스)에서 서비스 컨테이너에 액세스하는 방법은 무엇입니까?
이 질문은 왜 내가 symfony2 전역 도우미 함수 (서비스)에 변수를 전달할 수 없는지 이해하지 못하면서 시작되었지만 나보다 더 밝은 사람들 덕분에 내 오류가 클래스 내에서 security_context를 사용하려고한다는 것을 깨달았습니다. 주사하지 않았으니 ...
이것이 최종 결과, 작동하는 코드입니다. 나는 이것을 커뮤니티에 도움이되는 더 좋은 방법을 찾지 못했습니다.
이것은 symfony2의 전역 함수 또는 도우미 함수 내에서 security_context에서 사용자 및 기타 데이터를 얻는 방법입니다.
다음과 같은 클래스와 기능이 있습니다.
<?php
namespace BizTV\CommonBundle\Helper;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;
class globalHelper {
private $container;
public function __construct(Container $container) {
$this->container = $container;
}
//This is a helper function that checks the permission on a single container
public function hasAccess($container)
{
$user = $this->container->get('security.context')->getToken()->getUser();
//do my stuff
}
}
... 다음과 같이 서비스 (app / config / config.yml)로 정의 됨 ...
#Registering my global helper functions
services:
biztv.helper.globalHelper:
class: BizTV\CommonBundle\Helper\globalHelper
arguments: ['@service_container']
이제 컨트롤러에서 다음과 같이이 함수를 호출합니다.
public function createAction($id) {
//do some stuff, transform $id into $entity of my type...
//Check if that container is within the company, and if user has access to it.
$helper = $this->get('biztv.helper.globalHelper');
$access = $helper->hasAccess($entity);
속성과 생성자를 추가하기 전에 첫 번째 오류 (정의되지 않은 속성)가 발생했다고 가정합니다. 그런 다음 두 번째 오류가 발생했습니다. 이 다른 오류는 생성자가 Container 개체를받을 것으로 예상하지만 아무것도받지 못했음을 의미합니다. 이는 서비스를 정의 할 때 종속성 주입 관리자에게 컨테이너를 가져오고 싶다고 말하지 않았기 때문입니다. 서비스 정의를 다음과 같이 변경하십시오.
services:
biztv.helper.globalHelper:
class: BizTV\CommonBundle\Helper\globalHelper
arguments: ['@service_container']
생성자는 Symfony \ Component \ DependencyInjection \ ContainerInterface 유형의 개체를 예상해야합니다.
use Symfony\Component\DependencyInjection\ContainerInterface as Container;
class globalHelper {
private $container;
public function __construct(Container $container) {
$this->container = $container;
}
OO의 모범 사례는 아니지만 항상 작동하는 접근 방식
global $kernel;
$assetsManager = $kernel->getContainer()->get('acme_assets.assets_manager');
또 다른 옵션은 ContainerAware를 확장하는 것입니다.
use Symfony\Component\DependencyInjection\ContainerAware;
class MyService extends ContainerAware
{
....
}
setContainer
서비스 선언 을 호출 할 수 있습니다 .
foo.my_service:
class: Foo\Bundle\Bar\Service\MyService
calls:
- [setContainer, [@service_container]]
그런 다음 다음과 같이 서비스에서 컨테이너를 참조 할 수 있습니다.
$container = $this->container;
Maybe it's not the best way but what I do is I pass container to the class so I have it every time I need it.
$helpers = new Helpers();
or
$helpers = new Helpers($this->container);
/* My Class */
class Helpers
{
private $container;
public function __construct($container = null) {
$this->container = $container;
}
...
}
Works every time for me.
You should not inject the service_container
in your services. In your example you should rather inject the old security.context
or the more recent security.token_storage
instead. See for example the "Avoiding your Code Becoming Dependent on the Container" section of http://symfony.com/doc/current/components/dependency_injection.html.
Ex:
<?php
namespace BizTV\CommonBundle\Helper;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
class globalHelper {
private $securityTokenStorage;
public function __construct(TokenStorage $securityTokenStorage) {
$this->securityTokenStorage= $securityTokenStorage;
}
public function hasAccess($container)
{
$user = $this->securityTokenStorage->getToken()->getUser();
//do my stuff
}
}
app/config/config.yml:
services:
biztv.helper.globalHelper:
class: BizTV\CommonBundle\Helper\globalHelper
arguments: ['@security.token_storage']
Your controller:
public function createAction($id) {
$helper = $this->get('biztv.helper.globalHelper');
$access = $helper->hasAccess($entity);
ReferenceURL : https://stackoverflow.com/questions/12056178/how-to-access-service-container-in-symfony2-global-helper-function-service
'Programing' 카테고리의 다른 글
Hive 란? : org.apache.hadoop.hive.ql.exec.MapRedTask의 리턴 코드 2 (0) | 2021.01.11 |
---|---|
행렬 목록 합계 (0) | 2021.01.11 |
MVC 4 클라이언트 측 유효성 검사가 작동하지 않음 (0) | 2021.01.11 |
Twitter 부트 스트랩과 Angular.js의 실제 (또는 숨겨진) 차이점 (0) | 2021.01.11 |
C ++ Qt-qmake에 의해 생성 된 makefile에“-std = c ++ 11”을 추가하는 방법은 무엇입니까? (0) | 2021.01.11 |