Laravel 扩展从 composer 安装的供应商 class
Laravel extend a vendor class installed from composer
您好,我正在使用以下包 https://github.com/jayhealey/Robots 为我的应用程序中的每个环境添加不同的 robots.txt 文件。但是,这缺少我在我的应用程序中使用的一种方法,即抓取延迟,即
Crawl-delay: 3600
现在我有来自这个包的作曲家安装的以下文件夹:
vendor/healey/robots/src/Healey/Robots/Robots.php 开头是这样的:
<?php namespace Healey\Robots;
class Robots
{....}
现在我希望能够扩展这个 class 以便我可以成功地使用其中的方法,但显然不想在 vendor 目录中添加该函数,因为这是不可取的。所以我创建了以下 class:
app/lib/Helpers/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'));
});
现在抛出以下错误:
非静态方法 AppRobots::crawlDelay() 不应被静态调用
所以我将方法更改为静态方法如下:
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 Healey\Robots\RobotsFacade::addLine()
这是 RobotsFacade 文件 (vendor/healey/robots/src/Healey/Robots/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'; }
}
这是服务提供商(vendor/healey/robots/src/Healey/Robots/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');
});
}
}
关于如何成功扩展此 class 以便我可以根据需要添加其他方法的任何想法?
更新
app/lib/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();
});
}
}
app/lib/Helpers/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");
}
}
app.php 在 providers 数组中,我有以下内容:
'Healey\Robots\RobotsServiceProvider',
'MyApp\Healey\Robots\CustomRobotsServiceProvider'
在别名数组中我有以下内容:
'Robots' => 'Healey\Robots\Robots',
然而,这不是使用此方法添加抓取延迟线:
\Robots::crawlDelay('3600');
知道为什么没有将此行写入 robots.txt 路由吗?方法正常,但未成功添加此行。
您需要创建自己的服务提供商并覆盖那里的 "robots" 服务,以便它使用您的 class,而不是基础服务。
创建服务提供商
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();
});
}
}
在您的 config/app 中注册服务提供商。php
'providers' => array(
... some other providers
'Your\Namespace\CustomRobotsServiceProvider'
),
确保您的提供商在 RobotsServiceProvider 之后注册,以便您的服务覆盖原始服务,而不是相反。
您好,我正在使用以下包 https://github.com/jayhealey/Robots 为我的应用程序中的每个环境添加不同的 robots.txt 文件。但是,这缺少我在我的应用程序中使用的一种方法,即抓取延迟,即
Crawl-delay: 3600
现在我有来自这个包的作曲家安装的以下文件夹:
vendor/healey/robots/src/Healey/Robots/Robots.php 开头是这样的:
<?php namespace Healey\Robots;
class Robots
{....}
现在我希望能够扩展这个 class 以便我可以成功地使用其中的方法,但显然不想在 vendor 目录中添加该函数,因为这是不可取的。所以我创建了以下 class:
app/lib/Helpers/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'));
});
现在抛出以下错误:
非静态方法 AppRobots::crawlDelay() 不应被静态调用
所以我将方法更改为静态方法如下:
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 Healey\Robots\RobotsFacade::addLine()
这是 RobotsFacade 文件 (vendor/healey/robots/src/Healey/Robots/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'; }
}
这是服务提供商(vendor/healey/robots/src/Healey/Robots/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');
});
}
}
关于如何成功扩展此 class 以便我可以根据需要添加其他方法的任何想法?
更新
app/lib/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();
});
}
}
app/lib/Helpers/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");
}
}
app.php 在 providers 数组中,我有以下内容:
'Healey\Robots\RobotsServiceProvider',
'MyApp\Healey\Robots\CustomRobotsServiceProvider'
在别名数组中我有以下内容:
'Robots' => 'Healey\Robots\Robots',
然而,这不是使用此方法添加抓取延迟线:
\Robots::crawlDelay('3600');
知道为什么没有将此行写入 robots.txt 路由吗?方法正常,但未成功添加此行。
您需要创建自己的服务提供商并覆盖那里的 "robots" 服务,以便它使用您的 class,而不是基础服务。
创建服务提供商
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(); }); } }
在您的 config/app 中注册服务提供商。php
'providers' => array( ... some other providers 'Your\Namespace\CustomRobotsServiceProvider' ),
确保您的提供商在 RobotsServiceProvider 之后注册,以便您的服务覆盖原始服务,而不是相反。