Undo the registration of old singletons in the DI container.

The container will in principle be used only to register classes
in the `src` directory.

Also, CustomerProvider class removed.
This commit is contained in:
Nestor Soriano 2020-06-11 09:53:26 +02:00
parent 518c52b829
commit 281ec18158
9 changed files with 56 additions and 162 deletions

View File

@ -8,8 +8,6 @@
* @version 3.4.0
*/
use Automattic\WooCommerce\Tools\DependencyManagement\ObjectContainer;
defined( 'ABSPATH' ) || exit;
/**
@ -21,8 +19,6 @@ class WC_Checkout {
* The single instance of the class.
*
* @var WC_Checkout|null
*
* @deprecated 4.3.0 Use dependency injection instead, see the ObjectContainer class.
*/
protected static $instance = null;
@ -53,23 +49,19 @@ class WC_Checkout {
* @since 2.1
* @static
* @return WC_Checkout Main instance
*
* @deprecated 4.3.0 Use dependency injection instead, see the ObjectContainer class.
*/
public static function instance() {
return self::$instance = ObjectContainer::get_instance_of( __CLASS__ );
}
if ( is_null( self::$instance ) ) {
self::$instance = new self();
/**
* Class constructor, hooks the appropriate actions.
*/
public function __construct() {
// Hook in actions once.
add_action( 'woocommerce_checkout_billing', array( $this, 'checkout_form_billing' ) );
add_action( 'woocommerce_checkout_shipping', array( $this, 'checkout_form_shipping' ) );
add_action( 'woocommerce_checkout_billing', array( self::$instance, 'checkout_form_billing' ) );
add_action( 'woocommerce_checkout_shipping', array( self::$instance, 'checkout_form_shipping' ) );
// woocommerce_checkout_init action is ran once when the class is first constructed.
do_action( 'woocommerce_checkout_init', $this );
do_action( 'woocommerce_checkout_init', self::$instance );
}
return self::$instance;
}
/**

View File

@ -9,7 +9,6 @@
*/
use Automattic\Jetpack\Constants;
use Automattic\WooCommerce\Tools\DependencyManagement\ObjectContainer;
defined( 'ABSPATH' ) || exit;
@ -29,8 +28,6 @@ class WC_Emails {
* The single instance of the class
*
* @var WC_Emails
*
* @deprecated 4.3.0 Use dependency injection instead, see the ObjectContainer class.
*/
protected static $_instance = null;
@ -49,11 +46,12 @@ class WC_Emails {
* @since 2.1
* @static
* @return WC_Emails Main instance
*
* @deprecated 4.3.0 Use dependency injection instead, see the ObjectContainer class.
*/
public static function instance() {
return self::$_instance = ObjectContainer::get_instance_of( __CLASS__ );
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
@ -292,14 +290,12 @@ class WC_Emails {
array(
'{site_title}',
'{site_address}',
'{site_url}',
'{woocommerce}',
'{WooCommerce}',
),
array(
$this->get_blogname(),
$domain,
$domain,
'<a href="https://woocommerce.com">WooCommerce</a>',
'<a href="https://woocommerce.com">WooCommerce</a>',
),

View File

@ -8,8 +8,6 @@
* @package WooCommerce/Classes/Payment
*/
use Automattic\WooCommerce\Tools\DependencyManagement\ObjectContainer;
defined( 'ABSPATH' ) || exit;
/**
@ -29,8 +27,6 @@ class WC_Payment_Gateways {
*
* @var WC_Payment_Gateways
* @since 2.1.0
*
* @deprecated 4.3.0 Use dependency injection instead, see the ObjectContainer class.
*/
protected static $_instance = null;
@ -41,11 +37,12 @@ class WC_Payment_Gateways {
*
* @since 2.1
* @return WC_Payment_Gateways Main instance
*
* @deprecated 4.3.0 Use dependency injection instead, see the ObjectContainer class.
*/
public static function instance() {
return self::$_instance = ObjectContainer::get_instance_of( __CLASS__ );
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
/**

View File

@ -9,7 +9,6 @@
*/
use Automattic\Jetpack\Constants;
use Automattic\WooCommerce\Tools\DependencyManagement\ObjectContainer;
if ( ! defined( 'ABSPATH' ) ) {
exit;
@ -53,8 +52,6 @@ class WC_Shipping {
*
* @var WC_Shipping
* @since 2.1
*
* @deprecated 4.3.0 Use dependency injection instead, see the ObjectContainer class.
*/
protected static $_instance = null;
@ -65,11 +62,12 @@ class WC_Shipping {
*
* @since 2.1
* @return WC_Shipping Main instance
*
* @deprecated 4.3.0 Use dependency injection instead, see the ObjectContainer class.
*/
public static function instance() {
return self::$_instance = ObjectContainer::get_instance_of( __CLASS__ );
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
@ -334,26 +332,7 @@ class WC_Shipping {
if ( ! is_array( $stored_rates ) || $package_hash !== $stored_rates['package_hash'] || 'yes' === get_option( 'woocommerce_shipping_debug_mode', 'no' ) ) {
foreach ( $this->load_shipping_methods( $package ) as $shipping_method ) {
if ( ! $shipping_method->supports( 'shipping-zones' ) || $shipping_method->get_instance_id() ) {
/**
* Fires before getting shipping rates for a package.
*
* @since 4.3.0
* @param array $package Package of cart items.
* @param WC_Shipping_Method $shipping_method Shipping method instance.
*/
do_action( 'woocommerce_before_get_rates_for_package', $package, $shipping_method );
// Use + instead of array_merge to maintain numeric keys.
$package['rates'] = $package['rates'] + $shipping_method->get_rates_for_package( $package );
/**
* Fires after getting shipping rates for a package.
*
* @since 4.3.0
* @param array $package Package of cart items.
* @param WC_Shipping_Method $shipping_method Shipping method instance.
*/
do_action( 'woocommerce_after_get_rates_for_package', $package, $shipping_method );
$package['rates'] = $package['rates'] + $shipping_method->get_rates_for_package( $package ); // + instead of array_merge maintains numeric keys
}
}

View File

@ -8,9 +8,6 @@
defined( 'ABSPATH' ) || exit;
use Automattic\WooCommerce\Tools\DependencyManagement\ObjectContainer;
use Automattic\WooCommerce\Providers\CustomerProvider;
/**
* Main WooCommerce Class.
*
@ -39,8 +36,6 @@ final class WooCommerce {
*
* @var WooCommerce
* @since 2.1
*
* @deprecated 4.3.0 Use dependency injection instead, see the ObjectContainer class.
*/
protected static $_instance = null;
@ -114,20 +109,6 @@ final class WooCommerce {
*/
public $deprecated_hook_handlers = array();
/**
* The container used for dependency injection.
*
* @var ObjectContainer
*/
private $container;
/**
* The instance of CustomerProvider to use.
*
* @var CustomerProvider
*/
private $customer_provider;
/**
* Main WooCommerce Instance.
*
@ -137,11 +118,12 @@ final class WooCommerce {
* @static
* @see WC()
* @return WooCommerce - Main instance.
*
* @deprecated 4.3.0 Use dependency injection instead, see the ObjectContainer class.
*/
public static function instance() {
return self::$_instance = ObjectContainer::get_instance_of( __CLASS__ );
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
@ -177,10 +159,7 @@ final class WooCommerce {
/**
* WooCommerce Constructor.
*/
public function __construct( ObjectContainer $container, CustomerProvider $customer_provider ) {
$this->container = $container;
$this->customer_provider = $customer_provider;
public function __construct() {
$this->define_constants();
$this->define_tables();
$this->includes();
@ -498,8 +477,8 @@ final class WooCommerce {
}
$this->theme_support_includes();
$this->query = $this->container->get( WC_Query::class );
$this->api = $this->container->get( WC_API::class );
$this->query = new WC_Query();
$this->api = new WC_API();
$this->api->init();
}
@ -581,13 +560,13 @@ final class WooCommerce {
$this->load_plugin_textdomain();
// Load class instances.
$this->product_factory = $this->container->get( WC_Product_Factory::class );
$this->order_factory = $this->container->get( WC_Order_Factory::class );
$this->countries = $this->container->get( WC_Countries::class );
$this->integrations = $this->container->get( WC_Integrations::class );
$this->structured_data = $this->container->get( WC_Structured_Data::class );
$this->deprecated_hook_handlers['actions'] = $this->container->get( WC_Deprecated_Action_Hooks::class );
$this->deprecated_hook_handlers['filters'] = $this->container->get( WC_Deprecated_Filter_Hooks::class );
$this->product_factory = new WC_Product_Factory();
$this->order_factory = new WC_Order_Factory();
$this->countries = new WC_Countries();
$this->integrations = new WC_Integrations();
$this->structured_data = new WC_Structured_Data();
$this->deprecated_hook_handlers['actions'] = new WC_Deprecated_Action_Hooks();
$this->deprecated_hook_handlers['filters'] = new WC_Deprecated_Filter_Hooks();
// Classes/actions loaded for the frontend and for ajax requests.
if ( $this->is_request( 'frontend' ) ) {
@ -775,12 +754,12 @@ final class WooCommerce {
public function initialize_cart() {
// Cart needs customer info.
if ( is_null( $this->customer ) || ! $this->customer instanceof WC_Customer ) {
$this->customer = $this->customer_provider->get_logged_in_customer();
$this->customer = new WC_Customer( get_current_user_id(), true );
// Customer should be saved during shutdown.
add_action( 'shutdown', array( $this->customer, 'save' ), 10 );
}
if ( is_null( $this->cart ) || ! $this->cart instanceof WC_Cart ) {
$this->cart = $this->container->get( WC_Cart::class );
$this->cart = new WC_Cart();
}
}
@ -794,7 +773,7 @@ final class WooCommerce {
// Session class, handles session data for users - can be overwritten if custom handler is needed.
$session_class = apply_filters( 'woocommerce_session_handler', 'WC_Session_Handler' );
if ( is_null( $this->session ) || ! $this->session instanceof $session_class ) {
$this->session = $this->container->get( $session_class );
$this->session = new $session_class();
$this->session->init();
}
}
@ -834,9 +813,11 @@ final class WooCommerce {
* Get queue instance.
*
* @return WC_Queue_Interface
*
* @deprecated 4.3.0 Use the container to get an instance of WC_Queue_Interface instead.
*/
public function queue() {
return $this->container->get( WC_Queue_Interface::class );
return WC_Queue::instance();
}
/**
@ -845,7 +826,7 @@ final class WooCommerce {
* @return WC_Checkout
*/
public function checkout() {
return $this->container->get( WC_Checkout::class );
return WC_Checkout::instance();
}
/**
@ -854,7 +835,7 @@ final class WooCommerce {
* @return WC_Payment_Gateways
*/
public function payment_gateways() {
return $this->container->get( WC_Payment_Gateways::class );
return WC_Payment_Gateways::instance();
}
/**
@ -863,7 +844,7 @@ final class WooCommerce {
* @return WC_Shipping
*/
public function shipping() {
return $this->container->get( WC_Shipping::class );
return WC_Shipping::instance();
}
/**
@ -872,7 +853,7 @@ final class WooCommerce {
* @return WC_Emails
*/
public function mailer() {
return $this->container->get( WC_Emails::class );
return WC_Emails::instance();
}
/**

View File

@ -6,8 +6,6 @@
* @package WooCommerce/Interface
*/
use Automattic\WooCommerce\Tools\DependencyManagement\ObjectContainer;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
@ -19,7 +17,7 @@ if ( ! defined( 'ABSPATH' ) ) {
*
* @version 3.5.0
*
* @deprecated 4.3.0 Use dependency injection instead to get an instance of WC_Query_Interface, see the ObjectContainer class.
* @deprecated 4.3.0 Use the container to get an instance of WC_Queue_Interface instead.
*/
class WC_Queue {
@ -43,7 +41,13 @@ class WC_Queue {
* @return WC_Queue_Interface
*/
final public static function instance() {
return self::$instance = ObjectContainer::get_instance_of( WC_Queue_Interface::class );
if ( is_null( self::$instance ) ) {
$class = self::get_class();
self::$instance = new $class();
self::$instance = self::validate_instance( self::$instance );
}
return self::$instance;
}
/**

View File

@ -1,36 +0,0 @@
<?php
/**
* CustomerProvider class file.
*
* @package Automattic\WooCommerce\Providers
*/
namespace Automattic\WooCommerce\Providers;
use \WC_Customer;
/**
* Provides methods to retrieve customer objects.
*/
class CustomerProvider {
/**
* Get a customer object for the currently logged in user.
*
* @return WC_Customer Customer object for the currently logged in user.
*/
public function get_logged_in_customer() {
return new WC_Customer( get_current_user_id(), true );
}
/**
* Get a customer object by id.
*
* @param int $id The id of the customer to retrieve.
*
* @return WC_Customer Customer object for the specified id.
*/
public function get_customer_by_id( int $id ) {
return new WC_Customer( $id );
}
}

View File

@ -101,8 +101,7 @@ final class ObjectContainer {
self::$instance->reflection_container = new WooReflectionContainer();
$container->delegate( self::$instance->reflection_container );
// Perform any required manual class and service provider registration.
self::$instance->register_classes();
// Perform any required service provider registration.
self::$instance->register_service_providers();
}
@ -115,24 +114,6 @@ final class ObjectContainer {
$this->container = $container;
}
/**
* Register class resolutions for which default autowiring is not appropriate/enough.
*/
private function register_classes() {
$singletons = array(
\CustomerProvider::class,
\WC_Checkout::class,
\WC_Emails::class,
\WC_Payment_Gateways::class,
\WC_Shipping::class,
\WooCommerce::class,
);
foreach ( $singletons as $class_name ) {
$this->reflection_container->share( $class_name );
}
}
/**
* Register all the service providers inside the ServiceProviders directory.
*/

View File

@ -46,7 +46,7 @@ ObjectContainer::init();
* @return WooCommerce
*/
function WC() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
return ObjectContainer::get_instance_of( WooCommerce::class );
return WooCommerce::instance();
}
// Global for backwards compatibility.