รันโค้ดของฉันก่อนการกระทำใดๆ ของคอนโทรลเลอร์

ฉันต้องการตรวจสอบว่าผู้ใช้ของฉันได้กรอกข้อมูลบางฟิลด์ในโปรไฟล์ของเขาหรือไม่ ก่อนที่จะสามารถเข้าถึงการดำเนินการใด ๆ ของตัวควบคุมใด ๆ ตัวอย่างเช่น

if(empty(field1) && empty(field2))
{
   header("Location:/site/error")
}

ใน yii1 ฉันสามารถทำได้ใน protected\components\Controller.php ในฟังก์ชัน init() แต่ใน yii2 ฉันไม่แน่ใจว่าจะใส่โค้ดไว้ที่ไหน ฉันไม่สามารถแก้ไขไฟล์หลักได้ แต่ไม่แน่ใจว่าต้องทำอย่างไรในแบ็กเอนด์ของแอปพลิเคชันขั้นสูงเพื่อให้ทำงานได้

ฉันรู้ว่าฉันสามารถใช้ beforeAction() ได้ แต่ฉันมีคอนโทรลเลอร์มากเกินไปที่จะทำอย่างนั้นและติดตามคอนโทรลเลอร์ทุกตัวได้


person Misko Mali    schedule 27.11.2014    source แหล่งที่มา


คำตอบ (4)


ในกรณีที่คุณจำเป็นต้องรันโค้ดก่อนทุกๆ คอนโทรลเลอร์และแอคชั่น คุณสามารถดำเนินการดังต่อไปนี้:

1 - เพิ่มส่วนประกอบลงในไดเร็กทอรีส่วนประกอบของคุณ เช่น (MyGlobalClass):

namespace app\components;
class MyGlobalClass extends \yii\base\Component{
    public function init() {
        echo "Hi";
        parent::init();
    }
}

2 - เพิ่มองค์ประกอบ MyGlobalClass ลงในอาร์เรย์ส่วนประกอบของคุณในไฟล์กำหนดค่า:

'components' => [
    'MyGlobalClass'=>[
        'class'=>'app\components\MyGlobalClass'
     ],
     //other components

3 - เพิ่ม MyGlobalClass ลงในอาร์เรย์ bootstarp ในไฟล์กำหนดค่า:

'bootstrap' => ['log','MyGlobalClass'],

ตอนนี้คุณสามารถเห็น Hi ก่อนทุกการกระทำ

โปรดทราบว่า หากคุณไม่จำเป็นต้องใช้ Events และ Behaviors คุณสามารถใช้ \yii\base\Object แทน \yii\base\Component

person Ali MasudianPour    schedule 27.11.2014
comment
@MiskoMali คุณใช้โมดูลหรือไม่? - person Ali MasudianPour; 28.11.2014
comment
อีกอย่างคุณจำเป็นต้องโต้ตอบกับแบบฟอร์มหรือไม่? หรือคุณต้องรันโค้ดก่อนที่คอนโทรลเลอร์ทุกตัวจะดำเนินการ? ในกรณีเป็นแบบฟอร์ม หากใช้โมเดล สามารถใช้ beforeValidate() - person Ali MasudianPour; 28.11.2014
comment
@MiskoMali ถ้าคุณใช้โมดูลคุณสามารถเขียนโค้ดของคุณในวิธี init() ซึ่งจะถูกดำเนินการก่อนตัวควบคุมแต่ละตัวของโมดูลนั้น - person Ali MasudianPour; 28.11.2014
comment
ฉันแค่ต้องรันโค้ดก่อนดำเนินการทุกครั้ง ซึ่งไม่เกี่ยวข้องกับฟอร์มหรือฐานข้อมูลใดๆ ฉันใช้โมดูลในโฟลเดอร์ผู้ขาย ไม่ใช่ในโฟลเดอร์แบ็กเอนด์ ในโฟลเดอร์แบ็กเอนด์ฉันใช้เฉพาะคอนโทรลเลอร์และโมเดลเท่านั้น - person Misko Mali; 28.11.2014
comment
ฉันจะต้องลองด้วยตัวเอง :) ฉันไม่รู้ว่ามันจะทำงานอย่างไรเพราะฉันไม่เห็นความเชื่อมโยงระหว่าง MyGlobalClass ของคุณกับคอนโทรลเลอร์ คุณไม่ควรทำให้ MyGlobalClass ใช้แทน \yii\base\Component หรือไม่ - person Mihai P.; 28.11.2014
comment
@MihaiP. ไม่ที่รัก นี่เป็นเพียงคลาส (ส่วนประกอบ วัตถุ เหตุการณ์ หรือพฤติกรรม) ซึ่งจะเริ่มต้นในบูตสแตรปของแอปพลิเคชัน ทันทีที่แอปพลิเคชันทำงาน เมธอด init() ของคลาสนี้จะถูกเรียก - person Ali MasudianPour; 28.11.2014
comment
คุณพูดถูกฉันไม่ได้คิดอย่างนั้น :) - person Mihai P.; 28.11.2014
comment
พูดตามตรงสิ่งที่เขาต้องการทำให้สำเร็จนั้นค่อนข้างบ้า เขาจะไม่สามารถเข้าสู่ระบบได้เพราะเขาจะไม่สามารถเข้าถึงคอนโทรลเลอร์ / การกระทำใด ๆ - person Mihai P.; 28.11.2014
comment
ฉันได้ลองสิ่งนี้แล้ว ฉันกำลังสร้างแอปพลิเคชันที่สงบ และฉันต้องการการตอบสนองทั้งหมดเพื่อส่งคืนเป็นรูปแบบ json (สำหรับตอนนี้ด้วยเหตุผลบางอย่าง การตอบสนองทั้งหมดอยู่ในรูปแบบ xml) ฉันแค่ดำเนินการคำสั่งเพื่อเปลี่ยนรูปแบบการตอบสนอง แต่มันไม่ได้ งาน - person Oscar Reyes; 11.11.2015
comment
ใช้งานได้หากคลาสของคุณขยาย BaseObject ฉันใช้งานได้ในแบ็กเอนด์ของเทมเพลตขั้นสูงเพื่อให้แน่ใจว่า date_default_timezone_set จะทำงานสำหรับการดำเนินการทั้งหมดในตัวควบคุมทั้งหมด ในส่วนหน้า .htaccess จะทำให้ทุกอย่างผ่าน actionIndex ดังนั้นจึงง่ายกว่า - person Rich Harding; 19.04.2018

เพียงเพิ่มไฟล์ปรับแต่งลงในอาร์เรย์ $config:

    'on beforeAction' => function ($event) {
           echo "Hello";
    },
person Ruslan Novikov    schedule 10.03.2015
comment
อันนี้ดีที่สุดสำหรับการจัดการเหตุการณ์ 'ทั่วโลก' beforeAction - person leealex; 18.10.2017
comment
ใช่ มันดีมาก และฉันคิดว่ามันจะเป็นคำตอบที่ดีที่สุด! - person kiamoz; 05.01.2018

แค่ฉันคิดว่ารหัสนี้ในไฟล์ปรับแต่งสามารถช่วยคุณได้:

'on beforeAction' => function ($event) {
      // To log all request information
},
'components' => [
    'response' => [
        'on beforeSend' => function($event) {
            // To log all response information
        },
    ],
];
person Sajjad Dehghani    schedule 17.11.2018

หรือ https://github.com/yiisoft/yii2/blob/master/docs/guide/security-authorization.md ใช้ RBAC เพื่อจำกัดการเข้าถึงการดำเนินการของผู้ควบคุมทีละรายการตามกฎ เหตุใดคุณจึงต้องการจำกัดการเข้าถึงการดำเนินการของคอนโทรลเลอร์ตามฟิลด์ผู้ใช้ที่อยู่นอกเหนือฉัน คุณจะไม่สามารถเข้าถึงสิ่งใดๆ ได้ (รวมถึงแบบฟอร์มเข้าสู่ระบบ) หากคุณใส่ข้อจำกัดไว้

person Mihai P.    schedule 28.11.2014