欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

composer使用相关&mvc实现原理--2019年10月31日

程序员文章站 2022-03-11 14:16:13
...

0x01    composer使用相关

    composer 官方网址: https://www.phpcomposer.com/

    注意:在composer下载的内容会自动适配你绑定的php版本,也就是说,如果你的php版本不够高将有可能无法下载某些应用

    打开网址,找到相应的下载点点击即可下载:

composer使用相关&mvc实现原理--2019年10月31日

    下载完,双击开始安装

    composer使用相关&mvc实现原理--2019年10月31日

    选择安装路径

    composer使用相关&mvc实现原理--2019年10月31日

    选择要绑定的php版本

    composer使用相关&mvc实现原理--2019年10月31日

    然后一路next,等待安装完成

    最后打开cmd命令行,输入

composer -v

    出现以下界面即表示安装完成

    composer使用相关&mvc实现原理--2019年10月31日

    由于composer默认的访问源在国外,我们可以通过设置镜像来提高下载速度:https://developer.aliyun.com/composer

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

    composer使用相关&mvc实现原理--2019年10月31日

    然后我们可以点击composer官网首页的安装包列表,在搜索框中输入你所需要的应用,并将相应的命令复制到cmd命令行执行即可

    composer使用相关&mvc实现原理--2019年10月31日

    composer使用相关&mvc实现原理--2019年10月31日

    这里是默认安装相应版本,如果你想要自定义,可以在最后加上相应命令(使用时去掉括号)

composer create-project laravel/laravel (文件夹名称) (下载的版本,例如:5.8.*)



    0x02    MVC实现原理

        简单来说就是:通过获取url地址中所请求的资源名称,对相应的处理文件进行引入。例如,请求http://demo.com/index,当我们收到这个请求时,我们就可以去加载相应目录下的index.blade.php(假设相应的处理文件是这个名字)文件来相应这个请求。

        直接来看核心代码:

    index.php

<?php
//路由解析
$server = $_SERVER;
//脚本名称
$script_name = $_SERVER['SCRIPT_NAME'];
//从客户端发送来的原生请求URI,包括参数
$request_uri = $_SERVER['REQUEST_URI'];
//服务器状态中的一个参数,可用来找寻相应的控制器并执行相应的方法
//$path_info = $_SERVER['PATH_INFO'];

//实现伪静态的处理
//str_replace把字符串 $request_uri 中的字符 $script_name 替换为 ''
$path_info = str_replace($script_name, '', $request_uri);

/*假设访问   
$script_name = /index.php
$request_uri = /index.php/home/index
$path_info = /home/index 
*/

//ltrim() 函数移除字符串左侧的空白字符或其他预定义字符。
$path = ltrim($path_info, '/');
//解析控制器和方法
//以特定字符分割字符串,并返回一个数组
$controller_method = explode('/', $path);
//控制器一般要首字母大写,但浏览器数据一般是小写,所以要进行转化
//注意要进行异常控制(这里没做)
$controller_method[0] = ucfirst($controller_method[0]);
//然后根据控制器名称加载相应的php文件
require_once __DIR__ . '/Controllers/' . $controller_method[0] . '.blade.php';

//实例化相应的类
$controller = $controller_method[0];
$method = $controller_method[1];
$res = (new $controller)->$method();

echo '<pre>';
print_r($res);

    Home.blade.php

<?php
class Home{    
    public function index()    
    {        
        echo 'hello mvc';    
    }
     public function welcome()    
    {       
         require_once __DIR__ . '/../Views/welcome.php';    
     }
 }

      下面是实现伪静态的文件:

    .htaccess

<IfModule mod_rewrite.c>  
Options +FollowSymlinks -Multiviews  
RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d  
  RewriteCond %{REQUEST_FILENAME} !-f  
  RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
</IfModule>

    RewriteEngine On 表示开启url重写功能

    RewriteCond 后面的是条件

    RewriteRule 后面的是要执行的操作

    这一部分可以理解为:

if(%{REQUEST_FILENAME} !-d && %{REQUEST_FILENAME} !-f)
    ^(.*)$ index.php [L,E=PATH_INFO:$1]
    
//其中%{REQUEST_FILENAME}等同于$_SERVER['REQUEST_FILENAME']
//判断表示:如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写),如果目录存在就直接访问目录不进行RewriteRule;如果都不存在就执行RewriteRule

    例如:我们直接访问 http://mvc.com/home/welcome ,它会进行判断,发现不存在这个路径及文件,那么就会去执行RewriteRule,进到index.php中去

    然后在index.php中再进行相应的引入,此时index.php相当于一个中转站(路由)


0x03    总结

    1.    在实现mvc的过程中,最重要的对象就是服务器返回的超全局变量$_SERVER,最核心的思想是文件引用。简单说就是:根据$_SERVER数组中的元素的值来引用相关文件

    2.    .htaccess 里可以自定义规则来实现伪静态(但有个问题,他可能会存在文件解析漏洞)