ایده
هدف این پروژه، ساخت یک پایگاه داده قابل مرور از گروهبندی و محصولات میباشد. یک مدیر قادر به ایجاد صفحاتی برای گروهها و محصولات خود و ورود اطلاعاتی مانند نام، موجودیت، تصویر هر محصول بهسادگی خواهد بود. برنامه وب ما از عملیاتهای ایجاد، بازیابی، بهروزرسانی، حذف (UCID) پشتیبانی خواهد کرد. همچنین صفحاتی را بهصورت عمومی با گزینه فیلتر کردن محصولات از طریق گروه و امکان دادن به کاربران برای ورود و ارائه سفارش خود و پرداخت از طریق paypal ایجاد خواهد شد.
نهادها، روابط و ویژگیها
در ابتدا، نهادهای برنامه باید تعیین شود، یک نهاد میتواند یک مکان، یک شیء یا یک شخصی باشد که داده میتواند درباره آن ذخیره و کلاسبندی شود و با سایر نهادها رابطه برقرار کند، بهعنوان اولین نیازمندیها، میتوان نهادهای زیر و سایر ویژگیها را تعیین کرد:
این اطلاعات جهت کمک به ساخت شمای پایگاه دادهای که نهادها، روابط، ویژگیها و مدلهای از پیش تعیینشده را ذخیره میسازد حیاتی است، بدین معنا که کلاسهای PHP اشیا را در پایگاه داده خود نشان میدهند.
NB:pk-> primary key and fK-> foreign key
در دیاگرام مشاهده میشود که گروهها دارای یک رابطه “hasMany” با محصولات هستند و محصولات یک رابطه “belongTo” با گروهها دارند. این موارد هنگام ساخت مدلهای خود شرح داده خواهند شد.
نگاشت برنامه
در حال حاضر،ساختارURL برنامه وب ما باید تعیین شود.قابلیت استفاده view،مرور برنامه وب خود به سادگی انجام خواهد شد و دلهره کمی برای بازدیدکنندگان ایجاد خواهد کرد.آنها،URLها،همچنین معمولاً رتبه بالایی در نتایج موتور جستجو به خصوصی اگر کلمات کلیدی مناسبتی داشته باشند دارند،میخواهیم مسیرهای زیر را در برنامه وب خود جهت تکمیل مجموعه نیازمندیهای اولیه بکار ببریم:
Description | Route | Method |
Index | / | GET |
Overview page | admin/categories/index | GET |
Form to create a new category page | admin/categories/create | GET |
Form to confirm deletion of page | admin/categories/destroy | GET |
Overview page | admin/products/index | GET |
Form to create a new product page | admin/products/create | GET |
Form to update a product page | admin/products/index | PUT |
Form to confirm deletion of page | admin/products/destroy | GET |
Overview of single category | store/category/id | GET |
Overview of single product | store/view/id | GET |
Overview page | store/cart | GET |
Overview page | store/contact | GET |
ایجاد یک نمای اصلی
همانگونه که در ابتدا شرح داده شد،Blade templating امکان ایجاد لایههای سلسله مراتبی را از طریق ارائه قالبهای تودرتو و یا توسعهیافته فراهم میسازد.
این رویه کاملاً شفاف و مستقیم است که در آن فایل “index.html” که همراه با نصب Boot & trap ارائه میشود کپی میکنیم و آن را بهعنوان”app/views/layouts/main.blade.php” ذخیره میسازد.
ازhelper های Laravel بهجای کد html معمولی استفاده میکنیم که به ما در نوشتن کد بیشتر و همچنین رهایی از نهادهای html کمک میکند.این تغییرات را در این مثالها اعمال خواهیم کرد:
.
برای تعریف یک Blade templating اصلی از ساختار اساسی زیر استفاده میکنیم:
سپس،میتوان از Blade templating اصلی با نمایی دیگر از طریق استفاده این ساختار اصلی استفاده کرد:
دستور”@yield” مکانی برای چندین بخش است که یک نمای تودرتو میتواند آن را پر کند یا مجدد قرار گیرد،درحالیکه دستور است”@section” و “@stop” هر دو بلوکهایی از محتوا را که به template اصلی وارد میشوند را تعریف میکند.برنامهریزی این فرآیند کلی میتواند در دیاگرام زیر مشاهده شود:
برای تمرین،بخش محتوای اصلی در فایل “main.blade.php” را خالی میکنیم و آن را با(‘content’)@yield جایگزین مینماییم که نتیجه “main” خواهد بود که تمامی نماها را در برنامه وب استفاده خواهد کرد.
یک ناحیه notification بیت هدر و صفحه محتوا درصورتیکه نیاز به اطلاعرسانی به کاربرد درباره خروجی بخش معینی داریم آماده میشود.این پیغام flash از شیء session استخراج میگردد.
مرحله بعد،آوردن منابع دیگر به نمای اصلی خود میباشد،برای این کار،تمامی محتوای CSS/js/img/fonts را کپی میکنیم در دایرکتوری app/public قرار میدهیم.
خلق نماهای شخصی برای هر بخش از برنامه وب بهطور کامل در بخش ایجاد نماها پوشش داده خواهد شد.
ایجاد مدلهای Eloquent و سایر شماهای مرتبط
همانگونه که پیشازاین مشاهده گردید،Laravel4 با یک ORM برنامه Eloquent همراه است،این ابزار قدرتمند، به ما امکان میدهد تا نهادها را تعریف کنیم،آنها را به سایر جداول پایگاه داده مرتبط نگاشت نماییم و آنها را با استفاده از متدهای php بجای گرامرSQL بهسادگی دستکاری کنیم.
این کار را با تعریف مدلهایی که برنامه قصد تعامل با آنها را دارد آغاز میکنیم.پیشازاین 3 نهاد اصلی به نامهای گروه،محصول و کاربر را تعریف کرده بودیم.این پیماننامهای بین توسعهدهندگان Laravel4 برای نوشت یک نام مدل به شکل منفرد میباشد، مدلی به نام محصول به جدول محصولات در پایگاه داده نگاشت میشود و مدل گروه به گروهها.
مدل گروه،داخل app/models/category.php ذخیره میشود که یک رابطه “hasMany”با مدل محصول دارد.
برای ایجاد مهاجرت به این مدل،دستور”$php artisan migrate:make” و درج نام مهاجرت پس از آن در نظر گرفته میشود.
سپس، فایل مهاجرت در داخل app/database/migrations را باز میکنیم و شما را با استفاده از کلاس schema مینویسیم:
برای ایجاد جدولی که در پایگاه داده،باید دستور زیر را وارد کنیم:
“$ php artisan migrate”
مراحل قبلی را بهطور مشابه برای ایجاد مدل محصول انجام میدهیم که داخل app/models/product.php ذخیره میشود و یک رابطه ”belongsTO” با مدل گروه دارد.
این نوعها (Type) باید همیشه یکسان،بنابراین،باید دقت داشته باشیم که همواره ستون کلید خارجی علامتگذاری نشده باشد،هنگامیکه یک عدد صحیح در حال افزایش به آن اشاره دارد.
مدل کاربر، گره مورد خاص میباشد،زیرا امنیت آن باید در نظر گرفته میشود، در ادامه این موضوعi شرح داده خواهد شد.
مدیریت تصویر بهعنوان مثالی از مدیریت وابستگی
برای محصولات نشان دادهشده در فروشگاه نیاز به آپلود کردن تصاویر و resize آنها برای نمایش بهصورت thumbnail داریم.برای انجام این کار، باید بسته خارجی به نام Intersection/image را بکار بگیریم.برای افزودن این وابستگی جدید، باید آن را از طریق Composer نصب کنیم.به فایل composer.json مراجعه میکنیم و خط برجسته شدن در شکل زیر را به آن اضافه میکنیم:
و سپس دستور Composer را در ترمینال خود اجرا میکنیم:
Composer Update$
این بسته Intervention را در دایرکتوری Sender نصب خواهد شد.برای اطمینان از اینکه Laravel بهطور خودکار آن را بارگذاری میکند باید تأمینکننده سرویس برویم و خط مشخصشده زیرا را به ؟ اضافه میکنیم:
پس از پایان مرحله قبلی، میتوان به کتابخانه ؟ از طریق تصویر بارگذاری شده خودکار توسط Laravel دسترس یافت.برای انجام این کار و در بخشنامهای مستعار کلاس همان فایل بایدFacedes را اضافه کنیم،لذا میتوان بهراحتی به آن طریق یک نام مستعار در ارائه alias دستیافت.
آخرین مرحله، ایجاد مکانی برای ذخیرهسازی تصاویر آپلود شده میباشد.فولدری به نام “products” به دایرکتوری public/image اضافه خواهیم کرد.
متدهای ذخیره و تغییر اندازه تصویر در کنترلر محصولات ما استفاده خواهد شد.
ایجاد کنترلرها و مسیرهای مربوط به آن
همانگونه که بیشتر اشاره شد، وظیفه اصلی کنترلر مدیریت درخواستها و ارسال داده از مدل به نماها میباشد.بنابراین، یکی کنترلر میتواند بهعنوان پیوندی بین مدلها و نماها در نظر گرفته شود.
-کنترلر گروهها
برای ایجاد کنترلر گروهها،داخل دایرکتوری app/controllers ،فایل categoriesController.php را اضافه میکنیم:
سپس میتوان مسیر مرتبط را در فایل app/routes.php ثبت کرد.برای انجام این کار،خط مشخصشده زیر را به فایل زیر اضافه میکنیم:
فایل app/routes.php برای در برگرفتن مسیرهای بیشتر از سایر کنترلرها ویرایش خواهد شد.
-کنترلر محصولات
بهطور مشابه،کنترلر محصولات با کد زیر در داخل app/controllers/productsController.php ایجاد میشود:
سپس مجموعه مسیرها با افزودن خط زیر به app/routes.php دوباره بهروزرسانی میشود:
;(‘Route:Controller(‘admin/products’,’products Controller
-کنترلر فروشگاه
– کنترلر پایه
برای مشاهده محصولات توسط گروه به مار میرود.این کار از طریق بهروزرسانی منوی بازشدنی کد درواقع از گروههای پایگاه داده بهجای لینکهای ایستا استفاده میکند آغاز میشود.کل برنامه وب ما از آن منوی بازشدنی گروهبندیها استفاده میکند که این منوها هنگامیکه تکمیل میشوند، تمامی نماها نیاز دارند تا به دادههای آن گروهها دسترسی یابند، به این منظور، باید یک فیلتر به کنترلر پایه اضافه شود تا مطمئن شویم تمامی کنترلرهای ما از آن ارثبری میکنند و بنابراین تمامی نماهای وبسایت بین دادههای گروههای یکسان به اشتراک میگذارد.
حال باید تمامی کنترلرهای خود را بهجای نوشتن دوباره کنترلر پایه که بهتازگی به آن اضافهشده است بهروزرسانی کنیم.خط مشخصشده زیر را بهتمامی کنترلر های خود اضافه میکنیم:
-کنترلر کاربران
برای ایجاد این کنترلر در بخش احراز هویت کاربران شرح داده خواهد شد.
ایجاد نماها
همانگونه که بیشتر شرح داده شد،نماها دادههای را از کنترلر(یا روتر)دریافت میکنند و آن را به template وارد مینمایید،بنابراین،به ما کمک میکند تا منطق تجاری از لایه نمایش در برنامه وب جدا شود.
-نمای گروهها
برای افزودن اولین نما، که همان نمای گروهها میباشد، بهراحتی فایل به نام dex.blade.php را داخل app/views/categories ایجاد میکنیم و محتوای زیر را به آن اضافه مینماییم:
این نمایی است که توسط admin برای مدیریت گروهها استفاده میشود:
– نمای محصولات
این نمایی است که توسط admin برای مدیریت محصولات استفاده میشود:
تمامی نماهای فروشگاه لیست شده در اینجا نماهایی هستند که یک کاربر غیر ادمین میتواند مشاهده کند و با آن تعامل برقرار نماید.کد زیر برای مشاهده index استفادهشده بهعنوان اصلی برای نماهای زیر میباشد:
کلاس “Availibility” میتواند instock یا outofstock باشد.برای مقدار Availibility در پایگاه داده میتوان صفر و هم یک را در نظر گرفت.لذا باید 2 متر helper نوشت، یکی نام کلاس instock یا outofstock را برمیگرداند و دیگری مقدار instock یا outofstock را یک فولدر جدید به نام libs داخل دایرکتوری app برای نگهداری کتابخانههای شخصی خود ایجاد میکنیم و این فایل Availibility را به آن میافزاییم:
سپس باید مطمئن شویم کهlaravel آن را برای ما دانلود میکند.برای انجام این کار، به فایل app/start/global.php مراجعه و خط مشخصشده زیر را به آن اضافه میکنیم:
و بهطور مشابه، نماهای دیگر را به فروشگاه اضافه میکنیم که عبارتند از:
-Category :جایی که کاربر میتواند محصولات را بهصورت گروهبندی مشاهده کند.
-View :جایی که کاربر میتواند محصولات را بهطور انفرادی مشاهده نماید.
-Search :جایی که کاربر میتواند تمامی وبسایت را با استفاده از کلمه کلیدی جستجو نماید.
-Cart :جایی که کاربر میتواند جزییات سفارش خود را پیش از پرداخت مشاهده و ویرایش کند.
Contact -:جایی که کاربر میتواند جریات تماس را بیابد.
– نمای کاربران
برای ایجاد نما به بخش احراز هویت کاربران مراجعه نمایید.
احراز هویت کاربران
حال بر روی سیستم احراز هویت کار میکنیم.به این منظور برای اینکه مشتریان سفارشهای خود را ارائه دهند و تاریخچه سفارشهای قبلی را مشاهده نمایند، باید یک حساب کاربری داشته باشند.ابتدا باید جدولی برای ذخیرهسازی دادههای کاربران داشته باشیم.
یک فایل جدید با استفاده از دستور زیر در ترمینال ایجاد میکنیم:
$ php artisan migrate : make create-users-table
سپس شمای مدلی کاربران خود را با ویرایش فایل مهاجرت ایجادشده میسازیم.
همانگونه که پیشتر بیان شد، کاربران بهطور پیشفرض admin تعریف نمیشوند.
فایل migration را برای ایجاد جدولی در پایگاه داده با استفاده از دستور زیر اجرا میکنیم:
$ php artisan migrate
ازآنجاییکه هنوز داده backend وجود ندارد، از یک seeder برای پر کردن آن با دادههایی استفاده میکنیم. این کار را با دستور زیر انجام میدهیم:
سپس زیر دایرکتوری app/database/seeds فایل users table seeder شامل کد زیر را ایجاد میکنیم:
سپس گروهها و محصولات خود را در پنل admin که تنها توسط admin قابلدسترسی است ایجاد میکنیم. این کار را با افزودن خط مشخصشده زیر به هر دو فایل انجام میدهد:
سپس به فایل app/filters.php برای افزودن مسیر فیلتر ادمین مراجعه میشود:
پساز انجام تمامی مراحل فوق، تنها با کاربر ادمین که میتواند به پنل گروهها و محصولات دسترسی داشته باشند وارد میشویم. سایر کاربران به نمای فروشگاه فرستاده میشوند.
ایمنسازی برنامه
برنامه وب، در حال حاضر دارای تعدادی نقاط آسیبپذیر میباشد. و تمامی آنها را نمیتوان در این بخش پوشش داد اما جدیترین این آسیبها، در این بخش اصلاح خواهد شد. جملات باهدف گذاری یک URL که دارای اثراتی است هدایت میشوند. اولین آنها، تمامی URLهایی است که ورودی کاربر را مدیریت میکند که این توکن CSRF را بررسی نمیکنند.
برای اشاره به این Cross-site request forgery (CSRF) خط مشخصشده زیر را بهتمامی کنترلرهای خود اضافه کنیم:
سپس به فایل app/filters.php مراجعه و مسیر فیلتر CSRF را اضافه میکنیم.
و فرآیند ساخت یک برنامه وب ecommerce با استفاده از فریم ورک Laravel 4 منتج میشود.