Jalankan kode saya sebelum tindakan apa pun dari pengontrol apa pun

Saya ingin memeriksa apakah pengguna saya telah mengisi kolom tertentu di profilnya sebelum dia dapat mengakses tindakan apa pun dari pengontrol mana pun. Misalnya

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

Di yii1 saya bisa melakukannya di protected\components\Controller.php di fungsi init() Tapi di yii2 saya tidak yakin di mana harus meletakkan kode saya. Saya tidak dapat mengubah file inti, tetapi tidak yakin apa yang harus dilakukan di backend aplikasi lanjutan saya agar dapat berfungsi.

Saya tahu saya dapat menggunakan beforeAction() tetapi saya memiliki terlalu banyak pengontrol untuk melakukan itu dan melacak setiap pengontrol


person Misko Mali    schedule 27.11.2014    source sumber


Jawaban (4)


Jika Anda perlu mengeksekusi kode sebelum setiap pengontrol dan tindakan, Anda dapat melakukan seperti di bawah ini:

1 - Tambahkan komponen ke direktori komponen Anda, misalnya (MyGlobalClass):

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

2 - Tambahkan komponen MyGlobalClass ke dalam array komponen Anda di file konfigurasi:

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

3 - Tambahkan MyGlobalClass ke dalam array bootstarp di file konfigurasi:

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

Sekarang, Anda dapat melihat Hi sebelum setiap tindakan.

Harap diperhatikan bahwa, jika Anda tidak perlu menggunakan Events dan Behaviors Anda dapat menggunakan \yii\base\Object daripada \yii\base\Component

person Ali MasudianPour    schedule 27.11.2014
comment
@MiskoMali Apakah Anda menggunakan modul? - person Ali MasudianPour; 28.11.2014
comment
Hal lain, apakah Anda perlu berinteraksi dengan formulir? atau Anda hanya perlu mengeksekusi beberapa kode sebelum setiap tindakan pengontrol? dalam hal formulir, jika Anda menggunakan model, Anda dapat menggunakan beforeValidate() - person Ali MasudianPour; 28.11.2014
comment
@MiskoMali Nah, jika Anda menggunakan modul, Anda dapat menulis kode Anda dalam metode init() yang akan dieksekusi sebelum setiap pengontrol modul itu - person Ali MasudianPour; 28.11.2014
comment
Saya hanya perlu menjalankan beberapa kode sebelum setiap tindakan, tidak terkait dengan formulir atau database apa pun. Saya menggunakan modul di folder vendor, bukan di folder backend. Di folder backend saya hanya menggunakan Controller dan Model - person Misko Mali; 28.11.2014
comment
Saya harus mencobanya sendiri :), Saya tidak tahu cara kerjanya karena saya tidak melihat hubungan antara MyGlobalClass Anda dan pengontrol. Bukankah sebaiknya Anda menjadikan MyGlobalClass sebagai ganti \yii\base\Component ? - person Mihai P.; 28.11.2014
comment
@MihaiP. Tidak sayang, Ini hanya sebuah kelas (komponen, objek, peristiwa atau perilaku) yang akan dimulai dalam bootstrap aplikasi. Segera setelah aplikasi berjalan, metode init() kelas ini akan dipanggil. - person Ali MasudianPour; 28.11.2014
comment
Anda benar, saya tidak berpikir seperti itu :). - person Mihai P.; 28.11.2014
comment
Sejujurnya apa yang ingin dia capai agak gila, dia tidak akan bisa login karena dia tidak memiliki akses ke pengontrol/tindakan apa pun. - person Mihai P.; 28.11.2014
comment
Saya telah mencoba ini, saya membuat aplikasi yang tenang dan saya memerlukan semua respons untuk kembali sebagai format json (untuk saat ini karena alasan tertentu semua respons dalam xml), saya hanya menjalankan perintah untuk mengubah format respons, tetapi tidak bekerja - person Oscar Reyes; 11.11.2015
comment
Juga berfungsi jika kelas Anda memperluas BaseObject. Saya memiliki ini berfungsi di backend templat Tingkat Lanjut, untuk memastikan date_default_timezone_set berjalan untuk semua tindakan di semua pengontrol. Di frontend, .htaccess menyebabkan semuanya melalui actionIndex, jadi lebih mudah di sana. - person Rich Harding; 19.04.2018

Cukup tambahkan file konfigurasi ke dalam array $config:

    'on beforeAction' => function ($event) {
           echo "Hello";
    },
person Ruslan Novikov    schedule 10.03.2015
comment
Yang ini adalah yang terbaik untuk menangani acara BeforeAction 'global'. - person leealex; 18.10.2017
comment
ya itu sangat bagus dan menurut saya itu akan menjadi jawaban terbaik! - person kiamoz; 05.01.2018

Menurut saya kode pada file konfigurasi ini dapat membantu Anda:

'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

Atau, https://github.com/yiisoft/yii2/blob/master/docs/guide/security-authorization.md gunakan RBAC, untuk membatasi akses ke tindakan pengontrol satu per satu berdasarkan aturan. Mengapa Anda ingin membatasi akses ke tindakan pengontrol berdasarkan bidang pengguna berada di luar jangkauan saya. Anda tidak akan dapat mengakses apa pun (termasuk formulir login) jika Anda membatasinya.

person Mihai P.    schedule 28.11.2014