博客列表 >composer使用相关&mvc实现原理--2019年10月31日

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

缘的博客
缘的博客原创
2019年11月04日 12:44:32642浏览

0x01    composer使用相关

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

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

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

image.png

    下载完,双击开始安装

    image.png

    选择安装路径

    image.png

    选择要绑定的php版本

    image.png

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

    最后打开cmd命令行,输入

composer -v

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

    image.png

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

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

    image.png

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

    image.png

    image.png

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

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 里可以自定义规则来实现伪静态(但有个问题,他可能会存在文件解析漏洞)

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议