zoukankan      html  css  js  c++  java
  • 使用PSR-4配合composer autoload 自动加载文件夹

     

    require 文件很麻烦,使用PSR-4搭配composer一次加载,终生受用。

    感觉类似java中的import了,自己先记录一下最近理解的。

    用composer管理自己的包吧

    安装composer

    这个不多赘述

    英文版教程

    中文版教程

    PSR-4规范

    PSR-4-autoloader

    构建项目目录

    |-project

    ​ |-src

    ​ |-View.php

    ​ |-app

    ​ |-Tools.php

    |-composer.json

    上面路径的View.php在project/src/View.php 中,其他同理,View 和 Tools 只是为了做演示用的。

    构建composer.json

    打开创建的composer.json文件输入,这里拿monolog做例子。

    {
      "require": {
        "monolog/monolog": "1.2.*"
      }
    }
    

    用composer加载包

    在目录所在的命令行中输入

    #linux全局安装下使用该命令
    composer install
    #windows下使用参考前面的composer教程
    composer.phar install
    

    加载完毕之后你的目录应该是这样的

    |-project

    ​ |-src

    ​ |-View.php

    ​ |-app

    ​ |-Tools.php

    ​ |-vendor

    ​ |-composer/* composer目录下面的文件不在赘述

    ​ |-monolog/* 同理

    ​ |-autoload.php

    |-composer.json

    |-composer.lock

    测试加载的monolog包

    在project目录下创建一个index.php

    #index.php
    <?php
    /**
     * Created by PhpStorm.
     * User: EasyChris<chris@afox.cc>
     * Date: 2017/1/22
     * Time: 10:50
     */
    //引入autoload.php文件
    require_once 'vendor/autoload.php';
    //测试monlog
    $log = new MonologLogger('name');
    $log->pushHandler(new MonologHandlerStreamHandler('app.log', MonologLogger::WARNING));
    $log->addWarning('Foo');
    echo 'success';
    

    在浏览器里面访问该文件地址,通常应该是http://127.0.0.1/project/index.php

    看到页面success之后,然后再查看project文件夹下面是不是多了一个app.log文件。那么恭喜你成功使用了composer加载包,并且使用该加载的包输出了log日志。

    使用PSR-4加载文件

    1.编辑composer.json 配置加载目录和空间名

    编辑刚才的composer.json文件,添加autoload模块。

    {
      "require": {
        "monolog/monolog": "1.2.*"
      },
      "autoload": {
        "psr-4": {
          "Acme\": "src/",
        }
      }
    }
    

    其中Acme\:"src"表示,将Acme这么空间名绑定到/project/src这个目录下

    然后修改project/src/View.php文件

    #View.php
    <?php
    /**
     * Created by PhpStorm.
     * User: EasyChris<chris@afox.cc>
     * Date: 2017/1/22
     * Time: 11:06
     */
    //命名空间为Acme,
    namespace Acme;
    class View
    {
        public static function getView()
        {
            echo "get view";
        }
    }
    

    继续返回修改/project/index.php

    #index.php
    <?php
    /**
     * Created by PhpStorm.
     * User: EasyChris<chris@afox.cc>
     * Date: 2017/1/22
     * Time: 10:50
     */
    require_once 'vendor/autoload.php';
    use AcmeView;
    
    View::getView();
    

    修改完毕之后返回命令行运行

    #使用这个命令会自动生成autoload的文件
    vagrant@easychris:/var/www/public/test$ composer dump-autoload
    Generating autoload files
    

    PS:需要注意一下!

    #生成环境下使用
    composer dump-atoload -o
    #这里的意思是composer dump-autoload --optimize,不是用的话会损失性能。
    

    最后打开http://127.0.0.1/project/index.php如果显示get view 那么,恭喜你配置成功了。

    拓展

    接下来你就可以继续在src目录下面创建比如Tools.php然后不需要做其他require,便可以直接使用了。非常的方便,可以自己尝试一下。

    总结

    查看vender下的autoload.php文件你会看到,他其实是return了一个ComposerAutoloaderInitaa62b39f628dda129dc5b4ebdfb2b2ae::getLoader();

    #autoload.php
    <?php
    
    // autoload.php @generated by Composer
    
    require_once __DIR__ . '/composer/autoload_real.php';
    
    return ComposerAutoloaderInitaa62b39f628dda129dc5b4ebdfb2b2ae::getLoader();
    

    而这个getLoader()方法做了如下几件事

    1.找 ComposerClassLoader 如果不存在就是生成一个实例放在ComposerAutoloaderInitaa62b39f628dda129dc5b4ebdfb2b2ae 中
    2.将 composer cli 生成的各种 autoload_psr4, autoload_classmap, autoload_namespaces(psr-0) 全都注册到 ComposerClassLoader 中。
    3.直接 require 所有在 autoload_files 中的文件

    致谢参考

  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/brady-wang/p/10579949.html
Copyright © 2011-2022 走看看