wpshop / container
PHP 容器
v2.1
2023-11-07 10:15 UTC
Requires
- php: >=7.2.5
- psr/container: ^2.0
Requires (Dev)
- phpunit/phpunit: ^8.5
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();