【问题标题】:Slim 3 Conditional routeSlim 3 条件路由
【发布时间】:2020-12-30 01:19:52
【问题描述】:

我撞到墙上,现在我的头很痛。

有这个路由将数据返回给用户。

 $this->get('/getdata', 'DataController:SweetData');

控制器做它的事情并返回数据,我试图根据一个条件将这个单一的路由路由到不同的控制器。

例如,如果用户来自特定的 IP 地址,我希望他使用不同的控制器。 我在想这样的事情:

 $this->get('/getdata', function ($request, $response) {
   ** DO SOME CONDITIONAL MAGIC AND SEND IT TO CONTROLLER ** 
 };

我的问题是,我不确定如何在条件魔法之后将其发送到不同的控制器。

谢谢。

【问题讨论】:

  • 从未使用过 Slim v3,但我想您可以使用 middleware 为请求添加一个属性以便以后使用它,也许吧?
  • @AymDev 嗯,您可能走在正确的轨道上。我可以从中间件中重定向。我只是好奇它是否会导致客户端出现任何问题。
  • 您是否真的要将用户重定向到另一个网址?还是您想根据某些条件发送不同的响应?还是您想始终使用同一个控制器,但在某些特定条件下,在调用控制器方法之前做一些事情?
  • @Nima 我想根据条件的结果使用不同的控制器。
  • Slim 提供对“子请求”的支持。但这不是一个非常优雅的解决方案。你想分享一些代码逻辑吗?如果是,那么服务类将是一个“更好”的选择。

标签: php frameworks slim


【解决方案1】:

更好的做法是采用Route > Controller > Service > Model 的模式。您可以根据需要跳过模型,但这是重用代码并遵守 DRY 原则的好方法(不要重复自己)。

我会说您的头很痛,因为您超出了控制器的范围。控制器就是这样,控制器——这就是你应该定义你的“条件魔法”的地方。

一般来说,我建议您保持控制器轻量级 - 使用它们来简单地收集查询参数、验证有效的请求正文并调用适当的服务。您的主要业务逻辑应该存在于您的服务中。使用模型在您的服务之间共享通用的可重用代码。

/src/Routes/MyRoute.php:

<?php

use MyApp\Controllers\MyController;

$app->get('/getdata', [MyController::class , 'sweetData']);

/src/Controllers/MyController.php:

<?php

namespace MyApp\Controllers;

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use MyApp\Services\MyService;
use MyApp\Services\OtherService;

class MyController
{
    protected $myService;
    protected $otherService;

    public function __construct(MyService $myService, OtherService $otherService)
    {
        $this->myService = $myService;
        $this->otherService = $otherService;
    }

    public function sweetData(Request $request, Response $response)
    {
        # perform your conditional magic and call your appropriate service

        $someParam = (string)$request->getQueryParam("something");
        if ($someParam === "apple") {
            return $response->withJson($this->myService->doSomething($someParam));
        }
        elseif ($someParam === "orange") {
            return $response->withJson($this->otherService->doSomething($someParam));
        }
    }
}

/src/Services/MyService.php:

<?php

namespace MyApp\Services;

class MyService
{
    public function doSomething(string $data)
    {
        # $data would be "apple"
        return "Apples are delicious.";
    }
}

/src/Services/OtherService.php:

<?php

namespace MyApp\Services;

class OtherService
{
    public function doSomething(string $data)
    {
        # $data would be "orange"
        return "Oranges are delicious.";
    }
}

【讨论】:

  • 您说的完全正确,我需要遵循这种模式。这是漫长的一天,压力很大。我找到了一个解决方案而不会超出控制器。
猜你喜欢
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多