composer就很少说了,是php的包管理器,和node.js的npm,python的pip差很少
composer里面有自动加载的配置,能够帮助咱们自动加载咱们的类
咱们经过slim来作路由演示php
建立个文件夹,我命名为了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.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下依然会正常显示。
在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也是一种写法,可是没增长一个类都要执行一边composer,以便生成新的autoload_classmap.php文件
好比
"classmap": ["Model/"]
在composer中这样写,
他就会把Model/下的全部类文件根据明名空间加类名一一对应起来
好比你Model中有个User类
他会生成'Model\\User' => $baseDir . '/Model/User.php',
这样的对应,缺点就是每当有新的类文件咱们都须要执行一下composer install生成新的classmap