【问题标题】:Yii2: my new action is not found - 404Yii2:找不到我的新动作 - 404
【发布时间】:2017-01-25 00:14:23
【问题描述】:

我正在尝试通过 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!');
    }
}

后端/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',
    ]
];

【问题讨论】:

    标签: yii2 yii2-advanced-app yii-actions


    【解决方案1】:

    更改一些内容,然后重试。

    行动:

    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 &gt; urlManager &gt; rules 否则 URL 规则将不起作用。
    我删除了多余的规则。一般来说,最后添加一般规则,然后首先添加特定规则。

    【讨论】:

    • 感谢您的改进,但这不能解决我的问题。问题是由于动作的骆驼大小写命名。
    • 并非如此。 GetOne 操作名称在路由中被翻译为get-one,但您错过了正确的正则表达式模式([\w-]+ 而不是\w+),因此没有路由匹配。我已经纠正了它并修复了其他问题,因为我很好;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多