2014-03-03 2 views
0

propel로 비즈니스 로직을 구축합니다. 추진는 프리 세이브 방법, 그 응답을 실행하는 경우Symfony2 Setter Injection works

Services.yml

parameters: 
    Abstract.Model : 'FooBundle\Model\AbstractModel' 

services: 
    Abstract.Model: 
     class: 'FooBundle\Model\AbstractModel' 
     calls: 
      - [setSecurity, ["@security.context"]] 

AbstractModel

abstract class AbstractModel extends BaseObject 
{ 
    /** 
    * @param $security \Symfony\Component\Security\Core\SecurityContext 
    */ 
    protected $security; 

    /** 
    * Sets the security context 
    * 
    * @param $security \Symfony\Component\Security\Core\SecurityContext 
    */ 
    public function setSecurity($security) 
    { 
     $this->security = $security; 
    } 

    /** 
    * Code to be run before persisting the object 
    * 
    * @param PropelPDO $con 
    * @return boolean 
    */ 
    public function preSave(\PropelPDO $con = null) 
    { 
     $token = $this->security->getToken(); 
    } 
} 

: 모든 모델은 내가 보안 컨텍스트를 주입하고자하는 추상적 인 모델을 확장 500 :

FatalErrorException: Error: Call to a member function getToken() on a non-object 

누구나 무슨 일이 일어날 지 알고 있습니까?

인사말

Update_01 :

public function save(PropelPDO $con = null, $skipReload = false) 
{ 
    ... 
    $ret = $this->preSave($con); 
} 
+0

당신이 우리에게'preSave'를 트리거 년대 * 사용자 * 코드를 게재 할 수 있습니까? – Touki

+0

이봐, 위에서 코드 예제를 업데이트했다. 당신의 도움을 주셔서 감사합니다. –

+0

추상 클래스를 인스턴스화 할 수 없습니다. – stwe

답변

1

추상 클래스는 인스턴스화 할 수 없습니다.

는 추상 클래스 확장 :

class MyModel extends AbstractModel 
{ 
} 

과 서비스로이 클래스를 사용

services: 
    My.Model: 
     class: 'FooBundle\Model\MyModel' 
     calls: 
      - [setSecurity, ["@security.context"]] 
+0

흠 ... 테스트 용으로 추상 키워드를 방금 들었지만 어쨌든 작동하지 않습니다. 같은 오류. 구성에 문제가 있습니까? 자세한 정보가 필요하면 알려주세요. –

+0

두 가지 이유 : 1. Chache (PHP app/console 캐시 : clear)를 비우고 2. security.context를 캐시로 사용하십시오. getToken()을 제거하고 필요할 때 호출하십시오. 참조 : http://stackoverflow.com/questions/22116642/getuser-in-symfony2s-service-constructor#comment33554223_22116642 – stwe