PDA

View Full Version : سوال: این روشی که من استفاده می کنم MVC هست؟



idocsidocs
یک شنبه 13 شهریور 1390, 02:17 صبح
من برای ساختار (MVC) سایتم به این شکل عمل می کنم که یه فایل می سازم که کار کنترلر رو انجام می ده و همه درخواستها به این فایل می رسن.

توی سازنده این فایل ابتدا فایلهای در بر دارنده کدهای model و سایر توابع مورد نیاز اینکلود می شن و بعد به کمک کوئری استرینگ صفحات مورد نظر کاربر رو تشخیص می ده، و به کمک آرایه پست فرمهای ارسالی رو پردازش می کنه و در نهایت توی قسمت مخرب قالب سایت یا همون بخش view رو نمایش می ده.

توی این روش از رجیستر استفاده نمی کنم. لطفا بگید که آیا این روش یه روش استاندارد هست یا نه؟

کدهای فایل کنترلر رو در ادامه قرار دادم.



<?php
class controler
{
function __construct()
{
define('ROOT',dirname(__FILE__));
define('DS',DIRECTORY_SEPARATOR);
date_default_timezone_set('Asia/Tehran');

require_once(ROOT.DS.'config'.DS.'config.php');
}
public function controler_fun()
{
require_once(ROOT.DS.'config'.DS.'model.php');
require_once(ROOT.DS.'config'.DS.'func.php');
if(!empty($_GET))
{
//پردازش کوئري استرينگ
}
elseif(!empty($_POST))
{
//پردازش فرمها
}
else
{

//یک صفحه پیش فرض تعیین می شود
}
}
function __destruct()
{
require_once(ROOT.DS.'view'.DS.'fa'.DS.'lang.php') ;
require_once('view/view.php');
}
}
$obj = new controler();
$obj->controler_fun();
?>

بعضی وقتا تعداد خطها به بالای 1000 خط می رسه، لطفا نظرتون رو در مورد این روش بگید.

Mr.Moghadam
یک شنبه 13 شهریور 1390, 02:24 صبح
این روش شما استاندارد نیست.
یه فایل آموزش به همراه کدهاش برات ضمیمه کردم ببینش. باهاش کار کن سعی کن بفهمی طرز کارش رو وقتی که نحوه عملکردش دستت اومد میتونی یه MVC بسازی.
من برای انجام پروژه هام از مدل mvc استفاده کردم.گسترشش دادم.با اینکه هنوز خیلی ناقصه اما کار میکنه ;)
هر جاش هم مشکل داشتی بپرس.

idocsidocs
یک شنبه 13 شهریور 1390, 02:32 صبح
این روش شما استاندارد نیست.
یه فایل آموزش به همراه کدهاش برات ضمیمه کردم ببینش. باهاش کار کن سعی کن بفهمی طرز کارش رو وقتی که نحوه عملکردش دستت اومد میتونی یه MVC بسازی.
من برای انجام پروژه هام از مدل mvc استفاده کردم.گسترشش دادم.با اینکه هنوز خیلی ناقصه اما کار میکنه ;)
هر جاش هم مشکل داشتی بپرس.
امکانش هست که ایرادهای این روش رو که من استفاده می کنم بهم بگید؟

idocsidocs
یک شنبه 13 شهریور 1390, 11:12 صبح
این روش شما استاندارد نیست.
یه فایل آموزش به همراه کدهاش برات ضمیمه کردم ببینش. باهاش کار کن سعی کن بفهمی طرز کارش رو وقتی که نحوه عملکردش دستت اومد میتونی یه MVC بسازی.
من برای انجام پروژه هام از مدل mvc استفاده کردم.گسترشش دادم.با اینکه هنوز خیلی ناقصه اما کار میکنه ;)
هر جاش هم مشکل داشتی بپرس.
الان فایل پی دی اف رو خوندم. ظاهرا روشی که توی این فایل گفته با روشی که من استفاده می کنم فقط یه تفاوت ساده داره.

تفاوتش اینه که توی روشی که شما پیشنهاد می کنید، همه درخواستها به فایل index.php می رسن و بعد از طریق کوئری استرینگ controler مورد نظر پیدا اینکلود می شه.

توی روشی که من استفاده می کنم هر کنترلر رو توی یه فایل جدا گانه قرار می دم و برای اجرای کنترلر، کاربر آدرس اون کنترلر به همراه پارامترهای اکشن وارد می کنه. بعد از این کار، فایل کنترلر بصورت مستقیم اجرا می شه و اکشن و پارامترهای مورد نظر خودش رو اجرا می کنه در صورتیکه توی روش که شما پیشنهاد می کنید باید نام فایل کنترلر رو هم توی کوئری استرینگ قرار داد و فایل کنترلر باید اینکلود بشه.

هر دو روش تقریبا یکسان هست، خوشحال می شم اگه روش من ایراد داره، بهم بگید.

Mr.Moghadam
یک شنبه 13 شهریور 1390, 11:58 صبح
روش شما اگر درست کار میکنه پس ایراد نداره بنده گفتم خدمتتون استاندارد نیست. اگر با بقیه فریم ورکها کار کرده باشید میبینید که ابتدا همه درخواستها به فایل ایندکس میره و سپس درخواستها پردازش و اجرا میشه.

پیشنهاد میکنم در حد معمول با چندتا از فریم ورکهای معروف کار کنید تا روش کار و امکاناتی رو که در اختیارتون قرار میدن دستتون بیاد.

موفق باشید

رضا قربانی
یک شنبه 13 شهریور 1390, 12:50 عصر
این روش شما استاندارد نیست.
یه فایل آموزش به همراه کدهاش برات ضمیمه کردم ببینش. باهاش کار کن سعی کن بفهمی طرز کارش رو وقتی که نحوه عملکردش دستت اومد میتونی یه MVC بسازی.
من برای انجام پروژه هام از مدل mvc استفاده کردم.گسترشش دادم.با اینکه هنوز خیلی ناقصه اما کار میکنه ;)
هر جاش هم مشکل داشتی بپرس.
داش سعید کارت عالی بود .

موفق باشید

idocsidocs
یک شنبه 13 شهریور 1390, 13:06 عصر
روش شما اگر درست کار میکنه پس ایراد نداره بنده گفتم خدمتتون استاندارد نیست. اگر با بقیه فریم ورکها کار کرده باشید میبینید که ابتدا همه درخواستها به فایل ایندکس میره و سپس درخواستها پردازش و اجرا میشه.

پیشنهاد میکنم در حد معمول با چندتا از فریم ورکهای معروف کار کنید تا روش کار و امکاناتی رو که در اختیارتون قرار میدن دستتون بیاد.

موفق باشید

ظاهرا روشی که شما استفاده می کنید بهتره و کد نویسی رو به همراه حجم فایلهایی که باید اینکلود بشن خیلی کمتر می کنه. از این به بعد از این روش استفاده می کنم. مرسی.

من چندجای دیگه هم آموزش mvc دیدم، توی اونها بعلاوه امکانات mvc شما، از رجیستر و روتر هم استفاده می شد. آیا استفاده از رجیستر و روتر توی mvc ضروری هست و چرا شما توی فریم ورکتون از رجیستر و روتر استفاده نکردید؟

یه نکته در مورد فایل index.php: بر اساس اصول سئو باید www و index.php رو از آدرس های اینترنتی حذف کنیم تا هر صفحه چندبار ایندکس نشه. منم همین کار رو می کنم، ولی وقتی این کار رو انجام می دم و یه فرم رو برای فایل index.php می فرستم، چون index.php از آدرس حذف می شه، در نتیجه نمی تونم هیچ فرمی رو برای فایل index.php بفرستم.

به همین دلیل از فایل index.php فقط برای صفحه اول سایت و اونم برای نمایش دادن استفاده می کنم.
می شه بگید چرا فریم ورکها این نکته رو رعایت نمی کنن؟

Mr.Moghadam
یک شنبه 13 شهریور 1390, 14:50 عصر
داش سعید کارت عالی بود .

موفق باشید
ممنون رضا جان


من چندجای دیگه هم آموزش mvc دیدم، توی اونها بعلاوه امکانات mvc شما، از رجیستر و روتر هم استفاده می شد. آیا استفاده از رجیستر و روتر توی mvc ضروری هست و چرا شما توی فریم ورکتون از رجیستر و روتر استفاده نکردید؟

این آموزشی رو که گذاشتم مال خیلی وقت پیشه که از یه سایت ترجمه کردم. در حال حاضر فریم ورکی که خودم درست کردم از Router استفاده میکنه اما از رجیستر نه. اگر اصول اصلی mvc رعایت شده باشه فکر میکنم این قضیه سلیقه ای باشه.



یه نکته در مورد فایل index.php: بر اساس اصول سئو باید www و index.php رو از آدرس های اینترنتی حذف کنیم تا هر صفحه چندبار ایندکس نشه. منم همین کار رو می کنم، ولی وقتی این کار رو انجام می دم و یه فرم رو برای فایل index.php می فرستم، چون index.php از آدرس حذف می شه، در نتیجه نمی تونم هیچ فرمی رو برای فایل index.php بفرستم.

همینطور که میدونی آدرسهای صفحات در mvc به شکل زیره


http://hostname/controller/action/parametes

شما وقتی آدرسی رو به صورت زیر http://hostname/user/profile/saeed فراخوانی میکنید درخواست به فایل index.php فرستاده میشه و این آدرس به وسیله کلاس router ( یا هرچی دیگه ) پردازش میشه.
کلاس router کنترلر user رو اینکلود میکنه و یک شیء از کنترلر user میسازه. و متود مربوط رو که در اینجا profile هست با پارامتر saeed فراخوانی میکنه.
حالا شما اگه یک فرم رو به صورت post بخوای ارسال کنی توی اکشن مربوط به فرمت باید اینجوری بنویسی

http://hostname/user/add
که این هم میره کنترلر یوزر رو با متود add فراخوانی میکنه و ارایه POST رو به اون متود ارسال میکنه.شما داخل متود add به شکل زیر میتونی از post استفاده کنی


function add()
{
if(isset($_POST['username']))
{
// do somthing
}
}

idocsidocs
یک شنبه 13 شهریور 1390, 15:18 عصر
ممنون رضا جان



این آموزشی رو که گذاشتم مال خیلی وقت پیشه که از یه سایت ترجمه کردم. در حال حاضر فریم ورکی که خودم درست کردم از Router استفاده میکنه اما از رجیستر نه. اگر اصول اصلی mvc رعایت شده باشه فکر میکنم این قضیه سلیقه ای باشه.




همینطور که میدونی آدرسهای صفحات در mvc به شکل زیره


http://hostname/controller/action/parametes

شما وقتی آدرسی رو به صورت زیر http://hostname/user/profile/saeed فراخوانی میکنید درخواست به فایل index.php فرستاده میشه و این آدرس به وسیله کلاس router ( یا هرچی دیگه ) پردازش میشه.
کلاس router کنترلر user رو اینکلود میکنه و یک شیء از کنترلر user میسازه. و متود مربوط رو که در اینجا profile هست با پارامتر saeed فراخوانی میکنه.
حالا شما اگه یک فرم رو به صورت post بخوای ارسال کنی توی اکشن مربوط به فرمت باید اینجوری بنویسی

http://hostname/user/add
که این هم میره کنترلر یوزر رو با متود add فراخوانی میکنه و ارایه POST رو به اون متود ارسال میکنه.شما داخل متود add به شکل زیر میتونی از post استفاده کنی


function add()
{
if(isset($_POST['username']))
{
// do somthing
}
}
آقا اینا رو که گفتی معلوم شد که من خیلی توی MVC عقب هستم. باید بیشتر کار کنم.

یه سوال، اگه چند فایل بسازیم و توی هرکدوم یه کلاس ایجاد کنیم و این فایلها رو اینکلود کنیم، آیا می شه بیرون از فایل های اینکلود شده، کلاسهایی بسازیم که از کلاسهای موجود توی فایلها ارث بری کنن؟

Mr.Moghadam
یک شنبه 13 شهریور 1390, 15:33 عصر
آقا اینا رو که گفتی معلوم شد که من خیلی توی MVC عقب هستم. باید بیشتر کار کنم.PHP Architects در مورد MVC بیشتر تحقیق کن. یه فریم ورک برا خودت بساز و سعی کن کاملش ترش کنی مرحله به مرحله. توی هر مرحله خیلی چیزا یاد میگیری. ایشالا شاید فریم ورکی رو که ساختم با اینکه خیلی چیزا کم داره و ناقصه ، برای دانلود اینجا بزارم تا شما و دوستان علاقه مند ببینید و نظرتون رو بگید.


یه سوال، اگه چند فایل بسازیم و توی هرکدوم یه کلاس ایجاد کنیم و این فایلها رو اینکلود کنیم، آیا می شه بیرون از فایل های اینکلود شده، کلاسهایی بسازیم که از کلاسهای موجود توی فایلها ارث بری کنن؟ اگه اشتباه منظورت رو فهمیدم دوباره بپرس
در واقع وقتی یک صفحه از سایت شما داره نمایش داده میشه اون فایل index.php رو به شما نشون میده. وقتی شما فایها رو توی فایلindex.php اینکلود میکنی پس میتونی ازشون ارث بری هم بکنی. کلاسهای Model , Controller , TRouter و بقیه کلاسهای اصلی فریم ورکت توی فایل ایندکس اینکلود میشه هم میتونی ازشون ارث بری کنی هم ازشون شیء بسازی.

idocsidocs
یک شنبه 13 شهریور 1390, 16:21 عصر
PHP Architects در مورد MVC بیشتر تحقیق کن. یه فریم ورک برا خودت بساز و سعی کن کاملش ترش کنی مرحله به مرحله. توی هر مرحله خیلی چیزا یاد میگیری. ایشالا شاید فریم ورکی رو که ساختم با اینکه خیلی چیزا کم داره و ناقصه ، برای دانلود اینجا بزارم تا شما و دوستان علاقه مند ببینید و نظرتون رو بگید.

اگه اشتباه منظورت رو فهمیدم دوباره بپرس
در واقع وقتی یک صفحه از سایت شما داره نمایش داده میشه اون فایل index.php رو به شما نشون میده. وقتی شما فایها رو توی فایلindex.php اینکلود میکنی پس میتونی ازشون ارث بری هم بکنی. کلاسهای Model , Controller , TRouter و بقیه کلاسهای اصلی فریم ورکت توی فایل ایندکس اینکلود میشه هم میتونی ازشون ارث بری کنی هم ازشون شیء بسازی.

درست متوجه شدید. الان دوتا مسئله دارم: 1- با توجه به اینکه چنین فریم ورکهایی فقط یک آدرس اجرایی دارن، بنظرتون بهتر نیست که بقیه پوشه های فریم ورک رو توی یه پوشه قرار بدیم و با فایل robots.txt به موتورهای جستجو بگیم که این فایلها رو ایندکس نکنن و موتورهای جستجو رو مجبور کنیم که خروجی فایل index.php رو ایندکس کنن؟ 2- بنظرتون بهتر نیست برای بالابردن سرعت سایت، همه متدهای فریم ورک رو توی فایلهای مجزاقرار بدیم و در صورت نیاز اون متد رو اینکلود کنیم؟ (البته این متدهای مجزا باید از کلاسهای اصلی ارث بری کنن تا مشکلی پیش نیاد)

Mr.Moghadam
یک شنبه 13 شهریور 1390, 16:49 عصر
1- با توجه به اینکه چنین فریم ورکهایی فقط یک آدرس اجرایی دارن، بنظرتون بهتر نیست که بقیه پوشه های فریم ورک رو توی یه پوشه قرار بدیم و با فایل robots.txt به موتورهای جستجو بگیم که این فایلها رو ایندکس نکنن و موتورهای جستجو رو مجبور کنیم که خروجی فایل index.php رو ایندکس کنن؟

درمورد ایندکس کردن کلاسهات توسط موتورهای جستجو نگران نباش چون اونارو ایندکس نمیکنن. فقط فایلها مربوط به لایه نمایش یا view ایندکس میشن.


2- بنظرتون بهتر نیست برای بالابردن سرعت سایت، همه متدهای فریم ورک رو توی فایلهای مجزاقرار بدیم و در صورت نیاز اون متد رو اینکلود کنیم؟ (البته این متدهای مجزا باید از کلاسهای اصلی ارث بری کنن تا مشکلی پیش نیاد)
منظورت رو درست متوجه نشدم؟ یعنی چی متدهای فریم ورک رو توی فایلهای جدا قرار بدیم؟

idocsidocs
یک شنبه 13 شهریور 1390, 17:05 عصر
درمورد ایندکس کردن کلاسهات توسط موتورهای جستجو نگران نباش چون اونارو ایندکس نمیکنن. فقط فایلها مربوط به لایه نمایش یا view ایندکس میشن.


منظورت رو درست متوجه نشدم؟ یعنی چی متدهای فریم ورک رو توی فایلهای جدا قرار بدیم؟
من الان تقریبا همه کلاسها و متدهای مورد نیازم رو توی دو-سه تا فایل گذاشتم، همواره باید این فایل ها رو اینکلود کنم و از متدها استفاده کنم. بعضی از این فایلها از 500 خط بیشتر هستن.

اگر بجای اینکار هر متد رو توی یه فایل جدا گانه قرار بدم و اون فایل رو اینکلود کنم بهتر نیست و سرعت اجرای سایت بیشتر نمی شه؟ (البته جون متدها توی فایلهای جداگانه هستن باید برای هر متد یه کلاس بسازم که از کلاسهای اصلی ارث بری می کنه)

armsoftpc
یک شنبه 13 شهریور 1390, 19:36 عصر
به نام خدا
با سلام
دوستان کسی میتونه بگه کدوم فریم ورک از همه بهتره!:بامزه:
در ضمن فریم ورک به چه کاری می یاد و نحوه راه اندازیش چه جوریه!:متفکر:
جند سایت هم مثال بزنید که با فریم ورک راه اندازی شده باشند.(فارسی و انگلیسی)
موفق باشید.

Mr.Moghadam
یک شنبه 13 شهریور 1390, 20:14 عصر
من الان تقریبا همه کلاسها و متدهای مورد نیازم رو توی دو-سه تا فایل گذاشتم، همواره باید این فایل ها رو اینکلود کنم و از متدها استفاده کنم. بعضی از این فایلها از 500 خط بیشتر هستن.

اگر بجای اینکار هر متد رو توی یه فایل جدا گانه قرار بدم و اون فایل رو اینکلود کنم بهتر نیست و سرعت اجرای سایت بیشتر نمی شه؟ (البته جون متدها توی فایلهای جداگانه هستن باید برای هر متد یه کلاس بسازم که از کلاسهای اصلی ارث بری می کنه)

برای هر کلاس باید یه فایل جدا بسازید. مثلا کلاس Model که شامل جندین متد مختلف میشه توی یه فایل با نام Model قرار میگیره که بخش مدل فریم ورکت باید ازش ارث بری کنه.


دوستان کسی میتونه بگه کدوم فریم ورک از همه بهتره!:بامزه:
این موضوع سلیقه ایه اما zend framework خیلی امکانات در اختیارت قرار میده.


در ضمن فریم ورک به چه کاری می یاد و نحوه راه اندازیش چه جوریه!:متفکر:
فریم ورک میاد با استفاده از کلاسهای آماده ای که در اختیارتون قرار میده برای شما کار طراحی سایت رو براتون راحتتر میکنه. همچنین میاد کدهای پی اچ پی رو از کدهای html جدا میکنه که برای گسترش و توسعه کارت رو راحت تر میکنه.

idocsidocs
یک شنبه 13 شهریور 1390, 20:37 عصر
من الان کدهای زیر رو تست کردم، همه درخواستها به فایل index.php می رسه و من بر اساس اصول سئو فایل index.php رو از لینکها حذف کردم و لینکها رو کاربر پسند کردم.

روشی که شما می گید شدنی نیست. کدهایی که توی فایل htaccess استفاده می کنم رو در ادامه گذاشتم.



Options +FollowSymLinks

RewriteEngine On
RewriteBase /

#no Index.php
RewriteRule ^(.*)(/?)index\.php$ /$1 [R=301,L]
RewriteRule ^(.*)(/?)index\.html$ /$1 [R=301,L]
RewriteRule ^(.*)(/?)index\.htm$ /$1 [R=301,L]

RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$ index.php?controller=$1&action=$2 [NC,L]


تا وقتی کدهای زیر رو حذف نکنم فریم ورک اجرا نمی شه ! آیا شما تا حالا توی فریم ورکتون وقتی لینکها رو کاربر پسند می کنید، با این مشکل هم برخورد کنید؟ لطفا توضیح بدید.

RewriteRule ^(.*)(/?)index\.php$ /$1 [R=301,L]
RewriteRule ^(.*)(/?)index\.html$ /$1 [R=301,L]
RewriteRule ^(.*)(/?)index\.htm$ /$1 [R=301,L]

Mr.Moghadam
یک شنبه 13 شهریور 1390, 22:13 عصر
اصول سئو رو فراموش کن. یکی از مزایای طراحی و پیاده سازی mvc همین آدرسهای user frindly شه.

شما در فریم ورکها وقتی urlی رو به صورت http://host/controller/action/params فراخوانی میکنی در واقع آدرسهات رو داری سئو میکنی.نیازی به این همه دستور توی فایل htaccess نداری.اگر میخوای پسوند بذاری واسه صفحاتت خیلی راحت میشه اینکارو کرد.درخواست رو که ارسال کردی پسوند html رو از آخرش حذف کن بعد درخواست رو اجرا کن.



RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$ index.php?controller=$1&action=$2 [NC,L]
نیازی نیست پارامتر $action رو هم اینجا قرار بدی.


RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?controller=$1 [L,QSA]





بیشتر در مورد این معماری مطالعه کن و اصولش رو درک کن. بیشتر هم سعی کن منابع انگلیسی رو بخونی. سوالاتت رو هم همینجا بپرس

idocsidocs
یک شنبه 13 شهریور 1390, 22:51 عصر
من الان با دو مسئله مشکل دارم،
چرا توی کد زیر فرض کردید که آرگومان می تونه یه آرایه باشه؟ همچنین چرا به این شکل 'Base','load_model' کار کردید؟ یعنی load_model یه متد هست و مشکلی نداره، اما Base یه کلاس هست و array_map فقط روی آرایه اثر می ذاره. در این مورد لطفا توضیح بدید.

if(is_array($model))
{
array_map(array('Base','load_model'),$model);
}

Mr.Moghadam
یک شنبه 13 شهریور 1390, 23:33 عصر
وقتی بخوای تک تک اعضای آرایه ات رو به یک تابع بفرستی از array_map اصتفاده میکنی. حالا اگر این تابع داخل یه کلاس قرار گرفته باشه باید نام کلاس رو هم به تابع array_map ارسال کنی به صورت زیر


array_map(array("className", "methodname"));

وقتی که یک آرایه به تابع load_model ارسال میشه اگر پارامتر دریافتی آرایه بود یعنی اعضای ارایه حاوی اسامی مدلهایست که شما میخوای لودشون کنی. تک تک مدلهارو براتو لود میکنه.

البته پیشنهاد میکنم دوتا تابع موجود رو حذف کنید و تابع زیر بنویسید.


/**
*
* Load Model
*
**/

function model($model)
{
if(is_array($model))
{
array_map(array('Controller','model'),$model);
}
else
{
$file = ROOT.'/model/'.strtolower($model).'.php';
if(file_exists($file))
{
include_once($file);
$this->$model = new $model();
}
else
die('Model does not exists');
}
}

idocsidocs
دوشنبه 14 شهریور 1390, 00:33 صبح
وقتی بخوای تک تک اعضای آرایه ات رو به یک تابع بفرستی از array_map اصتفاده میکنی. حالا اگر این تابع داخل یه کلاس قرار گرفته باشه باید نام کلاس رو هم به تابع array_map ارسال کنی به صورت زیر


array_map(array("className", "methodname"));

وقتی که یک آرایه به تابع load_model ارسال میشه اگر پارامتر دریافتی آرایه بود یعنی اعضای ارایه حاوی اسامی مدلهایست که شما میخوای لودشون کنی. تک تک مدلهارو براتو لود میکنه.

البته پیشنهاد میکنم دوتا تابع موجود رو حذف کنید و تابع زیر بنویسید.


/**
*
* Load Model
*
**/

function model($model)
{
if(is_array($model))
{
array_map(array('Controller','model'),$model);
}
else
{
$file = ROOT.'/model/'.strtolower($model).'.php';
if(file_exists($file))
{
include_once($file);
$this->$model = new $model();
}
else
die('Model does not exists');
}
}
شما توی فایل ایندکس متغیر مدل رو به شکل زیر تعریف کردید، و این یعنی اینکه مدل نمی تونه یه آرایه باشه. اما توی متدهاتون فرض کردید که مدل می تونه آرایه باشه. می شه در این مورد توضیح بدید؟

$uri['model'] = $uri['controller'];
سوال دیگه اینکه اگر بعضی صفحات نیاز به لاگین داشته باشن، کجا باید این مسئله رو تشخیص بدم؟ به روش عادی در ابتدای اسکریپتها چک می کردم و اگه سسشن مربوطه پر بود، اجازه لاگین می دادم اما الان که همه سایت رو فقط یه اسکریپت بالا می یاره، نمی دونم این مطلب رو باید چطور تست کنم؟

Mr.Moghadam
دوشنبه 14 شهریور 1390, 11:31 صبح
$uri['model'] = $uri['controller'];

این برای زمانیه که مدل شما باید با نام کنترلرتون یکی باشه. مثل فریم ورک کیک پی اچ پی.اما در بیشتر موارد شما نیاز دارین توی کنترلرتون با چندتا از جدولهای دیتابیس کار کنید. برای همین اونهارو به شکل زیر لود میکنید :


function _construct()
{
$this->model(array("Post","User","Category"));
}





در واقع متدهای کنترلر شما صفحات سایت شما هست که باید در ابتدای متد چک کنی ببینی لاگین شده یا نه.
مثلا :


function profile()
{
if(!logged_in())
return false;
}

idocsidocs
پنج شنبه 17 شهریور 1390, 18:47 عصر
با این روش همه صفحات سایت روی یه اسکریپت اجرا می شه.

من جاههایی دیدم که برای اینکه کدهاشون لو نره، می رن یه ریسلر می گیرن و طوری برنامه رو طراحی می کنن که همه سایتها یه هسته مشترک داشته باشه.

توی سی پنل صاحبان وب سایت هم فقط تصاویر و فایلهای css و js قرار می گیره.

در این مورد اطلاعای دارید و می دونید که چطور باید این کار رو کرد؟

payamsp
جمعه 18 شهریور 1390, 00:21 صبح
ممنون از نمونه کدهایی که گذاشته بودید

در مورد فایل php.index تو بخشی که با استفاده از متغیر سراسری SERVER آدرس رو میگیرید بهتره که با استفاده از روش GET پارامترها رو بگیرید چون توی فایل htaccess پارامترهای درخواستی رو به index.php?rt=parametrs پاس دادید پس خیلی راحت با GET_$ می تونید بگیرید و explode کنیدش .

کیک هم از همچین روشی استفاده میکنه ( از اونجا که ساختار فریم ورکتون خیلی شبیه کیک بود )


موفق باشید

idocsidocs
جمعه 18 شهریور 1390, 00:31 صبح
در مورد فایل php.index تو بخشی که با استفاده از متغیر سراسری SERVER آدرس رو میگیرید بهتره که با استفاده از روش GET پارامترها رو بگیرید چون توی فایل htaccess پارامترهای درخواستی رو به index.php?rt=parametrs پاس دادید پس خیلی راحت با GET_$ می تونید بگیرید و explode کنیدش .

کیک هم از همچین روشی استفاده میکنه ( از اونجا که ساختار فریم ورکتون خیلی شبیه کیک بود )

همیشه شنیدم که امنیت فریم ورکها بالاست، می شه بگید چه از چه روشهایی برای بالابردن امنیت استفاده می کنن؟ اگر توابع امنیتی فریم ورکها رو کار کردید لطفا نمونه کدهاشون رو اینجا بزارید.

payamsp
جمعه 18 شهریور 1390, 00:55 صبح
معمولا هر فریم ورک کلاس هایی داره که یک سری کارها رو برای بالا رفتن امنیت برنامه انجام میده ، توصیه میکنم نمونه کدهای فریم ورک ها رو مطالعه کنید ( بحث مفصلی هست ) بیشتر بر میگرده به نحوه کد زدن و چون تو فریم ورک از یک ساختار درست استفاده میشه باعث میشه تا برنامه قابل اعتماد تر بشه .

در مورد نمونه فریم ورکی که گذاشتید
توی کلاس Base برای فراخوانی اکشن مربوط به کنترلر از متد call_user_method یا متدهای مشابه این متد استفاده کنید تا محدودیت تو ارسال پارامترها نداشته باشید .

Mr.Moghadam
جمعه 18 شهریور 1390, 01:02 صبح
با این روش همه صفحات سایت روی یه اسکریپت اجرا می شه.

من جاههایی دیدم که برای اینکه کدهاشون لو نره، می رن یه ریسلر می گیرن و طوری برنامه رو طراحی می کنن که همه سایتها یه هسته مشترک داشته باشه.

توی سی پنل صاحبان وب سایت هم فقط تصاویر و فایلهای css و js قرار می گیره.

در این مورد اطلاعای دارید و می دونید که چطور باید این کار رو کرد؟

متاسفانه در این مورد اطلاعاتی ندارم.



ممنون از نمونه کدهایی که گذاشته بودید

در مورد فایل php.index تو بخشی که با استفاده از متغیر سراسری SERVER آدرس رو میگیرید بهتره که با استفاده از روش GET پارامترها رو بگیرید چون توی فایل htaccess پارامترهای درخواستی رو به index.php?rt=parametrs پاس دادید پس خیلی راحت با GET_$ می تونید بگیرید و explode کنیدش .

کیک هم از همچین روشی استفاده میکنه ( از اونجا که ساختار فریم ورکتون خیلی شبیه کیک بود )


موفق باشیدبا تشکر از شما. در نسخه ای که برای کار خودم طراحی کردم از این روشی استفاده کردم.



همیشه شنیدم که امنیت فریم ورکها بالاست، می شه بگید چه از چه روشهایی برای بالابردن امنیت استفاده می کنن؟ اگر توابع امنیتی فریم ورکها رو کار کردید لطفا نمونه کدهاشون رو اینجا بزارید.
توی فریم ورک Codeigniter برای ورودی های get و post یه کلاس هست که اطلاعات دریافتی رو فیلتر میکنه. در مورد این کلاس برید به لینک زیر.

http://codeigniter.com/user_guide/libraries/input.html

برای امنیت کار با دیتابیس هم میتونید از روشهای معمول فیلتر و escape کردن اطلاعات استفاده کنید.

idocsidocs
جمعه 18 شهریور 1390, 01:21 صبح
متاسفانه در این مورد اطلاعاتی ندارم.

بنظرم بهترین روش برای جلوگیری از منتشر شدن کدهامون همینه. ولی نمی دونم که چطور پیاده سازی می شه.

فرض کنید یه سایت نوشتیم که بالای یک میلیون قیمتشه، و کسی بیاد و این رو از ما بخره و بعد بره قالبش رو عوض کنه و به چند نفر بفروشه !
برنامه هایی مثل زند هم نمی تونن امنیت رو کامل کنن. تنها راه همینه که هسته سایت رو به مشتریها ندیم.

البته مشکل این روش اینه که مشتری باید راضی باشه که از سرور ما استفاده کنه وگرنه نمی تونیم سایت رو بهش بدیم.

payamsp
شنبه 19 شهریور 1390, 11:44 صبح
در مورد محافظت از کدها شما باید از نرم افزار های انکدر با لایسنس استفاده کنید یک بار هزینه کنید و لایسنس بگیرید تا برای همیشه خیالتون راحت باشه
این زند که میگید معمولا نسخه کرک هست و خوب مشکل داره
به جز زند ioncube و sourceguardian هم هستن که میتونند کمکتون کنند.

هزینه لایسنسِ شون هم حدودا 200 دلار هست که به نظرم مناسبه

idocsidocs
شنبه 19 شهریور 1390, 11:50 صبح
در مورد محافظت از کدها شما باید از نرم افزار های انکدر با لایسنس استفاده کنید یک بار هزینه کنید و لایسنس بگیرید تا برای همیشه خیالتون راحت باشه
این زند که میگید معمولا نسخه کرک هست و خوب مشکل داره
به جز زند ioncube و sourceguardian هم هستن که میتونند کمکتون کنند.

هزینه لایسنسِ شون هم حدودا 200 دلار هست که به نظرم مناسبه
همه نرم افزارها کرک می شن، و به همین دلیل نمی شه روی این نرم افزارها زیاد حساب کرد. تنها راه اینه که کدهامون رو دست کسی ندیم.

نظر شما چیه؟

payamsp
شنبه 19 شهریور 1390, 23:05 عصر
امنیت یک بحث نسبی هست و هیچ موقع شما 100 درصد نمیتونید مطمئن باشید که کدهاتون دست کسی نمیوفته
در مورد کرک شدن هم بله ! ممکنه کرک بشه اما نه به سادگی و راحتی حالتی که از نرم افزار کرک شده برای انکد کردن استفاده می کنید

idocsidocs
یک شنبه 20 شهریور 1390, 13:04 عصر
سه سوال:

البته پیشنهاد میکنم دوتا تابع موجود رو حذف کنید و تابع زیر بنویسید.

array_map(array('Controller','model'),$model);

1- می شه بگید چرا توی این کد بجای کلاس Base از کلاس Controller استفاده کردید؟



$this->$model = new $model();

2- فرض کنید بخوایم توی توابع کنترلر به شی ساخته شده و توابع مدل دسترسی پیدا کنیم، در این مورد باید چطور به توابع دسترسی داشته باشم؟

3-امکانش هست یه مثال بزنید که از توی توابعی که کنترلر بکار می بره، توابع مربوط به مدل و کتابخانه ها بصورت آرایه اجرا می شن و از مقدار برگشتیشون توی کنترلر استفاده می شه؟

Mr.Moghadam
یک شنبه 20 شهریور 1390, 22:38 عصر
1- شما باید از Base استفاده کنید. چون اسم کلاس شما Base

2 - وقتی که مدل رو لود کردید :


$this->model(array('user','post');

توی توابع کنترلر به صورت زیر باید استفاده کنید :


$this->Post->find()

3- برای استفاده از توابع کتابخانه ها هم باید به صورت مدل ازشون استفاده کنی.

idocsidocs
یک شنبه 20 شهریور 1390, 23:14 عصر
1- شما باید از Base استفاده کنید. چون اسم کلاس شما Base

2 - وقتی که مدل رو لود کردید :


$this->model(array('user','post');

توی توابع کنترلر به صورت زیر باید استفاده کنید :


$this->Post->find()

3- برای استفاده از توابع کتابخانه ها هم باید به صورت مدل ازشون استفاده کنی.

وقتی بخوایم از مقدار برگشتی یه مدل استفاده کنیم باید چیکار کنیم؟ ایا استفاده از همین دو خطی که در پست قبل دادید می شه از مقدار برگشتی مدل استفاده کرد؟ همچنین لطفا بگید که post، user، find چی هستن؟

Mr.Moghadam
دوشنبه 21 شهریور 1390, 01:07 صبح
ببین دوست عزیز به نظرم بهتره شما حتمن با یه فریم ورک قوی کار کنید.اینکه دستتون بیاد مفهموم رو و طرز کار اجزای مختلف رو.

پیشنهاد میکننم با Codeigniter شروع کنی. یادگیریش راحته.وقتی مفهوم اومد دستت میتونی برای خودت یه فریم ورک بسازی. از همین امروز شروع کن به یادگیری Codeigniter تا با قسمتهای مختلف و طرز کار آشنا بشی.

idocsidocs
دوشنبه 21 شهریور 1390, 01:20 صبح
1- شما باید از Base استفاده کنید. چون اسم کلاس شما Base

2 - وقتی که مدل رو لود کردید :


$this->model(array('user','post');

توی توابع کنترلر به صورت زیر باید استفاده کنید :


$this->Post->find()

3- برای استفاده از توابع کتابخانه ها هم باید به صورت مدل ازشون استفاده کنی.
ظاهرا این روش که شما استفاده می کنید برای ثیت کردن مدلها توی کلاس جاری هست، تا از این طریق بشه به کمک کلمه this به متدها دسترسی داشت. خیلی روش خویه.

من الان متوجه این مطلب شدم، تا اینجا مشکلی ندارم.
من برای امنیت بیشتر سسشن ها رو توی دیتابیس ذخیره می کنم، وقتی که یه کنترلر اینکلود می کنم توی سازندش به شکل زیر سه تا مدل فراخوانی می کنم.

$arr[]='model';
$arr[]='sql';
$arr[]='mysessions';
$this->model($arr);
هر کدوم از این مدل ها توی یه فایل جداگانه قرار دارن، model مدل والد هست. این مدل به دیتابیس یه اتصال ایجاد می کنه، بقیه مدلها از این اتصال ارث بری می کنن، مشکلی که دارم اینه که توی این کد کلاس sql بدون مشکل اجرا می شه اما کلاس mysessions ارور زیر رو می ده:

Fatal error: Call to a member function real_escape_string() on a non-object in C:\xampp\htdocs\admin\model\mysessions.php on line 57
با توجه به اینکه هردو کلاس، اتصال ایجاد شده توی والد رو به ارث می برن، چرا کلاس sql این مشکل رو نداره اما کلاس mysessions با این ارور مواجه می شه؟