$clients * @param array $clientConfig */ public function __construct( Serializer $serializer, array $clients, array $clientConfig = [] ) { //@codeCoverageIgnoreStart $this->serializer = $serializer; $clientConfig['serializer'] = $serializer; // Adds some defaults // gccl needs to be present for handwritten clients $clientConfig += [ 'libName' => 'gccl', 'emulatorHost' => null ]; if ((bool) $clientConfig['emulatorHost']) { $emulatorConfig = $this->emulatorGapicConfig($clientConfig['emulatorHost']); $clientConfig = array_merge( $clientConfig, $emulatorConfig ); } //@codeCoverageIgnoreEnd // Initialize the client classes and store them in memory foreach ($clients as $client) { if (is_object($client)) { $this->clients[get_class($client)] = $client; } else { $this->clients[$client] = new $client($clientConfig); } } } /** * Helper function that forwards the request to a client obj. * * @param string $clientClass The request will be forwarded to this client class. * @param string $method This method needs to be called on the client obj. * @param Message $request The protobuf Request instance to pass as the first argument to the $method. * @param array $optionalArgs The optional args. * @param bool $whitelisted This decides the behaviour when a NotFoundException is encountered. * * @return \Generator|OperationResponse|array|null * * @throws ServiceException */ public function sendRequest( string $clientClass, string $method, Message $request, array $optionalArgs, bool $whitelisted = false ) { $clientObj = $this->getClientObject($clientClass); if (!$clientObj) { return null; } $allArgs = [$request]; $allArgs[] = $optionalArgs; try { $callable = [$clientObj, $method]; $response = call_user_func_array($callable, $allArgs); return $this->handleResponse($response); } catch (ApiException $ex) { throw $this->convertToGoogleException($ex); } catch (NotFoundException $e) { if ($whitelisted) { throw $this->modifyWhitelistedError($e); } throw $e; } } /** * Helper function that returns a client object stored in memory * using the client class as key. * @param $clientClass The client class whose object we need. * @return mixed */ private function getClientObject(string $clientClass) { return $this->clients[$clientClass] ?? null; } }