2015-07-15 1 views
7

Привет Я использую следующий пакет https://github.com/jayhealey/Robots, чтобы добавить другой файл robots.txt для каждой среды, которую я имею в своем приложении. Однако это отсутствует один метод я использую на моем приложении, которое является задержка ползать т.е.Laravel расширяет класс поставщика, установленный от композитора

Crawl-delay: 3600

Теперь у меня есть следующая папка с композитором установки этого пакета:

поставщика/Healey/роботы /src/Healey/Robots/Robots.php и это начинается так:

<?php namespace Healey\Robots; 

class Robots 
{....} 

Теперь я хочу, чтобы иметь возможность расширить этот класс, так что я могу использовать метод в нем успешно, но, очевидно, не хотят, чтобы добавить функция внутри каталог поставщика, поскольку это нежелательно. Таким образом, я создал следующий класс:

приложение/Библиотека/Помощники/AppRobots.php

и это имеет следующее содержание:

<?php 
use Healey\Robots\Robots; 
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')); 
}); 

Теперь это выдает следующее сообщение об ошибке:

Non-статический метод A ppRobots :: crawlDelay() не следует называть статически

Так что я изменил метод статической следующим образом:

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

Однако это бросает следующее сообщение об ошибке:

Использование $ это, когда не в контексте объекта, так что я обновил это использовать следующий метод:

/** 
* 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 Healey\Robots\RobotsFacade::addLine()

Это RobotsFacade файл (поставщик/Healey/роботы/SRC/Healey/Роботы/RobotsFacade.php)

<?php namespace Healey\Robots; 

use Illuminate\Support\Facades\Facade; 

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

и это поставщик услуг (поставщик/Healey/роботы/SRC/Healey/Роботы /RobotsServiceProvider.php)

<?php namespace Healey\Robots; 

use Illuminate\Support\ServiceProvider; 

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 = \Illuminate\Foundation\AliasLoader::getInstance(); 
      $loader->alias('Robots', 'Healey\Robots\RobotsFacade'); 
     }); 
    } 

} 

Любые идеи, как я могу успешно расширить этот класс, так что я могу добавить дополнительный метод в соответствии с требованиями?

обновление

приложение/Библиотека/CustomRobotsServiceProvider.php

<?php 
namespace MyApp\Healey\Robots; 
use Illuminate\Support\ServiceProvider; 
class CustomRobotsServiceProvider extends ServiceProvider 
{ 
    public function boot() 
    { 
    } 

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

приложение/Библиотека/Помощники/AppRobots.php

<?php 
namespace MyApp\Healey\Robots; 
use MyApp\Healey\Robots\CustomRobotsServiceProvider; 
use Healey\Robots\Robots 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"); 
    } 

} 

приложение.PHP в массиве провайдеров, я следующее:

'Healey\Robots\RobotsServiceProvider', 
    'MyApp\Healey\Robots\CustomRobotsServiceProvider' 

в массиве псевдонимов У меня есть следующие:

 'Robots'   => 'Healey\Robots\Robots', 

Однако это не добавляет строку Crawl Delay, используя этот метод:

 \Robots::crawlDelay('3600'); 

Любые идеи, почему эта строка не написана на маршруте robots.txt? Он достигает метода штрафа, но не успешно добавляет эту строку.

ответ

4

Вам необходимо создать своего собственного поставщика услуг и перезаписать службу «роботы» там, чтобы он использовал ваш класс, а не базовый.

  1. Создание поставщика услуг

    use Illuminate\Support\ServiceProvider; 
    class CustomRobotsServiceProvider extends ServiceProvider 
    { 
        public function boot() 
        { 
        } 
    
        public function register() 
        { 
        $this->app['robots'] = $this->app->share(function($app) 
        { 
         return new AppRobots(); 
        }); 
        } 
    } 
    
  2. Регистрация поставщика услуг в вашей конфигурации/app.php

    'providers' => array(
        ... some other providers 
        'Your\Namespace\CustomRobotsServiceProvider' 
    ), 
    

Убедитесь, что ваш поставщик зарегистрирован после RobotsServiceProvider так, что ваша служба перезаписывает исходную, а не наоборот.

+0

спасибо, что это огромная помощь. но теперь я получаю эту ошибку 'Call to undefined method MyApp \ Healey \ Robots \ AppRobots :: addUserAgent()'. Я обновил свой вопрос с помощью своего кода – 001221

+0

Ваш класс AppRobots должен расширить исходный класс Robots. –

+0

спасибо, что я только что понял и обновил вопрос. его не записывая в файл, когда я нажимаю URL-адрес приложения, я получаю только этот «User-agent: *», но я также ожидаю, что строка Crawl-delay: 3600' тоже – 001221