컨트롤러 사용에 대한 딜레마가 있습니다. 일반적으로 라우터 (디스패처 또는 프런트 컨트롤러)는 컨트롤러 클래스에서 몇 가지 정적 메서드를 호출합니다. 즉, PageController :: showIndexPage()입니다. 내 컨트롤러는 보통 몇 줄의 코드를 가지고 있으며 보통의 모델로드, 데이터 가져 오기 및보기 전달에 사용됩니다.PHP - 클래스 또는 함수의 정적 메서드
제 질문은 - HTTP 요청 당 하나의 메소드 만 실행되기 때문에 클래스를 피하고 컨트롤러에 대해 단일 함수를 만들어야합니까? 때로는 컨트롤러 당 여러 가지 방법이 있지만 실제로는 하나의 메서드 만 사용됩니다. 그게 큰 문제는 아니지만 아마도 더 나은 시스템을 얻을 수 있을까요? My AuthController는 showLoginPage(), doLogin(), doLogout()과 같은 메소드를 가지고 있습니다. 따라서 클래스를 피하고이 컨트롤러를 여러 함수 (eq auth/show_login_page)로 작성하는 것이 좋습니다. PHP, auth/do_login.php 등등? 이 개념에는 장단점이 있습니까?
업데이트 : 일부 사용자가 정적 메서드의 내 사용을 부 풀리기 때문에, 나는 방어해야합니다 :) 나는 그럴 필요가 없기 때문에 나는 컨트롤러의 인스턴스를 만들지 않습니다. 99 %의 경우 컨트롤러는 모델에서보기로 데이터를 전달하는 데에만 사용됩니다. 그리고 단 하나의 메소드 호출에 대한 인스턴스 작성이 필요하지 않습니다. 이것이 메소드가 정적 인 이유입니다. 다음은 내 컨트롤러 중 하나의 예입니다.
class ArticlesController {
static function showArticle($article_id) {
$article = ArticlesModel::getArticleById($article_id);
View::getInstance()->assignByRef("article", $article);
View::getInstance()->display("articles/one.tpl");
}
static function showAllArticles() {
$articles = ArticlesModel::getAllArticles();
View::getInstance()->assignByRef("articles", $articles);
View::getInstance()->display("articles/all.tpl");
}
}
전역 함수에서 같은 접두사를 함께 묶어 둘 수 있습니다. 그것은 당신이 제안하는 것과 같은 "다소"네임 스페이스입니다. 그냥 정적 클래스 함수는 꽤 제한되어 있기 때문에 당신은 정말 현명하게 그들을 사용해야합니다, 일반 MVC 패턴 IMHO를 사용하지 말아야합니다. – hakre
정적 클래스 함수는 전역 함수를 논리적 인 장소로 분리하는 데 도움이되므로 훨씬 편리하며 모든 함수에 대해 하나의 거대한 파일을 가지거나 각 함수를 수동으로로드해야하는 것과 달리 함수와 전역 변수를 자동로드 할 수 있습니다. 파일. – Anther