제품 목록을 필터링하기위한 필터 메소드를 만들었습니다. 이것은 내 URL입니다 :CodeIgniter의 친숙한 URL
localhost/myshop/products/filter?category=shirts&color=blue&page=1
그러나 나는 이런 식으로 보여주고 싶은 :
localhost/myshop/products/shirts/blue/1
가 어떻게 그것을 달성 할 수 있습니까?
제품 목록을 필터링하기위한 필터 메소드를 만들었습니다. 이것은 내 URL입니다 :CodeIgniter의 친숙한 URL
localhost/myshop/products/filter?category=shirts&color=blue&page=1
그러나 나는 이런 식으로 보여주고 싶은 :
localhost/myshop/products/shirts/blue/1
가 어떻게 그것을 달성 할 수 있습니까?
Products::filter()
이 요청 처리를 담당한다고 가정하면 서명의 매개 변수를 수락하도록 메서드를 다시 작성할 수 있습니다. 당신은 단순히 URL 세그먼트를 통해 매개 변수를 받아 그것을 리팩토링 할 수
class Products extends CI_Controller
{
public function filter()
{
// Retrieve data from GET params
$page = $this->input->get('page');
$color = $this->input->get('color');
$category = $this->input->get('category');
// Do the filtering with $category, $color and $page...
}
}
: 현재 로직이 같은 경우에 따라서 장소에두고
public function filter($category, $color, $page)
{
// Do the filtering with $category, $color and $page...
}
을, 현재의 URL은 다음과 같습니다
localhost/myshop/products/filter/shirts/blue/1
우리는 그 여분의 filter/
을 제거해야합니다. docs에서 인용 :
일반적으로 URL 문자열과 그에 해당하는 컨트롤러 클래스/방법 간에는 일대일 관계가 있습니다. 다른 클래스/메소드 대신에 해당하는 하나의 호출 할 수 있도록하지만, 는이 관계를 매핑 할 수 있습니다, 어떤 경우에는
example.com/class/method/param1/param2
: URL의 세그먼트는 통상 다음의 패턴을 따릅니다 URL.
OK, 현재 경로를 다시 매핑해야합니다. 당신은 몇 가지 옵션이 있습니다
$route['products/(:any)'] = 'products/filter/$1';
그것은 URL이 products/
로 시작하면,의 filter
방법으로 매핑 말한다 :
먼저, 새 항목으로 application/config/routes.php
파일을 업데이트하는 것입니다 products
클래스입니다.
여기서 와일드 카드와 정규식 패턴을 사용하여 메서드에서 허용하는 매개 변수의 유형을 더욱 정확하게 지정할 수 있습니다.
또 다른 방법은 컨트롤러에 _remap()
메서드를 구현하여 경로 재 매핑을 수행하는 것입니다.
굉장 !! 그것은 완벽!! 고마워,하지만 params 중 하나가 비어 있다면 어떻게 피할 수 있습니까? 예 : localhost/myshop/products/filter/blue/1 – kate23
괜찮습니다. 하나 이상의 매개 변수 중 하나라도 비어 있으면 CodeIgniter는 사용자의 'ArgumentCountError' 예외를 throw합니다. 매개 변수 중 하나 이상에 잘못된 문자가 포함되어 있으면 '400 잘못된 요청'이 표시됩니다.그래서, 기본적으로, 당신은 그 위협에 대해 안전합니다. – sepehr
'routes.php' 파일에서도 와일드 카드/정규식 패턴을 지정하여 매개 변수를 일치시키고 보호 할 수 있습니다. 예를 들어'$ page '가 항상 숫자가되기를 원한다면 $ route ['products/(: any)/(: any)] '] ='products/filter/$ 1/$ 2/$ 3 ';'. 자세한 내용은 [라우팅 문서] (https://www.codeigniter.com/userguide3/general/routing.html)를 참조하십시오. – sepehr
첫 번째 URL의 컨트롤러 이름은 무엇입니까? – Tpojka
다른 사람들이 도움을 줄 수 있도록 시도한 코드를 제공해주십시오. –
죄송합니다. 잊어 버립니다. 그것은 제품입니다. – kate23