간단히 말해서 컨트롤러의 역할은 요청을 수락하는 것입니다. 이 경우 URI를 통해 get 메소드를 사용하여 프리젠테이션 레이어를 새로 고치거나 제출하는 함수 모듈을 로드합니다. 컨트롤러는 $_GET 자동 전역 변수를 사용하여 로드할 모듈을 결정합니다.
요청의 예는 다음과 같습니다:
http://example.com/index.php?module=login
이것은 간단해 보이지만 구현 과정에서는 그렇지 않습니다. 다음은 여러 컨트롤러에서 인식할 수 있는 인수 부분입니다.
모듈은 사용자와 같이 사용할 모듈을 정의하고, 모듈 클래스는 사용자가 로그인하거나 로그아웃할지 여부와 같이 사용할 기능 클래스를 정의합니다.
이벤트는 사용할 특정 이벤트를 정의합니다.
더 복잡한 예에서는 위의 각 인수로 최종적으로 구성되는 요청 URL을 설명할 수 있습니다.
http://example.com/index.php?module=users&class=login
이 요청은 컨트롤러에 다음을 알려줍니다. 사용자 모듈을 로드한 다음 로그인 클래스를 로드하고 특정 이벤트가 정의되지 않았기 때문에 마지막으로 login::__default() 기본 이벤트를 실행해야 합니다.
다음은 특정 코드 부분입니다:
<?php
/**
*index.php
*
* @저자 조 스텀프 < [email protected] >
* @copyright 조 스텀프 < [email protected] >
* @license http://www.opensource.org/licenses/gpl-license.php
* @packageFramework
*/
require_once('config.php')
// {{{ __autoload($class)
/**
* __자동 로드
*
* 자동 로드는 로드하려는 클래스를 찾을 수 없을 때 PHP에 의해 실행됩니다.
* 클래스 이름을 지능적으로 지정하면 대부분의 클래스를 로드할 수 있습니다.
* 동적으로.
*
* @저자 조 스텀프 < [email protected] >
* @param string $class 로드하려는 클래스 이름
* @return 무효
* @packageFramework
*/
함수 __autoload($class)
{
$file = str_replace('_','/',substr($class,2)).'.php';
require_once(FR_BASE_PATH.'/includes/'.$file);
}
// }}}
if (isset($_GET['module'])) {
$module = $_GET['모듈'];
if (isset($_GET['event'])) {
$이벤트 = $_GET['이벤트'];
} 또 다른 {
$이벤트 = '__기본값';
}
if (isset($_GET['class'])) {
$class = $_GET['클래스'];
} 또 다른 {
$클래스 = $모듈;
}
$classFile = FR_BASE_PATH.'/modules/'.$module.'/'.$class.'.php';
if (file_exists($classFile)) {
require_once($classFile);
if (class_exists($class)) {
노력하다 {
$인스턴스 = 새로운 $class();
if (!FR_Module::isValid($instance)) {
die("요청한 모듈은 유효한 프레임워크 모듈이 아닙니다!");
}
$instance->moduleName = $module;
if ($instance->authenticate()) {
노력하다 {
$result = $instance->$event();
if (!PEAR::isError($result)) {
$presenter = FR_Presenter::factory($instance->presenter,$instance)
if (!PEAR::isError($presenter)) {
$프레젠터->디스플레이();
} 또 다른 {
die($presenter->getMessage());
}
}
} 잡기(예외 $error) {
die($error->getMessage());
}
} 또 다른 {
die("요청한 페이지에 접근할 수 없습니다!");
}
} 잡기(예외 $error) {
die($error->getMessage());
}
} 또 다른 {
die("요청에 맞는 유효한 모듈을 찾을 수 없습니다.");
}
} 또 다른 {
die("찾을 수 없습니다: $classFile");
}
} 또 다른 {
die("유효한 모듈이 지정되지 않았습니다.");
}
?>
다음은 위 코드에 대한 구체적인 설명입니다.
__autoload() 함수를 정의하려면
"config.php"를 로드하세요
.이는 다양한 클래스의 동적 로딩을 용이하게 하는 PHP5의 새로운 기능입니다.
인수가 정의되면 관련 모듈, 클래스 및 특정 이벤트가 로드되고,
이어서 몇 가지 판단 및 특정 오류 작업이 수행됩니다.
마지막으로 모든 것이 올바른 경우 프레젠테이션 레이어
(
친숙한 URL)
가 로드됩니다.위의 예에서 언급한 내용은 불편하다면 mod_rewrite를 사용하여 친숙한 URL을 구현하는 것입니다. 다음은 이 프레임워크에 대해 작성자가 작성한 실제 재작성 표준 코드입니다.
RewriteEngine On
# 여기에서 URI를 원하는 홈페이지로 변경하세요. RewriteRule
^/$ /index.php?module=welcome [L,QSA]
# 변경 /
index.php?module=rewriteCond %{DOCUMENT_ROOT}/
%{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)$ /index.php
에 오신 것을 환영합니다
.php?module=$1 [L,QSA]
# /index.php?module=users&class=login을 /users/login으로 변경
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/([^/]*)$ /index.php?module=$1&class=$2 [L,QSA]
# 변경 사항 /index.php?module=users&class=login&event =foo
# ~ /users/login/foo.html
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/( [^/]*)/([^/]*).html$
/index.php?module=$1&class=$2&event=$3 [L,QSA]
컨트롤러 확장
[확장 컨트롤러]
에는 중앙 집중식 컨트롤러가 있습니다. 장점은 일부 기능을 추가한 후 컨트롤러를 통해 즉시 반영할 수 있다는 것입니다. 다음은 이 컨트롤러를 확장하여 프레임워크를 전반적으로 더욱 강력하게 만드는 몇 가지 아이디어입니다.
PHP5의 새로운 기능인 SoapServer를 사용하면 요청이 SOAP인지 자동으로 감지할 수 있습니다.
를 사용
하면 $_GET 및 $_POST와 같은 모든 자동 전역 변수를 필터링하여 악성 HTML 코드 등을 방지할 수 있습니다.
예를 들어 기본 모드에서 PDF 모드로 표현식을 즉시 변환하면
컨트롤러에 캐싱 메커니즘을 직접 추가할 수 있습니다. 이 방법의 장점은 전체 애플리케이션이 캐시를 사용하여 효율성을 높일 수 있다는 것입니다
. 한 가지 주목할 점은 추가된 기능이 전체 프로그램에 반영된다는 것입니다. 예를 들어, 모든 자동 전역 변수를 필터링하고 싶지만 많은 응용 프로그램 관리자는 일부 HTML 코드를 사용해야 하는데 이는 까다로운 일이 됩니다. 기능).