首页 > 解决方案 > Codeigniter redirect()->to() 在 __construct() 中不起作用

问题描述

我的控制器中有代码

public function __construct()
{
   return redirect()->to('/auth');
   $this->validation =
     \Config\Services::validation();
   $this->title = 'Header Menu';
   $this->controller = 'user';
}

public function index()
{
  $data = [
     'title_prefix' => 'Profil',
     'title' => $this->title,
     'controller' => $this->controller,
     'button_add' => false,
     'validation' => $this->validation
    ];

  return view('user/index', $data);
}

它仍然显示视图('用户/索引')。如何在 __construct() 中返回 redirect()->to('/auth') ?对不起,我英语说得不好

标签: codeigniter-4

解决方案


redirect()这是在构造函数中不起作用的预期行为。

redirect()在 CI4 中不仅设置标头,还返回一个 RedirectResponse 对象。
问题是:在你的控制器的构造函数中,你不能返回其他东西的实例。您正在尝试构建控制器而不是 RedirectResponse。

好的做法是使用控制器过滤器

或者,redirect()如果您只想在此端点处重定向用户,则可以在 index 函数内部添加。

这是一个适合您需要的过滤器示例:
注意您的 CI 版本。$arguments从 4.0.4 开始需要该参数。否则你必须删除它

<?php

namespace App\Filters;

use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;

class AuthFilter implements FilterInterface {

    public function before(RequestInterface $request, $arguments = null) {
        return redirect()->to('/auth');
    }

    //--------------------------------------------------------------------

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) {
    }

}

并在您app/Config/Filters编辑这两个变量以激活您的过滤器:

public $aliases = [
        'auth' => \CodeIgniter\Filters\AuthFilter::class,
    ];
public $globals = [
        'before' => ['auth' => 'the_routes_you_want_to_redirect']
    ];

您可能还想检查此线程:https ://forum.codeigniter.com/thread-74537.html


推荐阅读