CI 묻고 답하기

제목 컨트롤필터 우선순위 - 내용추가
카테고리 CI 4 관련
글쓴이 nuno 작성시각 2020/01/22 21:08:32
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 13423   RSS

app/config/Routes.php 에 필터를 적용하면

app/config/Filters.php 의 글로벌에 적용한 필터보다 우선 적용이됩니다.

글로벌에 적용한 필터가 우선 적용될수 있게 할 수 있는 방법이 있을까요?

app/config/Filters.php 의 $filters 에 적용하면 글로벌 필터가 우선 적용되긴하지만 

루트디렉토리에는 유저기능을 구현하고 admin 폴더에 관리자 기능을 나눌려고하니 어렵네요.

------------------------------------------------------------------------------------------------------------------------------

설명을 길게하면 복잡해질꺼 같아서 단순하게 글을 섰더니 전달이 잘못된거 같습니다.

 

app/Filters/PublicFilter.php

echo 'Public';

app/Filters/UserFilter.php

echo 'user';

app/Filters/AdminFilter.php

echo 'admin';

app/config/Filters.php

public $globals = [
		'before' => [
			'public',
		],
		'after'  => [
			'toolbar',
		],
	];

app/config/Routes.php

$routes->get('/', 'App\Controllers\main::index',  ['filter' => 'user']);

/* 
결과
user
public
*/

App/Controllers           -> 사용자페이지

App/Contollers/Admin   -> 관리자페이지

위과 같은 구조로 구현을할려고 하며 PublicFilter에 공통기능을 작성 UserFilter, AdminFilter 에 각각 구분되는 

되는 필터를 작성을 하고자하나 위의 결과와 같이 UserFilter 필터가 먼저 실행이됩니다.

위의 문제를 해결을 하기위해서 

app/config/Routes.php

$routes->get('/', 'App\Controllers\main::index);

app/config/Filters.php

public $filters = [
		'admin' => ['before'=>['admin', 'admin/*']],
		'user' => ['before'=>['user', '*']],
	];

이렇게 작성을하면

public

user

이렇게 원하는 결과를 얻을수 있으나 admin 디렉토리에서는

public

admin

user

이렇게 나오는 문제가 생깁니다. 이부분을 해결을 하기위해서 

app/config/Filters.php

public $filters = [
		'admin' => ['before'=>['admin', 'admin/*']],
		'user' => ['before'=>['user', 'user/*']],
	];

app/config/Routes.php

$routes->get('/', function() {
	return redirect()->to('/user');
});
$routes->get('/User', 'App\Controllers\main::index');
$routes->get('/Admin', 'App\Controllers\Admin\main::index');

이렇게 하면 위의 문제는 해결이됩니다 하지만.

http://주소/user/ 는 open graph 를 가져올수 있고

http://주소/ 는 open graph 를 불러오지못하고는 문제가 발생을합니다.

위의 문제를 해결할려고하는데 어떻게 해야할까요?

질문 2: 제가 할려는 구조가 잘못되었을까요? 저걸 구현하기위한 다른 방법이 있을까요?

제가 초보라서 어려움이 있네요 이해부탁드립니다.

 

 다음글 log_message 함수에 대한 질문입니다. (1)
 이전글 컨트롤러에서 ajax post 요청 받는법 (5)

댓글

변종원(웅파) / 2020/01/23 10:53:44 / 추천 0

질문이 조금 이상합니다.

 

app/config/Routes.php 에 필터를 적용하면 app/config/Filters.php 의 글로벌에 적용한 필터보다 우선 적용이됩니다.

app/config/Filters.php 의 $filters 에 적용하면 글로벌 필터가 우선 적용되긴하지만 <- 된다고 이야기하시는 건데요? ^^

 

프레임워크  특성상 Routes를 먼저 탈 겁니다. 주소에 대해 분배 처리가 되고 그 이후에 필터(csrf 등)처리가 됩니다.

routes와 filter의 역할은 다른 것인데 혼동하시는 것 같습니다 주소처리에 대한 부분이라면 Routes에서 처리하셔야 합니다.

nuno / 2020/01/23 14:37:24 / 추천 0

@변종원(웅파)

답변감사합니다. 내용추가했습니다.

nuno / 2020/01/23 15:40:34 / 추천 0

해결했습니다.

public $globals = [
		'before' => [
			'public',
		],
		'after'  => [
			'toolbar',
		],
	];

public $filters = [
		'admin' => ['before'=>['admin', 'admin/*']],
		'user' => ['before'=>['user', 'user/*', '/']],
	];

$routes->get('/', 'App\Controllers\main::index');
$routes->get('/user/main', 'App\Controllers\main::index');