composer自动加载配置

composer就很少说了,是php的包管理器,和node.js的npm,python的pip差很少
composer里面有自动加载的配置,能够帮助咱们自动加载咱们的类
咱们经过slim来作路由演示php

首先安装slim

建立个文件夹,我命名为了modernroute(这个随便)
而后建立composer.json文件
安装slim,命令行进入文件夹后html

composer require slim/slim "^3.0"

这样的话slim下好了
,在根目建立index.php文件node

<?php

require 'vendor/autoload.php';

$app = new Slim\App();

$app->get('/',function(){
    echo 'is mine';
});

$app->run();

而后命令行python

php -S localhost:8000

让服务跑起来;
若是咱们在slim中建立了路由,但愿由controller中的方法执行,而不是像这样经过匿名函数该怎么样呢?
slim官方文档给了咱们方法
(https://www.slimframework.com/docs/v3/objects/router.html#how-to-create-routes下搜索关键字\HomeController::class)shell

建立相应文件

咱们但愿经过根目录Controller文件夹下的UserCon类中的getUserName方法来处理 '/name'这个路由
修改index.phpnpm

require 'vendor/autoload.php';

$app = new Slim\App();

$app->get('/',function(){
   echo 'is mine';
});

$app->get('/name', \Controller\UserCon::class.':getUserName');

$app->run();

而后再根目录建立Controller文件夹,文件夹下建立UserCon文件
文件夹结构以下json

-  Controller
  -  UserCon.php
-  vendor    
-  index.php
-  composer.json
-  compooser.lock

在UserCon.php里编辑内容浏览器

<?php
namespace Controller;

Class UserCon
{
   public function getUserName()
   {
       echo 'wang';
   }
}

启动服务浏览器输入 localhost:8000/name,发现报错
<div align="center">
<img src="http://ox6ze07ei.bkt.clouddn....; width = "225" height = "425" alt="" align=center />
</div>app

打开错误调试后发现slim找不到\Controller\UserCon这个类
(https://www.slimframework.com/docs/v3/handlers/error.html下搜索displayErrorDetails)composer

composer自动加载

这时候咱们就可使用composer中的自动加载来加载咱们想要的类了。
在咱们在composer.json文件中
加入

{
    "require": {
        "slim/slim": "^3.0"
    },
    "autoload": {
        "psr-4" : {
            "" : ""
        }
    }
}

这里的意思是根据PSR4规范来加载对应的类(PSR0,PSR4均可以,这里用PSR4)
冒号前面是根命名空间,冒号后面是根目录(注意''转义)
由于咱们这里是在\Controller\UserCon下加载根目录下Controller文件下的UserCon类,冒号前面是根命名空间(这里根命名空间就是''),
冒号后面是根目录,因此写成了

"psr-4" : {
            "" : ""
        }

的形式
添加完这段代码后须要用composer重写自动加载(vendor/autoload)
在名命令行中

composer dump-autoload

或者

composer install

再次打开服务,输入localhost:8000/name
会发现服务已经以来了
若是咱们把跟命名空间定义为其余的,好比说Van
咱们但愿Van这个命名空间指向Controller
那么须要在composer中

修改index中'/name'的路由

$app->get('/name', \Van\UserCon::class.':getUserName');

修改Controller目录下的UserCon.php

<?php
namespace Van;

Class UserCon
{
    public function getUserName()
    {
        echo 'wang';
    }
}

这样的话,就是Van这个命名空间指向Controller这个文件夹了
咱们须要将composer.json文件修改成

{
    "require": {
        "slim/slim": "^3.0"
    },
    "autoload": {
        "psr-4": {
            "Van\\": "Controller/"
        }
    }
}

而后从新composer install一下,就能够了,启动服务/name下依然会正常显示。

"files"配置

在composer.json下autoload里,files配置的决定了单独会自动加载进来的文件,不要遵照PSR0和PSR4,通常用来引入公共文件
咱们在composer.json中加入 "files": ["Common/functions.php"]

{
    "require": {
        "slim/slim": "^3.0"
    },
    "autoload": {
        "psr-4": {
            "Van\\": "Controller/"
        },
        "files": ["Common/functions.php"]
    }
}

而后从新install
在根目录中创建Common文件夹,建立functions.php文件
写入

<?php

function getMeFive (){
   echo 'haha~';
}

而后路由中加入

$app->get('/givemefive',function(){
   getMeFive();
});

启动服务访问 localhost:8000/givemefive
页面显示haha~

说明正常,composer帮咱们加载了这个文件

Class-map

Class-map也是一种写法,可是没增长一个类都要执行一边composer,以便生成新的autoload_classmap.php文件
好比

"classmap": ["Model/"]

在composer中这样写,
他就会把Model/下的全部类文件根据明名空间加类名一一对应起来
好比你Model中有个User类
他会生成
'Model\\User' => $baseDir . '/Model/User.php',这样的对应,缺点就是每当有新的类文件咱们都须要执行一下composer install生成新的classmap

相关文章
相关标签/搜索