Welcome Guest, Not a member yet? Register   Sign In
redirect() does not redirects
#1

"redirect()" does not make redirect - it is only returns prepared response for redirecting. For redirecting you need to "return" this response from executing method of the Controller. Yes it is described in the documentation. But it makes some inconvenience.
In CI3 "redirect()" was physically doing the redirect. And it was possible to run it from anywhere - Controller, Model, Library.
In CI4 need to run it only from Controller and return it's response.

Here is my case:

I want to use route localization like said here. Every URLs should contain locale segment. And if someone goes to "mydomain.com/User" I want to redirect him to "mydomain.com/en/User" (default locale).
So as every Controller extends "BaseController" I've decided to add checking in its constructor:
PHP Code:
class BaseController extends Controller
{

    /**
     * Constructor.
     */
    public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
    {
        // Do Not Edit This Line
        parent::initController($request$response$logger);

        // check locale segment
        $uri = \Config\Services::uri();
        $locale $uri->getSegment(1);
        if (!in_array($locale, ['en''ua''de'])) {
            return redirect()->to('/en/' $uri->getPath());
        }
    }


But It was no effect. Then I tried to make separate method and call it in constructor, make Library and Event listener - nothing helped.

The only thing that helped me was - to make separate method in "BaseController" and call it from executing method of my Controller. But there is a nuance - if this method returns a response for a redirect, you need to return it from the controller method.

Method in "BaseController":
PHP Code:
    /**
     * Check locale
     * @return bool|\CodeIgniter\HTTP\RedirectResponse
     */
    public function checkLocale()
    {
        // check locale segment
        $uri = \Config\Services::uri();
        $locale $uri->getSegment(1);
        if (!in_array($locale, ['en''ua''de'])) {
            return redirect()->to('/en/' $uri->getPath());
        }

        return true;
    

My Controller:
PHP Code:
<?php namespace App\Controllers;

class 
User extends BaseController
{
    public function index()
    {
        $check $this->checkLocale();
        if (!is_bool($check)) {
            return $check;
        }

        // other code of the method
    }


Based on this, I need to insert this check into every executable method of every controller. And this is not very good.

Maybe someone knows a more convenient way to perform such check in one place (as I wanted to do it in the constructor)?
Reply


Messages In This Thread
redirect() does not redirects - by T.O.M. - 09-06-2020, 11:09 AM
RE: redirect() does not redirects - by SteeveDroz - 09-06-2020, 09:48 PM
RE: redirect() does not redirects - by chenzen - 09-06-2020, 11:42 PM
RE: redirect() does not redirects - by T.O.M. - 09-07-2020, 03:36 AM
RE: redirect() does not redirects - by T.O.M. - 09-07-2020, 03:21 AM



Theme © iAndrew 2016 - Forum software by © MyBB