نت شهر
  • تلگرام
  • اینستاگرام
  • فروشگاه
  • املاک
  • خودرو
  • شهربازی
  • تبلیغات
  • فروشگاه
  • شارژ همراه و پرداخت قبوض
  • املاک
  • خودرو
  • نیازمندی ها
  • شهربازی
  • تبلیغات
  • نت شهر
  • اخبار
  • خواندنی‌ها
  • گالری تصاویر
  • هنر
  • آموزش
  • سبک زندگی
  • فناوری اطلاعات
  • گردشگری

متن خطا

An erroe accoured during send message

پیام موفقیت

Your message added successfully
  1. خانه
  2. Zend framework 2
  • آشنایی با Routing در فریم ورک ZF2
    آشنایی با Routing در فریم ورک ZF2
    زمانی که از فریم ورک ها استفاده می کنیم، منظور از Routing فرایندی است که از آن طریق URL ورودی به یک کنترلر را مشخص می سازیم. ماژولی هم که حاوی هیچ گونه کنترلری نباشد نیازی به Rout Map هم نخواهد داشت. به طور کلی منظور از Route Map چیزی است که در فایل module.config.php تعریف می شود. برای این منظور می بایست از کلیدواژه ای تحت عنوان router استفاده کرده و در ادامه آن روت هایی که تمایل داریم داشته باشیم را تعریف کنیم. برای روشن تر شدن این مسئله مثالی می زنیم: 'route' => array( 'routes' => array ( 'home' => array( 'type' => 'Zend\Mvc\Router\Http\Literal', 'options' => array ( 'route' => '/', 'defaults' => array ( 'controller' => 'Application\Controller\Index', 'actions' => 'index', ), ), ), ), ) زمانی که ما یک روت تعریف می کنیم، می بایست نامی هم برای آن انتخاب کنیم. به طور مثال در کد فوق روتی داریم تحت عنوان home که برای آن Keyهایی تحت عنوان type و options تعریف کرده ایم. typeیی که برای روت بالا در نظر گرفته ایم برابر است با Zend\Mvc\Router\Http\Literal.optionsهای در نظر گرفته شده برای روت فوق حاوی keyیی تحت عنوان controller با مقدار Application\Controller\Index و اکشنی برابر با index می باشد.
  • چگونه در فریم ورک زند 2 یک فرم ثبت نام بسازیم
    چگونه در فریم ورک زند 2 یک فرم ثبت نام بسازیم
    در این پروژه، قصد داریم تا فرمی ایجاد کنیم تا بتوان از آن طریق به مدیریت کاربران همچون افزودن، ویرایش کردن و حذف کردن بپردازیم. نام این فایل را قصد داریم User.php گذاشته و آن را در مسیر ماژول User/src/User/Form ذخیره سازیم. برای این منظور، ابتدا فولدری تحت عنوان Form ساخته سپس داخل آن فایلی تحت عنوان User.php ایجاد می کنیم. با توجه به این که قرار است تا فرم استفاده شده در این وب اپلیکیشن برگرفته از کامپوننت Zend\Form فریم ورک زند 2 باشد، از این رو نیاز است تا پیش از هر چیز فایل User.php را به صورت زیر تکمیل کنیم: namespace User\Form; use Zend\Form\Form; use Zend\InputFilter\InputFilter; use Zend\InputFilter\InputFilterInterface; use Zend\InputFilter\Factory as InputFactory; class User extends Form { public function __construct($name='user') { parent::__construct($name); $this->setAttribute('method', 'post'); // This is how we define the "email" element $this->add(array( 'name' => 'email', // the unique name of the element in the form. Ex: 'type' => 'Zend\Form\Element\Email', // This must be valid Zend Form element. // This is list of options that we can add to the element. 'options' => array( 'label' => 'Email:' ), // These are the attributes that are passed directly to the HTML element 'attributes' => array( 'type' => 'email', // Ex: 'required' => true, // Ex: 'placeholder' => 'Email Address...', // HTM5 placeholder attribute ) )); $this->add(array( 'name' => 'password', 'type' => 'Zend\Form\Element\Password', 'attributes' => array( 'placeholder' => 'Password Here...', 'required' => 'required', ), 'options' => array( 'label' => 'Password', ), )); $this->add(array( 'name' => 'password_verify', 'type' => 'Zend\Form\Element\Password', 'attributes' => array( 'placeholder' => 'Verify Password Here...', 'required' => 'required', ), 'options' => array( 'label' => 'Verify Password', ), )); $this->add(array( 'name' => 'name', 'type' => 'Zend\Form\Element\Text', 'attributes' => array( 'placeholder' => 'Type name...', 'required' => 'required', ), 'options' => array( 'label' => 'Name', ), )); $this->add(array( 'name' => 'phone', 'options' => array( 'label' => 'Phone number' ), 'attributes' => array( 'type' => 'tel', // Below: HTML5 way to specify that the input will be phone number 'required' => 'required', // Below: HTML5 way to specify the allowed characters 'pattern' => '^[\d-/]+$' ), )); $this->add(array( 'type' => 'Zend\Form\Element\File', 'name' => 'photo', 'options' => array( 'label' => 'Your photo' ), 'attributes' => array( 'required' => 'required', 'id' => 'photo' ), )); // This is the special code that protects our form beign submitted from automated scripts $this->add(array( 'name' => 'csrf', 'type' => 'Zend\Form\Element\Csrf', )); // This is the submit button $this->add(array( 'name' => 'submit', 'type' => 'Zend\Form\Element\Submit', 'attributes' => array( 'value' => 'Submit', 'required' => 'false', ), )); } } همان طور که در کد فوق مشاهده می شود، در خط اول namespace را قرار داده ایم. در خط بعد با توجه به این که قصد داریم تا از کلاس هایی همچون Form زند فریم ورک و ... استفاده کنیم، ابتدا می بایست تا این کلاس ها را به فایل خود اصطلاحاً Import یا "وارد" کنیم که این کار با استفاده از کلیدواژه use در زبان پی اچ پی صورت می گیرد. سپس بعد از نام کلاس که User می باشد، کلیدواژه extends را نوشته (این کلیدواژه برای ارث بری در زبان برنامه نویسی پی اچ پی استفاده می شود) سپس نام کلاس Form را می نویسیم چرا که می خواهیم کلاس User از ویژگی های کلاس Form فریم ورک زند 2 استفاده کند. در ادامه هم یک کانستراکتور ایجاد کرده ایم که در ادامه آموزش خواهیم دید عملکرد آن به چه شکل است.حال قصد داریم تا المان هایی را به فرم خود اضافه کنیم که برای شروع می بایست آدرس پست الکترونیک کاربر که به عنوان نام کاربری هم استفاده خواهد شد را بگیریم. علاوه بر پست الکترونیک، رمز عبور، تکرار رمز عبور، نام، شماره تلفن و یک تصویر از کاربر هم نیاز خواهیم داشت. در ابتدا یک پارامتر ورودی تحت عنوان name با مقدار اولیه user برای متد construct در نظر گرفته ایم. از آن جا که کلاس Form که از آن ارث بری کرده ایم خود دارای یک متد construct است، می بایست این متد را با استفاده از دستور parent فرا خوانده و متغیر name را به آن پاس دهیم.در کد فوق داخل متد construct پیش از هر چیز از متدی تحت عنوان setAttributes استفاده کرده ایم که پیش از آن دستور this آمده است. پیش از این هم گفتیم که وقتی بخواهیم داخل کلاسی از یکی از متدهای آن کلاس استفاده کنیم، دستور this این امکان را برای ما فراهم خواهد ساخت. این متد دو پارامتر ورودی می گیرد که پارامتر اول را method قرار داده ایم و پارامتر دوم مقدار method است که برابر است با post.در ادامه از متدی تحت عنوان add استفاده نموده ایم که برای آن دو پارامتر در نظر گرفته ایم که این دو پارامتر یا آرگومان از جنس array هستند. آرایه اول خود دارای سه پارامتر است که پارامتر اول آن مربوط به نام این فیلد است که برابر با email قرار داده شده که بعداً برای ذخیره سازی مقدار این فیلد در دیتابیس مورد استفاده قرار خواهد گرفت، پارامتر دوم مرتبط با type یا "نوع" این فیلد است که برابر با کلاس Zend\Form\Element\Email قرار داده شده و پارامتر سوم برابر با option است که خود این پارامتر مقداری برابر یا یک آرایه دارد که در آن یک Key تحت عنوان label در نظر گرفته شده که مقدار آن برابر با :Email است.حال نوبت به تفسیر پارامتر دوم متد add یا همان آرایه دوم می رسد. در کد فوق یک Key تحت عنوان attributes تعریف کرده ایم که این امکان را به ما می دهد تا از قابلیت های HTML5 در فرم ها همچون تصدیق اطلاعات کاربر و ... بدون استفاده از کدهای جاوا اسکریپت استفاده کنیم اما در مثال فوق صرفاً اقدام به استفاده از Attributeهای type، required و placeholder کرده ایم که به ترتیب برای مشخص سازی نوع فیلد فرم، اجباری بودن فیلد، و متن Placeholder فیلد نموده ایم. مقدار اول این آرایه type یا "نوع" است که برابر با email قرار داده شده، پارامتر دوم برابر با required به معنی "اجباری" است که برابر با true قرار داده شده (یعنی این فیلد اجباری است و حتماً می بایست توسط کاربر پر شود) و در نهایت از placeholder استفاده کرده ایم که مقدار آن برابر با Email Address است که این مقدار داخل فیلد مربوط به ایمیل چاپ شده و به محض این که کار شروع به تایپ کردن کند، عبارت Email Address محو خواهد شد.در ادامه فیلدهای تکمیلی را به فرم خود می افزاییم که از آن جمله می توان به رمزعبور، تایید مرز عبور، نام، تلفن و تصویر کاربر اشاره کرد (به منظور جلوگیری از طولانی شدن آموزش، از تفسیر کردن کدهای مرتبط با رمزعبور، تایید رمزعبور، نام، شماره تلفن و عکس خودداری خواهیم کرد.)در ادامه، کدهای زیر را به کدهای فوق اضافه می کنیم: $this->add(array( 'name' =>'csrf', 'type' => 'Zend\Form\Element\Csrf', )); این بخش از کد از حملات CSRF به سایت جلوگیری خواهد کرد (به طور کلی منظور از این اصطلاح Cross-site Request Forgery است که این امکان را به ما می دهد تا از حملاتی که از طریق مرورگر روی کاربری که توانسته با موفقیت در سایتی لاگین کند جلوگیری نماییم.) در نهایت همان طور که در کد اصلی مشاهده می شود، نیاز است تا دکمه ثبت اطلاعات را به فرم خود اضافه کنیم. در این مرحله از کار، کدهای مرتبط با متد construct به اتمام می رسد.در نهایت نیاز است تا در View کاری کنیم که این فرم نمایش داده شود. برای این منظور، فایل add.phtml را به صورت زیر تکمیل می کنیم: $this->form1->prepare(); echo $this->form()->openTag($this->form1); echo $this->formcollection($this->form1); echo $this->form()->closeTag(); همان طور که در کد فوق ملاحظه می شود، شیئ که از روی کلاس User ساختیم تحت عنوان form1 را با استفاده از دستور this فراخوانده و با استفاده از متد prepare آن را اصطلاحاً "آماده سازی" کرده ایم تا نمایش داده شود.در خط بعدی ابتدا دستور echo را نوشته تا دستور مقابل آن چاپ شوند سپس به عنوان مقدار آن متد form را فرا خوانده و با استفاده از متد openTag تگ آغازین فرم خود را ایجاد کرده و برای پارامتر این متد هم شیئ form1 را در نظر می گیریم.با استفاده از دستور formcollection فیلدهای مختلف فرم خود را فرا می خوانیم و در نهایت هم با استفاده از متد closeTag تگ پایانی فرم خود را ایجاد می کنیم.برای این که متوجه شویم که شیئ form1 به چه شکل ساخته شده است، فایل AccountController را باز می کنیم: namespace User\Controller; use User\Form\User as UserForm; use Zend\Mvc\Controller\AbstractActionController; class AccountController extends AbstractActionController { public function indexAction() { return array(); } public function addAction() { $form = new UserForm(); $data = array_merge_recursive( $this->getRequest()->getPost()->toArray(), $this->getRequest()->getFiles()->toArray() ); $form->setData($data); return array('form1' => $form); } public function registerAction() { return array(); } public function viewAction() { return array(); } public function editAction() { return array(); } public function deleteAction() { return array(); } } همان طور که در کد فوق ملاحظه می شود، داخل متدی addAction را به صورت فوق تکمیل کرده و شیئ form که از روی کلاس UserForm ساختیم را تحت عنوان form1 اصطلاحاً return می کنیم.مسیر localhost/zend/public/user/account/add را وارد مرورگر می کنیم: می بینیم که فرم ما به صورت بالا نمایش داده می شود.
  • نحوه ساخت یک ماژول جدید در فریم ورک زند 2
    نحوه ساخت یک ماژول جدید در فریم ورک زند 2
    برای آشنایی بیشتر با عملکرد فریم ورک زند 2، یک ماژول جدید تحت عنوان User ایجاد کنیم. توجه داشته باشیم که در نامگذاری ماژول ها می بایست نام ماژول کوتاه، ساده و در عین حال توصیف کننده عملکرد ماژول باشد. یکی از مزایای فریم ورک زند 2 این است که برنامه نویس را محدود به هیچ ویرایشگر کد، محیط توسعه یکپارچه برنامه نویسی و ... نمی کند اما این در حالی است که یک IDE طراحی شده توسط خود شرکت Zend Technologies تحت عنوان Zend Studio است که در صورت استفاده از آن یکسری امکانات بیشتری نسبت به سایر IDE ها در اختیار ما قرار می گیرد که از آن جمله می توان به Code Hinting اشاره کرد (منظور از این اصطلاح این است که در حین کدنویسی یکسری راهنمایی در مورد متدها و کلاس های فریم ورک زند در اختیار برنامه نویس قرار خواهد گرفت.)علاوه بر این نرم افزار Zend Studio می توان از نرم افزار اکلیپس هم استفاده کرده و پلاگین مخصوص به فریم ورک زند را روی آن نصب کرد.برای آن که یک ماژول جدید ایجاد کنیم، یک راه این است که ماژول Application را کپی کرده و آن را تحت عنوان User داخل فولدر module قرار دهیم. حتماً توجه داشته باشیم که در این فولدری که کپی کردیم، می بایست کلیه جاهایی که نام Application آمده است را با عبارت User جایگزین کنیم.اولین جایی که می بایست تغییر نام دهیم، فولدری داخل فولدر src است تحت عنوان Application که می بایست آن را به User تغییر نام دهیم. داخل این فولدر، فولدر دیگری است تحت عنوان Controller که حاوی فایلی است تحت عنوان IndexController.php که ابتدا می بایست آنرا به AccountController.php تغییر نام داده سپس کدهای داخل آن را می بایست به صورت زیر تغییر دهیم: namespace User\Controller; use Zend\Mvc\Controller\AbstractActionController; class AccountController extends AbstractActionController { public function indexAction() { return array(); } public function addAction() { return array(); } public function registerAction() { return array(); } public function viewAction() { return array(); } public function editAction() { return array(); } public function deleteAction() { return array(); } } همان طور که در خط اول مشاهده می شود، در بخش مربوط به namespace واژه Application را به User تغییر نام می دهیم. در ادامه وارد فولدر view شده و داخل آن فولدری می بینیم تحت عنوان application که می بایست آن را به user تغییر نام دهیم (در این جا توجه داشته باشیم که یوزر را می بایست با حرف کوچک بنویسیم.) سپس فولدری که داخل آن قرار دارد را از index به account تغییر نام داده و داخل آن فایلی می سازیم تحت عنوان add.phtml که در ادامه آموزش بیشتر در مورد آن صحبت خواهیم کرد. صرفاً در این مرحله نیاز است تا داخل فایل add.phtml عبارتی همچون ... This is to add users را داخل تگ های آغازین و پایانی h1 قرار دهیم: This is to add users ... حال از داخل فولدر config فایل module.config.php را باز می کنیم: return array( 'router' => array( 'routes' => array( 'user' => array( 'type' => 'Literal', 'options' => array( 'route' => '/user', 'defaults' => array( '__NAMESPACE__' => 'User\Controller', 'controller' => 'Account', 'action' => 'index', ), ), 'may_terminate' => true, 'child_routes' => array( 'default' => array( 'type' => 'Segment', 'options' => array( 'route' => '/[:controller[/:action]]', 'constraints' => array( 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', ), 'defaults' => array( ), ), ), ), ), ), ), 'service_manager' => array( 'abstract_factories' => array( 'Zend\Cache\Service\StorageCacheAbstractServiceFactory', 'Zend\Log\LoggerAbstractServiceFactory', ), 'aliases' => array( 'translator' => 'MvcTranslator', ), ), 'controllers' => array( 'invokables' => array( 'User\Controller\Account' => 'User\Controller\AccountController' ), ), 'view_manager' => array( 'template_path_stack' => array( __DIR__ . '/../view', ), ), ); اگر این فایل را با فایل ماژول Application مقایسه کنیم، خواهیم دید که موردی تحت عنوان translate حذف شده چرا که نیازی برای ماژول یوزر به translate نخواهیم داشت. علاوه بر این، می بایست کنترلر خود را داخل این فایل تعریف کنیم. همان طور که در کد فوق ملاحظه می شود، در بخش مربوط به controllers، کنترلر مربوط به Account را تعریف کرده ایم. علاوه بر این، هر کجا که واژه Application چه با حرف بزرگ و چه با حرف کوچک نوشته شده بود را به همان صورت به User یا user تغییر می دهیم (توجه داشته باشیم که کوچکی و بزرگی حروف در اینجا بسیار حائز اهمیت است.) در ضمن یکسری تغییرات جزئی دیگر هم صورت گرفته که در ادامه بیشتر آن ها را توضیح خواهیم داد.حال می بایست فایل Module.php که داخل فولدر User قرار دارد را باز کرده و namespace آن را تغییر دهیم: namespace User; use Zend\Mvc\ModuleRouteListener; use Zend\Mvc\MvcEvent; class Module { public function onBootstrap(MvcEvent $e) { $eventManager = $e->getApplication()->getEventManager(); $moduleRouteListener = new ModuleRouteListener(); $moduleRouteListener->attach($eventManager); } public function getConfig() { return include __DIR__ . '/config/module.config.php'; } public function getAutoloaderConfig() { return array( 'Zend\Loader\StandardAutoloader' => array( 'namespaces' => array( __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, ), ), ); } } همان طور که در کد فوق ملاحظه می شود، در خط اول مقابل namepace نام ماژول خود که همان User است را می نویسیم.پس از ساخت این ماژول، نیاز است تا آن را فعال سازی کنیم. برای این منظور، فایل application.config.php که در پوشه config قرار دارد را باز می کنیم و آن را به صورت زیر ویرایش می کنیم: return array( 'modules' => array( 'Application', 'User' , ), 'module_listener_options' => array( 'module_paths' => array( './module', './vendor', ), 'config_glob_paths' => array( 'config/autoload/{,*.}{global,local}.php', ), ), ); همان طور که در کد فوق می بینیم، در Keyیی تحت عنوان modules پس از مقداری تحت عنوان Application نام ماژول جدید خود که User است را می نویسیم.حال اگر URLیی تحت عنوان localhost/zend/public/user/account/add را وارد نوار آدرس مرورگر خود کنیم، با تصویر زیر مواجه خواهیم شد:در پاسخ به این سؤال که چگونه توانستیم با وارد کردن URL فوق الذکر در مرورگر، به صفحه add.phtml دست پیدا کنیم بایستی گفت که این مسئله به خاطر تعریف پیش فرض روت در فایل تنظیمات ماژول User است. برای روشن تر شدن این مطلب، ابتدا یک فایل دیگر تحت عنوان index.phtml ساخته و عبارتی همچون This is the index file را داخل آن می نویسیم. حال فایل module.config.php ماژول User را باز می کنیم: return array( 'router' => array( 'routes' => array( 'user' => array( 'type' => 'Literal', 'options' => array( 'route' => '/user', 'defaults' => array( '__NAMESPACE__' => 'User\Controller', 'controller' => 'Account', 'action' => 'index', ), ), 'may_terminate' => true, 'child_routes' => array( 'default' => array( 'type' => 'Segment', 'options' => array( 'route' => '/[:controller[/:action]]', 'constraints' => array( 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', ), 'defaults' => array( ), ), ), ), ), ), ), 'service_manager' => array( 'abstract_factories' => array( 'Zend\Cache\Service\StorageCacheAbstractServiceFactory', 'Zend\Log\LoggerAbstractServiceFactory', ), 'aliases' => array( 'translator' => 'MvcTranslator', ), ), 'controllers' => array( 'invokables' => array( 'User\Controller\Account' => 'User\Controller\AccountController' ), ), 'view_manager' => array( 'template_path_stack' => array( __DIR__ . '/../view', ), ), ); همان طور که در کد فوق ملاحظه می شود، از طریق کلید route یک روت تعریف کرده ایم تحت عنوان /user که اگر کاربری این روت را داخل مرورگر وارد کرد، به صورت پیش فرض کنترلری تحت عنوان User/Controller/Account با اکشنی تحت عنوان index اجرا خواهد شد:همان طور که در تصویر فوق می بینیم، فایل index.phtml که پیش از این ساختیم در معرض دید قرار می گیرد. در تفسیر این عملکرد بایستی گفت که در فایل تنظیمات این ماژول گفته ایم که اگر کاربری وارد مسیر /user شد، به صورت پیش فرض کنترلری تحت عنوان Account با اکشنی تحت عنوان index اجرا خواهد شد. به عبارت دیگر چه در یو آر ال بنویسیم localhost/zend/user و چه بنویسیم localhost/zend/public/user/account/index هر دو مسیر به یک جا ختم می شوند و آن هم تصویری است که در بالا مشاهده می شود.
  • آشنایی با Design Patternیی تحت عنوان MVC
    آشنایی با Design Patternیی تحت عنوان MVC
    به طور کلی، معماری سه لایه MVC که مخفف واژگان Model View Controller است این امکان را به برنامه نویسان می دهد تا کدهای مرتبط با ظاهر سایت را در قالب View، کدهای مرتبط با روند اجرای وب اپلیکیشن و همچنین ارتباط مابین بخش های مختلف را در Controller و کدهای مرتبط با ارتباط با دیتابیس و ... را در Model قرار دهند.معماری سه لایه دارای فواید زیادی است که از آن جمله می توان به استفاده مجدد از کدهای هر یک از این لایه ها در سایر بخش های اپلیکیشن اشاره کرد.در فریم ورک زند 2 معماری سه لایه MVC به صورت زیر پیاده سازی می شود:Bootstrap به منزله شروع معماری سه لایه اپلیکیشن است. Route چیزی است که از آن طریق درخواست یا Request کاربر به یک کنترلر یا اکشن ضمیمه می شود. Dispatch به فرایندی گفته می شود که از آن طریق کنترلر ارتباط با بخش های مختلف اپلیکشن را کنترل می کند. Render برای نمایش داده هایی است که از طریق UI می بایست در معرض دید کاربر قرار گیرند. و در نهایت Finish که پایان موفقیت آمیز یک معماری سه لایه را مشخص می سازد.ZF2 از معماری سه لایه MVC با استفاده از کامپوننت های مختلفی استفاده می کند که در ادامه با برخی از رایج ترین آن ها آشنا خواهیم شد.کامپوننتی تحت عنوان Zend\Mvc\Router در فریم ورک زند 2 داریم که مشخص می سازد کدام ماژول، کنترلر و یا اکشن را می بایست با توجه به درخواست مرروگر کاربر مورد استفاده قرار دهد. در فریم ورک زند دو route ها داخل فایل تنظیمات هر ماژول تعریف می شوند (البته لازم به ذکر است که route ها را در هر جایی از کد می توان مورد استفاده قرار داد اما این در حالی است که با این کار استانداردهای معماری سه لایه را زیر پا گذاشته و خوانایی کد ما پایین خواهد آمد.)Route ها دارای انواع و اقسام مختلفی هستند که از آن جمله می توان به Literal، Segment، Rexex، Part/TreeRouteStack، Wildcard، Hostname، Scheme و ... اشاره کرد.برای روشن شدن این مسئله چند مثال می زنیم:به طور کلی منظور از روتی تحت عنوان Literal آدرسی همچون netshahr.com/contact است که در این URL هرآنچه که پس از / آمده به منزله یک Route می باشد. به عبارت دیگر، هر کاربری که وارد سایت نت شهر شده و پس از دامین سایت، آدرس contact را وارد نماید، روتی که پیش از این برای contact در نظر گرفته ایم فعال خواهد شد.اگر بخواهیم برای روتی از جنس Segment مثالی بزنیم می توان آدرسی همچون netshahr.com/blog/article/7 را مد نظر قرار دهیم که در این یو آر ال، مسیر article/7 روتی از جنس Segment است.زمانی که درخواستی از سمت مرورگر کاربر برای وب اپلیکیشن ارسال می شود، اکشنی که با روت همخوانی داشته باشد در ماژولی که هدف قرار داده شده از طریق کنترلر مرتبط با این کار فراخوانده می شود.در فریم ورک زند 2 کامپوننتی داریم تحت عنوان Zend\Mvc\View که مسئول نمایش داده های درخواست شده به کاربران وب اپلیکیشن ما است. کامپوننت View این دست داده ها را از طریق کنترلرهای مربوطه دریافت می دارد. در فریم ورک زند 2 تمپلیت های مرتبط با رابط کاربری سایت به صورت پیش فرض فایل هایی با پسوند php هستند اما این در حالی است که شما این امکان را خواهید داشت تا از پسوندهای دیگر هم استفاده کرده و یا پسوندهایی که مجاز هستند را با یکدیگر ادغام کنید (به طور مثال پسوند phtml که منظور از آن فایل اچ تی ام الی است که دارای یکسری کدهای پی اچ پی نیز می باشد.)در معماری سه لایه، Model این امکان را به برنامه نویسان می دهد تا مسائل مرتبط با دیتابیس، داده ها و ... مدیریت کنند. واقعیت امر این است است که مدل کاری بیش از ارتباط با دیتابیس و ... را انجام می دهد. به عبارت دیگر، کلیه کارهای منطقی همچون محاسبات، الگوریتم ها و ... را می توان در مدل یک وب سایتی که با معماری سه لایه طراحی شده باشد تعریف کرد. در یک کلام، مدل در این معماری مسئول این است که وب اپلیکیشن ما چگونه کار می کند.نکته جالب توجه این که در فریم ورک زند 2 هیچ گونه کلاسی تحت عنوان مثلاً Zend\Model وجود ندارد که بتوان از آن ارث بری کرد و علت این مسئله هم آن است که مدل در هر سایت مختص آن سایت بوده و نمی توان یک منطق کاری را برای کلیه سایت ها در نظر گرفت. به طور مثال، منطق به کارگرفته شده در یک فروشگاه آنلاین با یک سایت خبری همچون نت شهر کاملاً متفاوت خواهد بود.با این حال یکسری از مدل ها هستند که فارغ از این که سایت ما برای چه منظوری ساخته شده است، مابین کلیه سایت ها یکسان است که از آن جمله می توان به کامپوننتی تحت عنوان Zend\Db\TableGateway اشاره کرد که برای فراخوانی جداول یک دیتابیس مورد استفاده قرار می گیرد. و یا این که اگر بخواهیم از RSS استفاده نماییم، می بایست از کامپوننتی تحت عنوان Zend\Feed که مخصوص این کار است استفاده نماییم.
  • آشنایی با ServiceManager در فریم ورک زند 2
    آشنایی با ServiceManager در فریم ورک زند 2
    سرویس ها در ServiceManager صرفاً به شکل Array یا Object قابل استفاده هستند. برای روشن شدن این مسئله، فایل module.config.php را که داخل ماژول Application داخل پوشه config قرار دارد را باز می کنیم: 'service_manager' => array( 'abstract_factories' => array( 'Zend\Cache\Service\StorageCacheAbstractServiceFactory', 'Zend\Log\LoggerAbstractServiceFactory', ), 'aliases' => array( 'translator' => 'MvcTranslator', ), ) همان طور که در کد فوق ملاحظه می شود، service_manager یکی از Keyهای آرایه است که به منظور تعریف کردن سرویس های مختلفی مورد استفاده قرار می گیرد. برای تعریف کردن سرویس ها از راه های متفاوتی می توان استفاده کرد. به طور مثال، Keyهایی که داخل خود آرایه service_manager ایجاد می کنیم به منزله سرویس هایی هستند که می خواهیم اجرا شوند. از جمله رایج ترین سرویس هایی که در فریم ورک زند 2 مورد استفاده قرار می گیرند می توان به invokables، factories، aliases و shared اشاره کرد.به طور کلی، منظور از invokables این است که از آن طریق می توان یک آرایه تعریف کرد که در آن Key، نام منحصر به فردی از سرویسی است که می خواهید آن را تعریف کنید. Value این Key هم نام کلاسی است که می خواهیم از آن استفاده کنیم.زمانی که بخواهیم از سرویسی تحت عنوان factories استفاده کنیم، می بایست این سرویس را به صورت یک جفت Key/Value به عنوان یکی از آرایه های service_manager تعریف کنیم. علاوه بر سرویس هایی از جنس factories که استاندارد هستند، گروهی دیگر از این سرویس ها هستند که تحت عنوان abstract_factories شناخته می شوند. کاربرد این گروه از فکتوری ها این است که اگر ServiceManager قادر به یافتن سرویسی برای یک درخواست نباشد، پیش از نشان دادن ارور، نگاهی هم به لیست abstract_factories ها می اندازد. این کار تا جایی صورت می گیرد تا یکی از آن ها که مناسب باشد، شیئی را اصطلاحاً return کند. در این صورت، اگر که سرویس قادر به یافتن چیزی نباشد، مسلماً یک Exception یا بهتر بگوییم ارور ایجاد می شود (توجه داشته باشیم که اگر از abstract_factories ها به درستی استفاده نشود، این کار می تواند مشکلات امنیتی برای وب اپلیکیشن ما ایجاد کند.)برای ساخت یک abstract_factories می بایست آن را در قالب یک Key جدید زیر مجموعه service_manager ایجاد کنیم.سرویس دیگری که aliases نام دارد برای ایجاد سرویسی که پیش از این ایجاد شده اما قصد داریم تا آن را تحت عنوان نام دیگری بسازیم مورد استفاده قرار می گیرد.به صورت پیش فرض، کلیه سرویس ها به صورت مشترک مورد استفاده قرار می گیرند. به عبارت دیگر، وقتی که یک سرویس ایجاد می کنیم، آن سرویس در کلیه درخواست ها مورد استفاده قرار می گیرد. حال زمان هایی برای برنامه نویسان پیش خواهد آمد که قصد دارند تا سرویس های منحصر به فردی داشته باشند که برای این منظور می بایست از سرویسی تحت عنوان shared استفاده کنند.
  • نحوه کار کردن وب اپلیکیشنی که با Zend Framework 2 نوشته شده باشد
    نحوه کار کردن وب اپلیکیشنی که با Zend Framework 2 نوشته شده باشد
    پیش از آن که بیش از این در فریم ورک زند 2 به کدزنی بپردازیم، نیاز است تا با فرایند کاری این فریم ورک محبوب زبان برنامه نویسی پی اچ پی بیشتر آشنا شویم.در واقع زمانی که کاربری یک Request یا "درخواست" از طریق مرورگر برای سرور ارسال می کند، اولین فایلی که اجرا می شود فایل index.php است که داخل فولدر public قرار دارد. این فایل موتور اصلی ZF2 را اصطلاحاً Load می کند.در فاز اول، وب اپلیکیشن و تمامی ماژول های فعال آن Load می شوند. موتور فریم ورک زند 2 پایان یک مرحله و ابتدای یک مرحله جدید را با ایجاد پیام هایی با یک نام منحصر به فرد مشخص سازی می کند که اصطلاحاً Event گفته می شوند که عبارتند از loadModules، loadModule.resolve، loadModule و loadModules.post.به طور کلی منظور از Eventیی تحت عنوان loadModule این است که این Event زمانی اجرا می شود که لود شدن ماژول ها شروع می شود. معمولاً Autoloader ها با این Event ارتباط تنگاتنگی دارند.Eventیی تحت عنوان loadModule.resolve صرفاً برای ماژول های فعال شده اجرا می شود. loadModule نیز برای ماژول های فعالی اجرا می شود که نام ماژول به یک شیئ اختصاص پیدا کرده باشد.loadModules.post زمانی که همه ماژول ها لود شدند اجرای می گردد. این Event برای فراهم آوردن فرصتی برای ماژول ها به منظور انجام یکسری وظایف بیشتر مورد استفاده قرار می گیرد.در این فاز، کلیه فایل های مرتبط با تنظیمات ماژول ها لود شده و با فایل های تنظیمات اصلی وب اپلیکیشن ادغام شده تا یک فایل تنظیمات نهایی شکل گیرد.پس از اجرای موفقیت آمیز این فاز، متدی تحت عنوان onBootstrap که داخل فایل Module.php است اجرا می شود. در ادامه، فاز اجرایی وب اپلیکیشن آغاز می شود که در آن MVC به معنی واقعی کلمه شروع خواهد شد. در این مرحله یکسری Eventها من جمله route، dispatch، render و finish فراخوانی خواهند شد که در ادامه بیشتر با تک تک آن ها آشنا می شویم:route پیش از هر چیز دیگری فراخوانی می شود. فرایند routing پارامترهای یک درخواست ارسالی از سمت مرورگر کاربر را مورد بررسی قرار داده که از آن جمله می توان به پارامترهای GET و POST اشاره کرد. علاوه بر این، routing اطلاعات در مورد ماژول، کنترلر و اکشنی که می بایست لود شوند در اختیار وب اپلیکیشن قرار خواهد داد.dispatch زمانی اجرا می شود که اکشن استارت می خورد. در صورتی که درخواست رسیده مبنی بر نمایش نتیجه ای باشد، render فراخوانی خواهد شد و در نهایت هم finish فراخوانی می شود. به طور خلاصه، در این دو فاز، وب اپلیکیشنی که با فریم ورک زند 2 نوشته شده باشد به ترتیبی که در بالا گفتیم شروع به کار می کند.
  • نحوه ساخت یک اکشن در Zend Framework 2
    نحوه ساخت یک اکشن در Zend Framework 2
    برای آن که در توسعه وب اپلیکیشن دست ما بیشتر باز شود، نیاز است تا اقدام به نوشتن اکشن های بیشتری بنماییم. برای این منظور، داخل کنترلری مان تحت عنوان indexController یک اکشن تحت عنوان about ایجاد می کنیم. کاری که این اکشن قرار است انجام دهد این است تا صفحه درباره ما مرتبط با سایت را در معرض دید کاربران قرار دهد. برای شروع، نیاز است تا داخل indexController.php یک متد دیگر تحت عنوان aboutAction ایجاد می کنیم.توجه داشته باشیم که نحوه نامگذاری این اکشن ها از اهمیت بسزایی برخوردار است و می بایست از یک قانون کلی تبعیت کنیم. به عبارت دیگر، بخش اول نام اکشن ها (در این مثال about) نشانگر ماهیت اکشن بوده و پسوند Action (که با حرف بزرگ نوشته شده) به این خاطر است که به فریم ورک زند 2 بفهمانیم که می بایست این متد را به عنوانی اکشنی برای این کنترلر در نظر بگیرد.در مثال فوق قرار نیست تا هیچ داده ای را از Action به View پاس دهیم و صرفاً یک آرایه خالی داخل آن قرار می دهیم: namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class IndexController extends AbstractActionController { public function indexAction() { //return new ViewModel(); $my_service = $this->getServiceLocator(); $my_config = $my_service->get('config'); return array( 'version' => $my_config['application']['version'], 'applicationName' => $my_config['application']['name'] ); } public function aboutAction() { return array(); } } حال نیاز است تا یک View برای این اکشن در نظر بگیریم. برای این منظور، فایلی تحت عنوان about.phtml را در جایی که فایل index.phtml قرار داشت ایجاد می کنیم. حال ممکن است این سؤال برای شما پیش بیاید که چرا که فایل about.phtml را در این فولدر ایجاد می کنیم. در پاسخ به این سؤال می بایست گفت که اکشن about به منزله بخشی از کنترلر index است لذا می بایست کلیه View های مرتبط با این کنترل را داخل پوشه ای تحت عنوان index قرار دهیم (به طور مثال، اگر نام کنترلر ما company بود، می بایست کلیه View های مرتبط با آن را داخل پوشه ای تحت عنوان company که در مسیر module/Application/view/application/company قرار دارد ایجاد کنیم.)حال کدی داخل فایل about.phtml به صورت زیر قرار می دهیم: All About Training Center همان طور که در کد فوق مشخص است، از یک تگ h1 استفاده کرده و داخل آن عبارتی همچون All About Training Center به معنی "همه چیز درباره مرکز آموزش" قرار داده ایم.حال برای دسترسی به این صفحه می بایست یو آر الی همچون localhost/zend/public/application/index/about را وارد مرورگر کنیم و با صفحه زیر مواجه خواهیم شد:می بینیم که محتوایات صفحه about.phtml در معرض دید قرار می گیرند. ممکن است که با این URL کمی سردرگم شویم که چگونه با این یو آر ال توانستیم به فایل درباره ما سایت دست پیدا کنیم و این چیزی است که در ادامه آموزش ها بیشتر توضیح خواهیم داد.
  • پروژه سایت آموزشی آنلاین با استفاده از Zend Framework 2
    پروژه سایت آموزشی آنلاین با استفاده از Zend Framework 2
    در ابتدای آموزش، اولین کاری که می بایست انجام دهیم این است که صفحه خوشامدگویی پیش فرض فریم ورک زند 2 را مجدد طراحی کنیم. برای این منظور، فایلی تحت عنوان index.phtml که در مسیر module/Application/view/application/index قرار دارد را در ویرایشگر کدی همچون ادوبی برکتس، نوتپد پلاس پلاس، سابلایم و یا هر ویرایشگر کدی که مد نظر داشته باشیم باز کنیم. این فایل حاوی کلیه کدهای های HTMLیی است وقتی برای اولین بار ZF2 را نصب کردیم مشاهده نمودیم: در این مسیر، کلیه فایل های اچ تی ام ال مرتبط با این ماژول قرار خواهند گرفت. توجه داشته باشیم که این فایل صرفاً می بایست حاوی کدهایی باشد که مرتبط با View یا بهتر بگوییم "ظاهر سایت" باشند که در معرض دید کاربران قرار می گیرد. همان طور که مشاهده می شود پسوند این فایل phtml است و این پسوند حاکی از آن است که ما یک فایل اچ تی ام ال داریم که حاوی یکسری کدهای پی اچ پی داخل آن است. در خط اول این فایل، کدهای زیر را مشاهده خواهیم کرد: خروجی این کد با کد فوق هیچ تفاوتی نخواهد داشت. حال می بایست به تفسیر دستورات this و translate بپردازیم. دستور this به کلاسی که داخل آن قرار داریم اشاره می کند و کاری هم که متد translate انجام می دهد این است که متن در نظر گرفته شده به عنوان پارامتر آن را با توجه به زبان انتخابی وب اپلیکیشن که در این مثال انگلیسی است ترجمه می کند (متد translate اصطلاحاً View Helper خوانده می شود.)دستور echo هم پر واضح است که مسئول پرینت کردن هر چیزی است که مقابلش قرار گیرد. حال می بایست این عبارت را با عبارتی همچون Welcome to Training Center به معنی "به مرکز آموزش خوش آمدید" جایگزین کنیم. برای این منظور، کدهای فوق را به صورت زیر بازنویسی می کنیم: namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class IndexController extends AbstractActionController { public function indexAction() { return new ViewModel(); } } همان طور که در کد فوق ملاحظه می شود، در این کلاس متدی داریم تحت عنوان indexAction که از جنس public است (به عبارت دیگر دارای سطح دسترسی بالایی است و از هر کجا می توان به آن دست یافت.) از طریق این متد قادر خواهیم گشت تا داده های دلخواه خود را برای Viewیی تحت عنوان index.phtml ارسال کنیم. در فریم ورک Zf2 آسان ترین راه برای پاس دادن داده ها به یک View استفاده از یک آرایه است. Keyها در این آرایه به منزله نام متغیرها بوده و Valueهای این Keyها به منزله داده هایی بوده که در معرض دید کاربران قرار خواهند گرفت.برای مشخص تر شدن نحوه عملکرد این کنترلر، کدهای داخل متد indexAction را به صورت زیر تغییر می دهیم: namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class IndexController extends AbstractActionController { public function indexAction() { //return new ViewModel(); return array('version' => '0.0.1', 'applicationName' => 'Training Center'); } } همان طور که در کد فوق ملاحظه می شود، کدی که به صورت پیش فرض داخل این کنترلر نوشته شده بود را کامنت کرده و در عوض آرایه ای را بازگردانده که حاوی دو Key است. مقدار اول مربوط به نسخه بوده که برابر است با مقدار 0.0.1 و مقدار دوم هم مربوط به نام اپلیکیشن است که برابر است با Training Center به معنی "مرکز آموزشی".حال می بایست داخل View هم کاری کنیم که این داده ها نمایش داده شوند. برای این منظور View مرتبط با کنترلر indexAction را باز می کنیم (برای این منظور، از داخل ماژول Application وارد پوشه view سپس application و در نهایت index می شویم و فایل index.phtml را باز می کنیم): public function indexAction() { //return new ViewModel(); $my_service = $this->getServiceLocator(); $my_config = $my_service->get('config'); return array( 'version' => $my_config['application']['version'], 'applicationName' => $my_config['application']['name'] ); } پس از فراخوانی متدی تحت عنوان serviceLocator، به سادگی قادر خواهیم بود تا به تنظیمات سرویس دسترسی پیدا کنیم. تنظیمات سرویس یا همان config service آرایه ای است که دربرگیرنده ی آخرین تنظیمات اعمال شده روی وب اپلیکیشن ما است. ابتدا به تفسیر کدهای فوق پرداخته سپس فایلی تحت عنوان module.config.php که مسئول ذخیره سازی داده های مورد نیاز است را مورد بررسی قرار خواهیم داد.همان طور که در کد فوق ملاحظه می شود، متغیری ساخته ایم تحت عنوان my_service به معنی "سرویس من" که این نام کاملاً دلخواه است و مقدار آن را برابر با متدی تحت عنوان getServiceLocation قرار داده ایم (علت استفاده از دستور this در این خط از کد این است که می خواهیم به کلاسی که داخل آن قرار داریم اشاره کنیم.) از این پس متغیر my_service حاوی کلیه متدهای مرتبط با متد getSerciceLocator است. سپس متغیر دیگری تحت عنوان my_config به معنی "تنظیمات من" ایجاد کرده و مقدار آن را برابر با متغیر my_service قرار داده ایم که متدی تحت عنوان get را فرا می خواند. به طور کلی، کاری که متد get در فریم ورک زند انجام می دهد این است که هر پارامتری که داخل آن قرار دهیم را اصطلاحاً Fetch کرده یا "پیدا می کند". در این مثال قصد داریم کاری کنیم که پارامتری تحت عنوان config فراخوانی شود که مرتبط با فایلی تحت عنوان module.config.php می باشد.حال می بایست مقدار مد نظر خود را اصطلاحاً return کرد. برای این منظور، آرایه ای را باز می گردانیم که حاوی دو Key است. Key اول مرتبط با version یا "نسخه" است و دومی هم مرتبط با applicationName یا "نام وب اپلیکیشن" است. مقدار key اول برابر است با متغیر my_config که از این پس یک آرایه محسوب می شود که در آن دستور داده ایم که از Keyیی تحت عنوان application، یک Key به نام veriosn که داخل آن قرار دارد را به version اختصاص دهد. به همین صورت Valueیی را برای applicationName در نظر می گیریم.پیش از این هم گفتیم که این داده ها از فایلی تحت عنوان module.config.php که داخل فولدری تحت عنوان config که داخل ماژول Application قرار دارد فراخوانی می شوند. پس از باز کردن این فایل، آرایه ای تحت عنوان application ایجاد کرده و Keyهایی برای ذخیره سازی مقادیر نام اپلیکیشن و نسخه ی آن داخلش ایجاد می کنیم: return array( //Code related to the application name and its version 'application' => array( 'name' => 'Training Center', 'version' => '0.0.1' ), 'router' => array( 'routes' => array( 'home' => array( 'type' => 'Zend\Mvc\Router\Http\Literal', 'options' => array( 'route' => '/', 'defaults' => array( 'controller' => 'Application\Controller\Index', 'action' => 'index', ), ), ), 'application' => array( 'type' => 'Literal', 'options' => array( 'route' => '/application', 'defaults' => array( '__NAMESPACE__' => 'Application\Controller', 'controller' => 'Index', 'action' => 'index', ), ), 'may_terminate' => true, 'child_routes' => array( 'default' => array( 'type' => 'Segment', 'options' => array( 'route' => '/[:controller[/:action]]', 'constraints' => array( 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', ), 'defaults' => array( ), ), ), ), ), ), ), 'service_manager' => array( 'abstract_factories' => array( 'Zend\Cache\Service\StorageCacheAbstractServiceFactory', 'Zend\Log\LoggerAbstractServiceFactory', ), 'aliases' => array( 'translator' => 'MvcTranslator', ), ), 'translator' => array( 'locale' => 'en_US', 'translation_file_patterns' => array( array( 'type' => 'gettext', 'base_dir' => __DIR__ . '/../language', 'pattern' => '%s.mo', ), ), ), 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController' ), ), 'view_manager' => array( 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => array( 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ), 'template_path_stack' => array( __DIR__ . '/../view', ), ), // Placeholder for console routes 'console' => array( 'router' => array( 'routes' => array( ), ), ), ); همان طور که در کد فوق ملاحظه می شود، به عنوان اولین key آرایه اصلی، نامی همچون application را در نظر گرفته و از طریق یک array نام و نسخه اپلیکیشن را در نظر گرفته ایم.در این مرحله اگر که مرورگر را رفرش کنیم، هیچ تغییری نخواهیم دید اما این در حالی است که از این پس View و Logic یا همان "ظاهر" وب اپلیکیشن و "منطق" آن از یکدیگر مجزا شده اند و چنانچه تغییراتی در فایل module.config.php اعمال کنیم، این تغییرات به صورت سراسری اعمال خواهند شد.
  • تنظیمات مربوط به ماژول در Zend Framework 2
    تنظیمات مربوط به ماژول در Zend Framework 2
    در فایل application.config.php که در آموزش گذشته مورد بررسی قرار دادیم، یک Key دیگر داشتیم تحت عنوان module_paths که مشخص کننده مکانی هایی است که ماژول های ما در آنجا قرار گرفته اند. ماژول هایی که بسته به پروژه خود طراحی می کنیم می بایست داخل فولدری تحت عنوان module قرار گیرند و ماژول های از پیش تعریف شده توسط توسعه دهندگان فریم ورک زند 2 در فولدری تحت عنوان vendor قرار می گیرند که در آموزش های گذشته با آن به صورت کامل آشنا شده ایم.فایل اصلی تنظیمات برای ماژول Application داخل فولدر module داخل فولدر Application و داخل فولدر config قرار دارد که نامش module.config.php است.در این فایل، برنامه نویس قابلیت هایی را تعریف خواهد کرد که ماژول مد نظر ما قرار است ارائه دهد که از آن جمله می توان به serviceها، viewها، routeها، controllerها و بسیاری چیزهای دیگر اشاره کرد. در این دایرکتوری که این فایل داخل آن قرار دارد، همچنین می توان سایر فایل های تنظیمات را نیز تعریف کرد که از آن جمله می توان به فایل هایی با پسوند local.php.dist و global.php.dist اشاره کرد که در صورت لزوم در ادامه آموزش ها بیشتر با این فایل ها آشنا خواهیم شد. هدفی که این فایل ها دارند این است که مشخص می سازند که کدام بخش از تنظیمات پیش فرض می تواند برای این ماژول به خصوص Override شده تا نیازهای این ماژول برآورده شوند (توجه داشته باشیم زمانی که بخواهیم از دو فایل فوق استفاده کنیم، حتماً پسوند dist آن ها می بایست حذف شود.)برای روشن شدن این مسئله مثالی می زنیم: فرض کنیم ماژول جدیدی داریم که این امکان را برای ما برآورده می سازد تا سرویس های مرتبط با دیتابیس را ارائه دهیم. به منظور انجام تنظیمات این سرویس جدید، می توان یک فایل تنظیمات تحت عنوان database.local.php.dist ایجاد کرده و آن را داخل پوشه config قرار گرفته داخل ماژول مد نظر قرار داد. پس از آن که این ماژول را در فایل تنظیمات اصلی اپلیکیشن یا همان فایل application.config.php فعال سازی کردیم، فایل database.local.php.dist را می بایست داخل پوشه autoload قرار گرفته داخل config کپی کرده و پسوند dist آن را حذف نمود. با این کار به سادگی خواهیم توانست تنظیمات مرتبط با دیتابیس را برای این اپلیکیشن به خصوص تغییر دهیم. آشنایی با فایل Module.phpحداقل چیزی که هر ماژولی که در وب اپلیکیشن خود ایجاد می کنیم باید داشته باشد فایلی است تحت عنوان Module.php که حرف اول آن می بایست به صورت بزرگ نوشته شود. داخل این فایل می بایست تنظیمات مرتبط با ماژول را نوشته که از آن جمله می توان به محل قرارگیری کلاس هایی که به این ماژول مرتبط می باشند و می بایست به صورت خودکار فراخوانی شوند اشاره کرد. namespace Application; use Zend\Mvc\ModuleRouteListener; use Zend\Mvc\MvcEvent; class Module { public function onBootstrap(MvcEvent $e) { $eventManager = $e->getApplication()->getEventManager(); $moduleRouteListener = new ModuleRouteListener(); $moduleRouteListener->attach($eventManager); } public function getConfig() { return include __DIR__ . '/config/module.config.php'; } public function getAutoloaderConfig() { return array( 'Zend\Loader\StandardAutoloader' => array( 'namespaces' => array( __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, ), ), ); } } داخل این فایل کلاسی است تحت عنوان Module که حاوی متدهایی است که از آن جمله می توان به متدهای getConfig و getAutoloaderConfig اشاره کرد. متد getConfig مسئول تنظیمات این ماژول است و متد getAutoloaderConfig مسئول فراخوانی کلاس هایی که به محض اجرای این ماژول می بایست به صورت خودکار Load شوند. توجه داشته باشیم که خیلی نیازی به تغییر دادن در این دو متد نخواهیم داشت و متدی که کدهای خود را می بایست به آن اضافه کنیم onBootstrap است.متد onBootsrap بعد از این که تمامی ماژول ها Load شدند یا بهتر بگوییم زمانی که وب اپلیکیشن ما استارت خورد، فراخوانی می شود و در این لحظه است که ماژول اصطلاحاً Bootstrap می شود (در برنامه نویسی منظور از بوت استرپ نقطه شروع یک برنامه، اپلیکیشن یا وب اپلیکیشن است.)این متد، متد بسیار مهمی است چرا که داخل آن می توان Route های جدید و یا Listener هایی که به Event های خاصی اشاره دارند تعریف کرد. آشنایی با فایل composer.jsonفایل composer.json یکی دیگر از فایل تنظیمات فریم ورک زند 2 است که به معرفی وب اپلیکیشن و ملزومات آن می پردازد: { "name": "zendframework/skeleton-application", "description": "Skeleton Application for ZF2", "license": "BSD-3-Clause", "keywords": [ "framework", "zf2" ], "homepage": "http://framework.zend.com/", "require": { "php": ">=5.3.3", "zendframework/zendframework": "2.3.*" } } کدی که در بالا مشاهده می شود محتویات این فایل است. به طور مثال، name دربرگیرنده ی نام وب اپلیکیشن ما است و require هم نشانگر چیزهایی است که وب اپلیکیشن ما برای آن که به درستی بتواند کار کند به آن ها نیاز دارد. همان طور که در Value در نظر گرفته شده برای name مشاهده می شود، این نام دارای یک پیشوند تحت عنوان zendframework است که این پیشوند می بایست کوتاه بوده و در عین حال توصیف کننده ماهیت سایت باشد و بخش دوم هم نام منحصر به فردی است که توصیف کننده کاری است که این وب اپلیکیشن قرار است انجام دهد.در ارتباط با مقادیر در نظر گرفته شده برای require هم بایستی گفت که حداقل نسخه زبان پی اچ پی مورد نیاز برای اجرای این وب اپلیکیشن 5.3.3 است و حداقل نسخه فریم ورک زند هم نسخه 2.3 می باشد (علامت ستاره هم نشانگر این است که هر آپدیتی که برای نسخه 2.3 بیاید همچون 2.3.1 و ... هم شامل می شود.)در ادامه آموزش ها، به طور مفصل با این فایل و ابزار Composer آشنا خواهیم شد (به طور کلی، منظور از Composer ابزاری است که مرتبط با زبان برنامه نویسی PHP است که از آن طریق می توان کامپوننت های مرتبط با فریم ورکی همچون Zend را علاوه بر دانلود، آپدیت و مدیریت کرد.) آشنایی با فولدر Publicفولدری تحت عنوان public و کلیه فایل ها و فولدرهای قرار گرفته داخل آن قابل دسترسی توسط مروگر هستند. به عبارت دیگر زمانی که وب اپلیکیشنی توسط Zend Framework 2 نوشته می شود، این فولدر در ریشه یا Root هاست قرار گرفته و درخواست هایی که از سمت مرورگر ارسال می شوند به دست index.php قرار گرفته داخل این فولدر می رسند. توجه داشته باشیم که این فایل می بایست تا حد ممکن سبک باشد چرا که در هر درخواستی که برای وب اپلیکیشن ما از سمت مرورگرهای کاربران ارسال می شود، این فایل یک بار اجرا خواهد شد. به عبارت دیگر، این فایل جایی است که موتور ZF2 بارگزاری شده و اجرا می گردد (در این دوره آموزشی هیچ تغییر قابل توجهی داخل این فایل ایجاد نخواهیم کرد و تنظیمات پیش فرض آن را مد نظر قرار خواهیم داد.)این فولدر جایی است که فایل های سی اس اس، جاوا اسکریپت و همچنین تصاویری همچون لوگو و ... را داخل آن قرار می دهیم. از آنجا که این فایل به صورت مستقیم توسط مرورگر قابل دسترسی است، تحت هیچ عنوان نمی بایست فایل هایی حاوی داده های حساس را داخل این فولدر قرار دهیم.در این آموزش، با فایل ها و فولدرهای تشکیل دهنده یک پروژه نوشته شده با ZF2 آشنا شدیم و دیدیم که هر فایل و فولدر خاص مسئول چه کاری است. در آموزش های آتی، به بررسی پروژه ای که در این سری از آموزش های فریم ورک زند 2 خواهیم نوشت می پردازیم.
  • آشنایی با ساختار Skeleton Application در فریم ورک زند 2
    آشنایی با ساختار Skeleton Application در فریم ورک زند 2
    پیش از شروع آموزش به صورت جدی، ابتدا نیاز است تا با ساختار یک پروژه زند به خوبی آشنا شویم. برای این منظور، ساختار پروژه ای که در آموزش گذشته ساختیم را مورد بررسی قرار می دهیم: در هر پروژه ای فولدری داریم تحت عنوان module که دربرگیرنده تمامی ماژول های سایت ما خواهد بود. زمانی که وارد این فولدر می شویم، با فولدری تحت عنوان Application رو به رو خواهیم شد که به صورت پیش فرض در Skeleton Application ساخته شده است: در حقیقت این ماژول در حال حاضر تنها ماژول پروژه ما است. هر پروژه زند حداقل دارای یک ماژول می بایست باشد (توجه داشته باشیم که حرف اول نام ماژول ها می بایست به صورت بزرگ نوشته شود.) اما این در حالی است که محدود به یک ماژول نبوده و بسته به بزرگی پروژه، می توان سایت خود را به ماژول های مختلف تقسیم بندی نماییم. به طور مثال، فرض کنیم که یک فروشگاه آنلاین طراحی کنیم که در آن بخش های مختلفی همچون سبد خرید، خبرنامه، کاربران و ... داریم. به سادگی این بخش ها را می توان به ترتیب در قالب ماژول های Newsletter، Cartو Users دسته بندی کرد.علاوه بر این، هر وب اپلیکیشنی که با فریم ورک زند نوشته می شود می تواند دارای چندین فایل Configuration یا "تنظیمات" باشد که برخی از این فایل ها به عنوان فایل تنظیمات اصلی بوده و برخی دیگر مرتبط با تک تک ماژول ها می باشند.فایل اصلی تنظیمات اپلیکیشن در پوشه ای تحت عنوان config قرار دارد و نام آن application.config.php است: پس از باز کردن این فایل، با کدهای زیر مواجه خواهید شد: return array( 'modules' => array( 'Application', ), 'module_listener_options' => array( 'module_paths' => array( './module', './vendor', ), 'config_glob_paths' => array( 'config/autoload/{,*.}{global,local}.php', ), ), ); می دانیم که هر یک از مقادیر هر آرایه ای از یک Key و یک Value تشکیل شده است. در این فایل، در اصلی ترین array یک Key داریم تحت عنوان modules که مشخص می سازد کدام ماژول های وب اپلیکیشن ما فعال هستند و همان طور که پیش از این توضیح دادیم، وب اپلیکیشن ما تنها یک ماژول بیشتر به نام Application ندارد که در اینجا هم نام آن را مشاهده می کنیم (توجه داشته باشیم که نام Application با حرف بزرگ می بایست نوشته شود.) زمانی که شروع به افزودن ماژول های بیشتری به پروژه خود می کنیم، به ترتیب می بایست نام آن ها را پس از نام ماژول اول بنویسیم و آن ها را با کاما از یکدیگر مجزا سازیم.ترتیبی که نام ماژول ها بر آن اساس نوشته می شوند بسیار مهم است. به عبارت دیگر، زمانی که وب اپلیکیشن ما استارت می خورد، ماژول ها به همان ترتیبی که در این لیست نوشته شده اند Load می شوند. برای روشن شدن این مسئله مثالی می زنیم. فرض کنیم که ماژولی داریم تحت عنوان "ماژول ب" که برای اجرا نیاز به ماژول دارد تحت عنوان "ماژول الف". برای این که وب اپلیکیشن ما به درستی کار کند، در این لیست می بایست ابتدا نام ماژول الف را بنویسیم سپس نام ماژول ب را پس از آن قرار دهیم.زمانی که وب اپلیکیشن استارت می شود، فایل تنظیمات اختصاصی هر ماژول به همان ترتیبی که ماژول ها فراخوانی شده اند فراخوانده می شود که در نهایت منجر به تکمیل تنظیمات وب اپلیکیشن می شوند. در حقیقت، همواره تنظیمات آخرین ماژول فراخوانی شده تنظیمات ماژول قبل از خود را اصطلاحاً Override یا "بازنویسی" می کند.در ارتباط با فایل های تنظیمات، می بایست با مفاهیم دیگری همچون فایل های تنظیمات Local به معنی "محلی" و Global به معنی "عمومی" آشنا شویم.در کدهای فوق، یک Key دیگر داریم تحت عنوان config_glob_paths که محل قرارگیری و همچنین نام سایر فایل های تنظیمات که احتمال دارد در اجرای وب اپلیکیشن مورد نیاز واقع شوند را مشخص می سازد. این فایل ها می بایست داخل فولدر config داخل پوشه autoload قرار گیرند و نام آن ها می بایست به یکی از پسوند های global.php و local.php ختم شود: به طور خلاصه، فایل های تنظیماتی که به local.php ختم می شوند به منظور مشخص سازی تنظیمات برای محیط هایی که وب اپلیکیشن ما روی آن اجرا می گردد مورد استفاده قرار می گیرند. در توضیحات فوق، به جای واژه "محیط" از واژه "محیط ها" استفاده نمودیم چرا که در اینجا چندین محیط اجرای وب اپلیکیشن مد نظر ما است که عبارتند از:1. محیط توسعه وب اپلیکیشن: سیستمی که روی آن اقدام به کدنویسی می کنیم.2. محیط تست: سیستمی که از آن طریق تعدادی کاربر عادی اقدام به استفاده از وب اپلیکیشن ما می کنند تا باگ های احتمالی آن مشخص شود.3. محیط Stage: سیستمی که تنظیمات اولیه روی آن صورت می گیرد و خیلی شبیه به سرور اصلی است که قرار است سایت روی آن بالا بیاید.4. محیط تولید: سروری که سایت روی آن قرار گرفته و کلیه کاربران سایت از آن طریق اقدام به استفاده از وب اپلیکیشن ما می کنند.مثالی خوبی که مشخص می کند چه دست اطلاعاتی می تواند داخل فایل local.php قرار گیرد، پارامترهای مربوط به دیتابیس و کش می باشد.در ارتباط با فایل های تنظیمات global.php بایستی گفت که این فایل ها وابسته به محیط اجرای اپلیکیشن نمی باشند. در واقع این فایل ها حاوی تنظیماتی هستند که منجر به Override کردن تنظیمات ماژول هایی می شوند که فعال می باشند. توجه داشته باشید که داخل این فایل ها نمی بایست اطلاعات حساسی همچون رمزعبور و ... را قرار دهید.
  • صفحه قبل
  • 1
  • 2
  • صفحه بعد
دسترسی سریع
  • صفحه اصلی
  • اخبار
  • آموزش
  • فناوری اطلاعات
  • هنر
  • خودرو
  • آرایش و زیبایی
  • خانه داری
  • آموزش و ترفند
  • هک و امنیت
اطلاعات تماس
  • تماس با ما
  • درباره ما
  • تبلیغات
  • ورود کاربران
ویدیو
واکنش رهبر به تروریستی خواندن سپاه | واکنش آیت الله خامنه ای به اقدام خبیثانه آمریکا علیه سپاه
عیدی روحانی به مردم | عیدی 98 روحانی به مردم + فیلم

طراحی سایت ، سئو و میزبانی وب
توسط شبدیز

Top
Logo Copyright
  • تلگرام
  • اینستاگرام