如何使用PHP编写器

时间:2018-01-08 21:00:18

标签: php configuration composer-php

我想提供一个可以使用PHP的包管理器composer安装的脚本,该脚本必须是可配置的。

使用作曲家,我们可以轻松定义vendor binaries

但是,我认为没有任何可能的配置。

可以在包中包含配置文件。但是,供应商目录的名称和位置是可配置的,因此这将不是非常可靠。

为了进行比较:使用Python的包管理器pip,我们可以使用环境变量进行配置。我们可以在激活虚拟环境的同时设置环境变量,例如使用virtualenvwrapper等工具。

在PHP社区中必须至少进行类似方法的实验。

附录:背后的故事

我有脚本可以为网站的测试版本同步数据库和用户生成的文件。

对于 Django 网站,我总是使用相同的脚本,它们依赖于我使用virtualenvwrapper定义的环境变量。

对于 Drupal 网站,人们可以通过匆忙获得很多。

但是对于 Wordpress ,我找不到一个简单而干净的工具。它应该

  • 住在公众可用的文件夹之外
  • 可以使用composer进行安装,最终可以与其他通用PHP工具结合使用
  • 使用简单而强大的方法来检测设置。

老实说,我错过了PHP中的 virtualenvwrapper 。 virtualenvwrapper是一个linux脚本,它基本上做了两件事:

  1. 它激活了一个Python虚拟环境。转换为PHP意味着后面的所有内容都使用某个作曲家包的自动加载器。
  2. 在激活或停用虚拟环境时执行脚本。在那里,人们可以定义环境变量,做任何其他有用的事情。

5 个答案:

答案 0 :(得分:3)

我不确定你想要达到的目标,但是如果你想在Php中使用env变种,有很多选择。

https://github.com/symfony/dotenv就是其中之一,维护得很好。

<?php
use Symfony\Component\Dotenv\Dotenv;

$dotenv = new Dotenv();
$dotenv->load(__DIR__.'/path/to/.env');

然后,您可以按照所需的方式使用这些env var进行配置。例如。对于DB配置:

$someSettings = [
    // Db config
    DB_CONNECTION => [
        'host' => getenv('DB_HOST'),
        'username' => getenv('DB_USERNAME'),
        'password' => getenv('DB_PASSWORD'),
        'database' => getenv('DB_DATABASE')
    ]
];

答案 1 :(得分:3)

您可以添加post-package-install脚本。有了它,您可以使用symfony / console之类的东西来允许安装程序进行某种配置。

答案 2 :(得分:2)

使用作曲家,你可以做类似的事情(PATH是你的环境变量):

{
    "name": "test/test",
    "authors": [
        {
            "name": "Test",
            "email": "test@email.com"
        }
    ],
    "require": {

    },
    "scripts": {
        "post-install-cmd": [
            "@echoPath"
        ],
        "post-update-cmd": [
            "@echoPath"
        ],
        "echoPath": "echo $PATH"
    }
}

不确定这是否是你想要的。

答案 3 :(得分:1)

与其他用户一样,我不确定你的最终目标是什么,但你似乎已经概述的内容似乎打破了使用作曲家的重点,作曲家的整个观点是该代码适用于任何应用程序和放大器;安装时获得所需的依赖项。

对于您尝试为&#34;配置设置创建设置&#34;通常通过设置使用App必须创建的配置界面来实现,并为您的类/创建的对象提供初始化。

例如,你的作曲家lib需要一个登录系统,现在很可能是它正在使用/安装的应用程序已经拥有一个登录系统。没有开发人员想要在他们的数据库中为单个应用程序创建两个不同的登录表,因此您应该创建开发人员应用程序可以实现的界面并提供所需的配置

代码示例:

要做某事的示例类(您的库入口类)

<?php
namespace my_namespace;

class DoSomething{
    private $config;

    public function __construct(\my_namespace\interface\Config $config)
    {
        $this->config = $config;
    }

    function doLogin()
    {
        // get $username and $password
        $state = $this->config->CheckUserLogin($username, $password);
        if(!is_bool($state)){ throw new Exception("State of CheckUserLogin from class '".get_class($this->config)."' is incorrect expected boolean but '".gettype($state)."' was provided"); }
    }

}

示例配置界面:(您的作曲家的库配置界面)

<?php
namespace my_namespace\interface;

interface Config{

    public function CheckUserLogin($username, $password);

    //....

}

这意味着我可以通过编辑器和设置安装你的库。

示例我的应用程序库的配置:(使用应用程序必须构建的类继承您的界面)

<?php
namespace myapp;

class DoSomethingConfig implementes \my_namespace\interface\Config{
    public function CheckUserLogin($username, $password)
    {
        // do my login system ($loginState)
        return $loginState;
    }
}

我的库初始化示例:(任何应用程序必须使用的代码)

<?php
namespace myapp;

class ConnectToSomething{
    private $lib;

    public function __construct(){
        $config = new \myapp\DoSomethingConfig();
        $this->lib = new \my_namespace\DoSomething($config);
    }

}

通过这种方式,您可以让开发人员免费使用您的代码库。虽然他们永远不想编辑你的课程,因为你做了一些会导致重复信息的事情。

这是一个简单的示例,突出了我试图让我们尝试运行配置脚本以让用户为您的库设置内容,让他们设置所需内容的重点。然后,他们可以管理您的代码与其之间的连接点,这也提供了安全性,因为他们知道您不应该访问不应该访问的信息并将其发送到您的服务器。

因为它们为您的代码提供了工作所需的访问权限,而不是其他任何内容。

答案 4 :(得分:1)

我认为,您正在寻找的东西可能类似于图书馆https://packagist.org/packages/hiqdev/composer-config-plugin

这是一个非常受欢迎的图书馆,并且由Yii / 2框架Samdark https://packagist.org/users/samdark/的创建者/贡献者管理 或资产包装专家hiqdev的创建者 https://packagist.org/users/hiqdev/

This Composer plugin provides assembling of configurations distributed with composer packages. It allows putting configuration needed to use a package right inside of the package thus implementing a plugin system. The package becomes a plugin holding both the code and its configuration.

用法:

"extra": {
    "config-plugin-output-dir": "path/relative-to-composer-json",
    "config-plugin": {
        "params": [
            "config/params.php",
            "?config/params-local.php"
        ],
        "common": "config/common.php",
        "web": [
            "$common",
            "config/web.php"
        ],
        "other": "config/other.php"
    }
},