如何在 codeigniter 4 中使用 ajax

Sha*_*dat 2 php ajax jquery codeigniter codeigniter-4

我正在使用 codeigniter-4 版本并尝试在导航栏中自动搜索。我正在尝试使用 ajax 将 post 方法中的数据发送到控制器中。但它不起作用。而且 codeigniter 4 没有描述 ajax 的细节。在我的代码示例输入框下方是 -

<input class="form-control mr-sm-2" type="search" placeholder="<?= lang('nav.search'); ?>" aria-label="Search" name='s' id="seachBox">
Run Code Online (Sandbox Code Playgroud)

ajax 代码是 -

     $.ajax({  
       url:<?= base_url('search'); ?>,
       headers:{'X-Requested-With':'XMLHttpRequest'},
       data:{query:query},
       success:function(data){
             alert(data);
       }  
    });
Run Code Online (Sandbox Code Playgroud)

我的控制器是-

<?php
class Search extends BaseController
{
    public function __construct()
    { 
        helper(['common_helper','aws_helper']);
    }

    public function index(){

        echo 'string';
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

路线是——

<?php 

$routes->get('/search', 'Search::index');

?>
Run Code Online (Sandbox Code Playgroud)

小智 8

这是ajax的示例代码。(确保您已经为搜索url定义了路由/控制器方法)

$.ajax({  
    url:<?php echo base_url('search'); ?>,
    type: 'post',
    dataType:'json',
    data:{query:query},
    success:function(data){
        alert(data);
    }  
});
Run Code Online (Sandbox Code Playgroud)

获取请求数据的 CI4 代码

if ($this->request->isAJAX()) {
    $query = service('request')->getPost('query');
    var_dump($this->request->getPost('query'));
}
Run Code Online (Sandbox Code Playgroud)

此外,csrf token如果您没有成功重新加载页面,请确保更新每个请求。此外,您需要csrf在方法中返回令牌。所以在这种情况下,你的方法看起来像 -

if ($this->request->isAJAX()) {
        $query = service('request')->getPost('query');
        //var_dump($this->request->getPost('query'));
        return json_encode(['success'=> 'success', 'csrf' => csrf_hash(), 'query ' => $query ]);
    }
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,您的 ajax 代码将如下所示 -

$.ajax({  
        url:<?php echo base_url('search'); ?>,
        type: 'post',
        dataType:'json',
        data:{query:query},
        success:function(data){
           var result = JSON.parse(data);
            $("input[name='csrf_test_name']").val(result['csrf']);
        }  
    });
Run Code Online (Sandbox Code Playgroud)