【问题标题】:PHP - Routing two controllers with different actions to the same urlPHP - 将具有不同操作的两个控制器路由到相同的 url
【发布时间】:2018-04-12 22:59:52
【问题描述】:

我在这里有一条路线,其中一个控制器与一个动作相关联

'car/cars' => [
            'GET' => [
                'controller' => $CarController,
                'action' => 'cars'
            ],
          ]

这对我来说非常好,直到我向同一路由添加具有不同操作的第二个控制器,如下所示:

'car/cars' => [
            'GET' => [
                'controller' => $CarController,
                'action' => 'cars'
            ],
            'GET' => [
                'controller' => $ManufacturerController,
                'action' => 'list'
            ]
        ],

我的问题是第一个动作停止工作,第二个动作开始工作。有没有另一种方法可以将两个不同的操作路由到car/cars url?我已经尝试了下面的方法,它给了我相同的结果

        'car/cars' => [
            'GET' => [
                'controller' => $CarController,
                'action' => 'cars'
            ],
        ],
        'car/cars' => [
            'GET' => [
                'controller' => $ManufacturerController,
                'action' => 'list'
            ],
        ],

【问题讨论】:

  • 我不确定我是否遵循 - 如果两个不同的控制器方法对应于同一路径,如果有人访问该 URL,您希望发生哪一个?作为参考,这两个失败的原因是您在数组中多次设置相同的键 - 最后一个实例将始终覆盖以前的实例。
  • @iainn 如果有人访问了该 URL,我希望执行这两个操作。例如,链接到list 的动作正在显示制造商,而动作cars 负责列出汽车。我现在明白它不止一次设置同一个键,有没有办法解决这个问题或解决这个问题的方法?
  • 添加第三个,它自己运行列表和汽车,假设你也想保持这些分开
  • 您没有说明您的操作是做什么的(或者您正在使用哪个路由库,如果有的话),但假设这些操作生成网页,您是否只是希望在一个之后输出两个完整的 HTML 页面另一个?每条路由都需要对应一个 single 动作,然后它可以根据需要执行尽可能多或尽可能少的操作。
  • @iainn 我会尝试更清楚一点对不起。操作cars 导致一个单独的 php 控制器(此文件连接到 cars 表),其中包含一个名为“cars”的函数,它将运行。这个函数运行一个SELECT FROM,它显示所有的汽车。操作list 连接到制造商的php 文件,该文件执行相同的操作并运行SELECT FROM,但在侧边栏上显示制造商。这些是控制器文件中两个函数的屏幕截图:imgur.com/a/3SRj5 这允许我使用 $manu 和 $cars 变量来查看制造商和汽车。

标签: php routes


【解决方案1】:

您可以像这样将$manufactorerTable 注入您的Car 控制器:

class Car {

  private $carsTable;
  private $manufactorerTable;

  public function __constructor($carsTable, $manufactorerTable) {
    $this->carsTable = $carsTable;
    $this->manufactorerTable = $manufactorerTable;
  }

  public function cars() {
    $cars = $this->carsTable->findAll();
    $manufactorer = $this->manufactorerTable->find('manufactorerid', 1)[0];

    return [
      ...
      'variables': [
        'cars' => $cars,
        'manufactorer' => $manufactorerTable
      ]
    ];
  }
}

当然,您只需要一条路线来执行此操作:

'car/cars' => [
      'GET' => [
          'controller' => $CarController,
          'action' => 'cars'
      ],
 ]

【讨论】:

  • 嘿我试过这个方法收到以下错误Fatal error: Uncaught ArgumentCountError: Too few arguments to function PreControllers\Controllers\Car::__construct(), 1 passed in /srv/http/cars/PreControllers/Routes.php on line 13 and exactly 2 expected in /srv/http/cars/PreControllers/Controllers/Car.php on line 10这是我的routes.php部分i.imgur.com/hNXQ1hx.png。尝试调试了几分钟,但无法弄清楚什么不合适
  • 修改$carController以接受两个参数而不是一个($carsTable, $manufacturerTable)
  • /srv/http/cars/PreControllers/Routes.php 中修改$carController 使其成为$carController = new \PreControllers\Controllers\Car($carsTable, $manufacturerTable);
  • 修改后对我有用,非常感谢,非常感谢
【解决方案2】:
 'car/cars' => [
        'GET' => [
            'controller' => $CarController,
            'action' => 'listCars' // new method to implement
        ],
    ],

问题解决了:)

【讨论】:

    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多