PDA

View Full Version : چگونه تغییر method ها در MVC



ali_vavan2009
یک شنبه 09 آذر 1393, 17:03 عصر
سلام دوستان

در حال نوشتن یک Framework ساده برای یادگیری و درک بیشتر MVC هستم.

حالا می خوام در این سیستمی که می نویستم یک کاری انجام بدم.
طبق جستجوهایی که انجام دادم اصطلاحا Hook نام داره.
از https://github.com/bainternet/PHP-Hooks یک اسکریپت گرفتم. اما تا اونجا که فهمیدم، نیاز مرا برطرف نمیکنه.

در کل میخوام یک سیستم بنویسم که بتونه به method ها مدیریت کنه.

چند مثال:

---------------------------------------------------------------------------------------------------------------------
مثال ۱:

یک Controller داریم به نام اخبار (news) و در آن ۴ method وجود دارد ( list, add, edit, delete )
در list عنوان خبرها لیست میشود و در کنار هر خبر دو دکمه برای "ویرایش" و "حذف"
حالا می خوام بدونه اینکه کدهای news را دستکاری کنم، در کنار دکمه های ویرایش و حذف یک دکمه دیگر اضافه با عنوان " مشاهده خبر "
---------------------------------------------------------------------------------------------------------------------
مثال ۲:

یک Menu داریم که در آن لیست Link ها به صورت ساده نمایش داده میشه.
حالا میخوام بدونه دستکاری کردن کدهای Menu در پنل مدیریت در قسمت افزودن و ویرایش گزینه ای به نام آیکون اضافه کنم. تا بتوان برای هر لینک یک آیکون اختصاص داد.
که در خروجی هم باید آیکون انتخاب شده نمایش داده شود.
---------------------------------------------------------------------------------------------------------------------
مثال ۳:

یک سیستم ساده کاربری وجود دارد. که فقط شامل (Username, Password, Name, Email) هست.
حالا میخوام بدونه دستکاری کردن کدهای Users به قسمت کاربران امکان گروه بندی و ACL (http://fa.wikipedia.org/wiki/%D9%81%D9%87%D8%B1%D8%B3%D8%AA_%DA%A9%D9%86%D8%AA% D8%B1%D9%84_%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C) اضافه کنم.
در اینجا Groups یک قسمت مجاز میباشد و ACL هم مجاز، اما هردو برروی Users تاثیرگذار هستند.

اما در اینجا یک نکته وجود دارد.
Class ACL در سیستم وجود دارد. که در آن یک Method وجود دارد به نام hasPermission که در آن همیشه return true قرار دارد.
حالا باید بدونه دستکاری کردن کدهای Class ACL بتوان یک Class ACL دیگر ساخت.
این نکته را هم بیان کنم که این موضوع را هم درنظر دارم که در سیستم ۲ پوشه بسازم به نام های core و library.
و این شرط را قرار دهم که اول در library جستجو کند و Class را پیدا کند، اگر وجود نداشت در core جستجو کند.
اما میخواهم بدانم راه دیگری هم وجود دارد؟

Mohammadsgh
یک شنبه 09 آذر 1393, 18:25 عصر
پیشنهاد من اینه که شما به mvc مسلط بشید و ساختارشو درک کنید سپس برید سراغ اینجور چیزا

ali_vavan2009
یک شنبه 09 آذر 1393, 20:08 عصر
ممنون دوست عزیز
اما به چه چیز MVC باید مسلط بشم؟ لطفا با مثال بگین.

Mohammadsgh
دوشنبه 10 آذر 1393, 10:09 صبح
1-ساختار mvc چجوری کار میکنه؟
2-نقش controller/view/movel چیه؟
3-نقش بوت استرپ چیه؟
4-چجوری هر کلاسی که خواستم به فریم ورکمون بدیم(کپچا-ولیدیشن و...)
اینها رو درک کنید خودتون پاسخ پرسشتون رو پیدا میکنید.هر جا که مشکل داشتید تو پیغام خصوصی بهم بگید

ali_vavan2009
دوشنبه 10 آذر 1393, 11:55 صبح
ممنون

موارد شماره 3 و 4 را باید بیشتر بررسی کنم.

Mohammadsgh
دوشنبه 10 آذر 1393, 12:11 عصر
کار bootstrap مدیریت urlهاست.دقت کنید که به جز bootstrap نام دیگه ای(urlManager تو فریم ورک یی) میتونه داشته باشه

ali_vavan2009
دوشنبه 10 آذر 1393, 16:20 عصر
کار bootstrap مدیریت urlهاست.دقت کنید که به جز bootstrap نام دیگه ای(urlManager تو فریم ورک یی) میتونه داشته باشه

پس با این حساب من در سیستم این مورد را به نام Router دارم.



<?php
class Router{
static public $controller = "";
static public $action = "";
static public $param = array();
static private $prefixes = array();

static function route($url){
$urlparts = explode("/", $url);

self::$controller = $controller = ($urlparts[0] == "") ? "index" : $urlparts[0];
array_shift($urlparts);
self::$action = $action = ($urlparts[0] == "") ? "index" : $urlparts[0];
array_shift($urlparts);
self::$param = $param = $urlparts;

if(file_exists($cFile = ROOT."/app/controller/".$controller.".php")){
include($cFile);
}else{
die("Controller ". $controller ." Not found");
}

$controller = ucwords($controller)."Controller";
$contollerObj = new $controller();

if(method_exists($contollerObj, $action)){
call_user_func_array(array($contollerObj,$action), $param);
}else{
die("Action $action not found in $controller Class");
}
}
}

ali_vavan2009
سه شنبه 11 آذر 1393, 09:03 صبح
سلام

دوست عزیز یه سوال در مورد شماره 4

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

آیا منظور شما همان __autoload میباشد؟؟؟

Mohammadsgh
سه شنبه 11 آذر 1393, 09:53 صبح
بله.شما تو فایل index یه متد __autoload بنویسید که هر چی فایل نیاز بود بره از پوشه libs بخونه.پوشه libs هم بزارید برای کپچا و ... و نوع متدهاتونم static بزارید(بستگی به کلاس های دیگتون هم داره)

ali_vavan2009
سه شنبه 11 آذر 1393, 12:05 عصر
ممنون دوست عزیز

اما مشکل من این نیست.

فرض کنید در سیستم قسمت های "خبرها" و "مقالات"، "ویدئوها" هست.

حالا می خوایم به تمام این قسمت ها " نظرات " اضافه کنیم.

در پوشه libs یک Class اضافه میکنیم به نام Comments.

چکار باید کرد که بدونه دستکاری کردن کدهای "خبرها" و "مقالات"، "ویدئوها" بتوان " نظرات " را به آنها اضافه کرد؟

امیدوارم منظورم را خوب رسانده باشم.

ali_vavan2009
سه شنبه 11 آذر 1393, 16:53 عصر
سلام دوستان

دوباره از عمو گوگل کمک گرفتم و به این نتیجه پست اولم رسیدlم که به Hook نیاز دارم.



Hook ( قلاب، چنگک ) ابزاری برای تغییر در هسته و عملکرد CMS، بدون تغییر در سورس کد آن میباشد. با استفاده از هوک‌ها میتوانید به راحتی قلاب‌هایی را به هر بخشی که مورد نیاز هست وصل کرد (‌ یک تابع معرفی کرد‌‌) و تغییرات را در آنجا اعمال کرد، کاری که اگر بخواهیم بدون هوک‌ها انجام دهیم:

۱- باید مستقیما در کد‌های CMS تغییراتمان را اعمال کنیم.
۲- لازم است برای هر تغییر، بخشی از کد را ویرایش کنیم، به عبارت دیگر باید هر بار کدهایی ویرایش شده را، ویرایش نماییم و چند روز بعد دوباره آنها را ویرایش نمایمم و همینطور تکرار میشود….
3۳- احتمال خطا زیاد و خطایابی ( Debug ) بسیار دشوار میشود، و اگر بخواهیم ویژگی را غیرفعال کنیم باید کل کدها بررسی و ویرایش نماییم!


از لینک زیر
https://github.com/bainternet/PHP-Hooks

یک PHP Hooks Class گرفتم.

اما بنظر من یه مقدار گیج کننده هست و نتونستم تمام Class را درک کنم.

و این نکته را هم باید اضافه کنم که می خوام بر روی method ها کار کنم، نه بر روی خروجی ها. آیا امکانش هست؟

لطفا راهنمایی نمایید که چطوری میتونم یک Hook ساده بنویسم یا یک Class ساده معرفی نمایید.

باتشکر

Mohammadsgh
سه شنبه 11 آذر 1393, 17:41 عصر
نیاز به این کار ها نیست,ببینید این فریم ورک کارتون رو راه میندازه؟اگه نه هر جا مشکل داشتید بگید؟

ali_vavan2009
سه شنبه 11 آذر 1393, 17:59 عصر
ممنون دوست عزیز

اما Frameworkای که فرستادید بسیار ساده می باشد. و بیشتر برای تازه کارها مناسب میباشد.
و در هیچ جای آن به Hook یا Plugin اشاره نشده.

Mohammadsgh
سه شنبه 11 آذر 1393, 22:10 عصر
درسته.برای شما که میخواید تازه شروع کنید بهترینه فریم ورک های پیشرفته رو نمیتونید ساختارشو درک کنید.خیلی واستون سخته

ali_vavan2009
سه شنبه 11 آذر 1393, 22:45 عصر
ممنون دوست عزیز
قصد جسارت ندارم، اما این Framework شما چه کمکی به من میتونه بکنه؟

من قصد دارم تا یاد بگیرم به Framework امکان Plugin داشتن را اضافه کنم.
برای اجرا شدن Plugin هم میدونم که میشه راحت یک حلقه را تعیین کرد که از پوشه Plugins تمام Class های موجود را اجرا کند.
اما می خوام همچون CMS های دیگر بتوانم با Plugin در قسمت هایی از سایت تغییر به وجود بیارم.

من مشکلی با اجرا کردن یا فراخوانی Plugin ندارم.

مشکل من اینه که نمیدونم چطوری میتونم با یک Class بر روی Class دیگر تاثیر گذاشت؟

قصد بی احترامی ندارم، اما اگر به مثال هایی که قبلا زدم بیشتر توجه نمایید، مطمئنا بهتر میتونید راهنماییم کنید.

Mohammadsgh
چهارشنبه 12 آذر 1393, 00:05 صبح
فریم ورکی که بهتون دادم ساده ترین فریم ورکیه که میشه ساخت ولی این به این معنی نیست که نمیشه هیچ کاری باهاش کرد.من باهاش یک cms ساده نوشتم و مشکلی نداشتم و هر کلاسی که خواستم تو libs گذاشتم و استفاده کردم.اگه فریم ورکی که میخواید از این فریم ورک ها فراتر باشه پیشنهاد من اینه که شما فریم ورک codeigniter رو بررسی کنید و هر جاش رو که خواستید ازش الگو بگیرید و تو فریم ورک خودتون استفاده کنید

ali_vavan2009
چهارشنبه 12 آذر 1393, 11:12 صبح
ممنون دوست عزیز
همانطور که قبلا هم عرض کردم قصد جسارت ندارم، و در جایی هم نگفتم که با Framework شما نمی توان هیچ کاری انجام داد.

قصد من ایجاد تغییرات در سیستم هست فقط با اضافه کردن Plugin.

یعنی برای هر تغییر جزئی نیازی نباشه که به کدهای اصلی دست ببرم و در آنها تغییراتی به وجود بیاورم.

در مورد معرفی Framework Codeingniter هم ممنون.

Codeingniter نیز از Hook استفاده میکند.

پس در نتیجه راه حل مشکل من با Hook برطرف میشود.

باتشکر از وقتی که گذاشتید.

Mohammadsgh
چهارشنبه 12 آذر 1393, 11:45 صبح
خواهش میکنم.شما ببخشید