【问题标题】:How can I override Request class?如何覆盖请求类?
【发布时间】:2018-06-09 03:39:48
【问题描述】:

我尝试覆盖核心类,但这似乎不起作用。我知道我需要更新 application/config/app.php 文件以指向新类。但是当我这样做时,HTML 渲染器会在 head 标签处停止。

我将请求类从核心扩展到 application/src,更新了 app.php 文件,但它不起作用并给了我一个空白页面。我需要这个来使用重定向 url。

【问题讨论】:

    标签: overriding concrete5 concrete5-8.x


    【解决方案1】:

    如果您的目标是在将请求发回之前对其进行处理,您可能希望使用中间件而不是覆盖类。

    Centry 门户包就是一个很好的例子,您可以在这里找到:https://github.com/a3020/centry

    查看centry\Provider\CentryServiceProvider.php 函数registerMiddleware() 了解如何注册中间件。 然后查看centry\Http\Middleware中的2个文件,看看是怎么用的。

    【讨论】:

      【解决方案2】:

      如果您使用的是版本 8,则需要在 src 文件夹中自动加载您的类。

      在 application/bootstrap/autoload.php 中

      $classLoader = new \Symfony\Component\ClassLoader\Psr4ClassLoader();
      $classLoader->addPrefix('Application\\Example', DIR_APPLICATION . '/' . DIRNAME_CLASSES . '/Example');
      

      从这里您需要覆盖关联的服务提供商。目前尚不清楚您要覆盖哪个类以及这需要哪个服务提供者。下面是一个使用放置在 application/Src/Example/HttpServiceProvider 中的类覆盖 \Concrete\Core\Http\HttpServiceProvider 的示例

      return [
         'providers' => [
          'core_http' => 'Application\Example\HttpServiceProvider'
         ]
      ]
      

      从服务提供商处,您可以扩展类并以适合您的用例场景的方式覆盖返回的类(如果多个类有引用可能会很乏味,但这是我知道正确覆盖核心类的唯一方法)。通常,您可以扩展现有的类,覆盖一个或两个方法,并提出一个优雅的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2017-01-04
        • 2018-05-28
        相关资源
        最近更新 更多