7

我是学习 laravel 4 的新手。我想覆盖特定的辅助函数。或者向 Url、Str 等添加新功能。如何做到这一点?

4

3 回答 3

20

根据您想要扩展或替换 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 的分步操作:

  1. 创建文件夹app/lib来保存您的扩展类。

  2. 将此文件夹添加到自动加载:

    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"
        ]
    },
    
  3. 创建自定义 UrlGenerator app/lib/CustomUrlGenerator.php

    <?php 
    
    use \Illuminate\Routing\UrlGenerator;
    
    class CustomUrlGenerator extends UrlGenerator
    {
        public function test()
        {
            return $this->to('/test');
        }
    }
    
  4. 创建服务提供者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();
        }
    }
    
  5. 在app/config/app.php中注册服务提供者:

    添加CustomRoutingServiceProvider提供者数组。例如,在 Workbench 提供程序之后:

    'Illuminate\Workbench\WorkbenchServiceProvider',
    'CustomRoutingServiceProvider',
    
  6. composer dump-autoload从项目根文件夹运行。

  7. 完毕。像这样使用:

    URL::test();
    

注意 代码经过测试,但可能包含一些错误

于 2013-10-01T20:23:45.013 回答
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绑定应该至少执行一次,然后我们用我们自己的来覆盖它。

于 2014-11-02T01:01:44.563 回答
1

有趣的是,您实际上应该提到这一点。最近刚刚添加了一个完整的文档部分,其中详细介绍了这一点。它非常清晰,易于理解。如果你一直在使用 Laravel,你可能不会惊讶 Laravel 实际上为extend许多核心组件提供了一种方法。

于 2013-10-01T19:01:19.850 回答