PHP MVC 프레임워크 코어 클래스
이제 몇 가지 핵심 프레임워크 예를 들어 보겠습니다. Framework/core 아래에 Framework.class.php 파일을 만듭니다. 다음 코드를 작성하세요:
// Framework/core/Framework.class.php
class Framework {
public static function run() {
echo "run()"; > }
require "framework/core/Framework.class.php";
Framework::run()
브라우저 결과에서 index.php를 방문하면 확인할 수 있습니다. 일반적으로 이 정적 메서드의 이름은 run() 또는 bootstrap()입니다. 이 메서드에서는 세 가지 주요 작업을 수행해야 합니다.
class Framework {
public static function run() {
// echo "run()"
self ::init ();
self::autoload();
self::dispatch();
}
private static function init() {
}
private static function autoload() {
}
개인 정적 함수 디스패치() {
}
}
초기화
init() 메서드:
// 초기화
private static function init() {
// 경로 상수 정의
정의("DS", DIRECTORY_SEPARATOR)
정의("ROOT", getcwd( ) .DS );
정의("APP_PATH", ROOT . 'application' . DS)
정의("FRAMEWORK_PATH", ROOT . "프레임워크" . DS); 정의("PUBLIC_PATH", ROOT . "공공" . DS);
정의("CONFIG_PATH", APP_PATH . "config" . DS)
정의("ControlLER_PATH" , APP_PATH . "컨트롤러" . DS);
정의("MODEL_PATH", APP_PATH . "모델" . DS)
정의("VIEW_PATH", APP_PATH . "views" . DS ); 🎜>
정의("CORE_PATH", FRAMEWORK_PATH . "core" . DS)
정의('DB_PATH', FRAMEWORK_PATH . "데이터베이스" . DS)
정의("HELPER_PATH", FRAMEWORK_PATH . "helpers" . DS);
정의("UPLOAD_PATH", PUBLIC_PATH . "uploads" . DS)
// 플랫폼 정의, 컨트롤러, 액션 예:
// index.php?p=admin&c=Goods&a=add
정의("PLATFORM", isset($_REQUEST['p']) ? $ _REQUEST['p'] : '집');
정의("ControlLER", isset($_REQUEST['c' ]) ? $_REQUEST['c'] : '색인'); >
정의("ACTION", isset($_REQUEST['a']) ? $_REQUEST['a'] : 'index' )
정의("CURR_ControlLER_PATH", CONTROLLER_PATH . PLATFORM . DS);
정의("CURR_VIEW_PATH", VIEW_PATH . PLATFORM . DS); 클래스
에는 "Controller.class.php"가 필요합니다. " Loader.class.php";
필요 DB_PATH . "Mysql.class.php ";
필요 CORE_PATH . "Model.class.php";
// 구성 파일 로드
$GLOBALS['config'] = include CONFIG_PATH . "config.php"
// 세션 시작
session_start()
댓글의 각 단계의 목적.
자동 로딩
프로젝트에서는 스크립트에서 클래스를 사용하려고 할 때 수동으로 로딩을 포함하거나 요구하지 않습니다. 이것이 바로 PHP MVC 프레임워크에 자동 로딩 기능이 있는 이유입니다. 예를 들어, Symfony에서는 lib 아래에 클래스를 로드하려는 경우 해당 클래스를 자동으로 가져옵니다. 놀랍지 않나요? 이제 프레임워크에 자동 로딩 기능을 추가해 보겠습니다.
여기에서는 PHP에 내장된 함수 spl_autoload_register를 사용할 것입니다:
// Autoloading
private static function autoload(){
spl_autoload_register (array (__CLASS__,'load'));
}
// 사용자 정의 로드 방법 정의
private static function load($classname){
// 간단히 자동 로드 앱의 컨트롤러 및 모델 클래스
if (substr($classname, -10) == "Controller"){
// 컨트롤러
require_once CURR_CONTROLLER_PATH . "$classname.class.php"
} elseif (substr($classname, -5) == "모델"){
컨트롤러 클래스의 경우 xxxController.class.php와 같은 이름을 지정해야 하고, 모델 클래스의 경우 xxModel.class.php와 같은 이름을 지정해야 합니다. 프레임워크를 사용할 때 프레임워크의 명명 규칙을 따라야 하는 이유는 무엇입니까? 자동 로딩이 한 가지 이유입니다.
라우팅/배포
// 라우팅 및 디스패칭
private static function dispatch(){
// 컨트롤러 클래스를 인스턴스화하고 해당 액션 메서드 호출
$controller_name = "컨트롤러";
$action_name = ACTION .
$controller = new $controller_name; ;$action_name();
}
이 단계에서 index.php는 해당 Controller::Aciton() 메서드에 요청을 배포합니다.
기본 컨트롤러 클래스
보통 프레임워크의 핵심 클래스에는 기본 컨트롤러가 있습니다. Symfony에서는 sfAction이라고 하며, iOS에서는 UIViewController라고 합니다. 여기서 이름을 Controller로 지정하고 Framework/core
// Base Controller
class Controller{
아래에 Controller.class.php를 생성합니다. // Base Controller에는 $ loader라는 속성이 있습니다. Loader 클래스의 인스턴스입니다(나중에 소개됨)
protected $loader;
public function __construct(){
$this->loader = new Loader()
}
public 함수 리디렉션($url,$message,$wait = 0){
if ($wait == 0){
header("Location:$url")
} else {
include CURR_VIEW_PATH . "message.html";
} }
exit;
}
}
기본 컨트롤러에는 Loader 클래스의 인스턴스화인 변수 $loader가 있습니다. . 정확하게 말하면 $this->loader는 인스턴스화된 Load 클래스를 가리키는 변수입니다. 여기서는 이에 대해 너무 많이 논의하지 않겠지만 이는 실제로 매우 핵심적인 개념입니다. 나는
$this->loader = new Loader()
$this->load가 객체라고 믿는 일부 PHP 개발자를 만났습니다. 아니요, 단지 참고사항일 뿐입니다. 이는 Java부터 사용되었으며 Java 이전에는 C++ 및 Objective C에서 포인터라고 불렀습니다. 참조는 캡슐화된 포인터 유형입니다. 예를 들어, iOS(O-C)에서는 다음 객체를 생성했습니다.
UIButton *btn = [UIButton alloc] init]
Loading class
framework.class.php에서 이를 캡슐화했습니다. 애플리케이션 컨트롤러 및 모델. 하지만 프레임워크 디렉터리에 클래스를 자동으로 로드하는 방법은 무엇입니까? 이제 프레임워크 디렉터리에 클래스와 함수를 로드하는 새 Loader 클래스를 만들 수 있습니다. 프레임워크 클래스를 로드할 때 이 Loader 클래스의 메서드만 호출하면 됩니다.
class Loader{
// 라이브러리 클래스 로드
public function library($lib){
include LIB_PATH . "$lib.class.php"
}
// 로더 도우미 함수는 xxx_helper.php입니다.
public function helper($helper){
include HELPER_PATH .
}
}