2015-01-18 3 views
0

달성해야 할 일은 내 모델의 데이터베이스에서 일부 데이터를 추출하여 레이아웃으로 전송하는 것입니다. 여기서 내 기본 메뉴가 있습니다. 그 값을 모델에서 얻은 값을 변경 한 후에 그 메뉴를 변경하고 싶습니다. 이 클래스 모듈의 내용이다 :Zend 2의 모델에서 레이아웃으로 매개 변수를 전달하는 방법은 무엇입니까?

일부는 말했다
namespace Application; 

use Zend\Mvc\ModuleRouteListener; 
use Zend\Mvc\MvcEvent; 

class Module 
{ 
    public function onBootstrap(MvcEvent $e) 
    { 
     $eventManager  = $e->getApplication()->getEventManager(); 
     $moduleRouteListener = new ModuleRouteListener(); 
     $moduleRouteListener->attach($eventManager); 

     // $serviceManager = $e->getApplication()->getServiceManager(); 

     $viewModel = $e->getApplication()->getMvcEvent()->getViewModel(); 
     //$x = new UserController(); 
     // $var = $x->getUserSession(); 
     // $viewModel->someVar = $var; 
    } 

    public function getConfig() 
    { 
     return include __DIR__ . '/config/module.config.php'; 
    } 

    public function getAutoloaderConfig() 
    { 

     return array(
      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 
    public function getServiceConfig() { 
     return array(
      'factories' => array(
       'Application\Model\UsersTable' => function($sm) { 
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
        $table = new Model\UsersTable($dbAdapter); 
        return $table; 
       }, 
      ), 
     ); 
    } 
} 

, 나는 도우미를 사용 할 수 있습니다, 다른 하나는 내가 onBootstrap 기능을 수정해야했다. 정말이 모든 일에 내 머리가 엉망입니다. 어떻게 작동하게 만들 수 있습니까? 당신은 다음과 같은 작업을 수행 할 수 들으

+0

당신이 당신의 탐색에 첨부 할 일에 대해 더 구체적으로 설명해주십시오

Module Manager Listeners

The MvcEvent

. 나는 당신이 언급 한 예제 (헬퍼 또는 onBootstrap에 주입하기를 원하지 않는다는 것을 짐작할 뿐이다. 마지막으로 경량이어야하므로 db로부터 아무것도 붙이지 않는 것이 좋다). 나는 당신이 기본 네비게이션 클래스를 확장하고 싶다고 생각한다. :) 그러나 내가 말했듯이, 당신은 더 구체적으로 당신의 케이스를 기술해야한다. –

답변

1

는 :

public function onBootstrap(MvcEvent $e) 
    { 
     $sharedEvents = $e->getApplication()->getEventManager()->getSharedManager(); 
     $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) { 
     $controller = $e->getTarget(); 
     $data = $controller->getServiceLocator()->get('Application\Model\UsersTable')->functionToGetData(); 
     $controller->layout()->data= $data; 
    }, 100); 
} 

그런 다음 $ 데이터 매개 변수는 레이아웃을 사용할 수 있습니다. 레이아웃을 말할 때 명확하게 말하자면 기본 레이아웃을 의미한다고 가정합니다.

업데이트 : 혼동을 피하기 위해 자신의 이해 방법을 표현하는 것이 어렵다는 것을 알고 있습니다. 문서 및 기타 소스에서 인용 한 몇 가지 이론을 인용 할 것입니다. 나는 위의 것을 이해한다. 마지막에 제공 한 참조를 읽어야하며 아이디어를 얻을 수 있습니다.

onBootstrap() 메서드는 모든 페이지 요청에서이 기능을 구현하는 모든 모듈에 대해 호출되며 이벤트 리스너 등록과 같은 간단한 작업을 수행하는 데에만 사용해야합니다.

EventManager는 실제로 일부 이벤트를 트리거하는 경우에만 흥미 롭습니다.

기본 트리거링에는 다음과 같은 세 가지 인수가 사용됩니다. - 이벤트 이름 (일반적으로 현재 함수/메소드 이름). - 일반적으로 현재 객체 인스턴스 인 대상입니다. - 인수는 대개 현재 함수/메소드에 제공된 인수입니다.

차례로 이벤트를 트리거하는 것은 이벤트를 수신 할 때만 흥미 롭습니다.

리스너는 이름 지정된 이벤트와 콜백을 지정하여 EventManager에 연결합니다. 콜백은 이벤트 객체를받습니다. Event 객체에는 이벤트 이름, 대상 및 매개 변수를 검색하기위한 접근자가 있습니다. 리스너를 추가하고 이벤트를 트리거합니다.

공유 이벤트 관리자는 응용 프로그램에서 고유 한 관리, 그리고 그것은 onBootstrap 방법은 sharedEvents에를 사용하여 이벤트를 연결 한 다음를 트리거 즉

그래서 각 이벤트 관리자에 주입된다. 이 내용을 더 잘 이해하려면 다음 참조 자료를 살펴보십시오.

The EventManager

Understanding the Zend Framework 2 event manager

+0

작동하지만, 그 onBootstrap 함수에서 무슨 일이 일어날 지 전혀 모르겠습니다. 나를 설명 할 수 있습니까?thx –

+0

월요일에 설명 할 것입니다 :) – dixromos98

+0

내 늦은 응답을 위해 srry를 보내십시오. 그러나 월요일에 잊지 마십시오. –

관련 문제