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