Пространство имен с помощью библиотеки Composer Pusher

Я установил https://packagist.org/packages/pusher/pusher-php-server использую composer и запускаю PSR-4 для всех пакетов в моем приложении.

Мне удалось успешно подключиться к Pusher API с помощью базового кода, вызываемого со страницы, где не было упомянуто «использовать пространство имен»:

$pusher = new Pusher(
$app->config->get('pusher.api-key'),
$app->config->get('pusher.api-secret'),
$app->config->get('pusher.app-id'),
array('encrypted' => true)
);

Я решил, что мне нужен весь код подключения Pusher в его собственном классе, поэтому я создал класс ниже в его собственном пространстве имен и сохранил его как PusherConnect.php в каталоге Smawt / Helpers:

<?php

namespace Smawt\Helpers;

class PusherConnect
{
protected $app;

public function __construct($app)
{
$this->app = $app;

$pusher = new Pusher(
$this->app->config->get('pusher.api-key'),
$this->app->config->get('pusher.api-secret'),
$this->app->config->get('pusher.app-id'),
array('encrypted' => true)
);

$results = $pusher->get_channels( array( 'filter_by_prefix' => 'user_') );
$channel_count = count($results->channels);

$this->app->view->appendData([
'channels_count' => $channel_count
]);

$pusher->channel_count = $channel_count;

return $pusher;
}

public function check()
{
if (!$this->app->config->get('pusher.api-key')) {
$this->app->flash('global', 'No Pusher account has been set up.');
return $this->app->response->redirect($this->app->urlFor('home'));
}
}
}

Затем я создал объект с

<?php

use Smawt\Helpers\PusherConnect;

$pusher = new PusherConnect($app);

но меня встретили

Fatal error: Class 'Smawt\Helpers\Pusher' not found in C:\Users\...\PusherConnect.php on line 13

Итак, я понял, что классы pusher-php-server не были пространством имен, поскольку пространства имен Pusher не были упомянуты в сгенерированном Composer файле autoload_psr4.php. Итак, я отредактировал предоставленный поставщиком файл Pusher.php:

namespace Pusher;

class PusherException extends \Exception
{
}

class Pusher
{ ...

и мой собственный класс PusherConnect

public function __construct($app)
{
$this->app = $app;

$pusher = new \Pusher\Pusher(

и все начали работать.

Проблема, по-видимому, связана с созданием экземпляра класса Pusher без пространства имен из моего собственного класса, который является пространством имен.
Итак, мой вопрос: «Как я могу предотвратить переписывание Composer моих изменений при следующем обновлении Composer, а также, почему я не могу избежать этого редактирования установленного пакета Composer, ссылаясь на глобальное пространство имен из моего собственного учебный класс?» такой как в моем собственном классе PusherConnect

public function __construct($app)
{
$this->app = $app;

$pusher = new \Pusher(

Между прочим, похоже, что библиотека Pusher была когда-то пространством имен, но больше не является: https://github.com/pusher/pusher-http-php/commit/fea385ade9aede97b37267d5be2fce59d0f1b09d

заранее спасибо

2

Решение

Проблема, по-видимому, связана с созданием экземпляра класса Pusher без пространства имен из моего собственного класса, который является пространством имен.

Кажется, вы уже решили эту проблему, запросив ветку с пространством имен, но в любом случае:

Если вы используете new Pusher в классе пространства имен, PHP попытается найти класс в этом пространстве имен: Smawt\Helpers\ и потерпит неудачу с «Класс не найден», потому что Smawt\Helpers\Pusher не существует в этом пространстве имен — нет отображения.

Префиксом с ведущей обратной косой чертой new \Pusher вы ссылаетесь на глобальное пространство имен внутри вашего пространства имен. Альтернативой было бы добавить оператор использования в начало use \Pusher; а потом просто $obj = new Pusher,

Оба будут работать, потому что Composer генерирует файлы автозагрузки, после того, как пакет получен, а пакет, который вы выбираете, определяет автозагрузку на основе карты классов: "classmap": [ "lib/" ], Итак, класс Pusher карты для /vendor/pusher/pusher-php-server/lib/Pusher.php,

а) префикс с ведущей обратной косой чертой

namespace Smawt\Helpers;

class PusherConnect
{
protected $app;

public function __construct($app)
{
$this->app = $app;

$pusher = new \Pusher(

а) использование-статус

namespace Smawt\Helpers;

use \Pusher;

class PusherConnect
{
protected $app;

public function __construct($app)
{
$this->app = $app;

$pusher = new Pusher(
2

Другие решения

Если вы хотите изменить библиотеку, поставляемую с Composer, и сохранить изменения (но не отправлять запрос на извлечение для этого пакета), переместите ее за пределы vendor каталог и начать отслеживать его с вашей системой контроля версий. Недостатком (и почему люди не часто делают это) является то, что любые исправления или улучшения, сделанные в этом пакете, должны быть обработаны вами вручную.

1

Похоже, что автозагрузка PSR-4 и пространства имен должны появиться в следующем выпуске библиотеки Pusher.
В то же время я последовал совету в Как потребовать форк с композитором и создал мой собственный форк библиотеки Pusher, а затем обновил мой composer.json, чтобы потребовать эту разветвленную версию от github, который у меня был в пространстве имен.

1
По вопросам рекламы [email protected]