我是一个新学习的laravel 4.我想覆盖特定的帮助函数。或者向Url,Str等添加新功能。如何做到这一点?
答案 0 :(得分:20)
根据您想要扩展或替换的Laravel的哪个部分,有不同的方法。
向Str添加函数非常简单,因为“宏”:
以下是添加功能的简短示例:
Str::macro('test', function($str) {
return 'Testing: ' . $str . '!';
});
然后您可以按预期调用此函数:
echo Str::test('text'); // Outputs "Testing: text!"
Str,Form,HTML和Response 支持使用宏添加功能。
要扩展URL,必须使用Laravel的IOC。这在docs中解释(如BenjaminRH所述)。我同意这有点难以理解。以下是扩展URL的步骤:
创建文件夹 app / lib 以保存您的扩展程序。
将此文件夹添加到自动加载:
在 app / start / global.php 中,将lib路径附加到类加载器:
ClassLoader::addDirectories(array(
app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',
app_path().'/lib'
));
然后将路径添加到 composer.json classmap:
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php",
"app/lib"
]
},
创建自定义UrlGenerator app / lib / CustomUrlGenerator.php :
<?php
use \Illuminate\Routing\UrlGenerator;
class CustomUrlGenerator extends UrlGenerator
{
public function test()
{
return $this->to('/test');
}
}
创建服务提供商 app / lib / CustomRoutingServiceProvider.php :
<?php
use \Illuminate\Routing\RoutingServiceProvider;
class CustomRoutingServiceProvider extends RoutingServiceProvider
{
public function boot()
{
App::bind('url', function()
{
return new CustomUrlGenerator(
App::make('router')->getRoutes(),
App::make('request')
);
});
parent::boot();
}
}
在 app / config / app.php 中注册服务提供商:
将CustomRoutingServiceProvider
添加到 providers 数组中。
例如,就在Workbench提供程序之后:
'Illuminate\Workbench\WorkbenchServiceProvider',
'CustomRoutingServiceProvider',
从项目根文件夹运行composer dump-autoload
。
完成。使用如下:
URL::test();
注意 代码已经过测试,但可能包含一些错误
答案 1 :(得分:1)
有趣的是你应该提到这一点,实际上。最近添加了whole documentation section,其中详细介绍了这一点。它非常清晰,易于理解。如果你一直在使用Laravel,那么Laravel实际上为许多核心组件提供extend
方法甚至不会让你感到惊讶。
答案 2 :(得分:1)
根据Fnatte的回答,今天的Laravel版本在url
绑定中做了一些额外的处理。重新定义整个绑定不再是一个实用的选择。
以下是我最终扩展URL
门面的方法。
首先,使用此样板创建子类:
use Illuminate\Routing\UrlGenerator;
class YourUrlGenerator extends UrlGenerator {
public function __construct(UrlGenerator $url)
{
parent::__construct($url->routes, $url->request);
}
// redefine or add new methods here
}
然后,在ServiceProvider中添加它:
$url = $this->app['url'];
$this->app->singleton('url', function() use ($url)
{
return new YourUrlGenerator($url);
});
关键在于原始url
绑定应该在我们用自己的覆盖它之前至少执行一次。