Composer Pusher库的名称间距



我已经安装https://packagist.org/packages/pusher/pusher-php-server使用composer和am 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连接代码都在它自己的类中,所以我在下面它自己的命名空间中创建了这个类,并将其保存为Smawt/Helpers目录中的PusherConnect.php:

<?php
namespace SmawtHelpers;
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 SmawtHelpersPusherConnect;
$pusher = new PusherConnect($app);

但我遇到了

Fatal error: Class 'SmawtHelpersPusher' not found in C:Users...PusherConnect.php on line 13

因此,我意识到pusher php服务器类没有名称空间,因为Composer生成的autoload_psr4.php文件中没有提到pusher名称空间。因此,我编辑了供应商提供的Pusher.php文件:

namespace Pusher;
class PusherException extends Exception
{
}
class Pusher
{ ...

和我自己的PusherConnect类

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

一切都开始工作了。

这个问题似乎与从我自己的类中实例化非名称空间的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

提前感谢

这个问题似乎与从我自己的类中实例化非名称空间的Pusher类有关,该类是名称空间的。

似乎你已经通过需要一个名称空间的分支解决了这个问题,但无论如何:

如果在命名空间类中使用new Pusher,那么PHP将尝试在这个命名空间下查找该类:SmawtHelpers,并将以"未找到类"失败,因为SmawtHelpersPusher不存在于这个命名空间中-没有映射。

通过在前缀中加上前导反斜杠new Pusher,您指的是命名空间类中的全局命名空间。另一种选择是将use语句添加到顶部的use Pusher;,然后仅添加到$obj = new Pusher

这两者都会起作用,因为Composer会在提取包之后生成自动加载文件,并且要提取的包定义了一个基于类映射的自动加载:"classmap": [ "lib/" ]。因此,类Pusher映射到/vendor/pusher/pusher-php-server/lib/Pusher.php

a) 带前导反斜杠的前缀

namespace SmawtHelpers;
class PusherConnect
{
    protected $app;
    public function __construct($app)
    {
        $this->app = $app;
        $pusher = new Pusher(

a) 使用报表

namespace SmawtHelpers;
use Pusher;
class PusherConnect
{
    protected $app;
    public function __construct($app)
    {
        $this->app = $app;
        $pusher = new Pusher(

如果您想修改Composer带来的库并保留更改(但不向该包提交拉取请求),请将其移到vendor目录之外,并开始使用版本控制系统跟踪它。不利的一面(以及为什么人们不经常这样做)是,现在对该包进行的任何错误修复或改进都必须由您手动处理。

PSR-4自动加载和命名空间似乎将出现在Pusher Library的下一个版本中。与此同时,我遵循了How to require a fork with composer的建议,创建了我自己的Pusher Library fork,然后更新了我的composer.json,要求使用我命名的github的分支版本。

相关内容

  • 没有找到相关文章