wpshop/container

v2.1 2023-11-07 10:15 UTC

This package is auto-updated.

Last update: 2024-09-07 12:20:02 UTC


README

假设你的文件结构如下(针对主题)

core
  |- init-container.php
  |- config.php
src
  |- AssetsProvider.php
  |- Maintanance.php
  |- Options.php
  |- functions.php
.phpstorm.meta.php
composer.json
functions.php
readme.txt
style.css

... (other theme files)

composer.json 示例

{
  "name": "your-vendor/your-theme-name",
  "type": "project",
  "autoload": {
    "psr-4": {
      "YourVendor\\YourProduct\\": "src/"
    }
  },
  "require": {
    "php": ">=7.2",
    "wpshop/container": "^1.1 || ^2.1"
  }
}

在文件 src/functions.php 中创建特定函数

<?php

namespace YourVendor\YourProduct;

use WPShop\Container\Psr11\Container;

/**
 * @return Container
 */
function theme_container() 
{
    static $container;
    if (!$container) {
        $init = require_once dirname(__DIR__) . '/core/init-container.php';
        $config = require_once dirname(__DIR__) . '/core/config.php';
        $container = new Container($init($config));
    }
    return $container;
}

init-container.php 内容

<?php

use WPShop\Container;
use YourVendor\YourProduct\Maintanance;
use YourVendor\YourProduct\Options;

return function ($config) {
    $container = new Container\ServiceRegistry([
        AssetsProvider::class => function($c) {
            return new AssetsProvider($c[Maintanance::class]);
        },
        Maintanance::class => function($c) {
            return new Maintanance($c[Options::class]);
        },
        Options::class => function () use ($config) {
            return new Options($config);
        }
    ]);
    
    do_action('your_vendor/your_product/init_container', $container);
    
    return $container;
}

用于自动提示的 .phpstorm.meta.php 内容

<?php
/**
 * @see https://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata
 */

namespace PHPSTORM_META {
	override( \Psr\Container\ContainerInterface::get( 0 ), map( [

	] ) );
}

之后,你可以在项目的任何地方使用容器,例如在主主题文件 functions.php

<?php

use YourVendor\YourProduct\AssetsProvider;
use function YourVendor\YourProduct\theme_container;

require __DIR__ . '/vendor/autoload.php';

theme_container()->get(AssetsProvider::class)->init();
theme_container()->get(Maintanance::class)->init();