我是学习 laravel 4 的新手。我想覆盖特定的辅助函数。或者向 Url、Str 等添加新功能。如何做到这一点?
3 回答
根据您想要扩展或替换 Laravel 的哪个部分,有不同的方法。
宏
由于“宏”,将函数添加到 Str 非常容易:
这是添加功能的简短示例:
Str::macro('test', function($str) {
return 'Testing: ' . $str . '!';
});
然后,您可以按预期调用此函数:
echo Str::test('text'); // Outputs "Testing: text!"
Str、Form、HTML 和 Response 支持使用宏添加函数。
基于 IOC 的扩展
要扩展 URL,必须使用 Laravel 的 IOC。这在文档中进行了解释(如 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类映射:
"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
到提供者数组。例如,在 Workbench 提供程序之后:'Illuminate\Workbench\WorkbenchServiceProvider', 'CustomRoutingServiceProvider',
composer dump-autoload
从项目根文件夹运行。完毕。像这样使用:
URL::test();
注意 代码经过测试,但可能包含一些错误
按照 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
绑定应该至少执行一次,然后我们用我们自己的来覆盖它。
有趣的是,您实际上应该提到这一点。最近刚刚添加了一个完整的文档部分,其中详细介绍了这一点。它非常清晰,易于理解。如果你一直在使用 Laravel,你可能不会惊讶 Laravel 实际上为extend
许多核心组件提供了一种方法。