php组件化开发composer,使用composer自定义开发框架

1. 类加载的三种方式

示例将在frame这个目录下进行,先创建子目录app,在创建app的子目录controller,在controller里面新建文件Controller.php,在frame根目录下创建index1.php

9e80b3433caefa984a59f48ae90e6ea3.png

Controller.php 如下:

namespaceapp\controller;

classController

{

publicstaticfunctionhello()

{

return'方法名是: '.__METHOD__;

}

}

1.1 方式一:requireindex1.php 如下:

require__DIR__."/app/controller/Controller.php";

useapp\controller\Controller;

echoController::hello();

php组件化开发composer,使用composer自定义开发框架_第1张图片

1.2 方式二:注册自动加载器index2.php 如下:

spl_autoload_register(function($class){

$path=str_replace("\\",DIRECTORY_SEPARATOR,$class);

$classFile=__DIR__.DIRECTORY_SEPARATOR.$path.".php";

require$classFile;

});

useapp\controller\Controller;

echoController::hello();

php组件化开发composer,使用composer自定义开发框架_第2张图片

1.3 方式三:使用composer的autoload先生成composer.json,内容为空,就一对花括号{}

执行终端命名 composer install,成功以后会自动生成vendor目录,目录下有个autoload.php

在入口文件中引入autoload.php

修改composer.json的属性

{

"autoload":{

"files":[

"app/controller/Controller.php"

]

}

}

终端执行命名composer dumpautoload

index3.php 如下:

require__DIR__."/vendor/autoload.php";

useapp\controller\Controller;

echoController::hello();

php组件化开发composer,使用composer自定义开发框架_第3张图片

2. autoload 字段的意义

2.1 files 字段:加载任意位置的类文件

接上面的示例,在frame目录下,再创建子目录lib,新建文件Test1.php,如下:

namespacetest;

classTest1

{

publicstaticfunctionshow()

{

return'方法名是: '.__METHOD__;

}

}

修改composer.json,如下:

{

"autoload":{

"files":[

"app/controller/Controller.php",

"lib/Test1.php"

]

}

}

执行终端命名composer dumpautoload

index4.php 如下:

require__DIR__."/vendor/autoload.php";

useapp\controller\Controller;

usetest\Test1;

echoController::hello(),'
';

echoTest1::show();

php组件化开发composer,使用composer自定义开发框架_第4张图片

小结:想要使用某个类,直接在files字段中加入相应的类文件路径即可,修改后记得执行终端命名

2.2 classmap 字段:类映射,实现类的批量注册

接上面示例,如果同目录下有很多的类,每次都去手动引入类文件比较麻烦,而使用classmap ,可以将类文件映射到路径上,同目录下的类文件只需要引入一次即可

示例:在上面示例的lib目录下,再新建文件Test2.php,如下:

namespacetest;

classTest2

{

publicstaticfunctionshow()

{

return'方法名是: '.__METHOD__;

}

}

如果按照files字段,需要在composer.json中再去增加lib/Test2.php,显然这样有点麻烦了,而使用classmap 呢,如下:

{

"autoload":{

"classmap":[

"app/controller",

"lib"

]

}

}

终端执行命名composer dumpautoload

index4.php,如下:

require__DIR__."/vendor/autoload.php";

useapp\controller\Controller;

usetest\Test1;

usetest\Test2;

echoController::hello(),'
';

echoTest1::show(),'
';

echoTest2::show(),'
';

php组件化开发composer,使用composer自定义开发框架_第5张图片

2.3 psr-4字段:将类命名空间与路径绑定

在开发中,类文件一般会满足两个条件:

类的命名空间和当前类文件的路径一致

类名与类文件名一致

这种命名规范可以叫做psr-4规范,而满足这种规范的,一般都会使用psr-4字段来实现映射

修改composer.json,如下:

{

"autoload":{

"psr-4":{

"app\\controller\\":"app/controller",

"test\\":"lib"

}

}

}

php组件化开发composer,使用composer自定义开发框架_第6张图片

3. 自定义框架

本次示例,新建frame2这个根目录,所有文件将存放在这个目录下,使用MVC架构,Model和View使用第三方包,业务逻辑写在Controller中

下载模型包:catfan/medoo,终端输入命令composer require catfan/medoo

下载视图包:league/plates,终端输入命令composer require league/plates

创建自己的框架核心代码,继承第三方包,放入frame2/core目录下

Model.php :

namespacecore;

// 模型类

// 继承第三方包catfan\medoo

useMedoo\Medoo;

classModelextendsMedoo

{

// 连接数据库

publicfunction__construct(){

$options=[

'database_type'=>'mysql',

'database_name'=>'first',

'server'=>'php.edu',

'username'=>'root',

'password'=>'root'

];

parent::__construct($options);

}

}

View.php :

namespacecore;

useLeague\Plates\Engine;

classViewextendsEngine

{

private$templates;

publicfunction__construct($path)

{

$this->templates=parent::__construct($path);

}

}

创建自己的应用,分别放于app/models、app/views、app/controllers目录下

app/models中StudentModel.php :

namespaceapp\models;

usecore\Model;

classStudentModelextendsModel

{

publicfunction__construct(){

parent::__construct();

}

}

app/controllers中StudentController.php :

namespacecontrollers;

classStudentController

{

// 依赖注入

private$model=null;

private$view=null;

publicfunction__construct($model,$view)

{

$this->model=$model;

$this->view=$view;

}

// 用来测试的

publicfunctiontest(){

echo'111';

}

// 查询

publicfunctionselect()

{

// 获取数据

$users=$this->model->select("student",["username","age","tel"],["id[>=]"=>1200,"LIMIT"=>10]);

// return $users;

// 渲染模板(同时进行模板赋值)

return$this->view->render('student/list',['users'=>$users]);

}

}

app/views/student中list.php:

Document

table{

width:500px;

border:1pxsolid black;

border-collapse:collapse;

text-align:center;

margin:auto;

}

th,

td{

border:1pxsolid black;

padding:8px;

}

用户管理

用户名年龄电话操作

=$this->e($user['username'])?>=$this->e($user['age'])?>=$this->e($user['tel'])?>

编辑

删除

你可能感兴趣的:(php组件化开发composer,使用composer自定义开发框架)