2010-11-20 6 views
4

업데이트 : 나는 PHP에서 헤더의 사용법에 대해 잘못된 문장을 썼다. 그래서 그 부분을 잊지 :)컨트롤러에서 다른 컨트롤러로 Cakephp 내부 리다이렉트

내가 원하는 것은 브라우저에서 URL을 변경하지 않고 다른 컨트롤러에서 (컨트롤러의 데이터로) 컨트롤러의 뷰를 가져 와서 표시하는 것이다.

일부 세부 정보 :

  • requestAction 날 CSS를 제대로 이미지
  • 를 가져올 수 없습니다 (브라우저를 통해) 직접 리디렉션이기 때문에

    1. 리디렉션이 일을하지 않습니다 다른 컨트롤러로 내부적으로 리디렉션하는 컨트롤러 디스패처가 있기 때문에이 기능이 필요합니다.

      라우터 (라우터) :: config와 함께 routes.php를 사용하는 것이 유일한 해결책이라고 생각합니다. connect 디스패처 컨트롤러에 있던 로직을 사용합니다.

    +1

    "내부 재 작성"은 일반적으로 경로로 수행됩니다. "컨트롤러 디스패처"가 루트를 사용하여 똑같은 일을 할 수 없다는 점에있어서 특별한 점은 무엇입니까? – deceze

    +0

    당신이 말했듯이 솔루션은 데이터베이스와 라우트 간의 상호 작용을하는 것입니다. 그러나 가능할 지 모르겠습니다. – apelliciari

    +0

    다른 모델의 컨트롤러 동작에 표시된 한 모델의 데이터를 원하십니까? – Nigel

    답변

    12

    ummm ... header()는 PHP 설명서가 잘못되어 있지 않는 한 리디렉션에 사용하는 함수입니다. (http://php.net/manual/en/function.header.php) cakePHP의 핵심은 리다이렉트 기능을위한 헤더를 사용합니다 (cake/libs/controller.php의 721 - 730 행 참조).

    그래서 "보통 PHP"와 같은 것이 확실하지 않습니다. CakePHP는 PHP입니다. 객체 지향 코드를 기반으로 만들어졌습니다. 그것은 일을하는 마법이나 꼬인 방법이 아닙니다. 따라서 cake에서 리디렉션을 수행하려면 다음을 사용하면됩니다.

    $this->redirect(array('controller' => 'my_controller', 'action' => 'my_action')); 
    

    그러면 header() 함수가 호출됩니다.

    지금. 리디렉션을 사용하지 않고 죽은 경우 (아마 외부 사이트로 이동하는 경우) 코드에서 header()를 호출 할 수 있습니다. exit(); 헤더 통화 후 :

    header('Location: http://call/my/url'); 
    exit(); 
    

    리디렉션과 동일하게 작동합니다. 불필요한 추가 작업 일뿐입니다. 리디렉션을 사용하면 도메인 이름이 유지되고 자동으로 URL이 작성됩니다.

    +0

    예, 헤더의 사용을 혼동합니다. 가능한 한 빨리 질문을 다시 작성합니다. htaccess URL 리디렉션 (및 해당 투명성)과 같은 몇 가지가 필요합니다 – apelliciari

    +0

    참고로 상대 경로로 이동하기 위해 헤더를 사용할 수도 있습니다 – apelliciari

    2

    일반적으로 컨트롤러에 URL을 연결하는 것은 경로 작업입니다. 논리가 다소 복잡하고 일반 경로가 경로를 자르지 않는다면 더 복잡한 논리를 수행하는 자체 경로 구문 분석기 클래스를 작성할 수도 있습니다 (모두 매뉴얼에 있습니다).

    이 라우팅 논리에 데이터베이스 쿼리 또는 다른 종류의 컨트롤러 논리가 포함되어 있고 일부 내부 상태에 따라 동일한 URL에 대해 매우 다른 결과가 발생할 수있는 경우 매우 RESTless 응용 프로그램을 만들고 있습니다. 당신이하려고하는 것을 재고해야합니다. 그렇다면 $this->render()을 사용하여 모든 컨트롤러 동작의 뷰를 렌더링 할 수 있습니다. 각 뷰의 컨트롤러 로직을 AppController에 넣거나 모델을 부분적으로 호출하여 어디서나 호출 할 수 있습니다. 따라서 다른 컨트롤러로 "리디렉션"하는 대신 경로는 평상시와 같이 특정 컨트롤러 동작으로 라우팅하기 만하면 호출해야하는 코드를 동적으로 호출 한 다음 렌더링해야하는 뷰를 렌더링합니다.

    앱에 동일한 URL을 유지하면서 매우 다른 콘텐츠를 표시하려면 AJAX 앱을 조사해야합니다.

    올바른 해결책은 아마도 중간에있을 것입니다.

    관련 문제