آغاز کار با سیمفونی
به نظر بنده بهترین مرجع برای شروع سیمفونی (Symfony) همان پروژه Jobeet است که به شما آموزش میدهد که چگونه بوسیله این فریمورک در مدت ۲۴ ساعت (روز) یک برنامه تحت وب کار آمد را بصورت کاملاْ حرفهای تولید کنید. البته اشاره به این نکته هم خالی از لطف نیست که این آموزش ۲۴ قسمتی یکی از مزایای سیمفونی در مقابل رقبای قدرتمند خود همچون Zend و CakePHP است. چرا که تولید برنامهای با این قدرت در همان ابتدای راه، نشان دهنده قدرت و در عین حال سادگی سیمفونی می باشد.
در ادامه به ترجمه بخش اول این کتاب (جدای از مقدمه) میپردازیم. (طبق معمول ترجمهای پر از اشکال که به عظمت سیمفونی ببخشید)
امروز چکار میکنیم؟
۲۴ ساعت زمان مناسبی برای توسعه یک برنامه توسط سیمفونی است (در سال صرفه جویی و اصلاح الگوی مصرف، واقعا تا این حد صرفه جویی در زمان کار بسیار پسندیدهای است). امروز هیچ کدی نمینویسیم. اما بدون نوشتن حتی یک خط کد، میتوانیم مزایای استفاده از سیمفونی را تنها با راه اندازی یک پروژه جدید درک کنیم.
هدف امروز ما، راه اندازی محیط توسعه و نمایش صفحهای از برنامه در مرورگر است. اینکار شامل نصب سیمفونی، ایجاد برنامه و تنظیمات وب سرور میشود.
پیشنیازها
قبل از هر چیز محیط توسعه رو چک میکنیم. یک وب سرور (ترجیحاْ Apache)، یک موتور پایگاه داده (ترجیحاْ MySQL) و PHP نسخه ۵.۲.۴ و یا جدیدتر!
در سیمفونی به وفور از خط فرمان استفاده میکنیم، پس بهتر است تا از سیستمهای مبتنی بر Unix (ترجیحاْ لینوکس OpenSUSE که دلیلش هم بعداْ میگم!!!) استفاده کنید. البته ویندوز هم میشه ولی نه با این کیفیت!
در ادامه این مباحث بیشتر توجه ما به روی سیمفونی است و فرض را بر این میگذاریم که شما اطلاعات خوبی راجع به PHP 5 و OOP یا همون Object Oriented Programming میدانید.
برای آشنایی خیلی سریع با برنامه نویسی شیگرا این تاپیک را مطالعه کنید.
نصب سیمفونی
ابتدا برای میزبانی فایلهای مرتبط با پروژه Jobeet یک پوشه میسازیم و بهتر است این کار را توسط خط فرمان انجام دهیم.
$ mkdir -p /home/sfprojects/jobeet $ cd /home/sfprojects/jobeet
حالا یک پوشه هم برای فایلهای کتابخانهای سیمفونی میسازیم
$ mkdir -p lib/vendor
صفحه نصب در سایت رسمی پروژه تمام نسخههای مجاز رو لیست و مقایسه کرده. این آموزش نیز برای ورژن ۱.۲ نوشته شده است. به صفحه نصب این نسخه بروید و در قسمت زیرین Source Download، آرشیوی از فرمتهای tgz و یا zip رو میتونید پیدا کنید. آرشیو را دانلود کرده و در پوشهای که به تازگی ایجاد کردید قرار دهید و سپس آن را از حالت فشرده خارج کنید و البته باز هم سعی کنید اینکار را با استفاده از Terminal انجام دهید!
$ cd lib/vendor $ tar zxpf symfony-1.2.2.tgz $ mv symfony-1.2.2 symfony $ rm symfony-1.2.2.tgz
از آنجایی که پیکربندی PHP بواسطه وجود نسخههای مختلف بسیار متفاوت است، ما نیاز به بررسی پیکرهبندی PHP داریم تا از وجود حداقلها برای سازگاری با سیمفونی آگاه شویم.
اسکریپت configuration checker رو از خط فرمان اجرا میکنیم.
$ cd ../.. $ php lib/vendor/symfony/data/bin/check_configuration.php
اگر مشکلی باشد در خروجی به شما تذکر خواهد داد و راه حل رفع ان را نیز به شما میگوید. همچنین میتوان این آزمایش را بدون استفاده از خط فرمان در مرورگر اجرا کرد. فایل اسکریپت رو در شاخه ریشه وب کپی کنید و به آدرس مربوطه بروید و هرگز فراموش نکنید که بعد از پاک کردن فایل رو پاک کنید.
$ rm web/check_configuration.php
اگر در خروجی خطایی داده نشد نشان دهنده نصب درست سیمفونی است. شما میتوانید بوسیله خط فرمان ورژن سیمفونی را مشاهده نمائید.
$ php lib/vendor/symfony/data/bin/symfony -V
اگر شما هم مثل بنده مشتاقی هستید، که بعید میدونم!!! اما احتمالاْ مشتاق هستید که در رابطه با ابزارهایی که سیمفونی در خط فرمان فراهم کرده اطلاعاتی کسب کنید. کلمه symfony را در خط فرمان تایپ کنید تا لیستی از آپشنها و وظایف رو مشاهده کنید.
$ php lib/vendor/symfony/data/bin/symfony
خط فرمان سیمفونی بهترین دوست شما است، زیرا بهترین تسهیلات رو برای شما مهیا میکند و قابلیتهای شما را در فعالیتهای روزانه همچون پاک کردن Cach، ایجاد کدها و … بهبود میبخشد.
راهاندازی پروژه
در سیمفونی، Applicationها اشتراک همان مدلهای داده هستند که در پروژهها جمعآوری میشوند. برای Jobeet ما دو Application داریم: یکی Frontend و دیگری Backend.
ایجاد پروژه
فرمان generate:project را از پوشه Jobeet اجرا کنید که در حقیقت وظیفه ساخت پروژه را دارد.
$ php lib/vendor/symfony/data/bin/symfony generate:project jobeet
این دستور وظیفه ایجاد ساختار پیشفرض فایلها و پوشهها را به عهده دارد.
| پوشه | شرح |
|---|---|
apps/ |
میزبانی تمامی Applicationهای پروژه |
cache/ |
فایلهای Cache شده از فریمورک |
config/ |
فایلهای پیکرهبندی پروژه |
lib/ |
کتابخانهها و کلاسهای پروژه |
log/ |
فایلهای log فریمورک |
plugins/ |
افزونههای نصب شده |
test/ |
دستگاه آزمایش اساسی فایلها |
web/ |
پوشه ریشه وب (در پایین میبینیم) |
نکته : چرا سیمفونی فایلهای زیاد تولید میکند؟ یکی از مزایای استفاده از یک فریمورک full-stack این است که توسعه شما را استاندارد میکند. هر توسعه دهنده ای با دانستههایی اندک از سیمفونی، میتواند از پروژههای سیمفونی حمایت کند. تنها با چند دقیقه وقت گذاشتن میشه داخل کدها رفت، حفرههای آنها را گرفت و یا ویژگیهای جدیدی رو به انها افزود.
وظیفه generate:project ساخت یک میانبر در شاخه اصلی پروژه است تا هنگام اجرای وظایف (Task) کمترین تعداد کاراکتر را تایپ کنید.
همچنین از این به بعد، بجای استفاده بجای استفاده از مسیرهای کامل و صحیح به Applicationهای سیمفونی از میانبرها استفاده میکنیم.
ایجاد Application
حالا نمای جلوی برنامه را بوسیله دستور generate:app ایجاد میکنیم.
$ php symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend
نکته :به دلیل اجرایی بودن فایلهای میانبر سیمفونی، از این پس کاربران unix میتوانند بجای تمام رخدادهای php symfony از ./symfony استفاده کنند.
اساس یک application روی نام است، زیرا یک شناسه است، وظیفه generate:app ایجاد ساختار پیشفرض پوشههایی است که برنامه نیاز دارد و تحت پوشه apps/frontend قرار میگیرند.
| پوشه | شرح |
|---|---|
config/ |
فایلهای پیکرهبندی application |
lib/ |
کتابخانهها و کلاسهای application |
modules/ |
کدهای application (توجه به MVC) |
templates/ |
فایلهای سراسری قالب |
نکته : تمام دستورات سیمفونی باید در پوشه ریشه پروژه اجرا شوند، مگر اینکه بطور صریح طور دیگری اعلام کنند.
علاوه بر اینها به هنگام فراخوانی وظیفه generate:app از دو خصیصه امنیتی مرتبط عبور میکنیم.
- –escaping-strategy : فعال کردن فرار خروجی برای جلوگیری از حملات XSS
- –csrf-secret : فعال کردن اجازه ورود به نشستها در فرمها برای جلوگیری از حملات SCRF
با اعمال این دو خصیصه اختیاری به وظیفه، میتوانیم آینده توسعه خودمان را برای بیشتر از ۲ آسیبپذیری رایج در وب امن کنیم. درسته! سیمفونی بطور خودکار اقدامات امنیتی را از طرف ما انجام میدهد.
یادداشت : اگر در رابطه با XSS و CSRF چیزی نمیدانید، وقتی را به یادگیری درباره این دو آسیبپذیری امنیتی اختصاص دهید.
مسیر سیمفونی
شما میتوانید نسخه استفاده شده برای پروژه را با استفاده از دستور زیر بدست آورید.
$ php symfony -V or $ symfony -V
این دستور مسیر پوشه نصب سیمفونی را نیز نمایش میدهد که میتوان آن را در آدرس config/ProjectConfiguration.class.php پیدا کرد:
// config/ProjectConfiguration.class.php require_once '/Users/mehdi/work/symfony/dev/1.2/lib/autoload/sfCoreAutoload.class.php';
برای بهبود قابلیت حمل، مسیر مطلق را با یک مسیر نسبی تعویض میکنیم.
// config/ProjectConfiguration.class.php require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
حالا شما میتوانید پروژه را بروی هر سیستمی انتقال دهید و اون به درستی کار کند.
محیط
اگر به پوشه /web نگاه کنید، دو فایل PHP را در آن پیدا میکنید: index.php و frontend_dev.php. این فایلها برای فراخوانی front controller هستند: تمام درخواستها به application بواسطه آنها ساخته شدهاند.
اما چرا دو عدد front controller داریم، در حالی که تنها یک application ساختهایم؟!
هر دو فایل، همان application را نمایش میدهند اما برای محیطهای متفاوت. زمانی که شما application را توسعه میدهید، نیاز به یک محیط توسعه دارید، مگر توسعه شما مستقیماْ بروی سرور باشد.
Development environment : این محیطی است که توسعه دهندگان بهنگام کار بروی برنامهها برای اضافه کردن خصوصیات و رفع حفرهها از ان استفاده میکنند.
Test environment : این محیط در آزمایشهای خودکار مورد استفاده قرار میگیرد.
Staging environment : این محیز برای استفاده مشتری (کارفرما) برای امتحان و گزارش حفرهها و قابلیتهای فراموش شده است.
Production environment : این محیط هم اخر کار است و برای ارائه نهایی است.
اما چرا تهیه محیطهای مختلف؟ برای مثال در محیط توسعه برای راحتی در کار اشکال زدایی به log شدن تمام جزئیات درخواست نیاز است. اما سیستم Cache باید غیر فعال باشد تا تمامی تغییرات ایجاد شده در کد اعمال شوند. بنابراین بهینه سازی محیط توسعه برای اینکار ضروری است. بهترین مثال زمانی است که یک مشکل خاص در برنامه رخ میدهد. برای کمک به توسعه دهنده سیمفونی این مشکل خاص رو بهمراه تمامی اطلاعاتش در رابطه با درخواست جاری، در مرورگر نمایش میدهد.
اما در محیط ارائه Cache فعال است و به خوبی کار میکند. برنامه نیز پیغامهای خطا را بجای اتفاقهای خاص نمایش میدهد. بنابراین محیط ارائه برای نمایش و فعالیت کاربران بهینه شده است.
محیطهای سیمفونی دارای تنظیمات جداگانهای هستند. فریمورک سیمفونی بهمراه این سه میآید: dev، test و prod. در روز ۲۲ (قسمت ۲۲ آموزش) چگونگی ساخت یک محیط جدید رو فرا میگیرید و البته محیطstaging .
اگر فایل front controller را باز کنید، محتویات زیر را مشاهده خواهید کرد که برای تنظیمات محیط است.
// web/index.php <?php require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php'); $configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false); sfContext::createInstance($configuration)->dispatch();
یادداشت : تعیین یک محیط برای سیمفونی حتی از ایجاد یک front controller هم آسانتر است. در آینده میبینیم که چطور میتوان تنظیمات یک محیط را تغییر داد.
راهاندازی وب سرور : شیوه اشتباه
در بخش قبلی، پوشهای برای میزبانی Jobeet ایجاد کردیم. اگر شما این پوشه را در مکانی تحت وب سرور سیستم خود ایجاد کردید، در مرورگر به پروژه خود دسترسی دارید.
درسته! چون پیکرهبندی وجود ندارد راهاندازی خیلی سریع انجام شد. اما تلاش برای دسترسی به فایل config/databases.yml در مرورگر شما برای درک نتایج بد این تنبلی.اگر کاربران بدونند که وبسایت شما با سیمفونی توسعه پیدا کرده، میتوانند به بسیاری از فایلهای مهم دسترسی پیدا کنند.
هرگز اینکار را در سرور انجام ندهید و بخش بعدی رو برای یادگیری چگونگی راهاندازی وب سرور مطالعه کنید.
راهاندازی وب سرور : شیوه مطمئن
بهترین کار این است که تنها فایلهایی که باید توسط مرورگر دسترسی داشته باشند همچون فایلهای سبکنامه، جاوا و تصاویر را در پوشه اصلی قرار داده که البته بهتر است بطور پیشفرض در پوشه /web قرار دهیم.
اگر نگاهی به این پوشه انداخته باشید زیر پوشههایی رو میبینید که دارایی آنها، فایلها (سبکنامه، تصاویر و …) و دو فایل front controller هستند.front controllerها تنها فایلهای PHP هستند که نیاز دارند تا در پوشه ریشه وب سرور قرار بگیرند. همه فایلهای دیگر PHP میتوانند از دید مرورگر مخفی شوند. که این ایده خوبی از لحاظ امنیتی است.
پیکرهبندی وب سرور
حالا زمان ان رسیده تا پیکرهبندی Apache را تغییر دهیم.
فایل پیکرهبندی httpd.conf را باز کرده و این کدها را در خط اخر ان اضافه کنید.
# Be sure to only have this line once in your configuration NameVirtualHost 127.0.0.1:8080 # This is the configuration for Jobeet Listen 127.0.0.1:8080 <VirtualHost 127.0.0.1:8080> DocumentRoot "/home/sfprojects/jobeet/web" DirectoryIndex index.php <Directory "/home/sfprojects/jobeet/web"> AllowOverride All Allow from All </Directory> Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf <Directory "/home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf"> AllowOverride All Allow from All </Directory> </VirtualHost>
این پیکرهبندی، Jobeet را در آدرس http://localhost:8080/ قابل دسترس میکند
شما میتوانید این عدد را با هر عدد دیگری تغییر دهید. اما بهتر است از اعداد بزرگتر از ۱۰۲۴ استفاده کنید. زیرا این اعداد نیازی به اجازه مدیر سیستم ندارند.
آزمایش پیکرهبندی جدید
Apache را دوباره راهاندازی کنید (restart). دسترسی به jobeet را با استفاده از آدرس بالا امتحان کنید.
یادداشت : اگر ماژول mod-rewrite شما در apache فعال باشد میتوانید عبارت index.php را از انتهای آدرس حذف کنید. اینکار به برکت قوائد دوباره نویسی پیکرهبندی شده در فایل /web/.htaccess امکان پذیر است.
همچنین باید دسترسی برنامه را در محیط توسعه امتحان کنیم.
http://jobeet.localhost/frontend_dev.php/
نوار ابزار عیبیابی را باید در گوشه بالا سمت راست مشاهده کنید که شامل آیکون کوچک SF که نام اختصاری سیمفونی است میباشد.
نوار ابزار فوق در تمام صفحات در محیط توسعه حاضر است و دسترسی به اطلاعات زیادی را بوسیله کلیک بروی سایر تبها به شما میدهد. اطلاعاتی همچون پیکر بندی فعلی برنامه، وقایع درخواست جاری، دستورات SQL اجرا شده در موتور پایگاه داده، اطلاعات حافظه و اطلاعات زمان.
Subversion
بهترین کار این است که هنگام توسعه یک برنامه از SVN استفاده کنیم.
برخی از مزایای استفاده از SVN :
با اطمینان کار کردن
- برگشت به نسخه قبلی در صورت شکست تغییرات ایجاد شده
- امکان کار کردن موثر و واقعی بیشتر از چند نفر بر روی یک پروژه
- دسترسی به تمامی نسخههای منتشر شده پی در پی
در این بخش به شرح چگونگی کار کردن با SVN بوسیله سیمفونی میپردازیم. اگر شما از هر ابزار کنترل کد دیگری استفاده میکنید، توضیح در مورد چگونگی SVN بسیار راحت خواهد شد.
تصور را بر این میگذاریم که شما به یک سرور subversion دسترسی دارید و میتوانید بوسیله http با اون کار کنید.
نکته : اگر سرور subversion در دسترس ندارید، میتوانید به رایگان در google code یک مخزن ایجاد کنید و یا عبارت free subversion را در google جستجو کنید و …
ابتدا مخزن پروژه Jobeet را ایجاد میکنیم.
$ svnadmin create /path/to/jobeet/repository
ساختار اصلی پوشهها را در سیستم ایجاد میکنیم.
$ svn mkdir -m "created default directory structure" http://svn.example.com/jobeet/trunk http://svn.example.com/jobeet/tags http://svn.example.com/jobeet/branches
و پوشه خالی trunk را بررسی میکنیم.
$ cd /home/sfprojects/jobeet $ svn co http://svn.example.com/jobeet/trunk/ .
سپس محتویات پوشه /cache و /log را پاک میکنیم، زیرا نیازی به درج انها در مخزن نداریم.
$ rm -rf cache/* log/*
حالا از دسترسیهای پوشههای /cache و /log اطمینان حاصل میکنیم تا سرویس دهنده وب بتواند در آنها بنویسد.
$ chmod 777 cache/ log/
حالا تمامی فایلها و پوشهها را وارد میکنیم.
$ svn add *
از آنجایی که نیازی به فایلهای موجود در پوشههای /cache و /log نداریم باید آنها را در ignore list قرار دهیم.
$ svn propedit svn:ignore cache
ویرایشگر متن پیشفرض برای SVN باید راه افتاده باشد. Subversion باید تمامی محتوای موجود در این پوشه را ignore کند.
*ذخیره کنید و خارج شوید. شما موفق شدید.
این مراحل را برای پوشه log تکرار کنید.
$ svn propedit svn:ignore log
و وارد کنید:
*در نهایت، این تغییرات رو در مخزن اعمال کنید
$ svn import -m "made the initial import" . http://svn.example.com/jobeet/trunk
فردا (بخش دوم) همدیگر را خواهیم دید
وقت امروز تمام شد. با این حال حتی اگر صحبت کردن در رابطه با سیمفونی را آغاز نکردیم، اما یک محیط توسعه پایدار داریم، در رابطه با بهترین شیوههای توسعه وب بحث کردیم و هم اکنون برای کد نویسی آماده شدهایم.
فردا مشخص میکنیم که چه برنامهای را خواهیم نوشت و درباره ملزوماتی که برای اتمام پروژه در طول مدت آموزش به آن نیاز داریم بحث خواهیم کرد.
یادداشت : اگر میخواهید کد امروز و یا هر روز دیگری را بررسی کنید، کدها بصورت روز به روز در مخازن رسمی Jobeet یافت میشوند.
(http://svn.jobeet.org/propel)برای مثال شما میتوانید با استفاده از تگ
release_day_01کدهای امروز را دریافت کنید.$ svn co http://svn.jobeet.org/propel/tags/release_day_01/ jobeet/








فرید در تاریخ 8 آوریل , 2009 @ 8:01 ب.ظ
به به الان داشتم به خودم میگفتم بابا این مهدی خان که گفت به زودی پس چی شد!!!
خیلی خوشحالماین اموزشو میبینم.
البته هنوز نخوندمش ولی امیدوارم ادامه پیدا کنه
موفق باشی