אפליקציה
===========

האפליקציה מהווה עיבוד ראשוני של הבקשות אשר נכנסות למערכת. המטרה העיקרית שלה היא לקבל את בקשת המשתמש ולהפנות אותה לקונטרולר המתאים להמשך עיבוד הנתונים. בנוסף היא משמשת לחלק המרכזי של כל ההגדרות באפליקציה. מסיבה זו,האפליקציה נקראת גם בשם 'קונטרולר-ראשי'.

האפליקציה נוצרת על ידי [סקריפט הכניסה הראשי](/doc/guide/basics.entry).
ניתן לגשת לכל אובייקט וערך באפליקציה בעזרת [Yii::app()|YiiBase::app].


הגדרות האפליקציה
-------------------------

כברירת מחדל, אפליקציה היא אובייקט של [CWebApplication]. להתאמה אישית, אנחנו בדרך כלל מספקים קובץ הגדרות (או מערך) כדי לאתחל את המאפיינים של קובץ/מערך ההגדרות בעת יצירת האפליקציה. דרך נוספת להתאמה אישית של האפליקציה היא על ידי הרחבת [CWebApplication].

ההגדרות הם מערך של אלמנטים בפורמט של מפתח=>ערך. כל מפתח מייצג את שמו של המאפיין באובייקט של האפליקציה, וכל ערך את ערך ברירת המחדל של אותו מאפיין. לדוגמא, ההגדרות הבאות מגדירות את [שם האפליקציה|CApplication::name] ו [קונטרולר ברירת המחדל|CWebApplication::defaultController] של האפליקציה.

~~~
[php]
array(
    'name'=>'Yii Framework',
    'defaultController'=>'site',
)
~~~

בדרך כלל אנחנו שומרים את קובץ ההגדרות של האפליקציה בקובץ PHP נפרד (לדוגמא `protected/config/main.php`). בתוך הקובץ אנחנו מחזירים את מערך ההגדרות בצורה הבאה,

~~~
[php]
return array(...);
~~~

כדי ליישם את ההגדרות, אנחנו מעבירים את שם קובץ ההגדרות כפרמטר לקונסטרקטור (constructor) של האפליקציה, או ל [Yii::createWebApplication()] כמו הדוגמא הבאה, שבדרך כלל נעשית ב [סקריפט הכניסה הראשי](/doc/guide/basics.entry).

~~~
[php]
$app=Yii::createWebApplication($configFile);
~~~

> Tip|טיפ: אם ההגדרות של האפליקציה הם מורכבות, ניתן לפצל אותם לכמה קבצים, כל אחד מחזיר חלק אחר ממערך ההגדרות הכולל. לאחר מכן, בקובץ ההגדרות הראשי של האפליקציה ניתן להשתמש בפונקצית ה `include` של PHP כדי להוסיף את שאר קבצי ההגדרות ולאחד אותם למערך הגדרות אחד כולל.

ספרית הבסיס של האפליקציה
--------------------------

ספרית הבסיס של האפליקציה מתיחחסת לתיקיה הראשית אשר מכילה את כל קבצי ה PHP והמידע של המערכת, הרגישים מבחינת אבטחה. כברירת מחדל, זוהי תת תיקיה בשם `protected` אשר נמצאת תחת התיקיה אשר מכילה את סקריפט הכניסה הראשי. ניתן לשנותה על ידי הגדרת המאפיין [basePath|CWebApplication::basePath]  [בהגדרות האפליקציה](#application-configuration).

התוכן תחת התיקיה הראשית של האפליקציה צריך להיות מוגן מגישה וצפייה ישירה ועקיפה על ידי משתמשים. בעזרת  [Apache HTTP](http://httpd.apache.org/), ניתן לבצע זאת בצורה פשוטה על ידי הוספת קובץ `htaccess.` תחת התיקיה הראשית. הקובץ `htaccess.` אמור להכיל את הקוד הבא,

~~~
deny from all
~~~

רכיב האפליקציה
---------------------

הפונקציונליות של האפליקציה ניתנת להתאמה אישית בצורה קלה בעזרת הארכיטקטורה הגמישה של רכיב זה. האפליקציה מנהלת סט של רכיבי-אפליקציה, כל אחד מיישם אפשרויות מסויימות. לדוגמא, האפליקציה נעזרת ברכיבים [CUrlManager] ו [CHttpRequest] כדי לקבל את בקשת המשתמש ולנתב אותה למקום המתאים.

על ידי הגדרת ערך [הרכיבים|CApplication::components] באפליקציה, ניתן להגדיר בצורה אישית את הערכים והמחלקה של כל רכיב אשר משתמשים בו באפליקציה. לדוגמא, ניתן להגדיר את הרכיב [CMemCache] בצורה כזו שיעבוד מול כמה שרתי memcache כדי לשמור תוכן במטמון,

~~~
[php]
array(
    ......
    'components'=>array(
        ......
        'cache'=>array(
            'class'=>'CMemCache',
            'servers'=>array(
                array('host'=>'server1', 'port'=>11211, 'weight'=>60),
                array('host'=>'server2', 'port'=>11211, 'weight'=>40),
            ),
        ),
    ),
)
~~~

בקוד המוצג למעלה, אנחנו מוסיפים את האלמנט `cache` למערך של ה `components`. האלמנט `cache` הצהיר שהמחלקה של הרכיב הזה הינה `CMemCache` והערך של `servers` (שרתים) צריך להיות מוגדר כפי שהוא מוצג בקוד למעלה.

כדי לגשת לרכיב באפליקציה, יש להשתמש ב `Yii::app()->ComponentID`, כש `ComponentID` מתייחס לשם היחודי של הרכיב (לדוגמא `Yii::app()->cache`).

ניתן לכבות כל רכיב באפליקציה על ידי הגדרת הערך `enabled` ל false בהגדרות של אותו רכיב. ברגע שננסה לגשת לרכיב שהוא לא פעיל נקבל את הערך השווה ל Null.

> Tip|טיפ: כברירת מחדל, רכיבים באפליקציה נוצרים בעת בקשתם. זה אומר שרכיב באפליקציה יכול לא להווצר כלל אם לא קראו לו במהלך הבקשה של המשתמש. כתוצאה מכך, הביצועים הכללים של האפליקציה לא מושפעים גם אם האפליקציה מוגדרת עם הרבה רכיבים. חלק מהרכיבים באפליקציה (לדוגמא [CLogRouter]) צריכים להווצר בכל מקרה בין אם קראו לאותו רכיב או לא. כדי לבצע זאת, רשום את המזהה היחודי שלהם במאפיין [preload|CApplication::preload] (טעינה מראש) של האפליקציה.


רכיבים מרכזיים באפליקציה
---------------------------

Yii מגדירה מראש סט של רכיבים מרכזיים באפליקציה כדי לספק אפשרויות משותפות בקרב אפליקציות ווב. לדוגמא, הרכיב [request|CWebApplication::request] מעבד את בקשת המשתמש ומאפשר שימוש במידע כגון קישורים, עוגיות. על ידי הגדרת המאפיינים של רכיבים בסיסיים אלו, ניתן לשנות את אופי ההתנהלות של Yii בכל היבט כמעט.

למטה מופיעים הרכיבים הבסיסיים שמוגדרים מראש על ידי [CWebApplication].


- [assetManager|CWebApplication::assetManager]: [CAssetManager] -
מנהל פרסום של קבצי הנכסים הפרטיים (בדרך כלל קבצי JS, CSS ותמונות).

- [authManager|CWebApplication::authManager]: [CAuthManager] - ניהול בקרת גישות

- [cache|CApplication::cache]: [CCache] - מספק פונקציונליות לניהול מטמון. הערה, הינך חייב לציין את שם המחלקה (לדוגמא
[CMemCache], [CDbCache]). אחרת, יוחזר ערך השווה ל Null ברגע שתנסה לגשת לרכיב זה.

- [clientScript|CWebApplication::clientScript]: [CClientScript] -
ניהול סקריפטים בצד הלקוח (קבצי CSS ו JS).

- [coreMessages|CApplication::coreMessages]: [CPhpMessageSource] -
מספק תרגום של משפטי המקור אשר מוגדרים במערכת הפנימית של Yii.

- [db|CApplication::db]: [CDbConnection] - מספק את החיבור של מסד הנתונים. הערה, הינך חייב להגדיר את המאפיין
[connectionString|CDbConnection::connectionString] כדי להשתמש ברכיב זה.

- [errorHandler|CApplication::errorHandler]: [CErrorHandler] - טיפול בשגיאות PHP ושגיאות חריגות אחרות שלא נתפסו.

- [format|CApplication::format]: [CFormatter] - מעבד מידע למטרת תצוגה בלבד. אפשרות זאת קיימת מגרסא 1.1.0.

- [messages|CApplication::messages]: [CPhpMessageSource] - מספק ניהול תרגומים של האפליקציה עצמה.

- [request|CWebApplication::request]: [CHttpRequest] - מספק מידע הקשור לבקשת המשתמש.

- [securityManager|CApplication::securityManager]: [CSecurityManager] -
מספק שירותים הקשורים לאבטחת מידע, כגון יצירת HASH והצפנה.

- [session|CWebApplication::session]: [CHttpSession] - מאפשר שימוש ב SESSIONS.

- [statePersister|CApplication::statePersister]: [CStatePersister] -
מאפשר ניהול של מידע אשר שמור באופן קבוע.

- [urlManager|CWebApplication::urlManager]: [CUrlManager] - מאפשר עיבוד של קישורים ויצירתם.

- [user|CWebApplication::user]: [CWebUser] - מייצג את זהות המשתמש הנוכחי.

- [themeManager|CWebApplication::themeManager]: [CThemeManager] - ניהול תבניות.


מחזור החיים של האפליקציה
----------------------

בעת טיפול בבקשת המשתמש, אפליקציה תעבור במחזור החיים הבא:

0. אתחול האפליקציה בעזרת [CApplication::preinit];

1. הגדרת מחלקת הטעינה האוטומטית ומחלקת טיפול בשגיאות;

2. רישום רכיבים בסיסים של האפליקציה;

3. טעינת הגדרות האפליקציה;

4. אתחול האפליקציה בעזרת [CApplication::init]
- רישום התנהלות האפליקציה;
- טעינת רכיבים סטטיים של האפליקציה;

5. העלאת אירוע [onBeginRequest|CApplication::onBeginRequest];

6. תהליך עיבוד בקשת המשתמש:
- עיבוד הבקשה;
- יצירת קונטרולר;
- הרצת קונטרולר;

7. העלאת אירוע [onEndRequest|CApplication::onEndRequest];


<div class="revision">$Id: basics.application.txt 1601 2009-12-18 04:31:19Z qiang.xue $</div>