【问题标题】:How to extend laravel 4 core?如何扩展 laravel 4 核心?
【发布时间】:2015-09-17 21:48:13
【问题描述】:

我是学习 laravel 4 的新手。我想重写特定的辅助函数。或者给Url、Str等添加新的函数,怎么做?

【问题讨论】:

    标签: laravel laravel-4


    【解决方案1】:

    根据您想要扩展或替换 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();
      

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

    【讨论】:

      【解决方案2】:

      实际上,您应该提到这一点,这很有趣。最近刚刚添加了whole documentation section,其中详细介绍了这一点。它非常清晰,易于理解。如果你一直在使用 Laravel,那么 Laravel 实际上为许多核心组件提供了extend 方法可能不会让你感到惊讶。

      【讨论】:

      • 这一切似乎让我感到困惑。我仍然对 IoC 和 ServiceProviders 感到困惑。
      • 如果您以前没有遇到过它可能会非常混乱:)。顺便说一句,您可能想查看以下库,其中可能包含您正在寻找的方法:anahkiasen.github.io/underscore-php
      • 在 L4 发布之前查看这些 videos on IoC that Taylor put out - 它们对于将您的头包裹在容器、IoC 和其他好东西上非常有用。
      【解决方案3】:

      按照 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绑定应该至少执行一次,然后我们用我们自己的覆盖它。

      【讨论】:

        猜你喜欢
        • 2013-07-01
        • 2015-12-03
        • 1970-01-01
        • 2013-12-29
        • 2020-10-27
        • 2015-07-06
        • 2023-03-12
        • 1970-01-01
        • 2014-04-06
        相关资源
        最近更新 更多