TIP게시판

제목 $this->uri->get() 추가
글쓴이 배강민 작성시각 2010/06/02 20:48:36
댓글 : 11 추천 : 0 스크랩 : 0 조회수 : 16358   RSS
배강민

안녕들하세요...

허접해서 팁이라 하기도 뭐하지만, 해본김에...

mycastor의 input 확장을 보고 제 입맛에 맞추어보고자 해봤습니다.. mycastor Thanks~

많은 분들이 느끼시는 부분이실 $this->uri->segment(순서); 로 GET 대신 사용하는...

순서가 너무도 중요하므로 다소 곤란하거나 수정할 부분이 많이 생길 수 있죠...

그래서 얼마전 mycastor도 올리고, 이런저런 라이브러리 확장 방식등이 보이는 것 같습니다.

CI자체에 일반 쿼리스트링을 쓰는 방법도 있긴하지만... 고건 좀 싫어서....

전 get이긴한데... ?a=1&b=2 방식의 일반적인 방식은 아니고

abc.com/controller/method/파라메터명_값/파라메터명_값

이런 방식으로 만들어봤습니다.

이렇게 한 이유는 아래 소스에도 써있지만,

$config['permitted_uri_chars'] 을 손대지 않고, CI 기본 segment를 우선 거친 후 믿을 수 있는 놈을 이용하기 위함입니다. 또, 기존 segment와 병행도 가능하기 위함입니다..

파라메터 추가할 일이 생겼는데 너무 손댈데가 많아서,  제 입맛에 맞게 만들어봤습니다. 다소 오타쿠스러울지 모르겄지만..ㅋ

사용하실 분들은 마음껏~ 사용해주시면 제가 오히려 감사~~~

 

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

    /**
     * @author BaeKangMin.com
     * @param (파라메터명 또는 seg, $no_result) -> 파라메터명이 숫자면 $this->uri->segment(숫자) 와 동일
     * @url 타입 : abc.com/controller/method/파라메터명_값/파라메터명_값
     * 즉, abc.com/controller/method/a_100/b_200 일때
     * $this->uri->get('a') 하면 100이 리턴됩니다.
     * $this->uri->get(3) 하면 a_100이 리턴됩니다.
     * @목적1 : $config['permitted_uri_chars'] 손대지말기
     * @목적2 : CI 기본 segment를 우선 거친 후 믿을 수 있는 놈을 이용
     * @목적3 : 파라메터 순서 상관없이 일반(?) get방식과 비스무레하게 사용
     * @단점 : 단순히 URL을 파싱하므로, 컨트롤/함수명등과 중복되지 않게 주의해야함...
     */

    class MY_URI extends CI_URI 
    {
    	public function __construct()
    	{
    		parent::CI_URI();
            
            /*
            // fail...
            foreach($this->segments as $key=>$val)
            {   
                $temp = $this->segment($key);
                
                if($temp != '_' && strpos($temp, '_') !== FALSE)
                {
                    $temp = explode('_', $temp);
                    
                    // a_ba_bb 의 경우 a를 호출하면 ba_bb가 나와야 하므로 '_' 으로 다시 조합
                    $this->param[$temp[0]] = join('_', array_slice($temp, 1));                     
                }
            }
            */ 
                          
    	}
                
        public function get($param, $no_result=FALSE)
        {
                      
            //파라메터가 숫자면 CI 기본 segment 함수 호출             
            if(is_numeric($param) === TRUE)
            {               
                return $this->segment($param, $no_result);
            
            //파라메터가 문자면 쿼리스트링을 파싱해서  
            } else
            {
                
                foreach($this->segments as $key=>$val)
                {                    
                    $temp = $this->segment($key, $no_result);

                    //ver 2
                    //정규표현식으로 파라메터명으로 시작하는 것만 잡음
                    //substr로 파라메터명에 '_' 붙이면 안되는 것  해결
                    //explode 안함으로인해 시간/메모리 이득
                    if($temp != $param.'_' && preg_match('/^'.$param.'_/', $temp))
                    {
                        return substr($temp, strlen($param.'_'));                  
                    }
                    
                    /*
                    //ver 1
                    //파라메터명에 '_' 붙이면 안됨                    
                    if($temp != $param.'_' && strpos($temp, $param.'_') !== FALSE)
                    {                        
                        $temp = explode('_', $temp);
                    
                        // a_ba_bb 의 경우 a를 호출하면 ba_bb가 나와야 하므로 '_' 으로 다시 조합
                        if($temp[0] == $param) return join('_', array_slice($temp, 1));                        
                    }
                    */
                }
                
                return FALSE;
                
                /*
                // fail...
        		if(array_key_exists($param, $this->param)) 
                {
        			return $this->param[$param];
        		} else {
        			return FALSE;
        		} 
                */              
            }
        }
    }
    
/* End of File */


위 소스를 application/libraries/MY_URI.php로 저장하면, $this->uri->segment 대신 $this->uri->get(순서 혹은 파라메터명)으로 유동적으로 사용할 수 있습니다.

원래, 위 소스에 주석으로 fail.. 된 부분이 mycastor 처럼 우선 파싱하고서 골라서 써보려했는데...

지금대로면 함수 호출때마다 루프를 돌아야하므로...

단순 파싱이 아니라 URI 라이브러리의 것을 좀 쓰려고 했더니만... __construct 에서 사용이 아니되서...흠...

오늘은 그만 하고 내일 회사서 좀 더 만지작거려볼라꼬용...쩝..

어찌하면 저  fail 부분을 살릴 수 있을지 아시는 분 알려주세용~  흠.. 질답으로 옮겨야하나...

급히 만들고 잠깐만 테스트해본지라 문제가 될 부분 있으면 말씀해주시기 바랍니다...

꾸지람 및 버그 리포팅 환영합니당~

휴일 마무리 잘 하세용~ 오늘 제가 뽑은 사람들 반띵만 되면 좋겠네용..ㅋ

 다음글 json 라이브러리(php version < ph... (1)
 이전글 LAMP 웹사이트를 위한 10가지 간단한 보안 작업 (4)

댓글

kirrie / 2010/06/03 09:51:29 / 추천 0
ㅎㅎ 미안하지만 http://www.codeigniter-kr.org/user_guide/libraries/uri.html 이미 있다능;;
배강민 / 2010/06/03 10:31:34 / 추천 0

@kirrie// $this->uri->uri_to_assoc(숫자); 요걸 말하는거?

요걸 말하는거라면...흠...

만약 abc.com/controller/method/지역코드/파라메터명/100/파라메터명/200

지역코드는 기본적인 segment로 가져오고 뒤는 파라메터명으로 가져오고 하려면...

일때... 물론 $this->uri->segment(3), $this->uri->uri_to_assoc(4)를 병행사용하면 되겠지만...

상황에 따라 상당히 복잡해지거나, 수정하기 힘들 수도 있을 것 같은데....흠....

물론, 무조건 $this->uri->uri_to_assoc 방식으로 간다하면 문제 없겠지만....

또 이상한게 라우팅으로 method를 생략하거나해서

abc.com/controller/파라메터명/100/파라메터명/200

abc.com/controller/method/파라메터명/100/파라메터명/200

이걸 동일하게 동작하게 했을때... $this->uri->ruri_to_assoc()을 사용하면

둘다 "파라메터명/100/파라메터명/200" 요걸 잡아야하는 것 같은데....못잡네... 내가 잘못하고 있나...흠...

좀더 고민해봐야징....

kirrie / 2010/06/03 10:46:15 / 추천 0
아, 내가 네 소스 자세히 안봤어. 그냥 비슷한 건줄 알았는데 좀 다른가보네 ㅎㅎ
배강민 / 2010/06/03 11:19:52 / 추천 0
흠... 테스트 좀 해보니...

abc.com/controller/파라메터명/100/파라메터명/200

abc.com/controller/method/파라메터명/100/파라메터명/200

를 라우팅으로 동일하게 했을때...$this->uri->ruri_to_assoc() 해보니... uri_string을 꼴랑 controller/method/ 만 가져오네요.../method/파라메터명/100/파라메터명/200 이걸 다 가져와야하는데...쩝...

또, abc.com/controller/method/파라메터명//파라메터명/200

이렇게 앞 파라메터명의 값을 공백이 넘어와서 null로 인식하나 해봤더니만...

print_r 해보니, 무시하고서 Array ( [앞 파라메터명] => 뒤 파라메터 [200] => false) 이 되버리네요...

Array ( [앞 파라메터명] => false, [뒤 파라메터] => 200) 이렇게 잡아야하는디.... 이건 아닌거 같은데.... 

배강민 / 2010/06/03 11:33:28 / 추천 0
포럼 소스를 보니

	function segment_explode($seg) { //세크먼트 앞뒤 '/' 제거후 uri를 배열로 반환
		$len = strlen($seg);
		if(substr($seg, 0, 1) == '/') {
			$seg = substr($seg, 1, $len);
		}
		$len = strlen($seg);
		if(substr($seg, -1) == '/') {
			$seg = substr($seg, 0, $len-1);
		}
		$seg_exp = explode("/", $seg);
		return $seg_exp;
	}
요런 함수를 만들어서 page/1 을 처리하고 계시는군요...흠... 바로 다음값을 잡아서....흠...
변종원(웅파) / 2010/06/03 13:19:47 / 추천 0
강민/ 어 보통 쌍으로 처리를 하거나 강민이 방식대로 _로 나누거나 다른 기호를 사용하거나 하지.
난 써보니 dir/controller/method/?a=a&b=b 방식이 나은거 같아. ^^
혼용방식
배강민 / 2010/06/03 13:46:26 / 추천 0
웅파행님// 흐... 허용문자규약(?)을 손데기 싫어서리요.. 그거때문에 일전에 로그인 리턴 URL가지고도 거시기했었던.....
맥스 / 2010/06/04 23:37:42 / 추천 0
비슷한 내용들 같은데. 저도 kirrie님이 남긴것 처럼
$default = array('name', 'gender', 'location', 'type', 'sort');

$array = $this->uri->uri_to_assoc(3, $default);
이거 사용합니다.
시작포인트 잡는 거는 어려운거 아니니까 잡아주고
필요에 따라 기본값 잡는 경우가 있어야 해서 거의 디폴트 값은 잡는 편입니다.

하지만 앞으로는 보안상의 이유로 해서 실제 get으로 받아야 하는 쿼리 부분은 암호화 처리 하려고 생각하고 있습니다.
양승현 / 2010/06/08 17:11:32 / 추천 0
웹메이커는 혼용방식을 써요. 처리할께 많아지다보니 혼용방식을 쓸수밖에 없다는 ㅜ.ㅜ
SEB / 2010/12/19 13:53:26 / 추천 0
 검색 + 페이징만해도 상당히 머리가 아프네요..
저도 KangMin님 방법을 고려해보았었는데,, 혼자 이상한짓하는거 아닌가해서 안하고 그냥 assoc쓰고있다는 ㅋㅋ
실제로 하신분이 있었군요 ^^

아 그런데 점점 처리할양이 많아지면서 소스 중복도 많아지게되고
아무래도 혼용방식을 써야하나 생각하고 있습니다
규지니 / 2013/05/16 11:51:38 / 추천 0
저도 웅파님이 말씀하신 dir/controller/method/?a=a&b=b 방식에 한표
예외로는 member/회원 번호 와 같은 간단한 페이지?