Привет Я использую следующий пакет 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? Он достигает метода штрафа, но не успешно добавляет эту строку.
спасибо, что это огромная помощь. но теперь я получаю эту ошибку 'Call to undefined method MyApp \ Healey \ Robots \ AppRobots :: addUserAgent()'. Я обновил свой вопрос с помощью своего кода – 001221
Ваш класс AppRobots должен расширить исходный класс Robots. –
спасибо, что я только что понял и обновил вопрос. его не записывая в файл, когда я нажимаю URL-адрес приложения, я получаю только этот «User-agent: *», но я также ожидаю, что строка Crawl-delay: 3600' тоже – 001221