Zend Framework 2에서 경로, 게시, 가져 오기 등에 액세스하는 방법


98

zf2에서 페이지 요청과 관련된 다양한 매개 변수를 어떻게 얻을 수 있습니까? post / get 매개 변수와 마찬가지로 액세스되는 경로, 전송 된 헤더 및 업로드 된 파일.

답변:


205

가장 쉬운 방법 은 beta5에 도입 된 Params 플러그인 을 사용하는 것 입니다. 다양한 유형의 매개 변수에 쉽게 액세스 할 수있는 유틸리티 메소드가 있습니다. 항상 그렇듯이 테스트를 읽는 것은 어떤 것이 어떻게 사용되어야 하는지를 이해하는 데 유용 할 수 있습니다.

단일 값 얻기

컨트롤러에서 명명 된 매개 변수의 값을 얻으려면 찾고있는 매개 변수 유형에 적합한 방법을 선택하고 이름을 전달해야합니다.

예 :

$this->params()->fromPost('paramname');   // From POST
$this->params()->fromQuery('paramname');  // From GET
$this->params()->fromRoute('paramname');  // From RouteMatch
$this->params()->fromHeader('paramname'); // From header
$this->params()->fromFiles('paramname');  // From file being uploaded

 

기본값

이러한 모든 메서드는 지정된 이름의 매개 변수가없는 경우 반환되는 기본값도 지원합니다.

예:

$orderBy = $this->params()->fromQuery('orderby', 'name');

방문 할 때 http://example.com/?orderby=birthdate를 , $ 해 orderBy는 값이됩니다 생일을 .
방문 할 때 http://example.com/를 , $ 해 orderBy는 해야합니다 기본이름을 .
 

모든 매개 변수 가져 오기

한 유형의 모든 매개 변수를 얻으려면 아무 것도 전달하지 마세요. 그러면 Params 플러그인이 이름을 키로 사용하여 값 배열을 반환합니다.

예:

$allGetValues = $this->params()->fromQuery(); // empty method call

http://example.com/?orderby=birthdate&filter=hasphone을 방문하면 $ allGetValues 는 다음과 같은 배열이됩니다.

array(
    'orderby' => 'birthdate',
    'filter'  => 'hasphone',
);

 

Params 플러그인을 사용하지 않음

소스 코드 를 확인하면Params 플러그인 를 보다 일관된 매개 변수 검색을 허용하기 위해 다른 컨트롤러를 둘러싼 얇은 래퍼라는 것을 알 수 있습니다. 어떤 이유로 든 직접 액세스하기를 원하거나 필요로하는 경우 소스 코드에서 어떻게 수행되는지 확인할 수 있습니다.

예:

$this->getRequest()->getRequest('name', 'default');
$this->getEvent()->getRouteMatch()->getParam('name', 'default');

참고 : 수퍼 글로벌 $ _GET, $ _POST 등을 사용할 수 있지만 권장하지 않습니다.


4
params 플러그인을 직접 호출하는 것도 가능합니다. fromRoute ()에 대한 바로 가기입니다.$this->params('key', 'default')
Robin

@Robin은 사실입니다. 매개 변수없이 호출하면 경로 항목이 아닌 Params 플러그인이 반환되므로 모든 경로 매개 변수를 가져 오는 데 사용할 수는 없습니다.
Matsemann

1
단위 테스트 주석 + 링크의 경우 +1. 어떤 이유로 단위 테스트를 확인하려고 생각하는 사람은 거의 없습니다.
Xunnamius 2013 년

4

예를 들어, 게시 된 json 문자열을 얻는 가장 쉬운 방법은 'php : // input'의 내용을 읽고 디코딩하는 것입니다. 예를 들어 간단한 Zend 경로가 있습니다.

'save-json' => array(
'type' => 'Zend\Mvc\Router\Http\Segment',
            'options' => array(
                'route'    => '/save-json/',
                'defaults' => array(
                    'controller' => 'CDB\Controller\Index',
                    'action'     => 'save-json',
                ),
            ),
        ),

Angular의 $ http.post를 사용하여 데이터를 게시하고 싶었습니다. 게시물은 괜찮 았지만 Zend의 검색 방법

$this->params()->fromPost('paramname'); 

이 경우에는 아무것도 얻지 못했습니다. 그래서 내 해결책은 $ _POST 및 위에 언급 된 다른 방법과 같은 모든 종류의 방법을 시도한 후 'php : //'에서 읽는 것입니다.

$content = file_get_contents('php://input');
print_r(json_decode($content));

결국 내 json 배열을 얻었습니다. 도움이 되었기를 바랍니다.


1
원시 POST 본문이 필요한 경우 요청 객체의 getContent ()를 사용하십시오. 컨트롤러에서 다음을 수행 할 수 있습니다.$content = $this->getRequest()->getContent()
Torin Finnemann 2011

ZF2에서 어떻게 URL 매개 변수를 ?name=mike?
Stephane

1
require_once 'lib/Zend/Loader/StandardAutoloader.php';
$loader = new Zend\Loader\StandardAutoloader(array('autoregister_zf' => true));

$loader->registerNamespace('Http\PhpEnvironment', 'lib/Zend/Http'); 

// Register with spl_autoload:
$loader->register();

$a = new Zend\Http\PhpEnvironment\Request();
print_r($a->getQuery()->get()); exit;


0

예를 들어 컨트롤러 외부에서 플러그인에 액세스 할 수없는 경우 다음과 같이 servicelocator에서 매개 변수를 얻을 수 있습니다.

//from POST
$foo = $this->serviceLocator->get('request')->getPost('foo'); 
//from GET
$foo = $this->serviceLocator->get('request')->getQuery()->foo;
//from route
$foo = $this->serviceLocator->get('application')->getMvcEvent()->getRouteMatch()->getParam('foo');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.