使用Composer Pusher Library命名空间

时间:2015-10-27 12:32:41

标签: php namespaces composer-php pusher

我已经使用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连接代码,所以我在自己的命名空间中创建了下面的类,并将其保存为Smawt / Helpers目录中的PusherConnect.php:

<?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 Library似乎一度被命名,但不再是:https://github.com/pusher/pusher-http-php/commit/fea385ade9aede97b37267d5be2fce59d0f1b09d

提前致谢

3 个答案:

答案 0 :(得分:2)

  

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

似乎你已经通过要求命名空间分支来解决它,但无论如何:

如果在命名空间类中使用new Pusher,则PHP将尝试在此命名空间下找到该类:Smawt\Helpers\并且将失败,而#34;未找到类&#34;,因为{ <1}}并不存在于此命名空间内 - 没有映射。

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

两者都可以工作,因为Composer会在获取包之后生成自动加载文件,而您提取的包定义了基于类图的自动加载:$obj = new Pusher。因此,课程"classmap": [ "lib/" ]会映射到Pusher

a)带前导反斜杠的前缀

/vendor/pusher/pusher-php-server/lib/Pusher.php

a)use-statment

namespace Smawt\Helpers;

class PusherConnect
{
    protected $app;

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

        $pusher = new \Pusher(

答案 1 :(得分:1)

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

答案 2 :(得分:1)

似乎PSR-4自动加载和命名空间将出现在Pusher Library的下一个版本中。 在此期间,我按照How to require a fork with composer的建议创建了自己的Pusher库分支,然后更新了我的composer.json,要求从github获取这个分支版本,我已将其命名为。