【问题标题】:Namespacing with Composer Pusher Library使用 Composer Pusher 库进行命名空间
【发布时间】:2016-01-26 20:56:09
【问题描述】:

我已经使用 composer 安装了https://packagist.org/packages/pusher/pusher-php-server,并且我的应用程序中的所有包都是 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 类没有命名空间,因为 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 \Pusher\Pusher(

一切都开始工作了。

问题似乎与从我自己的类中实例化非命名空间的 Pusher 类有关,该类是命名空间的。 所以,我的问题是“我如何防止 Composer 覆盖我的更改,下次我作曲家更新时,还有,为什么我不能通过引用我自己的全局命名空间来避免对 Composer 安装包的这种编辑班级?”比如在我自己的 PusherConnect 类中

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

        $pusher = new \Pusher(

顺便说一下,Pusher 库似乎曾经是命名空间的,但现在不再是:https://github.com/pusher/pusher-http-php/commit/fea385ade9aede97b37267d5be2fce59d0f1b09d

提前致谢

【问题讨论】:

    标签: php namespaces composer-php pusher


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        您似乎已经通过要求命名空间分支解决了这个问题,但无论如何:

        如果您在命名空间类中使用new Pusher,那么 PHP 将尝试在此命名空间下查找该类:Smawt\Helpers\,并且将失败并显示“找不到类”,因为此命名空间中不存在 Smawt\Helpers\Pusher - 没有映射。

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

        两者都可以工作,因为 Composer 会在获取包之后生成自动加载文件,并且您正在获取的包定义了基于类映射的自动加载:"classmap": [ "lib/" ]。所以,Pusher 类映射到 /vendor/pusher/pusher-php-server/lib/Pusher.php

        a) 带有前导反斜杠的前缀

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

        a) 使用说明

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

        【讨论】:

          猜你喜欢
          • 2013-08-03
          • 2015-05-26
          • 2014-06-16
          • 1970-01-01
          • 1970-01-01
          • 2015-09-22
          • 2014-05-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多