【发布时间】:2015-09-17 21:48:13
【问题描述】:
我是学习 laravel 4 的新手。我想重写特定的辅助函数。或者给Url、Str等添加新的函数,怎么做?
【问题讨论】:
我是学习 laravel 4 的新手。我想重写特定的辅助函数。或者给Url、Str等添加新的函数,怎么做?
【问题讨论】:
根据您想要扩展或替换 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();
注意 代码已经过测试,但可能包含一些错误
【讨论】:
实际上,您应该提到这一点,这很有趣。最近刚刚添加了whole documentation section,其中详细介绍了这一点。它非常清晰,易于理解。如果你一直在使用 Laravel,那么 Laravel 实际上为许多核心组件提供了extend 方法可能不会让你感到惊讶。
【讨论】:
按照 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绑定应该至少执行一次,然后我们用我们自己的覆盖它。
【讨论】: