Laravel扩展了从作曲家安装的供应商类

您好我正在使用下面的包https://github.com/jayhealey/Robots来添加一个不同的robots.txt文件,每个环境我有我的应用程序。 然而,这是缺少一种方法,我正在使用我的应用程序,这是抓取延迟即

Crawl-delay: 3600

现在我从这个软件包的作曲家安装中获得以下文件夹:

供应商/ healey / robots / src / Healey / Robots / Robots.php,这开始如下:

<?php namespace HealeyRobots;

class Robots
{....}

现在我希望能够扩展这个类,这样我就可以成功地使用它的方法,但显然不想在vendor目录中添加这个函数,因为这是不可取的。 所以我创建了以下类:

应用程序/ LIB /助手/ AppRobots.php

这有以下内容:

<?php
use HealeyRobotsRobots;
class AppRobots extends Robots {

    /**
     * Add crawl Delay to robots.txt.
     *
     * @param string $delay
     */
    public function crawlDelay($delay)
    {
        $this->addLine("Crawl-delay: $delay");
    }

}

现在在routes.php中我有以下几点:

Route::get('robots.txt', function() {
    // If on the live server, serve a nice, welcoming robots.txt.
    if (App::environment() == 'production')
    {
        Robots::addUserAgent('*');
        AppRobots::crawlDelay('3600');

    } else {
        // If you're on any other server, tell everyone to go away.
        Robots::addDisallow('*');
    }
    return Response::make(Robots::generate(), 200, array('Content-Type' => 'text/plain'));
});

现在这会引发以下错误:

非静态方法AppRobots :: crawlDelay()不应被静态调用

所以我已经将方法更改为static,如下所示:

public static function crawlDelay($delay)
{
    $this->addLine("Crawl-delay: $delay");
}

然而,这然后会引发以下错误:

当不在对象上下文中时使用$ this,所以我更新了这个以使用下面的方法:

/**
 * Add crawl Delay to robots.txt.
 *
 * @param string $delay
 */
public static function crawlDelay($delay)
{
    $robots = new Robots();
    $robots->addLine("Crawl-delay: $delay");
}

现在我得到Call to undefined method HealeyRobotsRobotsFacade::addLine()

这是RobotsFacade文件(vendor / healey / robots / src / Healey / Robots / RobotsFacade.php)

<?php namespace HealeyRobots;

use IlluminateSupportFacadesFacade;

class RobotsFacade extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor() { return 'robots'; }
}

这是服务提供者(vendor / healey / robots / src / Healey / Robots / RobotsServiceProvider.php)

<?php namespace HealeyRobots;

use IlluminateSupportServiceProvider;

class RobotsServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = false;

    /**
     * Bootstrap the application events.
     *
     * @return void
     */
    public function boot()
    {
        $this->package('healey/robots');
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app['robots'] = $this->app->share(function($app)
        {
            return new Robots();
        });

        $this->app->booting(function()
        {
            $loader = IlluminateFoundationAliasLoader::getInstance();
            $loader->alias('Robots', 'HealeyRobotsRobotsFacade');
        });
    }

}

任何想法如何我可以成功地扩展这个类,所以我可以根据需要添加一个额外的方法?

更新

应用程序/ LIB / CustomRobotsServiceProvider.php

<?php 
namespace MyAppHealeyRobots;
use IlluminateSupportServiceProvider;
class CustomRobotsServiceProvider extends ServiceProvider
{
  public function boot()
  {
  }

  public function register()
  {
    $this->app['robots'] = $this->app->share(function($app)
    {
        return new AppRobots();
    });
  }
}

应用程序/ LIB /助手/ AppRobots.php

<?php
namespace MyAppHealeyRobots;
use MyAppHealeyRobotsCustomRobotsServiceProvider;
use HealeyRobotsRobots as Robots;
class AppRobots extends Robots {

    /**
     * Add crawl Delay to robots.txt.
     *
     * @param string $delay
     */
    public static function crawlDelay($delay)
    {
        $robot = new Robots();
        $robot->addLine("Crawl-delay: $delay");
    }

}

提供者数组中的app.php,我有以下内容:

    'HealeyRobotsRobotsServiceProvider',
    'MyAppHealeyRobotsCustomRobotsServiceProvider'

在别名数组中,我有以下几点:

     'Robots'         => 'HealeyRobotsRobots',

但是,这不会使用此方法添加抓取延迟线:

        Robots::crawlDelay('3600');

任何想法为什么这条线没有被写入robots.txt路线? 它正在达到这个方法,但没有成功添加这条线。


您需要创建自己的服务提供商并在其中覆盖“机器人”服务,以便它使用您的课程,而不是基础课程。

  • 创建一个服务提供者

    use IlluminateSupportServiceProvider;
    class CustomRobotsServiceProvider extends ServiceProvider
    {
      public function boot()
      {
      }
    
      public function register()
      {
        $this->app['robots'] = $this->app->share(function($app)
        {
            return new AppRobots();
        });
      }
    }
    
  • 在config / app.php中注册服务提供者

    'providers' => array(
       ... some other providers
       'YourNamespaceCustomRobotsServiceProvider'
    ),
    
  • 确保您的提供商在RobotsServiceProvider之后注册,以便您的服务覆盖原始服务,而不是相反。

    链接地址: http://www.djcxy.com/p/86657.html

    上一篇: Laravel extend a vendor class installed from composer

    下一篇: How to avoid repetition within custom java exception classes