소스 검색

first commit

chenlong 4 년 전
커밋
1c74f0ff3e
18개의 변경된 파일367개의 추가작업 그리고 0개의 파일을 삭제
  1. 8 0
      .idea/.gitignore
  2. 8 0
      .idea/chuck-php-mvc.iml
  3. 8 0
      .idea/modules.xml
  4. 26 0
      App/Controller/Home.php
  5. 0 0
      Configs/App.php
  6. 0 0
      Configs/Database.php
  7. 49 0
      Core/Application.php
  8. 49 0
      Core/Config.php
  9. 27 0
      Core/Controller.php
  10. 77 0
      Core/Ioc.php
  11. 18 0
      Core/Loader.php
  12. 11 0
      Core/Model.php
  13. 19 0
      Core/Request.php
  14. 4 0
      Helper/Helper.php
  15. 1 0
      README.md
  16. 18 0
      docker-compose.yml
  17. 23 0
      docker/nginx/conf/conf.d/cuspsr.conf
  18. 21 0
      index.php

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 数据源本地存储已忽略文件
+/dataSources/
+/dataSources.local.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/

+ 8 - 0
.idea/chuck-php-mvc.iml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/chuck-php-mvc.iml" filepath="$PROJECT_DIR$/.idea/chuck-php-mvc.iml" />
+    </modules>
+  </component>
+</project>

+ 26 - 0
App/Controller/Home.php

@@ -0,0 +1,26 @@
+<?php
+namespace App\Controller;
+
+use Core\Controller;
+use Core\Request;
+
+class Home extends Controller
+{
+    protected $request;
+
+    public function __construct(Request $request) {
+        $this->request = $request;
+    }
+
+    public function index()
+    {
+
+    }
+
+    /**
+     * 并发文件操作
+     */
+    function flock(){
+
+    }
+}

+ 0 - 0
Configs/App.php


+ 0 - 0
Configs/Database.php


+ 49 - 0
Core/Application.php

@@ -0,0 +1,49 @@
+<?php
+namespace Core;
+
+class Application
+{
+    public $base_dir;
+    protected static $instance;
+
+    public $config;
+
+    protected function __construct($base_dir)
+    {
+        $this->base_dir = $base_dir;
+        $this->config = new Config($base_dir.'/Configs');
+    }
+
+    static function getInstance($base_dir = '')
+    {
+        if (empty(self::$instance))
+        {
+            self::$instance = new self($base_dir);
+        }
+        return self::$instance;
+    }
+
+    function dispatch()
+    {
+        $requestUri = trim($_SERVER['REQUEST_URI'],'/');
+        list($uri,$params) = explode('?',$requestUri);
+        list($c, $m) = explode('/', $uri);
+
+//        $request = new \Core\Request();
+//
+//        if($params){
+//            $paramsArr = explode('&',$params);
+//            foreach($paramsArr as $v){
+//                $varr = explode('=',$v);
+//                $request->setInput($varr[0],$varr[1]);
+//            }
+//        }
+
+//        if($c == 'api'){
+//
+//        }
+        $c = ucwords($c);
+        $class = '\\App\\Controller\\'.$c;
+        \Core\Ioc::getInstance($class)->$m();
+    }
+}

+ 49 - 0
Core/Config.php

@@ -0,0 +1,49 @@
+<?php
+namespace Core;
+/**
+ * 配置文件的加载 基于ArrayAccess
+ * 可以让对象像数组一样进行访问
+ * Class Config
+ * @package IMooc
+ */
+class Config implements \ArrayAccess
+{
+    protected $path;
+    protected $configs = array();
+
+    function __construct($path)
+    {
+        $this->path = $path;
+    }
+
+    /**
+     * 获取配置
+     * @param mixed $key
+     * @return mixed
+     */
+    function offsetGet($key)
+    {
+        if (empty($this->configs[$key]))
+        {
+            $file_path = $this->path.'/'.$key.'.php';
+            $config = require $file_path;
+            $this->configs[$key] = $config;
+        }
+        return $this->configs[$key];
+    }
+
+    function offsetSet($key, $value)
+    {
+        throw new \Exception("cannot write config file.");
+    }
+
+    function offsetExists($key)
+    {
+        return isset($this->configs[$key]);
+    }
+
+    function offsetUnset($key)
+    {
+        unset($this->configs[$key]);
+    }
+}

+ 27 - 0
Core/Controller.php

@@ -0,0 +1,27 @@
+<?php
+namespace Core;
+
+abstract class Controller
+{
+    protected $data;
+    protected $controller_name;
+    protected $view_name;
+    protected $template_dir;
+
+    function assign($key, $value)
+    {
+        $this->data[$key] = $value;
+    }
+
+    function display($file = '')
+    {
+        $this->template_dir = Application::getInstance()->base_dir.'/Views';
+        if (empty($file))
+        {
+            $file = strtolower($this->controller_name).'/'.$this->view_name.'.php';
+        }
+        $path = $this->template_dir.'/'.$file;
+        extract($this->data);
+        include $path;
+    }
+}

+ 77 - 0
Core/Ioc.php

@@ -0,0 +1,77 @@
+<?php
+namespace Core;
+/**
+ * 工具类,使用该类来实现自动依赖注入。
+ */
+class Ioc {
+    /**
+     * 获得类的对象实例
+     * @param $className
+     * @return mixed
+     */
+    public static function getInstance($className) {
+
+        $paramArr = self::getMethodParams($className);
+
+        return (new \ReflectionClass($className))->newInstanceArgs($paramArr);
+    }
+
+    /**
+     * 执行类的方法
+     * @param  [type] $className  [类名]
+     * @param  [type] $methodName [方法名称]
+     * @param  [type] $params     [额外的参数]
+     * @return [type]             [description]
+     */
+    public static function make($className, $methodName, $params = []) {
+
+        // 获取类的实例
+        $instance = self::getInstance($className);
+
+        // 获取该方法所需要依赖注入的参数
+        $paramArr = self::getMethodParams($className, $methodName);
+
+        return $instance->{$methodName}(...array_merge($paramArr, $params));
+    }
+
+    /**
+     * 获得类的方法参数,只获得有类型的参数
+     * @param  [type] $className   [description]
+     * @param  [type] $methodsName [description]
+     * @return [type]              [description]
+     */
+    protected static function getMethodParams($className, $methodsName = '__construct') {
+
+        // 通过反射获得该类
+        $class = new \ReflectionClass($className);
+        $paramArr = []; // 记录参数,和参数类型
+
+        // 判断该类是否有构造函数
+        if ($class->hasMethod($methodsName)) {
+            // 获得构造函数
+            $construct = $class->getMethod($methodsName);
+
+            // 判断构造函数是否有参数
+            $params = $construct->getParameters();
+
+            if (count($params) > 0) {
+
+                // 判断参数类型
+                foreach ($params as $key => $param) {
+
+                    if ($paramClass = $param->getClass()) {
+
+                        // 获得参数类型名称
+                        $paramClassName = $paramClass->getName();
+
+                        // 获得参数类型
+                        $args = self::getMethodParams($paramClassName);
+                        $paramArr[] = (new \ReflectionClass($paramClass->getName()))->newInstanceArgs($args);
+                    }
+                }
+            }
+        }
+
+        return $paramArr;
+    }
+}

+ 18 - 0
Core/Loader.php

@@ -0,0 +1,18 @@
+<?php
+namespace Core;
+
+class Loader{
+    /**
+     * @param $class
+     */
+    static function autoload($class)
+    {
+        /**
+         * $class  出来的是反斜杠 App\Controller\Home\Index
+         * 需要转化一下 再包含进来
+         * 所包含的文件需要有命名空间
+         */
+        require BASEDIR.'/'.str_replace('\\','/',$class).'.php';
+    }
+
+}

+ 11 - 0
Core/Model.php

@@ -0,0 +1,11 @@
+<?php
+namespace Core;
+/**
+ * model
+ * Class Model
+ * @package Core
+ */
+class Model
+{
+
+}

+ 19 - 0
Core/Request.php

@@ -0,0 +1,19 @@
+<?php
+namespace Core;
+/**
+ * request请求对象
+ * Class Request
+ * @package Core
+ */
+class Request
+{
+    protected $input = array();
+
+    public function input(){
+        return $this->input;
+    }
+
+    public function setInput($key,$val){
+        $this->input[$key] = $val;
+    }
+}

+ 4 - 0
Helper/Helper.php

@@ -0,0 +1,4 @@
+<?php
+/**
+ * 辅助函数
+ */

+ 1 - 0
README.md

@@ -0,0 +1 @@
+##自定义一个php的mvc框架

+ 18 - 0
docker-compose.yml

@@ -0,0 +1,18 @@
+version: '3'
+services:
+  cuspsr:
+    image: my-php-fpm:2021.3
+    container_name: "cusmvc"
+    volumes:
+      - ./:/www
+
+  cuspsr-nginx:
+    image: library/nginx:latest
+    container_name: "cusmvc-nginx"
+    ports:
+      - 8003:80
+    volumes:
+      - ./:/usr/share/nginx/html
+      - ./docker/nginx/conf/conf.d:/etc/nginx/conf.d
+    depends_on:
+      - cuspsr

+ 23 - 0
docker/nginx/conf/conf.d/cuspsr.conf

@@ -0,0 +1,23 @@
+server {
+    listen       80;
+    server_name  localhost;
+
+    root   /usr/share/nginx/html;
+    index  index.html index.htm index.php;
+
+    location / {
+        try_files $uri $uri/ /index.php?$query_string;
+    }
+
+    error_page   500 502 503 504  /50x.html;
+    location = /50x.html {
+        root   /usr/share/nginx/html;
+    }
+
+    location ~ \.php$ {
+        fastcgi_pass   cusmvc:9000;
+        fastcgi_index  index.php;
+        fastcgi_param  SCRIPT_FILENAME  /www/$fastcgi_script_name;
+        include        fastcgi_params;
+    }
+}

+ 21 - 0
index.php

@@ -0,0 +1,21 @@
+<?php
+/**
+ * 定义根目录常量 /www
+ */
+define('BASEDIR',__DIR__);
+
+/**
+ * 载入自动加载
+ */
+include BASEDIR.'/Core/Loader.php';
+
+/**
+ * 自动载入类 传入方法名
+ * 当实例化或者调用不存在的类时,会回调该方法
+ */
+spl_autoload_register('\\Core\\Loader::autoload');
+
+/**
+ * 执行核心代码
+ */
+Core\Application::getInstance(BASEDIR)->dispatch();