如何扩展laravel 4核心?

Sak*_*lam 7 laravel laravel-4

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

Mat*_*röm 20

根据您想要扩展或替换的Laravel的哪个部分,有不同的方法.

宏

向Str添加函数非常简单,因为"宏":

这是添加功能的简短示例:

Str::macro('test', function($str) {
    return 'Testing: ' . $str . '!';
});
Run Code Online (Sandbox Code Playgroud)

然后,您可以按预期调用此函数:

echo Str::test('text'); // Outputs "Testing: text!"
Run Code Online (Sandbox Code Playgroud)

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'
    ));
    
    Run Code Online (Sandbox Code Playgroud)

    然后添加composer.json classmap 的路径:

    "autoload": {
        "classmap": [
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php",
            "app/lib"
        ]
    },
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建自定义UrlGenerator app/lib/CustomUrlGenerator.php:

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

    添加CustomRoutingServiceProvider到providers数组.例如,在Workbench提供程序之后:

    'Illuminate\Workbench\WorkbenchServiceProvider',
    'CustomRoutingServiceProvider',
    
    Run Code Online (Sandbox Code Playgroud)
  6. composer dump-autoload从项目根文件夹运行.

  7. 完成.使用如下:

    URL::test();
    
    Run Code Online (Sandbox Code Playgroud)

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