如何扩展laravel 4核心?

时间:2013-10-01 18:56:29

标签: laravel laravel-4

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

3 个答案:

答案 0 :(得分: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。这在docs中解释(如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 classmap:

    "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添加到 providers 数组中。 例如,就在Workbench提供程序之后:

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

  7. 完成。使用如下:

    URL::test();
    
  8. 注意 代码已经过测试,但可能包含一些错误

答案 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绑定应该在我们用自己的覆盖它之前至少执行一次。