Toggle navigation
تلگرام
اینستاگرام
فروشگاه
املاک
خودرو
شهربازی
تبلیغات
فروشگاه
شارژ همراه و پرداخت قبوض
املاک
خودرو
نیازمندی ها
شهربازی
تبلیغات
نت شهر
اخبار
خواندنیها
گالری تصاویر
آموزش
هنر
سبک زندگی
فناوری اطلاعات
گردشگری
×
متن خطا
An erroe accoured during send message
×
پیام موفقیت
Your message added successfully
خانه
آموزش
روش برای پرپشت کردن ریش و سبیل | چگونه ریش و سبیل خود را پرپشت کنیم
در این بخش ما قصد داریم در مورد پرپشت کردن ریش و سبیل به شما توضیحاتی را بیان کنیم . متاسفانه خیلی از آقایان با مشکل پرپشت و یکدست نبودن ریش و سبیل شان دست به گریبان هستند و نمی توانند رشد موهای صورت خود را خیلی سریع افزایش دهند .
نحوه جالب برای ساخت قاب عکس | چگونه یک قاب عکس زیبا درست کنیم | روش ساخت قاب عکس زیبا
آموزش تصویری تزیین و ساخت قاب عکس چوبی با چسب طرح دار و رنگ خیلی ساده و در عین حال زیبا و خاص در این مطلب یاد بگیرید.
نحوه دوخت حوله بچه گانه / چگونه حوله بچه گانه بدوزیم / آموزش دوخت حوله بچه گانه
در این بخش ما به شما آموزش تصویری دوخت حوله بچه گانه برای کودک خود را یاد می دهیم.
سخن پایانی دوره آموزش زبان طراحی وب سایت اچ تی ام ال
در این سری از آموزش ها سعی نمودیم تا با زبانی ساده مفاهیم اصلی اچ تی ام ال (HTML) را به علاقمندان منتقل نماییم و در اینجا دوره آموزش رایگان اچ تی ام ال (HTML) در سایت نت شهر به پایان می رسد اما این بدان معنا نیست که مفاهیم اچ تی ام ال (HTML) به طور کامل بیان شده اند بلکه در این سری از آموزش ها حداقل های مورد نیاز برای شروع کار طراحی سایت آموزش داده شد. از جمله وب سایت های آموزشی انگلیسی زبان در زمینه طراحی سایت به خصوص زبان های اچ تی ام ال و سی اس اس می توان به موارد زیر اشاره کرد: http://www.w3schools.comhttp://www.htmldog.comhttp://html.net/http://www.w3.org/TR/html401 http://www.w3.org https://developer.mozilla.org/en-US در حقیقت چنانچه بخواهیم از وب سایت های فوق الذکر استفاده کنیم، برخورداری از دانش زبان انگلیسی ضروری است. از سوی دیگر نکات مهم برخی وب سایت های فوق الذکر در این سری آموزش ها گنجانده شده اند. بنابراین سعی شده تا حد ممکن کاربران سایت نت شهر بی نیاز از رجوع به دیگر سایت ها گردند. علاوه بر این با استفاده از سایت validator.w3.org خواهیم توانست آدرس وب سایت طراحی شده خود را در بخش مربوطه وارد کرده و کلیه کدها، لینک ها و ... سایت خود را بر اساس اصول طراحی استاندارد چک کنیم. در واقع با اینکار چنانچه سایت ما دچار مشکلی باشد، نوع مشکل و جایگاه آن در سایت برای ما مشخص خواهد شد تا بتوانیم آن را اصلاح نماییم. در ضمن سایت https://www.google.com/webmasters که زیر مجموعه سایت گوگل است این امکان را به ما می دهد تا بتوانیم سایت خود را به موتور جستجوی گوگل بهتر معرفی کنیم. در این سایت علاوه بر مقالات آموزشی، امکان ثبت نام نیز وجود دارد بطوریکه پس از ثبت نام می توان آدرس سایت خود را وارد نموده و از این پس کلیه تحلیل های آماری در مورد سایت در اختیار ما قرار خواهند گرفت. با آرزوی پیروزی و سربلندی تیم تولید محتوای نت شهر
آشنایی با 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 یک فرم ثبت نام بسازیم
در این پروژه، قصد داریم تا فرمی ایجاد کنیم تا بتوان از آن طریق به مدیریت کاربران همچون افزودن، ویرایش کردن و حذف کردن بپردازیم. نام این فایل را قصد داریم 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، یک ماژول جدید تحت عنوان 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
به طور کلی، معماری سه لایه 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 صرفاً به شکل 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 نوشته شده باشد
پیش از آن که بیش از این در فریم ورک زند 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 نوشته شده باشد به ترتیبی که در بالا گفتیم شروع به کار می کند.
صفحه قبل
1
2
3
4
5
6
7
8
9
10
صفحه بعد