Memahami Application.cfc: Jantung Setiap Aplikasi Lucee
Ketahui fungsi Application.cfc: onApplicationStart, onRequestStart, onSessionStart dan onError, tetapan this.name dan this.datasource, serta contoh penuh.

Kandungan
- Memahami Application.cfc: Jantung Setiap Aplikasi Lucee
- Apa Itu Application.cfc dan Di Mana Ia Diletakkan
- Application.cfc Berbanding Application.cfm Lama
- Struktur Asas Application.cfc
- Tetapan Penting dalam this Scope
- onApplicationStart: Satu Kali Semasa Aplikasi Bermula
- onRequestStart dan onRequestEnd
- onSessionStart dan onSessionEnd
- onError dan Pengendalian Ralat Berpusat
- Contoh Penuh Application.cfc yang Berfungsi
- Kesilapan Biasa dan Cara Mengelakkannya
- Soalan Lazim (FAQ)
- Sumber
Memahami Application.cfc: Jantung Setiap Aplikasi Lucee
Application.cfc ialah komponen yang anda letakkan dalam direktori aplikasi web, dan Lucee akan mengambilnya secara automatik sebagai sebahagian daripada setiap permintaan. Ia menentukan konfigurasi aplikasi seperti this.name, this.datasource dan pengurusan sesi, serta menyediakan fungsi kitaran hayat seperti onApplicationStart, onRequestStart, onSessionStart dan onError. Memahami Application.cfc ialah asas wajib kerana hampir semua tetapan peringkat aplikasi dan logik permulaan berpusat di sini.
Apa Itu Application.cfc dan Di Mana Ia Diletakkan
Application.cfc ialah komponen CFML yang mentakrifkan konteks aplikasi. Lucee mencari fail ini bermula dari direktori semasa dan menuju ke akar web, dan secara lalai ia memilih Application.cfc yang paling hampir dengan fail yang diminta. Ini bermakna satu laman web boleh mempunyai lebih daripada satu Application.cfc: contohnya, folder /shop boleh mempunyai Application.cfc sendiri yang menghidupkan sesi, manakala bahagian lain laman web tidak.
Konfigurasi asas Lucee ditetapkan melalui pentadbir atau fail .CFConfig.json, dan setiap Application.cfc boleh menimpa tetapan itu pada peringkat aplikasi. Anda boleh menyemak konfigurasi semasa yang berkuat kuasa dengan fungsi GetApplicationSettings(), yang menggabungkan tetapan pelayan dengan tetapan aplikasi.
Application.cfc Berbanding Application.cfm Lama
Sebelum Application.cfc menjadi piawaian, pembangun menggunakan Application.cfm, iaitu templat biasa yang dijalankan sebelum setiap permintaan. Application.cfm pada dasarnya bertindak seperti fungsi onRequestStart secara tersirat, dan tetapan diletakkan melalui tag cfapplication.
Application.cfc pula ialah komponen sebenar dengan kelebihan yang jelas. Fungsi onXxx memberikan pemisahan kebimbangan yang jelas dan pelaksanaan benang tunggal secara tersirat apabila dipanggil oleh Lucee, satu perkara yang sukar ditiru dalam Application.cfm. Kaedah onRequest pula bertindak sebagai pengawal hadapan yang tidak ada padanannya dalam Application.cfm. Selain itu, semakin banyak tetapan seperti ORM dan datasource lalai hanya boleh ditetapkan sebagai struct dalam Application.cfc, jadi hampir semua aplikasi moden perlu berpindah ke sini. Untuk pengenalan ORM, baca pengenalan ORM Hibernate.
Struktur Asas Application.cfc
Contoh paling ringkas Application.cfc kelihatan seperti ini:
component {
this.name = "aplikasiSaya";
this.sessionManagement = true;
this.sessionTimeout = createTimeSpan(0, 0, 30, 0);
public boolean function onApplicationStart() {
application.startedAt = now();
return true;
}
}
Nilai dalam this diletakkan dalam pseudo-constructor, iaitu di luar mana-mana kaedah. Perhatikan bahawa this merujuk kepada tetapan aplikasi, manakala application ialah scope yang menyimpan data aplikasi sepanjang hayatnya. Perbezaan antara kedua-duanya penting dan dibincangkan secara terperinci dalam memahami scope CFML.
Tetapan Penting dalam this Scope
Jadual berikut menyenaraikan tetapan this yang paling kerap digunakan dalam aplikasi sebenar:
| Tetapan | Fungsi |
|---|---|
| this.name | Nama unik aplikasi, sehingga 64 aksara |
| this.datasource | Datasource pangkalan data lalai untuk aplikasi |
| this.sessionManagement | Hidupkan atau matikan pemboleh ubah sesi (lalai tidak aktif) |
| this.sessionTimeout | Tempoh luput sesi |
| this.applicationTimeout | Tempoh luput konteks aplikasi |
| this.mappings | Pemetaan direktori tersuai |
this.datasource menentukan pangkalan data yang digunakan oleh tag cfquery apabila atribut datasource tidak dinyatakan secara jelas. this.name pula wajib untuk membolehkan pemboleh ubah application dan session berfungsi. Untuk butiran menyambung pangkalan data, rujuk panduan konfigurasi datasource.
onApplicationStart: Satu Kali Semasa Aplikasi Bermula
onApplicationStart dipanggil apabila tiada konteks aplikasi wujud, iaitu biasanya pada permintaan pertama. Gunakannya untuk memuatkan data global dan objek ke dalam scope application:
public boolean function onApplicationStart() {
application.settings = loadSettings();
application.services = { users: new UserService() };
return true;
}
Jika fungsi ini memulangkan false atau melontar ralat, konteks aplikasi tidak dimulakan dan permintaan seterusnya akan memanggil onApplicationStart semula. Fungsi ini selamat untuk benang (thread safe). Lawannya ialah onApplicationEnd, yang dipanggil apabila konteks aplikasi tamat tempoh dan menerima scope application yang berakhir sebagai argumen.
onRequestStart dan onRequestEnd
onRequestStart dipanggil sebelum setiap permintaan, menjadikannya tempat yang sesuai untuk kawalan akses dan penyediaan pemboleh ubah per-permintaan:
public boolean function onRequestStart(required string targetPage) {
if (!structKeyExists(session, "user")) {
location(url = "/login", addToken = false);
}
return true;
}
Jika fungsi ini memulangkan false, Lucee menghentikan pelaksanaan permintaan dan memulangkan hasil kepada klien. onRequestEnd pula dipanggil selepas setiap permintaan dan sesuai untuk kerja pembersihan seperti mencetak pengaki HTML atau melepaskan sumber. Jika anda mentakrifkan kaedah onRequest, Lucee hanya melaksanakan kaedah itu dan tidak lagi mencari halaman sasaran, menjadikannya sesuai untuk corak pengawal hadapan.
onSessionStart dan onSessionEnd
onSessionStart dipanggil untuk setiap permintaan yang belum mempunyai sesi dalam konteks aplikasi semasa, jadi ia tempat yang betul untuk memulakan data sesi pengguna. onSessionEnd dipanggil apabila sesi tamat tempoh dan menerima scope session serta application sebagai argumen, sesuai untuk kerja pembersihan. Perhatikan bahawa onSessionEnd tidak dipanggil serta-merta apabila sessionTimeout dicapai, ia dipanggil apabila proses pembersihan latar belakang membersihkan scope yang tamat tempoh, dan proses itu berjalan setiap minit secara lalai. Untuk perbincangan penuh tentang sesi, baca panduan pengurusan sesi session.
onError dan Pengendalian Ralat Berpusat
onError dipanggil apabila ralat yang tidak ditangkap berlaku dalam konteks aplikasi. Ia menerima exception dan eventName sebagai argumen:
public void function onError(any exception, string eventName) {
writeLog(file = "app", text = exception.message);
include "error.cfm";
}
Gunakan onError untuk logging berpusat dan paparan halaman ralat tersuai. Selain onError, Application.cfc turut menyokong onAbort, onMissingTemplate dan onDebug untuk senario khusus. Jika anda mengamalkan keselamatan, header keselamatan biasanya ditetapkan dalam onRequestStart supaya setiap halaman mewarisinya, seperti yang diterangkan dalam panduan keselamatan web XSS dan CSRF.
Contoh Penuh Application.cfc yang Berfungsi
Contoh lengkap berikut menggabungkan tetapan dan kitaran hayat dalam satu fail yang boleh terus digunakan:
component {
this.name = "kedaiOnline";
this.datasource = "kedaiDB";
this.sessionManagement = true;
this.sessionTimeout = createTimeSpan(0, 0, 30, 0);
this.applicationTimeout = createTimeSpan(1, 0, 0, 0);
this.mappings = { "/model": expandPath("./model") };
public boolean function onApplicationStart() {
application.mulaPada = now();
application.katalog = loadKatalog();
return true;
}
public boolean function onRequestStart(required string targetPage) {
if (!structKeyExists(session, "user") && !listFindNoCase("login.cfm", targetPage)) {
location(url = "/login.cfm", addToken = false);
}
return true;
}
public void function onError(any exception, string eventName) {
writeLog(file = "kedaiOnline", text = exception.message);
include "error.cfm";
}
}
Contoh ini menunjukkan susunan yang lazim: tetapan di pseudo-constructor, pemuatan data global dalam onApplicationStart, kawalan akses dalam onRequestStart, dan logging ralat dalam onError. Anda boleh mengubah suai tetapan mengikut keperluan aplikasi anda.
Kesilapan Biasa dan Cara Mengelakkannya
- Meletakkan logik berat dalam pseudo-constructor. Kod di luar kaedah dijalankan pada setiap permintaan, jadi letakkan kerja permulaan dalam onApplicationStart.
- Mengelirukan this dengan application. this ialah tetapan konfigurasi, manakala application ialah data yang dikongsi sepanjang hayat aplikasi.
- Tidak memulangkan true dalam onApplicationStart atau onRequestStart, yang boleh menghentikan permintaan secara tidak sengaja.
- Menyimpan objek besar dalam session, yang membebankan ingatan untuk setiap pengguna serentak.
- Bergantung pada onSessionEnd untuk pembersihan kritikal, kerana masa panggilannya dikawal oleh proses pembersihan latar belakang.
Soalan Lazim (FAQ)
Di mana saya letakkan Application.cfc?
Letakkan dalam direktori akar aplikasi web anda. Lucee mencari fail ini secara automatik dan memilih yang paling hampir dengan fail yang diminta.
Adakah Application.cfc dijalankan pada setiap permintaan?
Ya, contoh baharu dicipta pada setiap permintaan, tetapi fungsi seperti onApplicationStart hanya dijalankan sekali semasa aplikasi bermula.
Bolehkah saya mempunyai lebih daripada satu Application.cfc?
Ya. Setiap direktori boleh mempunyai Application.cfc sendiri, membolehkan konfigurasi berbeza untuk sub-aplikasi seperti /shop atau /admin.
Apakah perbezaan Application.cfc dan Application.cfm?
Application.cfm ialah templat lama yang dijalankan sebelum setiap permintaan tanpa kitaran hayat berstruktur. Application.cfc ialah komponen dengan fungsi kitaran hayat dan tetapan this yang lebih lengkap.
Bagaimana saya mematikan ORM atau caching daripada Application.cfc?
Tetapan seperti this.ormEnabled dan this.ormSettings diletakkan dalam Application.cfc, dan banyak ciri lanjutan lain hanya boleh dikonfigurasi di sini atau melalui .CFConfig.json.