2014-12-22 7 views
1

yii 프레임 워크 용 사용자 정의 확장을 쓰려고하는데 확장 프로그램/컨트롤러 폴더에 저장된 컨트롤러에 액세스 할 수 없습니다. 나는 많은 것을 수색했지만 나는 그 어떤 힌트도 찾지 못했습니다. 이 내가 확장을로드하는 데 필요한 모든 조정을 완료 한yii extensions : 내선에있는 컨트롤러에 액세스하는 방법

protected 

-- extensions 
    -- XYZ (Extension's name) 
     -- assets 
     -- controllers 
      -- XYZController.php 
     -- models 
      -- XYZModel.php 
     -- widgets 
      -- views 
       -- form.php 
      -- XYZWidget.php 

구조이며, 현재 내가 $ this-를 사용하여 뷰 폴더에서 양식을 표시 할 수 있어요> renderInternal ('보기/form.php'). 따라서 확장이 성공적으로로드됩니다. 확장 프로그램 폴더에있는 컨트롤러에 액세스하려고하면이 문제가 나타납니다.

일반적으로 보호 된/컨트롤러/SiteController.php 내부의 인덱스 메소드에 액세스해야하는 경우 URL은 http://project.com/index.php/site/index입니다. 따라서/extensions/controllers/XYZController의 메소드에 액세스하려면 어떻게해야합니까? 이 다양한 권고

'controllerMap'=>array(
    'XYZ'=>array(
     'class'=> 'XYZ.controllers.XYZController', 
    ), 
), 

설정/main.php 파일

Yii::setPathOfAlias('XYZPath', realpath('protected') . '/extensions/AQ'); 
return array(
    ------- 
    ------- 
    'preload'=>array('log', 'XYZ'), 

// autoloading model and component classes 
    'import'=>array(
    'application.models.*', 
    'application.components.*', 
    'application.extensions.XYZ.controllers.*', 
    'application.extensions.XYZ.models.*', 
    'application.extensions.XYZ.widgets.*', 
), 
    'controllerMap'=>array(
     'XYZ'=>array(
      //'class'=> 'XYZPath.controllers.XYZController', 
     'class'=> 'extensions/XYZ/controllers/XYZController', 
    ), 
    ), 
    ------------- 
    ------------- 

) 
로 작성된 같은 양식에서 .PHP.

나는 main.php 코드의 덩어리를 추가

이 상황에서 어떤 힌트를 주시도록 부탁드립니다. 미리 감사드립니다.

+0

응용 프로그램 구성 요소 (http://www.yiiframework.com/doc/guide/1.1/en/extension.create#application-component) 또는 모듈 (http://www.yiiframework.com/doc/)을 작성하고 있습니다. guide/1.1/ko/extension.create # module)? 둘 다 없다면 설정 파일에'extensions.XYZ.controllers. *'만 가져 오면됩니다. –

+0

나는 이것을 'application.extensions.XYZ. *'처럼 만들었으므로 XYZ 폴더 내의 모든 것이 포함되어야한다. – johannesMatevosyan

+1

Yii는 하위 폴더에서 클래스를 재귀 적으로 가져 오지 않으므로 전체 폴더 별칭을 사용하여'controllers'의 클래스를 포함해야합니다. –

답변

1

저는 많은 프로젝트에서 minScript 확장을 사용하고 있으며,이 확장이 자체 디렉토리에서 컨트롤러를로드한다는 것을 알고 있습니다.

올바른 경로에 있지만 잘못된 방식으로 컨트롤러를 참조하고 있습니다.

minScript 확장은 이런 식으로 작업을 수행합니다

'controllerMap'=>array(
     'min'=>array(
      'class'=>'ext.minScript.controllers.ExtMinScriptController', 
     ), 
    ), 

보시다시피, 더 수입이 필요하지 않습니다. 나는 "ext."라고 생각한다. 이미 extensions 디렉토리에 대한 별칭이 있다면 "application.extensions"라고 쓸 수도 있습니다. 대신.

컨트롤러 맵의 config에 링크하십시오. 매개 변수 : http://www.yiiframework.com/doc/api/1.1/CWebApplication#controllerMap-detail

어딘가에 어떤 매개 변수를 전달해야할지 확실하지 않으면 프레임 워크의 코드를 검사해야합니다.

이 그래서를 기반으로, 당신은 같은 결과가 발생해야한다 :

'controllerMap'=>array(
     'min'=>array(
      'class'=>'ext.XYZ.controllers.XYZController', 
     ), 
    ), 

그리고 당신은 당신이 "인덱스"행동이 가정 /index.php?r=XYZ/index하여 액세스 할 것입니다. 또한 기본적으로 비 Windows 환경에서 Yii URL은 대소 문자를 구분합니다. 컨트롤러의 이름이 XYZController 인 경우 "xyz/index"와 같은 경로는 작동하지 않습니다.

가져 오기/경로 별칭이 필요하지 않습니다. 적어도 컨트롤러에는 적합하지 않습니다. 모델, 위젯 등과 같은 나머지 확장 파일을로드하려면 가져 오기가 필요할 수 있지만 Aleksei는 Yii가 재귀 적으로 가져 오기를하지 않으므로 확장 클래스가 포함 된 모든 디렉토리를 하나씩 가져와야한다고 지적 했으므로 당신은 그들에게 자동 로딩을 시키길 원한다.

연장으로 모든 물건을 가져

예 :

'ext.activitystream.models.*', 
'ext.activitystream.behaviors.*', 
'ext.activitystream.verbs.*', 
'ext.activitystream.notifications.*', 
'ext.activitystream.widgets.*', 
'ext.activitystream.*', 

이 마지막 한가지는, 당신의 확장이 무엇을 알고하지 않습니다하지만 당신은 컨트롤러를 많이 할 겁니다 경우 모듈을 개발하는 것이 좋습니다 대신.

확장 프로그램은 응용 프로그램으로 가져 와서 사용할 수있는 몇 가지 도구가 포함 된 단순한 디렉토리입니다. 그러나 확장 모듈이 많은 컨트롤러가있는 "미니"응용 프로그램 인 경우 모듈로로드 할 때 모든 컨트롤러가 자동으로로드되고 구조가 전체 Yii 응용 프로그램과 매우 유사하기 때문에 모듈로 관리하기가 더 쉽습니다.

모듈이 필요하다면 Gii 코드 생성 도구로 만들 수 있다고 생각합니다.