Mengembalikan $ ini setelah pengamat


27

Saya melihat beberapa informasi yang saling bertentangan di internet dan dalam modul pihak ke-3 - apakah itu persyaratan atau praktik terbaik untuk kembali $thispada akhir metode pengamat?

Misalnya:

MyCompany_Module_Model_Observer.php

public function salesOrderSaveAfter($observer){
    //do stuff
    return $this;
}

Jawaban:


30

Inti selalu return $this;dalam konteks metode pengamat - tetapi sebenarnya tidak ada alasan untuk itu.

Menelusuri kembali dispatchEvent()Anda akan menemukan metode utama yang memanggil metode pengamat (dalam ./app/Core/Model/App.php)

protected function _callObserverMethod($object, $method, $observer)
{
    if (method_exists($object, $method)) {
        $object->$method($observer);
    } elseif (Mage::getIsDeveloperMode()) {
        Mage::throwException('Method "'.$method.'" is not defined in "'.get_class($object).'"');
    }
    return $this;
}

Tetapi tidak ada nilai balik yang pernah benar-benar digunakan atau direferensikan untuk diteruskan ke pengamat lain di rantai.

Mungkin Magento berpikir jangka panjang untuk menggunakannya sebagai beberapa cara untuk menyimpan / meneruskan data dalam $thisinstance kelas di luar penggunaan sesi / registri; atau bisa jadi kode warisan yang baru saja macet .

Saya tidak bisa melihat alasan kuat untuk return $this- tetapi itu dikatakan, jika mereka melakukannya pada intinya, itulah yang kami lakukan.

Sebagai aturan umum, apa pun yang dilakukan inti - kami anggap praktik terbaik. Dengan pengecualian dari kesalahan ejaan yang mengejutkan :)


6
"Ukringlish" :-)
benmarks

Saya malu mengakui bahwa saya kadang-kadang mengembalikan $ pengamat untuk menyingkirkan peringatan IDE dari parameter yang tidak digunakan ...
Daniel Sloof

@Aniel - jangan tambahkan param di tanda tangan pengamat. PHP tidak masalah. Tapi sekali lagi, param yang lulus mungkin diperlukan di masa depan.
nevvermind

7

$ this (pun intended) disebut antarmuka yang lancar. Ini memungkinkan Anda untuk memanggil beberapa metode dalam suatu objek tanpa harus merujuk kembali ke variabel yang ditentukan.


1
Terima kasih - Saya mengerti antarmuka yang lancar. Saya mencari alasan kuat untuk kembali $thisketika tidak ada gunanya untuk antarmuka yang lancar pada pengamat.
philwinkle

1
@Kevin - Anda tidak perlu antarmuka yang lancar di pengamat Mage. Tidak yang saya tahu.
nevvermind

5

Ini hanya sebuah konvensi Magento untuk selalu kembali $thisalih-alih void(tidak ada) jika suatu metode tidak memiliki nilai balik lain, terlepas dari itu sebenarnya digunakan untuk antarmuka yang lancar di mana saja atau tidak.

Keuntungannya adalah, Anda tidak perlu memikirkan apakah itu berguna atau tidak, dan antarmuka yang lancar lebih baik daripada yang hilang. Juga, Magento mungkin mulai menggunakannya untuk pengamat, meskipun ini sangat tidak mungkin.


0

Beberapa tahun kemudian ... :)

Inti selalu mengembalikan $ this; dalam konteks metode pengamat - [...]

atau

Ini hanya sebuah konvensi Magento untuk selalu mengembalikan $ this daripada batal (tidak ada) jika suatu metode tidak memiliki nilai pengembalian lainnya [...]

Tidak benar-benar. Hanya memeriksa beberapa pengamat di 1.9.3.x dan banyak yang tidak mengembalikan apa-apa ( void). Jadi tidak benar-benar jelas "apa yang dilakukan kode inti";)

Saya telah menggunakan $return $this;kode saya juga, tetapi hari ini - tidak akan ada perubahan dalam kode M1 - Saya akan meninggalkannya. Saya pikir - jika saya membaca kode orang lain - voidmetode lebih jelas daripada yang ditambahkan secara membabi buta return $this, yang tidak pernah digunakan.


Edit:

Jika menggunakan Aoe_Scheduler, Anda juga dapat mengembalikan stringatau arraymenampilkannya dalam riwayat cron.

masukkan deskripsi gambar di sini

Tidak dapat menemukan dokumen untuk fitur ini ... kode terkait di sini: https://github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.