문제

CakePHP 3.0에서는 다른 애플리케이션 프레임워크와 인라인으로 표준 쿼리 문자열 매개변수를 사용하기 위해 명명된 매개변수가 제거되었습니다(신에게 감사합니다).

그래도 여전히 이해하기 어려운 부분은 다른 MVC 프레임워크(예: ASP.NET)에서는 ActionResult(함수와 동일)에 매개변수를 전달한다는 것입니다.

Edit( int id = null ) {

    // do stuff with id

}

그리고 해당 메소드는 다음과 같은 쿼리 문자열로 ID를 전달합니다. /Edit?id=1 라우팅을 사용하여 다음과 같이 만들 수 있습니다. /Edit/1.

그러나 CakePHP에서는 다음과 같은 함수 매개변수 내부에 전달되는 모든 것이 있습니다.

function edit( $id = null ) {

    // do stuff with $id

}

다음과 같이 전달된 매개변수로 수행되어야 합니다. /Edit/1 이는 쿼리 문자열 아이디어와 URL 개선을 위한 라우팅의 필요성을 우회합니다.

해당 편집에 대한 링크의 매개변수 이름을 다음과 같이 지정하면:

$this->Html->link('Edit', array('action' => 'edit', 'id' => $post->id));

그런 다음 다음을 수행해야 합니다.

public function edit() {

    $id = $this->request->query('id');

    // do stuff with $id

}

전달된 매개변수 ID를 얻으려면CakePHP 3.0용 ASP.NET과 같은 함수에서 이를 선택할 것이라고 생각했지만 그렇지 않습니다.

나는 단순히 전달하는 대신 편집 링크에서 전달된 값 앞에 접두사를 붙이는 것을 선호하므로 다른 쪽 끝에서 서수에 대해 많이 걱정할 필요가 없으며 그 값이 무엇인지 알 수 있습니다.

CakePHP의 메소드에 데이터를 전달하는 이러한 방법 중 하나를 사용해 본 사람이 있습니까? 올바른 작업 방법과 버전 3.0의 변경 사항이 이 영역에서 어떻게 개선되는지에 대해 더 많은 정보를 얻을 수 있는 사람이 있습니까?

도움이 되었습니까?

해결책

CakePHP 3.0에는 몇 가지 유형의 요청 매개변수가 있습니다.이를 검토해 보겠습니다.

쿼리 문자열:다음을 사용하여 액세스됩니다. $this->request->query(), 컨트롤러 함수에 인수로 전달되지 않으며 링크를 만들기 위해 수행해야 할 작업 Html->link('My link', ['my_query_param' => $value])

전달된 인수:특수 유형의 인수는 컨트롤러 함수가 인수로 수신하는 인수입니다.인수로 또는 검사를 통해 액세스됩니다. $this->request->params['pass'].경로에 따라 전달된 인수를 사용하여 링크를 빌드하지만 기본 경로의 경우 다음과 같이 링크에 위치 매개변수를 추가하면 됩니다. Html->link('My link', ['action' => view, $id, $secondPassedArg, $thirdPassedArg])

요청 매개변수:전달된 인수는 이 인수의 하위 유형입니다.요청 매개변수는 경로에서 추출할 수 있는 정보 중 요청에 존재할 수 있는 값입니다.매개변수는 수명 동안 다른 유형의 매개변수로 변환될 수 있습니다.

다음 경로를 고려해보세요.

Router::connect('/articles/:year/:month/:day', [
  'controller' => 'articles', 'action' => 'archive'
]);

해당 경로를 사용하여 3개의 요청 매개변수를 효과적으로 생성했습니다. year, month 그리고 day 다음을 사용하여 액세스할 수 있습니다. $this->request->year $this->request->month 그리고 $this->request->day.이에 대한 링크를 구축하기 위해 다음을 수행합니다.

$this->Html->link(
  'My Link',
  ['action' => 'archive', 'year' => $y, 'month' => $m, 'day' => $d]
);

경로가 해당 매개변수를 지정하므로 쿼리 문자열 매개변수로 변환되지 않습니다.이제 이를 전달된 인수로 변환하려면 대신 이 경로를 연결합니다.

Router::connect('/articles/:year/:month/:day',
  ['controller' => 'articles', 'action' => 'archive'],
  ['pass' => ['year', 'month', 'day']]
);

이제 컨트롤러 기능은 다음과 같습니다:

function archive($year, $month, $day) {
  ...
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top