2010-12-14 3 views
8

Iam은 Zend 프레임 워크를 사용한 양식 제출과 관련된 일반적인 문제에 직면합니다. 기본적으로 사용자를 로그인하는 간단한 코드를 작성했지만이 코드는 파란색으로 표시됩니다. 양식을 보여Zend_Form을 사용한 로그인의 일반적인 문제

코드는 꽤 표준입니다

$의 loginform = 새로운 Application_Form_Login(); $ loginform-> setMethod ('post'); $ loginform-> setAction ('login'); $ this-> view-> form = $ loginform; 나는 나의 홈 페이지 URL을 사용하는 경우

는 - 내가 http://localhost.ruin.com/public/index/으로 기본 URL을 사용하는 경우 내가 그러나 예외를

Page not found 
Exception information: 

Message: Invalid controller specified (login) 
Stack trace: 

#0 C:\domains\ruin\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) 
#1 C:\domains\ruin\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch() 
#2 C:\domains\ruin\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() 
#3 C:\domains\ruin\public\index.php(27): Zend_Application->run() 
#4 {main} 

Request Parameters: 

array (
    'controller' => 'login', 
    'action' => 'index', 
    'module' => 'default', 
    'username' => 'fsdf', 
    'password' => 'fdsf', 
    'submit' => 'submit', 
) 

을 얻을 http://localhost.ruin.com/public/

를, 같은 코드가 완벽하게 작동합니다.

나는 또한 최초의 URL에서는 젠드 라우터가 기본 인덱스 컨트롤러에 로그인 동작을 추가 할 수 없기 때문에 로그인으로 인덱스 컨트롤러를 엉망으로 만든다는 사실을 알고있다.

너희들이 젠드 프레임 워크의 디자인입니다 생각합니까 그들이 홈 페이지를 치거나 거기에 내가 http://localhost.ruin.com/public/

내 코드가 작동 할 수있는 방법 때마다 나는 강제로 URL을 http://localhost.ruin.com/public/index/ 내 사용자를 보낼 수 있어야한다

제안 사항이 있으십니까?

+0

게시 경로의 & htaccess로 파일 내용 – Ish

+0

당신이 액세스/공공/로그인/색인을하려고하면 어떻게됩니까? –

+0

@ishkumar - 사용자 정의 경로가 없으며, .htaccess는 zend 도구가 생성하는 기본값입니다. 둘 중 누구에게도 변경이 없습니다. –

답변

2

짧은 답변 :

$form->setAction('/public/index/login'); 

웃기 자세한 대답은 다음과 혼란의 ;-)

한 점은 용어 "조치"를 사용하는 것입니다. 형태과 관련하여

는 "작업은"작업 속성을 참조 :

<form action="/url/at/which/the/form/will/be/processed" method="post"> 

이가되는 동작이 $form->setAction() 메서드를 호출 할 때 참조 할 수있다. 핵심은 URL이 이어야하며 응용 프로그램에는이 URL을 (컨트롤러, 작업) 쌍에 매핑하는 라우팅이 있어야한다는 것입니다.

"동작"이라는 용어를 사용하는 다른 방법은 컨트롤러의 메소드에 대한 약식 이름입니다. 예를 들어 "smile"라는 작업은 컨트롤러의 smileAction() 메서드에 매핑됩니다.

귀하의 경우이 문제는 양식의 setAction() 전화가 앱의 라우팅과 동기화되도록하는 중 하나입니다.

양식의 작업으로 '로그인'URL을 지정하면 상대 URL URL을 제공하므로 브라우저는이를 브라우저의 위치 표시 줄에 나타나는 URL에 상대적으로 해석합니다. 페이지를 탐색하지만 URL의 "인덱스"부분을 남겨두면 프레임 워크의 기본 라우팅은 컨트롤러로 "로그인"합니다. LoginController이 없으므로 요청이 잘못되었습니다.

그래서 IndexController처럼 보일 수 : 결말은에, setAction() 호출 라우터 쌍 포스트를 처리하는 방법을 알고있는 컨트롤러/액션에 매핑 할 수있는 URL을 필요로한다는 것입니다

<?php 

class IndexController extends Zend_Controller_Action 
{ 
    public function indexAction() 
    { 
     $this->view->form = $this->_getForm(); 
    } 

    public function loginAction() 
    { 
     $form = $this->_getForm(); 
     if ($this->getRequest()->isPost()){ 
      if ($form->isValid($this->getRequest()->getPost())){ 
       // All cool. Process your form, 
       // probably with a redirect afterwords to 
       // clear the POST. 
      } 
     } 

     // Still alive? 
     // Then it was either not a post request or the form was invalid. 
     // In either case, set the form in the view 
     $this->view->form = $form; 
    } 

    /** 
    * A helper method to keep the form creation DRY 
    */ 
    protected function _getForm() 
    { 
     $loginform = new Application_Form_Login(); 
     $loginform->setMethod('post'); 

     // Points the form to the IndexController::loginAction(); 
     $loginform->setAction('/public/index/login'); 
     return $loginform; 
    } 
} 

.

희망이 도움이됩니다.

-1

먼저 알아야 할 사항은 예제의 "공용"폴더가 웹 루트 (또는 DocumentRoot) 여야한다는 것입니다. 올바르게 설정하면 http://localhost.ruin.com을 사용하여 사이트에 액세스 할 수 있으며 로그인 양식이 아무런 문제없이 작동 할 것입니다.

자세한 내용은 http://framework.zend.com/manual/en/project-structure.project.html을 참조하십시오.

+0

디렉토리 구조와 아무 관련이 없습니다. –

2

는이 같은 액션의 URL을 설정해야합니다

당신이 컨트롤러에 있다면 당신이보기

$this->form->setAction($this->url(array('params here or'), 'the route name')); 

에 경우

$form->setAction($this->_helper->url(array('params or...'), 'the route name')); 

또는

$form->setAction($this->getRequest()->getBaseUrl() . '/index/login'); 

lated 질문 :

Zend Form SetAction Using Named Routes

+1

이 답변은 허용 된 답변보다 낫지 만, 컨트롤러에서 헬퍼보기 대신 액션 도우미를 사용해야합니다. – takeshin

+0

감사합니다. @takeshin 귀하의 추천을 추가했습니다. –

관련 문제