1. 프레임워크 전체 분석
프레임워크를 구현하기 전에 프레임워크가 어떤 효과를 달성해야 하는지를 이해해야 합니다. 전통적인 프레임워크의 개념에 따르면 다음과 같은 사항을 대략적으로 요약할 수 있습니다.
1. 구현 MVC 아키텍처는 컨트롤, 로직 및 뷰 레이어를 분리합니다.
2. 다양한 기능과 기능 모듈을 캡슐화하여 한 곳에서 작성하고 여러 곳에서 호출할 수 있도록 하여 코드 중복을 줄입니다.
3. 확장이 용이하며 외부 확장 라이브러리를 쉽게 도입하여 자체 프레임워크를 향상할 수 있습니다.
4. 디자인 패턴을 선택하고 다양한 엔진 모듈을 캡슐화하거나 작성합니다.
기본 프레임워크 요구 사항은 대략 다음과 같습니다. 아키텍처 설계에는 해결해야 할 문제가 많이 있습니다.
2. 프레임워크 디자인 프로세스
1. 프레임워크 디렉토리
이것은 실제로 매우 중요한 단계이며, 선택에 따라 최종 디렉토리 구조는 기본 3가지를 충족하는 것 외에도 매우 달라집니다. 레이어 또한 확장 라이브러리, 프런트엔드 파일, 템플릿, 리소스 파일 등도 디렉터리에 배치해야 나중에 호출하기 편리한지 여부를 결정합니다. 여기서는 smaty 엔진을 뷰 엔진으로 사용했습니다. 프레임워크 디자인은 대략 다음과 같습니다.
이 그림은 2단계 디렉터리의 구조를 보여줍니다. 더 자세한 디렉터리는 하나씩 표시되지 않습니다. 제한된 사진 표시로 인해 각 디렉토리와 주요 파일의 기능은 나중에 하나씩 설명하겠습니다.
2. 디렉터리 소개
(1) 데이터 디렉터리
위 그림에서 디렉터리 구조를 볼 수 있는데, smarty 엔진을 사용하기 때문에 버퍼 디렉터리와 캐시 디렉터리를 구성해야 합니다. 이것이 바로 데이터 디렉토리의 역할입니다.
(2) 프레임워크 디렉터리
이 디렉터리는 우리 프레임워크의 핵심이며, db 디렉터리에는 데이터베이스 운영 함수 라이브러리가 포함되어 있습니다. 함수 디렉토리에 function.php 파일이 있습니다. 이 파일의 주요 기능은 M('do') 모드의 각 레이어에서 메서드 호출을 빠르게 인스턴스화하는 것입니다. libs 디렉토리에는 데이터베이스 작업 클래스 및 보기 작업 클래스와 같은 프레임워크의 핵심 팩토리 클래스 파일이 배치되어 외부 파일이 DB::funtion()과 같은 방식으로 메소드를 호출할 수 있도록 합니다. View는 스마트한 뷰 엔진을 배치합니다. include.list.php는 프레임워크를 호출할 때 포함해야 하는 파일입니다. 모두 배열에 저장됩니다. pc.php는 각 모듈의 통합 초기화와 URL 구문 분석을 담당하는 프레임워크 시작 엔진입니다.
(3) img 디렉토리
는 스타일 파일, js 파일 및 기타 관련 리소스 파일을 저장하는 데 사용됩니다.
(4) libs 디렉토리
이 디렉토리의 이름은 libs 디렉토리와 동일하지만 하지만 MVC의 3개 계층에 해당하는 비즈니스 처리 콘텐츠와 조직 확장 디렉터리가 이 디렉터리에 배치되어 있음을 알 수 있습니다. 컨트롤러는 컨트롤러를 배치하고, 모델은 모델을 배치하고, 뷰는 뷰 처리 클래스를 배치합니다.
(5) tpl 디렉터리
이 디렉터리에는 프런트엔드 표시를 위한 일부 템플릿 파일이 저장됩니다. 프런트엔드와 백엔드에 템플릿 파일을 저장하기 위해 admin과 index라는 두 개의 디렉터리를 배치한 것을 볼 수 있습니다. 각기.
(6) admin.php 및 index.php
일반적으로 MVC 아키텍처를 사용할 때 단일 입력 모드가 사용되며, 이 두 파일은 프레임워크를 시작하기 위한 단일 입력 모드의 입력 파일입니다.
(7) config.php
기본적으로 모든 프레임워크에서 사용 가능하며, 구성 파일에는 데이터베이스 구성, 스마트 엔진 구성, 일부 정적 변수 정의 등이 포함됩니다.
이 모든 구조는 마이크로 프레임워크의 기본 구조일 뿐입니다. 실제로 복잡한 프레임워크에는 많은 확장 기능과 외부 플러그인이 있으며 이에 따라 이 디렉토리 구조를 조정할 수 있습니다.
3. 프레임워크의 핵심 포인트
(1) 컨트롤러의 동적 호출
단일 입력 모드의 일반적인 URL은 아마도 index.php?controller=controller&method=method와 유사할 것입니다. get 메소드를 통해 얻은 컨트롤러와 메소드 이름 뒤에는 다음과 같은 방법으로 동적 초기화를 수행할 수 있습니다.
function C($name,$method){ require_once('/libs/Controller/'.$name.'Controller.class.php'); eval('$obj=new '.$name.'Controller();$obj->'.$method.'();'); } function M($name){ require_once('/libs/Model/'.$name.'Model.class.php'); eval('$obj=new '.$name.'Model();'); return $obj; } function V($name){ require_once('/libs/View/'.$name.'View.class.php'); eval('$obj=new '.$name.'View();'); return $obj; }
(2) 네이티브 메소드 변환
smarty에 익숙한 친구들은 smarty에 두 가지 메소드가 있다는 것을 알아야 합니다. , 할당 및 디스패치를 각각 템플릿 파일에 등록하는 데 사용되지만 여러 변수를 동시에 등록하면 코드가 매우 복잡해지기 때문에 이 두 가지 방법을 변환해 봅니다
public static function assign($data){ foreach ($data as $key => $value) { self::$view->assign($key,$value); } } public static function display($template){ self::$view->display($template); }
배열을 직접 등록할 수 있도록 할당 메서드를 중복 쓰기로 만들어 후속 코드의 양을 줄입니다. 다른 외부 라이브러리를 도입하려는 경우 이 메서드를 사용하여 기본 함수를 더 적용 가능하게 만들 수도 있습니다. .
(3) 로직이 포함된 파일
이 프레임워크의 시작 파일은 pc.php이므로 기본적으로 pc.php를 포함하여 전체 프레임워크에 필요한 파일이 포함되어 있습니다. 먼저 항목 파일 index 를 살펴보세요. PHP 내용.
header("Content-type:text/html;charset=utf-8"); date_default_timezone_set('Asia/Shanghai'); require_once('config.php'); require_once('framework/pc.php'); PC::run($config)
는 매우 간단합니다. 여기에는 구성 파일과 프레임워크 시작 엔진 pc.php가 포함되어 있으며, 실행 메소드를 호출하여 프레임워크를 시작합니다. 그런 다음 pc.php
$currentdir=dirname(__FILE__); include_once($currentdir.'/include.list.php'); foreach ($paths as $path) { include_once($currentdir.'/'.$path); } /** * 完成一系列的初始化和调用控制器 */ class PC { public static $controller; public static $method; private static $config; private static function init_db(){ DB::init('mysql',self::$config['dbconfig']); } private static function init_view(){ VIEW::init('Smarty',self::$config['viewconfig']); } private static function init_controller(){ self::$controller=isset($_GET['controller'])?daddslashes($_GET['controller']):'index'; } private static function init_method(){ self::$method=isset($_GET['method'])?daddslashes($_GET['method']):'index'; } public static function run($config){ self::$config = $config; self::init_db(); self::init_view(); self::init_controller(); self::init_method(); C(self::$controller,self::$method); } }foreach 탐색에는 include.list.php의 모든 파일이 포함되어 있으며 자동 포함을 위해 컨트롤러와 해당 메서드를 C 클래스에 전달합니다. include.list.php에 무엇이 포함되어 있는지 다시 한 번 살펴보세요
$paths=$arrayName = array( 'function/function.php', 'libs/core/DB.class.php', 'libs/core/VIEW.class.php', 'db/mysql.class.php', 'view/Smarty/Smarty.class.php' );
这里面存储了一个数组,包含了咱们的两个工厂类、数据库操作类、外部引擎类、核心function类。
至此,可以梳理一下整个框架对一个url请求的处理流程:
(4)业务分离
mvc的核心就在于各层之间的严格分离,但Controller层和Model经常容易被混淆在一起,这样会导致mvc架构失去原有的意义,我们需要清楚,控制层只实现简单的控制和逻辑处理,不涉及到具体的业务和数据交互,所有的具体操作都应放到Model层。另外,这两层中的类名和文件名也应保持一致。
(5)方法控制
我们在通过url的形式调用控制器及方法时,某些方法是不想被外部调用到的,比如登录检查函数,这个时候我们可以通过将函数定义为私有函数的方式避免其直接被通过url的形式调用到,来防止风险的发生。
(6)扩展性设计
一个框架应该具备好的扩展性,尤其对于新外部库引入,应该能很容易通过简单修改就可以使用,因此应该将配置项单独分离存储。
三、总结
该框架基本设计就是这个样子,很简单,但基本实现了mvc架构,虽然和市面上的成熟框架相差很多,但重写一遍对于mvc的架构理解会更加深入,加之如今越来越多的网站都采用的这种单入口mvc架构,对于这类网站的渗透更需要很好的理解。
1. 프레임워크 전체 분석
프레임워크를 구현하기 전에 프레임워크가 어떤 효과를 달성해야 하는지를 이해해야 합니다. 전통적인 프레임워크의 개념에 따르면 다음과 같은 사항을 대략적으로 요약할 수 있습니다.
1. 구현 MVC 아키텍처는 컨트롤, 로직 및 뷰 레이어를 분리합니다.
2. 다양한 기능과 기능 모듈을 캡슐화하여 한 곳에서 작성하고 여러 곳에서 호출할 수 있도록 하여 코드 중복을 줄입니다.
3. 확장이 용이하며 외부 확장 라이브러리를 쉽게 도입하여 자체 프레임워크를 향상할 수 있습니다.
4. 디자인 패턴을 선택하고 다양한 엔진 모듈을 캡슐화하거나 작성합니다.
기본 프레임워크 요구 사항은 대략 다음과 같습니다. 아키텍처 설계에는 해결해야 할 문제가 많이 있습니다.
2. 프레임워크 디자인 프로세스
1. 프레임워크 디렉토리
이것은 실제로 매우 중요한 단계이며, 선택에 따라 최종 디렉토리 구조는 기본 3가지를 충족하는 것 외에도 매우 달라집니다. 레이어 또한 확장 라이브러리, 프런트엔드 파일, 템플릿, 리소스 파일 등도 디렉터리에 배치해야 나중에 호출하기 편리한지 여부를 결정합니다. 여기서는 smaty 엔진을 뷰 엔진으로 사용했습니다. 프레임워크 디자인은 대략 다음과 같습니다.
이 그림은 2단계 디렉터리의 구조를 보여줍니다. 더 자세한 디렉터리는 하나씩 표시되지 않습니다. 제한된 사진 표시로 인해 각 디렉토리와 주요 파일의 기능은 나중에 하나씩 설명하겠습니다.
2. 디렉터리 소개
(1) 데이터 디렉터리
위 그림에서 디렉터리 구조를 볼 수 있는데, smarty 엔진을 사용하기 때문에 버퍼 디렉터리와 캐시 디렉터리를 구성해야 합니다. 이것이 바로 데이터 디렉토리의 역할입니다.
(2) 프레임워크 디렉터리
이 디렉터리는 우리 프레임워크의 핵심이며, db 디렉터리에는 데이터베이스 운영 함수 라이브러리가 포함되어 있습니다. 함수 디렉토리에 function.php 파일이 있습니다. 이 파일의 주요 기능은 M('do') 모드의 각 레이어에서 메서드 호출을 빠르게 인스턴스화하는 것입니다. libs 디렉토리에는 데이터베이스 작업 클래스 및 보기 작업 클래스와 같은 프레임워크의 핵심 팩토리 클래스 파일이 배치되어 외부 파일이 DB::funtion()과 같은 방식으로 메소드를 호출할 수 있도록 합니다. View는 스마트한 뷰 엔진을 배치합니다. include.list.php는 프레임워크를 호출할 때 포함해야 하는 파일입니다. 모두 배열에 저장됩니다. pc.php는 각 모듈의 통합 초기화와 URL 구문 분석을 담당하는 프레임워크 시작 엔진입니다.
(3) img 디렉토리
는 스타일 파일, js 파일 및 기타 관련 리소스 파일을 저장하는 데 사용됩니다.
(4) libs 디렉토리
이 디렉토리의 이름은 libs 디렉토리와 동일하지만 하지만 MVC의 3개 계층에 해당하는 비즈니스 처리 콘텐츠와 조직 확장 디렉터리가 이 디렉터리에 배치되어 있음을 알 수 있습니다. 컨트롤러는 컨트롤러를 배치하고, 모델은 모델을 배치하고, 뷰는 뷰 처리 클래스를 배치합니다.
(5) tpl 디렉터리
이 디렉터리에는 프런트엔드 표시를 위한 일부 템플릿 파일이 저장됩니다. 프런트엔드와 백엔드에 템플릿 파일을 저장하기 위해 admin과 index라는 두 개의 디렉터리를 배치한 것을 볼 수 있습니다. 각기.
(6) admin.php 및 index.php
일반적으로 MVC 아키텍처를 사용할 때 단일 입력 모드가 사용되며, 이 두 파일은 프레임워크를 시작하기 위한 단일 입력 모드의 입력 파일입니다.
(7) config.php
기본적으로 모든 프레임워크에서 사용 가능하며, 구성 파일에는 데이터베이스 구성, 스마트 엔진 구성, 일부 정적 변수 정의 등이 포함됩니다.
이 모든 구조는 마이크로 프레임워크의 기본 구조일 뿐입니다. 실제로 복잡한 프레임워크에는 많은 확장 기능과 외부 플러그인이 있으며 이에 따라 이 디렉토리 구조를 조정할 수 있습니다.
3. 프레임워크의 핵심 포인트
(1) 컨트롤러의 동적 호출
단일 입력 모드의 일반적인 URL은 아마도 index.php?controller=controller&method=method와 유사할 것입니다. get 메소드를 통해 얻은 컨트롤러와 메소드 이름 뒤에는 다음과 같은 방법으로 동적 초기화를 수행할 수 있습니다.
function C($name,$method){ require_once('/libs/Controller/'.$name.'Controller.class.php'); eval('$obj=new '.$name.'Controller();$obj->'.$method.'();'); } function M($name){ require_once('/libs/Model/'.$name.'Model.class.php'); eval('$obj=new '.$name.'Model();'); return $obj; } function V($name){ require_once('/libs/View/'.$name.'View.class.php'); eval('$obj=new '.$name.'View();'); return $obj; }
(2) 네이티브 메소드 변환
smarty에 익숙한 친구들은 smarty에 두 가지 메소드가 있다는 것을 알아야 합니다. , 할당 및 디스패치를 각각 템플릿 파일에 등록하는 데 사용되지만 여러 변수를 동시에 등록하면 코드가 매우 복잡해지기 때문에 이 두 가지 방법을 변환해 봅니다
public static function assign($data){ foreach ($data as $key => $value) { self::$view->assign($key,$value); } } public static function display($template){ self::$view->display($template); }
배열을 직접 등록할 수 있도록 할당 메서드를 중복 쓰기로 만들어 후속 코드의 양을 줄입니다. 다른 외부 라이브러리를 도입하려는 경우 이 메서드를 사용하여 기본 함수를 더 적용 가능하게 만들 수도 있습니다. .
(3) 로직이 포함된 파일
이 프레임워크의 시작 파일은 pc.php이므로 기본적으로 pc.php를 포함하여 전체 프레임워크에 필요한 파일이 포함되어 있습니다. 먼저 항목 파일 index 를 살펴보세요. PHP 내용.
header("Content-type:text/html;charset=utf-8"); date_default_timezone_set('Asia/Shanghai'); require_once('config.php'); require_once('framework/pc.php'); PC::run($config)
는 매우 간단합니다. 여기에는 구성 파일과 프레임워크 시작 엔진 pc.php가 포함되어 있으며, 실행 메소드를 호출하여 프레임워크를 시작합니다. 그런 다음 pc.php
$currentdir=dirname(__FILE__); include_once($currentdir.'/include.list.php'); foreach ($paths as $path) { include_once($currentdir.'/'.$path); } /** * 完成一系列的初始化和调用控制器 */ class PC { public static $controller; public static $method; private static $config; private static function init_db(){ DB::init('mysql',self::$config['dbconfig']); } private static function init_view(){ VIEW::init('Smarty',self::$config['viewconfig']); } private static function init_controller(){ self::$controller=isset($_GET['controller'])?daddslashes($_GET['controller']):'index'; } private static function init_method(){ self::$method=isset($_GET['method'])?daddslashes($_GET['method']):'index'; } public static function run($config){ self::$config = $config; self::init_db(); self::init_view(); self::init_controller(); self::init_method(); C(self::$controller,self::$method); } }foreach 탐색에는 include.list.php의 모든 파일이 포함되어 있으며 자동 포함을 위해 컨트롤러와 해당 메서드를 C 클래스에 전달합니다. include.list.php에 무엇이 포함되어 있는지 다시 한 번 살펴보세요
$paths=$arrayName = array( 'function/function.php', 'libs/core/DB.class.php', 'libs/core/VIEW.class.php', 'db/mysql.class.php', 'view/Smarty/Smarty.class.php' );
这里面存储了一个数组,包含了咱们的两个工厂类、数据库操作类、外部引擎类、核心function类。
至此,可以梳理一下整个框架对一个url请求的处理流程:
(4)业务分离
mvc的核心就在于各层之间的严格分离,但Controller层和Model经常容易被混淆在一起,这样会导致mvc架构失去原有的意义,我们需要清楚,控制层只实现简单的控制和逻辑处理,不涉及到具体的业务和数据交互,所有的具体操作都应放到Model层。另外,这两层中的类名和文件名也应保持一致。
(5)方法控制
我们在通过url的形式调用控制器及方法时,某些方法是不想被外部调用到的,比如登录检查函数,这个时候我们可以通过将函数定义为私有函数的方式避免其直接被通过url的形式调用到,来防止风险的发生。
(6)扩展性设计
一个框架应该具备好的扩展性,尤其对于新外部库引入,应该能很容易通过简单修改就可以使用,因此应该将配置项单独分离存储。
3. 요약
프레임워크의 기본 디자인은 매우 간단하지만 기본적으로 MVC 아키텍처를 구현합니다. 비록 시장에 나와 있는 성숙한 프레임워크와는 매우 다르지만 다시 작성하면 됩니다. MVC 아키텍처에 대한 더 깊은 이해 또한 오늘날 점점 더 많은 웹사이트가 이 단일 항목 MVC 아키텍처를 채택하고 있으며 이러한 웹사이트의 침투에는 충분한 이해가 필요합니다.
더 많은 PHP 마이크로 프레임워크 디자인 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!