Yii2:找不到我的新动作 - 404

Yii2: my new action is not found - 404

我试图通过 ajax 调用自定义操作,但返回的响应是 404,我很确定这是一个路由问题,但我不知道如何解决它。 这是我的代码:

行动

public function actionGetOne($id){
    $model = Driver::findOne($id);
    if(!empty($model)){
        $data = [];
        $row = [
            'id'=>$model->id,
            'full_name'=>$model->full_name,
            'email'=>$model->email,
            'nationality_id'=>$model->nationality_id,
            'current_location'=>$model->current_location,
            'medical_check_id'=>$model->medical_check_id,
            'img'=>$model->img,
            'current_fleet_id'=>$model->current_fleet_id,
            'availability'=>$model->availability
        ];
        $data[] = $row;
        echo json_encode(['driver-getOne'=>'success','data'=>$data]);
    } else{
        echo json_encode(['driver-getOne'=>'failure']);
    }
}

ajax

$.ajax({
    url:'<?= urldecode(Url::toRoute(['driver/get-one'])); ?>?id=<?= $id; ?>',
    method:'post',
    dataType:'json',
    success:function(response){}
    error:function(){
        alert('target action is not found!');
    }
}

backend/config/params.php

<?php
return [
    'adminEmail' => 'admin@example.com',
    'urlRules' => [
        '' => 'site/index',
        'login/' => 'site/login',
        'signup/' => 'site/signup',
        '<controller:[\w-]+>/<action:\w+>' => '<controller>/<action>',
        '<controller:[\w-]+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
        '<controller:[\w-]+>/<id:\d+>' => '<controller>/view',
        '<controller:[\w-]+>/create' => '<controller>/create',
        '<controller:[\w-]+>/update/<id:\d+>' => '<controller>/update',
        '<controller:[\w-]+>/delete/<id:\d+>' => '<controller>/delete',
        '<controller:[\w-]+>/get-all' => '<controller>/get-all',
        '<controller:[\w-]+>/get-one' => '<controller>/get-one',
        '<controller:[\w-]+>/update-status' => '<controller>/update-status',
    ]
];

稍作改动,然后重试。

操作:

public function actionGetOne($id)
{
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $model = Driver::findOne($id);
    if (empty($model)) {
        return ['driver-getOne' => 'failure'];
    }
    return [
        'driver-getOne' => 'success',
        'data' => [[
            'id' => $model->id,
            'full_name' => $model->full_name,
            'email' => $model->email,
            'nationality_id' => $model->nationality_id,
            'current_location' => $model->current_location,
            'medical_check_id' => $model->medical_check_id,
            'img' => $model->img,
            'current_fleet_id' => $model->current_fleet_id,
            'availability' => $model->availability
        ]],
    ];
}

操作应该 return 正确完成响应序列,否则可能会发生不需要的事情。通过设置响应格式可以自动得到JSON编码数组。

AJAX:

$.ajax({
    url:'<?= Url::to(['driver/get-one', 'id' => $id]) ?>',
    method:'post',
    dataType:'json',
    success:function(response){}
    error:function(){
        alert('target action is not found!');
    }
}

使用正确的语法获取 URL。

参数:

'urlRules' => [
    '' => 'site/index',
    'login' => 'site/login',
    'signup' => 'site/signup',
    '<controller:[\w-]+>/<id:\d+>' => '<controller>/view',
    '<controller:[\w-]+>/<action:[\w-]+>/<id:\d+>' => '<controller>/<action>',
    '<controller:[\w-]+>/<action:[\w-]+>' => '<controller>/<action>',
]

我假设您将 urlRules 传递给 components > urlManager > rules,否则 URL 规则将不起作用。
我删除了多余的规则。一般情况下,最后添加一般规则,首先添加特定规则。