일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Database
- mysql
- 설정
- ajax
- 후크
- php
- API
- 코드이그나이터
- CI3
- 옵션표
- html
- APK
- 그누보드
- FCM
- 함수
- jquery
- 라이렌
- 헬퍼
- 안드로이드
- rairen
- 웹 프로그래밍
- MSsql
- codeigniter3
- 영카트
- phpDocumentor
- config
- jw player
- CodeIgniter
- function
- javascript
- Today
- Total
프로그램 개발서
[PHP][CI3] URL 첫 경로 부분 한글에 대한 Controller 처리 본문
PHP 코드이그나이터3 프로젝트 작업 중 발생한 이슈에 대한 처리방법에 대하여 글을 작성합니다.
발생 이슈 : URL 첫번재 경로 값으로 홈페이지의 데이터 처리를 변경하고자 합니다.
예시로 http://www.domain.com/인천/home/dashboard.html 이라는 경로가 있을 경우 코드이그나이터 컨트롤러의 경우
인천을 제외한 다음 경로부터 체크하여 Home_Controller의 dashboard 함수가 실행되고 해당 함수의 데이터의 조건을 인천으로 처리하는 것입니다.
이 것을 처리하는데 몇 가지 방법을 사용해봤습니다.
1. .htaccess
2. CI3 라우트
3. URL 형태 변경하기
4. 커스텀 코어
1. htaccess
mod_rewrite 모듈을 통해서 rewriterule을 재설정하여 사용하여고 해보니
파라미터는 받을 수 있으나 라디이렉트 경로에서 인천이 빠지지 않아 컨트롤러를 찾을 수 없음을 확인함.
2. CI3 라우트
코드이그나이터3 프레임워크내에서 /application/config/routes.php 파일을 통해 라우팅 규칙으로 한글을 구분하여 처리하려고 시도했으나, 한글을 인식하지 못하여 불가능.
3. URL
인천의 경로 위치를 바꾸는 것을 생각해았으나, 요청내용과 거리가 멀어지는 느낌이라서 제외함.
4. 커스텀 코어 만들기
2번에 해당하는 문제를 처리하기 위해 사용한 방법으로 이 방법을 통해 해결을 함.
처리내용 : 4번 코어 클래스 추가
코드이그나이터3 에서 URI 라이브러리로 url을 받아올 때, 한글은 urlencode가 되어있습니다.
그러다보니 세그먼트에서 체크할 떄 한글 구분이 불가능한 것입니다.
따라서 요청 유효성 체크할 때 세그먼트에서 urldecode로 확인할 수 있도록 수정하고 세그먼트를 수정하면 이슈를 해결할 수 있다.
디렉토리 : /application/core/
확장 코어 클래스 : AJY_Router.php
덮어쓸 함수 : _validate_request
* 함수 원본
protected function _validate_request($segments){
$c = count($segments);
$directory_override = isset($this->directory);
// Loop through our segments and return as soon as a controller
// is found or when such a directory doesn't exist
while ($c-- > 0)
{
$test = $this->directory
.ucfirst($this->translate_uri_dashes === TRUE ? str_replace('-', '_', $segments[0]) : $segments[0]);
if ( ! file_exists(APPPATH.'controllers/'.$test.'.php')
&& $directory_override === FALSE
&& is_dir(APPPATH.'controllers/'.$this->directory.$segments[0])
)
{
$this->set_directory(array_shift($segments), TRUE);
continue;
}
return $segments;
}
// This means that all segments were actually directories
return $segments;
}
* 수정 함수
protected function _validate_request($segments){
//첫번째 디렉토리가 urldecode값이 한글일 경우
//세그먼트를 재조정하여 컨트롤러를 재조정합니다.
if(preg_match('/^[가-힣]{3,}$/', urldecode($segments[0]))){
$CI_AREA = urldecode($segments[0]);
//서버값에 담아두자
$_SERVER['AJY_AREA'] = $CI_AREA;
$list = $segments;
unset($segments);
foreach ($list as $key => $segment){
if($key > 0)
{
$segments[$key-1] = $segment;
}
}
}
$c = count($segments);
$directory_override = isset($this->directory);
// Loop through our segments and return as soon as a controller
// is found or when such a directory doesn't exist
while ($c-- > 0)
{
$test = $this->directory
.ucfirst($this->translate_uri_dashes === TRUE ? str_replace('-', '_', $segments[0]) : $segments[0]);
if ( ! file_exists(APPPATH.'controllers/'.$test.'.php')
&& $directory_override === FALSE
&& is_dir(APPPATH.'controllers/'.$this->directory.$segments[0])
)
{
$this->set_directory(array_shift($segments), TRUE);
continue;
}
return $segments;
}
// This means that all segments were actually directories
return $segments;
}
** 주의사항
다만 http://domain.com/인천/ 같은 경로일 때 기본 컨트롤로 돌아갈 수 있도록 코드를 추가하는게 좋다.
수정코드에서 서버변수에 담아두고, 확장 코어 컨틀롤러에서 변수값이 없을 경우 기본 값을 주고 컨트롤러를 가도록 처리.
public function __construct()
{
parent::__construct();
$default = '서울';
if(empty($_SERVER['AJY_AREA'])){
redirect(site_url("/{$default}/index"));
}
$AREA = $_SERVER['AJY_AREA'];
$this->data['config']['area'] = $AREA;
}
이방법을 응용하면 다른 상황에서도 충분히 유효하게 쓸 수 있을 것 같다.
'PHP' 카테고리의 다른 글
[PHP][CI3] 함수 헬퍼 ver 1.5 (0) | 2021.07.08 |
---|---|
[PHP][CI3][MySQL] 시/도 목록 채우기 (0) | 2021.07.05 |
[PHP][CI3][Mysql] 주소 디비 만들기 (0) | 2021.06.21 |
[PHP][CI3] custom config.php (v.0.2) (0) | 2021.06.15 |
[코드이그나이터3] korean/core_lang.php 0.3 (0) | 2020.11.03 |