PDA

View Full Version : Yii vs Laravel



صفحه : [1] 2

rezakho
جمعه 25 بهمن 1392, 11:33 صبح
سلام
مطلب زیر رو برای یکی از دوستان فرستاده بودم، گفتم اینجا هم بگذاریمش
این مطلب مقایسه فریمورک Laravel و Yii هست و البته بیشتر مزایای Laravel


1- مسیریاب (Router)

توی لاراول مسیر ها رو میشه بدون اکشن و کنترولر مدیریت کرد

میشه مسیرهای تو در تو تعریف کرد

میشه به راحتی دومین و ساب دومین رو مدیریت کرد

میشه درخواست ها رو بر اساس متد درخواست post, get, delete, put, patch, ... محدود کرد

میشه برای روت های پارامتریک، مقدار پیشفرض تعریف کرد

میشه روت ها رو فیلتر کرد

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

میشه روت ها رو درجا، به یک مدل، کنترولر و یا اکشن خاصی هدایت کرد

میشه محدود به قوانین خاصی مثل لاگین کردن و یا چک csrf token کرد

میشه برای روت ها پیشوند تعریف کرد

میشه کاربر رو به صفحه قبل از لاگین به صورت خودکار هدایت کرد

میشه بین ریدیرکت ها داده ها رو با یک متد حفط کرد

و ...



2- کوئری (Query builder)

سینتکس تمیز تر (یی 2 هم این شکلی شده)

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

تمام خروجی ها به صورت شی هستند

2 برابر بودن متد ها در قبال yii برای انواع واکشی

جوین های تو در تو

قفل جداول

کش کردن بی درد سر

صفحه بندی با یک متد

...



2- مدل (Eloquent)

در لاراول ولیدیشن اغلب بیرون از مدل استفاده میشه

سینتکسش تمیز تره User::find یا User::all

از تمامی متدهای query builder میشه اینجا درجا استفاده کرد

2 برابر متد بیشتر برای انواع واکشی مدل ها

قابلیت soft deleting برای تیک زدن رکورد به عنوان حذف شده

پیاده سازی رابطه ها مثل هلو!

قابلیت eager and lazy loading

واکشی آرایه ای و json

...


3- تصدیق هویت

فقط با یک دستور Auth::attemp

پیاده سازی واسط مدل کاربر به صورت خودکار Auth::user

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

لاگین دستی کاربر

بازیابی کلمه عبور ایمیلی داخلی
...


4- موتور قالب blade

قابلیت قطعه بندی layout

کنترول تمام layout از داخل view

روش ها و میانبر های بسیار ساده و سریع برای تولید html
...


و کلی ویژگی دیگه

MMSHFE
جمعه 25 بهمن 1392, 20:18 عصر
توی لاراول مسیر ها رو میشه بدون اکشن و کنترولر مدیریت کرد
توی Yii هم میشه

میشه مسیرهای تو در تو تعریف کرد
توی Yii هم میشه

میشه به راحتی دومین و ساب دومین رو مدیریت کرد
ربطی به لاراول نداره. از امکانات htaccess. هست.

میشه درخواست ها رو بر اساس متد درخواست post, get, delete, put, patch, ... محدود کرد
توی Yii هم میشه

میشه برای روت های پارامتریک، مقدار پیشفرض تعریف کرد
توی Yii هم میشه

میشه روت ها رو فیلتر کرد
توی Yii هم میشه

میشه روت ها رو گروه بندی کرد
توی Yii هم میشه

میشه روت ها رو درجا، به یک مدل، کنترولر و یا اکشن خاصی هدایت کرد
توی Yii هم میشه

میشه محدود به قوانین خاصی مثل لاگین کردن و یا چک csrf token کرد
توی Yii هم میشه

میشه برای روت ها پیشوند تعریف کرد
توی Yii هم میشه

میشه کاربر رو به صفحه قبل از لاگین به صورت خودکار هدایت کرد
توی Yii هم میشه

میشه بین ریدیرکت ها داده ها رو با یک متد حفط کرد
توی Yii هم میشه

سینتکس تمیز تر (یی 2 هم این شکلی شده)
خودتون گفتین Yii 2 هم این شکلی شده

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

تمام خروجی ها به صورت شی هستند
توی Yii هم همینطوره (مگر در مواردی که نیازی نیست - مثل Count و...)

2 برابر بودن متد ها در قبال yii برای انواع واکشی
تعداد متدها مهم نیست. مهم اینه که Yii هم با همون متدهای کمتر، همه اون کارایی ها رو داره

جوین های تو در تو
Yii هم داره

قفل جداول
Yii هم داره

کش کردن بی درد سر
سیستم Cache فریمورک Yii دیگه ضرب المثل شده. حداقل در این مورد، بعنوان امتیاز برای لاراول مطرح نکنید.

صفحه بندی با یک متد
توی Yii هم این قابلیت هست

در لاراول ولیدیشن اغلب بیرون از مدل استفاده میشه
Validation داده هایی که قراره توی دیتابیس قرار بگیره، دلیلی نداره بیرون از مدل انجام بشه. اونهایی هم که مربوط به دیتابیس نیست، توی Yii هم بدون وجود قابل Validate کردن هستن

سینتکسش تمیز تره User::find یا User::all
توی Yii 2 این تغییرات انجام شده

از تمامی متدهای query builder میشه اینجا درجا استفاده کرد
توی Yii هم میشه

2 برابر متد بیشتر برای انواع واکشی مدل ها
قبلاً گفتم تعداد متدها مهم نیست. مهم اینه که توی Yii با همون متدهای کمتر، همه کار میشه انجام داد.

قابلیت soft deleting برای تیک زدن رکورد به عنوان حذف شده
قابلیت مهمی نیست. میشه بصورت نرم افزاری (یک فیلد در دیتابیس) پیاده سازی کرد.

پیاده سازی رابطه ها مثل هلو!
Relationهای Yii مثل هلوی پوست کنده است.

قابلیت eager and lazy loading
توی Yii هم وجود داره.

واکشی آرایه ای و json
توی Yii هم چنین امکانی وجود داره

فقط با یک دستور Auth::attemp
توی Yii هم بصورت Yii::user->authenticate انجام میشه

پیاده سازی واسط مدل کاربر به صورت خودکار Auth::user
توی Yii هم کامپوننت User بصورت خودکار پیاده سازی میشه

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

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

بازیابی کلمه عبور ایمیلی داخلی
توی Yii هم قابل انجامه

موتور قالب blade
موتور قالب رو میشه به راحتی در Yii تغییر داد. بعلاوه Yii بطور داخلی از Twig که بهینه تر از Blade هست، پشتیبانی میکنه.

قابلیت قطعه بندی layout
Yii علاوه بر این قابلیت، توانایی سلسله مراتبی کردن Layout رو هم داره

کنترول تمام layout از داخل view
منظورتون رو متوجه نشده ولی اگه منظورتون اینه که View میتونه ساختار Layout رو تغییر بده، این مسئله کاملاً غیر منطقیه. مثل اینه که بگیم از توی یک تابع میتونیم کدهای بیرون از تابع رو تغییر بدیم و این رو بعنوان امتیاز مطرح کنیم.

روش ها و میانبر های بسیار ساده و سریع برای تولید html
این قابلیتها در Yii هم هست (کلاس CHtml و...)

و کلی ویژگی دیگه
بیان کنید تا بدونیم.
-----
ابداً دوست ندارم باز یک عده بیان فکر کنن درمقابل لاراول جبهه گرفتم یا دارم بی دلیل از Yii دفاع میکنم. وقتی قراره مقایسه بشه، فقط یک صفحه متن ننویسید. با دلیل بگین این کار توی فلان سیستم میشه و توی فلان سیستم نمیشه تا ببینید جواب با دلیل ارائه میشه یا نه. Yii و Laravel هر دو فریمورکهای خوبی هستن ولی این دلایلی که گفتین، امتیاز خاصی برای لاراول درمقابل Yii ایجاد نمیکنه چون Yii هم این قابلیتها رو داره.

tux-world
جمعه 25 بهمن 1392, 22:33 عصر
شاید از نظر تفاوت، فرق خاصی هم نداشته باشن ولی مهم نوع استفاده توسط یه برنامه نویس هستش. من با اینکه خیلی سعی کردم به عنوان یک تازه کار فریم ورک با Yii کنار بیام نتونستم و واقعا هم دوستش داشتم و ازش لذت میبردم ولی با لاراول خیلی خیلی راحت کنار اومدم.
مهم هم همینه. نه اینکه بگیم تو Yii هست تو laravel نیست. برعکسش هم صادقه. البته این مورد رو هم توجه کنید که rezakho حدود ۲ سال با Yii کار کردن.

موفق باشید

MMSHFE
یک شنبه 27 بهمن 1392, 09:09 صبح
درسته. سابقه کارکرد با هر دو خیلی در مقایسه منصفانه مؤثره به شرطی که با آخرین تغییرات در نسخه های جدید هم تجربه کارکرد داشته باشیم. برای مثال، اگه من دو سال قبل با NET. کار کرده باشم و بیام با امروز PHP مقایسه کنم، یک قیاس اشتباه رو انجام دادم.

بهزاد علی محمدزاده
یک شنبه 27 بهمن 1392, 17:19 عصر
این مقایسه ها بد نیست و گاهی کمک میکنه با قابلیت های فریم ورک ها آشنا بشیم . کلا این بحث ها زیاد هم بد نیست . ولی این مقایسه ایی که انجام دادین به نظر من اشتباهه . شما می بایستی مزایا و معایب هرکدام , به دیگری رو لیست می کردین ... دیگه مقایسه هم باید براش وقت بذاری وگرنه نشه بهتره . تجربیات شخصی خودتون رو هم با هرکدام میشد بگین .کتابخانه های هردو رو میشد بررسی کرد .

rezakho
دوشنبه 28 بهمن 1392, 18:21 عصر
به به
آقای شهرکی اگر میدونستم اینجوری جواب میدید اصلا پست نمیزدم!!!
منظورم اینه که اگر جسارت نباشه به جای این همه "توی Yii هم میشه"، می تونستید در یک جمله بگید این قابلیت ها رو هم در Yii میشه پیاده کرد.
ضمنا بالا هم گفتم این مقایسه نیست و بیشتر امکانات لاراول هست!!!
من فقط 2 جا از Yii اسم بردم و یکیش هم به نیکی بوده :)
به هر حال ممنون :)

ولی
موارد بالا رو من بر طبق تجربه میگم
یک نکته ای رو هم توی این 8 سال برنامه نویسی یاد گرفتم، و اون اینه که هرگز تعصب نداشته باشم، هرگز!
البته مقصودم این نیست که بگم شما یا دیگر عزیزان تعصب دارید، به هیچ وجه
چندین سال پیش، اون اوایل، خیلی بحث بالا میگرفت با دوستان سر اینکه کدام زبان بهتره، ولی الان اگر از من همون سوال رو بپرسند، خواهم گفت: هیچ فرقی در 90 درصد موارد نمیکنه و کاملا سلیقه ای هست، مگر موارد بسیار بسیار خاص!
وقتی میخواستم سراغ Yii برم، خیلی تحقیق کردم، و انتخاب کردم که روی Yii کار کنم
بعد از کار با Yii، متوجه اشکالات و ضعف ها و دست و پا گیر های Yii شدم، که اگر این اشکالات از نظر من درست نبود، هیچ وقت نسخه 2 این فریم ورک اینقدر تغییر نمیکرد، پس اشکالات از نظر برنامه نویس ها منطقی بود و تیم توسعه Yii هم این رو متوجه شدند و تغییرات اساسی رو شروع کردند
مواردی که آقای شهرکی گفتند تقریبا درست هست، ولی این نکته رو شاید فراموش کردند که هر ویژگی رو میشه به هر کد، کتابخونه و یا فریم ورکی اضافه کرد، ولی من خصوصیات ذاتی این فریم ورک رو توضیح دادم نه اونچه میشه بهش اضافه کرد!

Yii در عین اینکه فریم ورک سطح بالایی شناخته میشه، در سفارشی کردنش خیلی اذیت میکنه برنامه نویس رو و میشه گفت در کارهای معمول و تکراری خیلی سریع هست، اما مهمترین مزیت لاراول پیچیدگی کمتر و باز گذاشتن دست برنامه نویس در سفارشی سازی و پیاده سازی تکنیک های خاص هست!
مثلا گرید در Yii اگر چه در ظاهر با Ajax میتونه کار کنه، ولی با روش خیلی مسخره ای این کار رو انجام میده، چطور؟ به این صورت که کل پیج رو با ajax در خواست میده و با متدهای DOM اون قسمت مربوط به گرید رو میکشه بیرون و گرید رو به روز میکنه، حالا واقعا میشه از این مورد دفاع کرد؟؟؟

من به مستندات هر دو تقریبا اشراف دارم، و از پست های پی در پی هم بدم میاد، ولی اگر لازم شد میتونم مورد به مورد مقایسه رو انجام بدم

MMSHFE
سه شنبه 29 بهمن 1392, 20:59 عصر
دوست عزیز، مواردی که من گفتم Yii داره رو با توجه به خصوصیات ذاتی این فریمورک گفتم. شما مورد به مورد اون چیزی که در Laravel هست رو بگین تا من هم معادل Yii اون رو بگم و با هم به یک نتیجه منطقی برسیم. قطعاً Yii و هر پروژه دیگری کامل نیست و بخاطر همین مسائله که نسخه های جدید تولید میشه و بهتره به دور از جدال و جنجال و ناراحتی، مقایسه موردی انجام بدیم تا اگه کسی با یکی از این دو کار کرده باشه و بخواد یکی دیگه رو هم تجربه کنه، این تاپیک کمکی باشه برای معادلسازی. برای مثال من خودم از کامپوننت Grid خود Yii استفاده نمیکنم ولی طراحی یک کامپوننت اختصاصی توی Yii حقیقتاً اینقدر ساده هست که این مورد رو بعنوان ضعف فریمورک مطرح نکنیم. درمقابل شاید توی Laravel این موضوع به راحتی Yii نباشه (گفتم شاید).

rezakho
سه شنبه 29 بهمن 1392, 21:15 عصر
باشه قبول
اگر صلاح میدونید یک تاپیک جدید باز بشه یا که نه همین جا مورد به مورد بریم جلو ؟

MMSHFE
چهارشنبه 30 بهمن 1392, 09:45 صبح
فرقی نمیکنه. با توجه به عنوان تاپیک، میتونیم همینجا ادامه بدیم.

rezakho
چهارشنبه 30 بهمن 1392, 10:13 صبح
خوب من از موارد بالا شروع میکنم
در لاراول میشه به طریق زیر، درخواست رو بدون کنترولر و اکشن هندل کرد
البته بحث مقایسه هست، یعنی کد کمتر و تمیز تر با پیچیدگی کمتر


Route::get('hello',function(){
return 'hello';
});

MMSHFE
چهارشنبه 30 بهمن 1392, 13:14 عصر
لطفاً منظورتون رو دقیقتر بیان کنید. الآن این کد قراره آدرس mysite.com/hello رو مدیریت کنه؟ اگه اینطوره، کاملاً غیر اصولیه چون توی MVC باید همه درخواستها به کنترلرها ارجاع داده بشه. توی Yii میتونید برای این کار، یک کلاس کلی بنویسید و درخواستهای مختلف رو به اون ارجاع بدین و اونجا، Route رو بررسی کنید (مثل کلاس Pages مثال Skeleton خود Yii که صفحه About و... رو مدیریت میکنه). دقت کنید که هر سادگی توی فریمورک به معنای یک قابلیت خوب نیست. اینکه من گفتم توی Yii هم این مسئله میشه، بخاطر این بود که میشه یک کلاس کلی برای اکشنهای متفرقه نوشت و با دستوراتی مثل $this->id و $this->action->id کنترلر و اکشن درخواست شده رو بدست آورد و براساس اونها کار لازم رو انجام داد یا اصلاً براشون Switch نوشت. حتی میشه با $this->route کلاً مسیر Route واردشده توسط کاربر رو گرفت و تفسیر کرد.
-----
پی نوشت: دقت کنید که مهمترین وظیفه یک فریمورک، اصولی انجام دادن کارهاست نه صرفاً ساده کردن کار برنامه نویس، به هر قیمتی. اگه قراره MVC کار بشه، تأکید میکنم باید همه درخواستها به کنترلرها فرستاده بشن. خود Router نباید سرخود کد تعریف کنه.

rezakho
چهارشنبه 30 بهمن 1392, 19:18 عصر
بله، کد بالا درخواست mysite.com/hello رو هندل میکنه
ولی شما طوری صحبت میکنید که انگار MVC وب هست و وب MVC !!!
خودتون خوب میدونید MVC یکی از چندین معماری تفکیک منطق هست، حالا برخی پروژه ها وجود دارند که نیازی نیست با این معماری پیاده سازی بشند، مثلا راه اندازی برخی سرویس های تحویل محتوا و یا سرویس های کش و ... نیازی به بخش مدل و ویو ندارند، بلکه هدف پیچیدگی کمتر و کارایی بالا با کمترین کد هست
پس این یک مزیت برای لاراول هست که Yii فاقد این ویژگیه

MMSHFE
چهارشنبه 30 بهمن 1392, 20:21 عصر
از شما که تو این حرفه با سابقه هستین این حرفها واقعاً بعیده. MVC کل وب نیست. وب هم همه اش توی MVC خلاصه نشده ولی وقتی کسی از فریمورک استفاده میکنه، دیگه از برنامه نویسی اسپاگتی باید فاصله گرفته باشه وگرنه فایده فریمورک چیه؟ کلی امکانات در اختیارمون بگذاره ولی استفاده نکنیم چون میخوایم بی قید و بند کد بنویسیم؟ توی Yii هم میشه اکشنهایی رو توی کنترلرها تعریف کرد که ویو و مدل ندارن. این مسئله ربطی به موضوع بحث نداره که میگین Yii فاقد این ویژگیه. من میگم درخواستهای کاربر باید به کنترلر ارجاع داده بشه. حالا خیلی میخوایم مثل سیستم سنتی عمل کنیم، فوقش یک کنترلر کلی مینویسیم و همه اکشنهای خاص رو به اون کنترلر ارجاع میدیم. این کار در Yii قابل انجامه ولی نه به اون شکل بی در و پیکری که لاراول داره انجام میده. اگه یک فریمورک بخواد اجازه بده هرجور دلمون میخواد کد بنویسیم، اونوقت امتیاز اصلی فریمورک که باعث افزایش قابلیت کار تیمی میشه رو از دست میدیم چون معلوم نیست هر کسی چطوری کد نوشته و کد پاسخ دهنده به هر درخواست مختلف رو باید کجای پروژه دنبالش بگردیم! برای مثال که بدونید این مسئله در Yii به چه شکل بدون مدل و ویو قابل انجامه، بگذارین نسخه معادل کاری که شما توی لاراول گفتین انجام میشه رو بگذارم تا دوستان قضاوت کنن کار کدوم، اصولیه:
1- توی تنظیمات، urlManager رو فعال میکنیم:


'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
'caseSensitive'=>false,
'rules'=>array(
'hello'=>'dirtyCoding/hello',
),
),

2- کنترلر DirtyCodingController رو میسازیم:


<?php
class DirtyCodingController extends Controller
{
public function actionHello()
{
echo 'Hello';
}
}

یا اگه بخوایم Style صفحات (Layout) هم حفظ بشه اینطوری میتونیم کار کنیم:


<?php
class DirtyCodingController extends Controller
{
public $layout = '//layouts/column1';
public function actionHello()
{
$this->renderText('Hello');
}
}

حالا کافیه هر کدی که میخوایم با MVC معمول کار نکنه رو به این کنترلر اضافه کنیم و Rule مربوطه رو هم توی تنظیمات برنامه معرفی کنیم. درسته که بازهم از MVC به ظاهر خارج شدیم ولی حداقل اگه یکی دیگه از اعضای تیم بیاد پروژه رو نگاه کنه، خیلی راحت با نگاه به تنظیمات برنامه میتونه ببینه کدوم فایل و کدوم متد داره به درخواست mysite.com/hello جواب میده.
باز هم تأکید میکنم: کمک کردن به کاربران جهت نوشتن کد بی نظم و اسپاگتی، قابلیت نیست، نقطه ضعفه.

rezakho
چهارشنبه 30 بهمن 1392, 20:36 عصر
قرار نیست از همه امکانات یک فریم ورک استفاده بشه، ما فقط داریم در این مورد، از روت ساده حرف میزنیم
نمیدونم، اگر نقطه ضعف هست که Symfony و Slim و Silex و Fuel و kohana و .... همه اینجوریند!!!
این مورد رو بگذریم و بگذاریم دیگران قضاوت کنند

rezakho
چهارشنبه 30 بهمن 1392, 20:43 عصر
مورد دوم
دسته بندی روت ها
به روش زیر میشه چندین درخواست رو در یک گروه گذاشت و حتی چند سطح جلو رفت
(فقط بحث سر دسته بندی هست، فعلا به اکشن و کنترولر کاری نداریم، به اونها هم میرسیم)

در کد زیر تمام درخواست هایی که با admin شروع میشه در یک دسته قرار دارند


Route::group(array('prefix'=>'user'), function()
{
Route::get('login', function()
{
// user/login
});

Route::get('logout', function()
{
// user/logout
});
});



حتی میشه یک فیلتر خاص مثل احراز هویت رو به این دسته بندی داد


Route::group(array('prefix'=>'user', 'before'=>'auth'), function()
{
Route::get('login', function()
{
// user/login
});

Route::get('logout', function()
{
// user/logout
});
});

MMSHFE
چهارشنبه 30 بهمن 1392, 21:02 عصر
خوب این مورد هم که گفتم با توجه به اینکه درخواستها در Yii به سمت کنترلر میره، عملاً نیازی نیست چون به راحتی میشه توی کامپوننت urlManager مسیردهیها رو مشخص کرد. گویا قابلیت Route::get در لاراول خیلی به زعم شما سودمند اومده. وقتی درخواستها توسط کنترلرها مدیریت بشن، عملاً گروه بندی actionها داره اتفاق میفته و نیازی نیست یکی یکی با توابع بدون نام، کار کنیم. ازطرفی در Yii توی کنترلر موردنظر میشه برای یک/چند/همه actionها فیلترهای موردنظر رو روی قبل یا بعد از هر عمل موردنظر، نصب کرد.

rezakho
چهارشنبه 30 بهمن 1392, 21:09 عصر
نه، شما درست متوجه قابلیت های گروه بندی نشدید، این جمله من "(فقط بحث سر دسته بندی هست، فعلا به اکشن و کنترولر کاری نداریم، به اونها هم میرسیم)" دقیقا منظورم این بود که به روت ها که اکشن هستند یا کلوژر کاری نداشته باشید
ببینید، فرض کنید همچین آدرس هایی دارید



http://domain.com/en/admin
http://domain.com/en/admin/login
http://domain.com/en/admin/logout

http://domain.com/fa/admin
http://domain.com/fa/admin/login
http://domain.com/fa/admin/logout

http://domain.com/en/admin/user
http://domain.com/en/admin/user/profile
http://domain.com/en/admin/user/edit
http://domain.com/en/admin/user/update

http://domain.com/fa/admin/user
http://domain.com/fa/admin/user/profile
http://domain.com/fa/admin/user/edit
http://domain.com/fa/admin/user/update


شما با Yii این رو بنویسید، تا من بگم چه فرقی با لاراول داره

MMSHFE
چهارشنبه 30 بهمن 1392, 21:23 عصر
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
'caseSensitive'=>false,
'rules'=>array(
'<lang:(en|fa)>/admin/index'=>'admin',
'<lang:(en|fa)>/admin/<action:(login|logout)>'=>'admin/<action>',
'<lang:(en|fa)>/admin/user/<id:\d+>'=>'admin/user_view',
'<lang:(en|fa)>/admin/user/<action:(profile/edit/update)>/<id:\d+>'=>'admin/user_<action>',
),
),

من برحسب نظر خودم، برای اکشنهای user شناسه id کاربر رو هم اضافه کردم چون حدس زدم منظورتون ویرایش اطلاعات کاربران در بخش مدیریته و شناسه id یادتون رفته بنویسید.
الآن توی اکشنهای index و login و logout و user با پارامتر lang$ میشه فهمید چه زبانی انتخاب شده بوده و توی اکشنهای user_profile و user_edit و user_update علاوه بر این پارامتر، با id$ هم میشه شناسه id کاربر رو بدست آورد.

rezakho
چهارشنبه 30 بهمن 1392, 21:45 عصر
بله، از جزئیات که بگذریم، ببینید لاراول تا N سطح میتونه دسته بندی رو انجام بده، الان در Yii اگر تعداد rule ها زیاد باشه باید برای همه lang رو تعریف کرد، یا admin رو هم باید تکرار کرد
ولی کد زیر که البته من از جزئیات زدم رو ببینید


Route::group(array('prefix'=>'{lang}/admin'), function($lang)
{
Route::group(array('prefix'=>'user/{id}'), function($id)
{
//for {lang}/admin/user/{id} prefix ({lang}/admin/user/{id}/...)
});

//for {lang}/admin prefix ({lang}/admin/...)
});


حتی میشه چندین کنترولر رو درون یک گروه جا داد و برای همه، یکبار قوانینی رو وضع کرد بدون اینکه بخوایم توی کنترولر دست ببریم

MMSHFE
چهارشنبه 30 بهمن 1392, 21:50 عصر
خوب این گروهبندی اگه اکشنها به کنترلر ارجاع داده بشن، عملاً اینقدر سطح برای گروهبندی لازم نیست و میشه با نوشتن Ruleهای مناسب و کلی تر، تعداد Ruleها رو کاهش داد. بهرحال فکر میکنم قضاوت درباره این موضوع رو هم باید به سایرین واگذار کنیم چون من شخصاً ساختار Yii رو بیشتر میپسندم و کلاً توی یک فریمورک، تعریف تابع بی نام و عدم استفاده از ساختار مناسب برای الگوی طراحی و کدنویسی اسپاگتی رو نمیپسندم.

rezakho
چهارشنبه 30 بهمن 1392, 21:53 عصر
عرض کردم که به کنترولر و اکشن میرسیم، اینجا فقط منظور دسته بندی بود، وگرنه برای ارسال درخواست ها به کنترولر میشه نوشت Route::controller که دقیقا مثل Yii کار میکنه

MMSHFE
چهارشنبه 30 بهمن 1392, 21:59 عصر
اینو میدونم. میگم تنها امتیازی که این گروهبندی ایجاد میکنه در کاربرد Route::get هست و استفاده از توابع بی نام وگرنه وقتی اکشنها به کنترلرها ارجاع داده بشن، عملاً گروهبندی انجام میشه و دیگه نیازی به اینهمه سطح نیست. بخاطر همینه که Yii چنین موردی رو پیاده سازی نکرده چون همه چیز رو در قالب MVC میبینه و گروهبندی اکشنها بطور پیشفرض انجام شده.

rezaonline.net
پنج شنبه 01 اسفند 1392, 17:36 عصر
سلام .
میشود یک کلاس برای هندل کردن url ها نوشت .

'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false ,
'rules'=>array(
array(
'class' => 'application.components.MyUrlRule',
'connectionID' => 'db',
),
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

rezakho
پنج شنبه 01 اسفند 1392, 22:51 عصر
خوب، مورد سوم

در لاراول به دو طریق مسیرها رو میشه به کنترلر هدایت کرد
موردی که می خوایم در موردش صحبت کنیم Route::controller هست
در این مورد، برای چک کردن نوع متد HTTP ، به ابتدای نام اکشن، نام متد اضافه میشه، به جای اینکه مثل Yii، داخل اکشن با if نوع متد رو بررسی کنیم، ضمن اینکه این روش Yii رو هم داره

در لاراول


class UserController extends BaseController
{
public function getIndex()
{
//
}

public function postUpdate()
{
//
}
}



در یی


class UserController extends Controller
{
public function actionIndex()
{
//
}

public function actionUpdate()
{
if(Yii::app()->request->isPostRequest){
//
}
}
}


حالا کدام ترتمیز ترند؟

rezaonline.net
پنج شنبه 01 اسفند 1392, 23:05 عصر
به نظر خودتون توی Yii دستتون بازتر نیست ؟
توی همین مقایسه خودتون یه نگاه بندازید :)

البته بهتون پیشنهاد میکنم مواردی که مورد قیاس انجام میدید رو یه خورده سطح بالاتر در نظر بگیرید مثل اون به چالش کشیدن روتر واقعا جالب بود ولی این مورد زیاد چیز شاخی نیست .
برید توی کار مدل ها و AR ببینیم لاراول چه کرده :)

rezakho
پنج شنبه 01 اسفند 1392, 23:12 عصر
آقا رضا! آهسته آهسته

MMSHFE
جمعه 02 اسفند 1392, 00:19 صبح
اینکه توی Yii اکشنها با کلمه action شروع میشن باعث شده راحتتر اکشنها از سایر متدهای داخلی کنترلر تشخیص داده بشن. ازطرفی میشه با فیلترها یک اکشن خاص رو فقط محدود به نوع خاصی از درخواستها کرد. مثال:


public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
'postOnly + delete',
);
}

حالا شما بگین کدوم تمیزتره:
لاراول:


public function postIndex()
{
// post action here
}
public function getIndex()
{
// get action here
}

Yii :


public function actionIndex()
{
if(Yii::app()->request->isPostRequest()) {
// post action here
}
else {
// get action here
}
}

MMSHFE
جمعه 02 اسفند 1392, 00:51 صبح
آقا رضا! آهسته آهسته
درست میگن آقا رضا. اجازه بدین، فعلاً فقط داریم از Yii درمقابل نقاط ضعفی که گفتن Yii درمقابل لاراول داره دفاع میکنیم. نوبت حمله هم میرسه.

rezakho
جمعه 02 اسفند 1392, 09:30 صبح
حمله!!!
:متفکر:
بگذریم

1- روش اضافه کردن متد http به ابتدای نام اکشن ها، یکی از روش ها در لاراول هست که به بعدی ها هم میرسیم
2- در کنترلر طبق همون قواعد سختی که خودتون درگیرشید، غالبا متدها اکشن هستند، وقتی میگیم غالبا دیگه چه نیازی هست کلمه action مرتب تکرار بشه بی خودی، در چند مورد شما متدهایی به غیر از اکشن به کنترلر اضافه میکنید؟، تعدادشون نسبت به اکشن ها چقدر هست؟
3- لاراول اون کدی رو که شما تمیز فرض کردید رو اینجوری در میاره

در یی


public function actionIndex()
{
if(Yii::app()->request->isPostRequest()) {
// post action here
}
else {
// get action here
}
}


در لاراول


public function index()
{
if(Request::isMethod('post')) {
// post action here
}
else {
// non-post action here
}
}

MMSHFE
جمعه 02 اسفند 1392, 11:38 صبح
1- هرموقع رسیدیم، بحثش رو مطرح کنید ولی بهرحال قابلیت خاص و ویژه ای نیست که خیلی اهمیت داشته باشه و Yii هم با فیلترها همین کار رو میتونه انجام بده.
2- خیلی زیاد. توی کنترلرها معمولاً من یکسری متدهای واسطه دارم که کارها رو بعهده اونها میگذارم و اکشنها اکثراً از اون متدها استفاده میکنن و درنتیجه از بیرون نباید قابل دسترسی مستقیم باشن. اینطوری اگه قرار باشه الگوریتم کار تغییر کنه، مستقیماً اکشنها رو تغییر نمیدم بلکه یک متد مشترک تغییر میکنه و همه اکشنهای مرتبط با اون، بطور خودکار اصلاح میشن.
3- خوب پس تا اینجا، به این نتیجه رسیدیم که این قابلیت در هر دو فریمورک وجود داره. حالا لاراول میاد علاوه بر action از کلمات get و post هم بعنوان پیشوند برای محدودکردن نوع دسترسی به یک اکشن استفاده میکنه و Yii بجاش از فیلترها برای اینکار استفاده میکنه ولی اونچه که مهمه اینه که این قابلیت در هر دو فریمورک هست و لاراول اونطوری که در پست اول گفتین، چیزی بیشتر از Yii نداره. اینکه کدوم Syntax بهتره رو هم بگذاریم بعهده بازدیدکنندگان و استفاده کنندگان از این فریمورکها چون هرچقدر من و شما درموردشون بحث کنیم، یک بحث سلیقه ای خواهیم داشت که فایده ای هم نداره. هدفمون هم از این مقایسه، ایجاد یک تاپیک مرجع برای قیاس قابلیتهای فریمورکهاست نه بحث بیهوده. البته درمورد اون علامت «متفکر» که اول پست قبلیتون گذاشتین هم باید بگم بله، البته نه حمله به معنای مخربش بلکه به این معنا که بعداً من هم قابلیتهای خاص Yii رو مطرح میکنم ببینیم لاراول چند مرده حلاجه و اگه دارای اون قابلیتهاست، مکانیزم پیاده سازیش چطوریه.

mojtaba.baghban
جمعه 02 اسفند 1392, 20:08 عصر
نمی‌خوام بپرم وسط بحث شما. فقط تجربه‌ی خودم رو بگم.
من بعد از اینکه yii رو انتخاب کردم با یه سری از چیزها مشکل داشتم مثل اینکه چرا مثلا به جای user::find داشته باشیم user::midel()->find. کم کم با لاراول آشنا شدم و مجذوب سینتکس و سادگیش(عدم پیچیدگی نه اینکه سادگی یاد گرفتن). تا اینکه لاراول ۴ اومد سینتکس همچنان دلنشین ولی در پشت پرده واسه رسیدن به این سینتکس ساده کلی پیچیدگی ایجاد شده بود. مثلا باز می نوشتیم user::find ولی متد استاتیک find وجود نداشت و متد معمولی بود. خلاصه اینکه درک عملکرد برنامه با نگاه به کد به شدت سخت شده بود ونمی‌تونستم تحملش کنم تا اینکه yii2 نسخه پیش‌نمایش عمومی و سپس آلفا منتشر شد با سینتکس دلنشین و عدم پیچیدگی و اینطوری شد که به سمت yii برگشتم.

metal gear solid 4
شنبه 03 اسفند 1392, 12:39 عصر
جناب مدیر این طرز جواب دادن شما در نوع خودش جالبه. اولش مطرح میکنید که بیاید دونه دونه قابلیت هارو بررسی کنیم اما توی تمامی مورد هایی که تا حالا اشاره شده یا جوابتون این بوده که عملاً نیازی نیست یا قابلیت خاص و ویژه ای نیست و میشه پیاده سازیش کرد!!!
هر چیزی رو میشه پیاده سازی کرد. حتی یک فریمورک جدید. مهم اینه این دو فریم ورک در هسته ی خودشون چی دارن. چقدر ساده باشند. چقدر تمیز باشند... !

MMSHFE
شنبه 03 اسفند 1392, 13:20 عصر
دوست عزیز، تمیز بودن یه حرفه، اصولی بودن یه چیز دیگه است. اینکه یک فریمورک به کاربران کمک میکنه مثل سیستم قدیم، کد بدون MVC و کلاً ساختار لایه بندی شده بنویسن، مزیت نیست. اینکه یک فریمورک با کمک پیشوندها متدها رو تفکیک کنه هم قابلیت مهمی نیست چون برای مثال Yii هم با کمک فیلترها و روشهای خاص خودش، این قابلیت رو داره. منتها استارتر جوری توی پست اول اینها رو فهرست کردن که گویا Yii اصلاً این موارد رو نداره. حالا هم چیزی نشده، دو سه مورد از قابلیتها رو گفتن و نسخه معادل Yii رو گفتم چی بوده. اتفاقاً با کسانی که تاپیک رو مطالعه کردن، صحبت کردم و اکثراً معتقد بودن که ساختار Yii اصولیتره و اگه بهش عادت کنیم، کدمون تمیزتر در میاد. حالا شاید ازنظر شما تمیزی اینه که کدتون یک خط بشه ولی ازنظر خیلیها، تمیزی یعنی اینکه کدتون اصولی باشه. اصلاً فریمورک معناش همینه: چهارچوب کاری! حالا اینکه فریمورک شما رو در مسیر کدنویسی غیر اصولی و سنتی کمک میکنه، مزیته یا عیب؟ اینکه بدون ساختار چندلایه توی یک فریمورک بشه اکشنها رو مدیریت کرد، فوق العاده غیر اصولی و ناشیانه است.
حالا بگذارین مواردی که دوستمون فهرست کردن تمام بشه، میرسیم سر امکانات خاص Yii که ببینیم لاراول توی پیاده سازی اونها چه کاره است. امیدوارم این فریمورک هم ساختار خوبی ارائه کرده باشه که کاربرانش از این بابتها متضرر نشن.

rezakho
شنبه 03 اسفند 1392, 19:56 عصر
خوب مورد بعد
این موارد که در پایین میاد، جز مواردی هست که در لاراول به راحتی تمام میشه انجامش داد

1- ست کردن یک الگوی عمومی در تمام روت ها، مثلا الگوی id در تمام روت ها عدد شناخته بشه


Route::pattern('id', '[0-9]+');

2- در لاراول متغیر های POST رو هم میشه به عنوان پارامتر به اکشن یا ... ارسال کرد

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


Route::when('admin/*', 'filters', array('http verps'));


4- در لاراول امکان نام دادن به روت ها برای راحت تر کردن مسیر دهی و یا تولید url ها وجود داره
کد زیر مسیری با آدرس admin رو با هر نوع متد http به اکشن index از کنترلر panel با نام dashboard هندل میکنه


Route::get('admin', array('as' => 'dashboard', 'uses' => 'PanelController@index'));

که به صورت زیر میشه بدون نام اکشن و ... ، فقط با نام روت ریدایرکت کرد یا آدرس رو بدست آورد


$redirect = Redirect::route('dashboard');
$url = URL::route('dashboard');

5- برای هندل کردن ساب دومین هم که خیلی زیبا!


Route::group(array('domain' => '{account}.myapp.com'), function($account)
{

// $account is here

});


6- به شکل زیر میشه یک مدل رو به url متصل کرد، به نحوی که مدل خودش اوتوماتیک لود بشه


Route::model('user', 'User');

Route::get('profile/{user}', function(User $user) {
});


اگر آدرسی مثل profile/1 زده بشه، مدل به صورت اوتوماتیک در $user لود خواهد شد، و اگر مدل وجود نداشته باشه هم میتونیم مشخص کنیم چه اتفاقی بیافته

MMSHFE
دوشنبه 05 اسفند 1392, 09:20 صبح
1- ست کردن یک الگوی عمومی در تمام روت ها، مثلا الگوی id در تمام روت ها عدد شناخته بشه


Route::pattern('id', '[0-9]+');


'rules'=array(
'<_c>/<_a>/<id:\d+>'=>'<_c>/<_a>',
);


2- در لاراول متغیر های POST رو هم میشه به عنوان پارامتر به اکشن یا ... ارسال کرد

توی Yii هم این امکان هست و بطور داخلی اعمال میشه. مثلاً اگه من بگم:


public function actionDelete($id) {
...
}

اونوقت id چه با Post ارسال بشه چه با Get، کار میکنه مگه اینکه با filters مشخص کنم که این اکشن فقط به یکی از این روشها باید جواب بده. البته محدودیت در دسترسی رو با rules خود urlManager هم میشه انجام داد:

'rules'=array(
array('user/delete', 'pattern'=>'user_delete/<id:\d+>', 'verb'=>'POST');
);


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


Route::when('admin/*', 'filters', array('http verps'));


توی Yii هم چنین امکانی وجود داره:

public function filters()
{
return array(
'postOnly, projectContext + create update index'
);
}



4- در لاراول امکان نام دادن به روت ها برای راحت تر کردن مسیر دهی و یا تولید url ها وجود داره
کد زیر مسیری با آدرس admin رو با هر نوع متد http به اکشن index از کنترلر panel با نام dashboard هندل میکنه


Route::get('admin', array('as' => 'dashboard', 'uses' => 'PanelController@index'));

که به صورت زیر میشه بدون نام اکشن و ... ، فقط با نام روت ریدایرکت کرد یا آدرس رو بدست آورد


$redirect = Redirect::route('dashboard');
$url = URL::route('dashboard');

توی Yii هم میشه و اتفاقاً خیلی هم ساده تره:

'rules'=array(
'dashboard/<action:.+>'=>'panel/<action>',
);
نکته: توی Yii اگه خاصیت routeOnly برای routeها ست نشه (حالت پیشفرض)، هم برای تولید لینک و هم برای تفسیر لینک از route مشخص شده استفاده میشه یعنی اگه شما الآن بنویسید:

echo Yii::app()->createUrl('panel/test');
باز هم لینک بصورت dashboard/test ایجاد میشه.


5- برای هندل کردن ساب دومین هم که خیلی زیبا!


Route::group(array('domain' => '{account}.myapp.com'), function($account)
{

// $account is here

});


توی Yii از این هم زیباتره:


array(
'http://<user:\w+>.example.com/<lang:\w+>/profile' => 'user/profile',
)

و اگه اکشن profile از کنترلر user رو اینطوری داشته باشیم:


public function actionProfile($user, $lang) {
...
}

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


6- به شکل زیر میشه یک مدل رو به url متصل کرد، به نحوی که مدل خودش اوتوماتیک لود بشه


Route::model('user', 'User');
Route::get('profile/{user}', function(User $user) {
});

اگر آدرسی مثل profile/1 زده بشه، مدل به صورت اوتوماتیک در $user لود خواهد شد، و اگر مدل وجود نداشته باشه هم میتونیم مشخص کنیم چه اتفاقی بیافته
توی Yii بخاطر مسئله Lazy Loading فوق العاده قدرتمندی که داره، اصلاً به این کارها نیازی نیست. کافیه توی تنظیمات برنامه، محل ذخیره سازی فایلهایی که میخواین بطور خودکار در زمان استفاده بارگذاری بشن رو مشخص کنید:


'import'=>array(
'application.models.*',
'application.components.*',
),

و توی این پوشه ها هم کلاسها رو توی فایلی همنام با کلاس ذخیره کنید. مثلاً کلاس User توی فایل User.php قرار گرفته باشه. ترتیب این آرایه هم مشخص میکنه به چه ترتیبی باید توی پوشه ها دنبال فایل موردنظر بگرده.

MMSHFE
دوشنبه 05 اسفند 1392, 09:34 صبح
هر چیزی رو میشه پیاده سازی کرد. حتی یک فریمورک جدید. مهم اینه این دو فریم ورک در هسته ی خودشون چی دارن. چقدر ساده باشند. چقدر تمیز باشند... !
وقتی از فریمورک (چهارچوب کاری) استفاده میکنیم، اینکه فریمورک بهمون کمک کنه از اون چهارچوب کاری خارج بشیم، کاملاً مساوی با عیب و نقصه نه مزیت (نتیجه این موضوع میشه دقیقاً سیستم قانونگذاری کشورهایی مثل هند که بعنوان یک ضرب المثل تلخ بین مردمش رایج شده که «هیچ قانونی وضع نمیشه، مگه اینکه تبصره فرار از اون برای عده مشخص شده ای، درنظر گرفته شده باشه»). کد تمیز یعنی کدی که اصول داخلش رعایت شده باشه. اینکه شما با کمک یک فریمورک میتونید اسپاگتی کد بنویسید و فریمورک هم به شما کمک میکنه که برای مثال، توی یک خط کد اینکار رو انجام بدین، معناش این نیست که کد شما تمیزه! فقط خلاصه تر نوشتین. اگه بنا به خلاصه نویسی باشه، برنامه نویسی رویه گرا هم کدهایی کوتاهتری نسبت به شئ گرایی تولید میکنه. پس ما هم باید بگیم Procedural Programming تمیزتر از OOP هست؟! امروزه اصول کاری برنامه نویسی وب شده MVC و MVVP و HMVC و... و دیگه اسپاگتی کد منسوخ شده. پس لطفاً به کدی که فقط کوتاهه و اصولی نیست، نگین کد تمیز!

engmmrj
دوشنبه 05 اسفند 1392, 11:29 صبح
آقای rezakho (http://barnamenevis.org/member.php?174696-rezakho) در Laravel میشه از چند لاگین استفاده کرد ؟ برای استفاده از معادل setFlash باید باید آگاهی داشته باشیم از اینکه session باز است یا نه ؟

metal gear solid 4
دوشنبه 05 اسفند 1392, 12:45 عصر
وقتی از فریمورک (چهارچوب کاری) استفاده میکنیم، اینکه فریمورک بهمون کمک کنه از اون چهارچوب کاری خارج بشیم، کاملاً مساوی با عیب و نقصه نه مزیت (نتیجه این موضوع میشه دقیقاً سیستم قانونگذاری کشورهایی مثل هند که بعنوان یک ضرب المثل تلخ بین مردمش رایج شده که «هیچ قانونی وضع نمیشه، مگه اینکه تبصره فرار از اون برای عده مشخص شده ای، درنظر گرفته شده باشه»). کد تمیز یعنی کدی که اصول داخلش رعایت شده باشه. اینکه شما با کمک یک فریمورک میتونید اسپاگتی کد بنویسید و فریمورک هم به شما کمک میکنه که برای مثال، توی یک خط کد اینکار رو انجام بدین، معناش این نیست که کد شما تمیزه! فقط خلاصه تر نوشتین. اگه بنا به خلاصه نویسی باشه، برنامه نویسی رویه گرا هم کدهایی کوتاهتری نسبت به شئ گرایی تولید میکنه. پس ما هم باید بگیم Procedural Programming تمیزتر از OOP هست؟! امروزه اصول کاری برنامه نویسی وب شده MVC و MVVP و HMVC و... و دیگه اسپاگتی کد منسوخ شده. پس لطفاً به کدی که فقط کوتاهه و اصولی نیست، نگین کد تمیز!
من متعجبم شما چطور این صحبت هارو میکنید. شما که اصولاً برنامه نویسی بدون فریمورک رو ترجیح میدید. ( طبق پست های خودتون ). چرا؟ نمیدونم اما احساس میکنم به خاطر اینه که شاید دست و پاگیر باشه. شاید. ولی این دقیقاً دلیلی میشه که یک فریمورک باید دست برنامه نویس رو باز بزاره. ;) این که ما دقیقاً مطابق با چهارچوب بریم جلو رو کی تعریف کرده؟ کی گفته؟ شما؟ اگر شما میگید کاملاً مرتبط به نوع برنامه نویسی خود شماست. هیچ ارتباطی به من نوعی نداره. من سبک و سیاق خودم رو در برنامه نویسی دارم. شما سبک خودتون. اما یک سبک و قانونی هست که همه ی برنامه نویسا دوسش دارن. اینکه کد رو راحت بشه نوشت. کد رو تمیز بشه نوشت.
بله. کد تمیز. توی تمامی مواردی که در مقایسه با لاراول نوشتید کدهای لاراول بدون جانب داری کورکورانه تمیز تر هستند. خواناتر هستند. این رو هرکسی که هیچ اشرافی به این دوفریمورک نداره هم میتونه بفهمه.
انقدر دم از قانون برنامه نویس نزنید. همونطور که گفتم قوانین هر کس مختص خودشه. درانتهای کار، کد من و شما هردو یک کار رو انجام میدند. مشتریهای جفتمون هم راضی هستند. اصلاً هم براشون مهم نیست من از قانون و چهارچوب فریمورکم خارج شدم و شما نشدید!!! این قوانین نانوشته ای که میگید فقط دست برنامه نویس ها رو میبنده.

metal gear solid 4
دوشنبه 05 اسفند 1392, 12:47 عصر
آقای rezakho (http://barnamenevis.org/member.php?174696-rezakho) در Laravel میشه از چند لاگین استفاده کرد ؟ برای استفاده از معادل setFlash باید باید آگاهی داشته باشیم از اینکه session باز است یا نه ؟
بله میشه. و من در پروژه ی فعلیم. با 4 لاگین همزمان میتونم وارد سیستم بشم.

engmmrj
دوشنبه 05 اسفند 1392, 13:15 عصر
بله میشه. و من در پروژه ی فعلیم. با 4 لاگین همزمان میتونم وارد سیستم بشم.
بدون تنظیمات اضافی این کارو کردین ؟

MMSHFE
دوشنبه 05 اسفند 1392, 13:34 عصر
من متعجبم شما چطور این صحبت هارو میکنید. شما که اصولاً برنامه نویسی بدون فریمورک رو ترجیح میدید. ( طبق پست های خودتون ). چرا؟ نمیدونم اما احساس میکنم به خاطر اینه که شاید دست و پاگیر باشه. شاید. ولی این دقیقاً دلیلی میشه که یک فریمورک باید دست برنامه نویس رو باز بزاره. ;) این که ما دقیقاً مطابق با چهارچوب بریم جلو رو کی تعریف کرده؟ کی گفته؟ شما؟ اگر شما میگید کاملاً مرتبط به نوع برنامه نویسی خود شماست. هیچ ارتباطی به من نوعی نداره. من سبک و سیاق خودم رو در برنامه نویسی دارم. شما سبک خودتون. اما یک سبک و قانونی هست که همه ی برنامه نویسا دوسش دارن. اینکه کد رو راحت بشه نوشت. کد رو تمیز بشه نوشت.
بله. کد تمیز. توی تمامی مواردی که در مقایسه با لاراول نوشتید کدهای لاراول بدون جانب داری کورکورانه تمیز تر هستند. خواناتر هستند. این رو هرکسی که هیچ اشرافی به این دوفریمورک نداره هم میتونه بفهمه.
انقدر دم از قانون برنامه نویس نزنید. همونطور که گفتم قوانین هر کس مختص خودشه. درانتهای کار، کد من و شما هردو یک کار رو انجام میدند. مشتریهای جفتمون هم راضی هستند. اصلاً هم براشون مهم نیست من از قانون و چهارچوب فریمورکم خارج شدم و شما نشدید!!! این قوانین نانوشته ای که میگید فقط دست برنامه نویس ها رو میبنده.
من هنوز هم میگم که به برنامه نویسی بدون فریمورک علاقمند هستم و ترجیحش میدم ولی معنای برنامه نویسی بدون فریمورک، لزوماً برنامه نویسی بدون قید و بند نیست. اینکه شما کار یک مشتری رو با MVC انجام بدین و بعد، یکسری جاها صرفاً برای اینکه کار شما راحتتر بشه، بیاین با همون روش معمول کد بنویسید، یعنی یک کد بی نظم دارین که بجز شما، هیچ کسی ازش سر در نمیاره و هیچ تضمینی هم وجود نداره که بعد از چند ماه که به این پروژه سر نزنید و سراغ پروژه های دیگه برین و یکهو مشتری بگه مشکلی پیش اومده یا بخواین قابلیتی رو اضافه کنید، باز هم یادتون باشه چند ماه قبل بخشهای مختلف پروژه رو چطوری انجام دادین. اینکه باید مطابق با چهارچوب فریمورک رفت جلو رو هم من نمیگم. هر آدم عاقلی میگه. شما نمیتونید عضو یک جامعه بشین و قوانینش رو چون دست و پاگیر هستن، قبول نکنید؛ حتی اگه اون جامعه به شما این اجازه رو بده، باز هم میشه یک جامعه بدون نظم و قانون. مثل اینه که پلیس بیاد بگه آقا شما باید بین خطوط حرکت کنید ولی اگه حرکت نکردین هم طوری نیست. نتیجه اش هم میشه ترافیک همیشگی که توی خیابونها شاهدش هستیم! اینجا هر آدم عاقلی میفهمه که نتیجه این مشکلات، در درجه اول عدم سختگیری در اجرای قوانین و در درجه بعد، عدم التزام شهروندان به قوانین تدوین شده است. اگه ازنظر شما کد تمیز، کد خلاصه است، پس با PHP خام و بصورت Procedural بنویسید چون سربارهای OOP و MVC و... رو ندارین. مشتری بهرحال چیزی از کد پشت پرده سر در نمیاره حتی اگه سورس کد رو هم تحویلش بدیم ولی اگه قرار باشه تیمی کار کنیم (مهمترین قابلیتی که فریمورکها به کاربران میدن) باید طبق یک قانون مشترک و استاندارد، کد بنویسیم. نمیگم MVC خیلی کامله ولی بهرحال داخلش مشخصه که منطق برنامه کجاست، بخش نمایش ظاهری کجاست، سیستم ارتباط با پایگاه داده و... کجاست. مثل کدنویسی اسپاگتی نیست که هرجا دلمون خواست، if میگذاریم و هرجا هم دلمون خواست با break از حلقه میایم بیرون و اصلاً هم برامون مهم نیست که سر برنامه نویس بعدی که قراره این کدنویسی افتضاح! ما رو ادامه بده چی میاد و چقدر به اجدادمون بد و بیراه خواهد گفت. بله ازنظر شما، کد تمیز یعنی این!!! شاید کد من و شما یک کار رو انجام بدن ولی مشتریهای من قطعاً راضیتر هستن چون یک سال دیگه هم بخوان قابلیتی رو اضافه کنن، هم خودم و هم فرد دیگری که بخوان باهاش کار کنن، به راحتی و با همون سرعت روزهای اول پروژه، میتونه اصلاحات رو انجام بده و ازطرفی چون پروژه کاملاً ماژولار هست، میتونم هر قسمتی رو بخوام جدا کنم و با اندکی اصلاحات (شاید هم بدون تغییر) توی پروژه های دیگه استفاده کنم و درنتیجه سرعت تولید پروژه های بعدیم هم افزایش پیدا میکنه. دوست عزیز، تعریف شما از کد تمیز، نیازمند یکم تمیزکاریه!!! اون سبک و قانونی که میگین همه برنامه نویسها دوستش دارن هم (اینکه کد رو راحت بشه نوشت...) به شرطی صحیحه و همه قبولش دارن و دوستش دارن که یک سال بعد هم راحت بتونن از عهده پشتیبانی (تغییر، اصلاح، ارتقاء و...) بر بیان. برخلاف شما، کدهای لاراول رو سرشار از بینظمی و حتی از اون بدتر، تشویق برنامه نویس به کدنویسی بینظم میبینم. با صحبتهایی که تا حالا توی تالار مطرح کردین هم ندیده ساختار کدنویسی شما رو میتونم تجسم کنم و مطمئنم اگه بخوایم برای ارتباط بخشهای مختلف پروژه شما، گراف ترسیم کنیم، در نهایت به توپولوژی Mesh میرسیم. شرمنده اگه رک صحبت کردم ولی راه بهتری برای رسوندن منظورم پیدا نکردم و ابداً قصد اهانت ندارم منتها بعنوان یک دوست یا شاید یک برادر، تجربه خودم رو میخوام منتقل کنم تا بعداً چند سال دیگه، از این سبکی که در کدنویسی دارین، پشیمون نباشین. موفق باشید.

MMSHFE
دوشنبه 05 اسفند 1392, 13:35 عصر
بدون تنظیمات اضافی این کارو کردین ؟
مگه شما توی Yii برای انجام این کار چقدر دردسر میکشین؟ بجز تنظیم کردن دو نسخه از همون کامپوننت User مگه کار دیگری هم لازمه؟ البته فکر میکنم کلاً سؤال شما مرتبط با این تاپیک نباشه و بهتره توی یک تاپیک جداگانه دنبالش کنید.

metal gear solid 4
دوشنبه 05 اسفند 1392, 14:04 عصر
نه چرا ناراحت بشم. من هم مثل هر برنامه نویس دیگه ای مدتی رو با کدهای بی نظمی که نوشتم طی کردم تا رسیدم به استفاده از فریمورک. الان سه ساله با لاراول کار میکنم و از ساختارش پیروی میکنم.
تمامی حرفای شما زمانی درسته که من کدها رو به شکلی پیچونده باشم که شخصی که بعد از من به عنوان پشتیبان فنی میخاد روی پروژه کار کنه تنها باید ازمن سوال کنه که چه کردم و نکردم یا زمان زیادی وقت بزاره و خودش بفهمه. خب اینطور نیست. هر فریمورکی هرچقدر هم قانونمند باشه Syntax خاص خودش رو داره. و شخصی که روی پروژه ی من و شما کار میکنه باید باهاش آشنا باشه. کسی که قراره با لاراول آشنا باشه به خوبی با نوع کد نویسی من هم آشناست. من چیزی فراتر از لاراول نمیرم و نرفتم اما خود لاراول پا رو فراتر گذاشته. اون دیگه به من و برنامه نویس بعدی ربطی نداره. اگه با این فریمورک آشنا باشه، منظورم اصلاً MVC نیست، به راحتی خط به خط کدهای نوشته شده رو متوجه میشه. در لاراول علاوه بر MVC، طبق یه سری چهارچوب های خاص، دست برنامه نویس بازه و میتونه کارکنه. جوری صحبت نکنید که انگار هرکی با این فریمورک کار میکنه داره آبگوشت هم میزنه.

MMSHFE
دوشنبه 05 اسفند 1392, 14:09 عصر
اتفاقاً همین Route::get مثال خوبی برای پروژه آبگوشتیه. شاید یک برنامه نویس خبره هیچوقت ازش استفاده نکنه ولی بودنش به تنهایی یعنی اینکه لاراول راه رو برای کدنویسی بی نظم باز گذاشته. اینکه دستی Route تعریف کنیم و متد بدون نام بسازیم و بهم لینک کنیم و... معناش جز بی نظمی چیز دیگری نیست. همونطور که گفتم، توی Yii هم میشه یکسری متدهای متفرقه داشت ولی بهرحال اونها هم ساختار MVC رو دارن یعنی نماها توسط View تولید میشن و پردازشها توسط Controller و شاید این وسط اصلاً بعضی جاها هم اصلاً دسترسی به دیتابیس لازم نباشه ولی اگه نیاز بود، مطمئناً باید ازطریق Model انجام بشه. توی Yii حتی درخواستهای AJAX هم با ساختار MVC کار میکنن.

tux-world
سه شنبه 06 اسفند 1392, 01:03 صبح
سلام. آقای شهرکی فکر کنم با تعصب جلو میبرید بحث رو. بحث سر این که فریم ورکها چه قابلتهایی دارند یا ندارند بحثهو مخصوا سر اینکه چقدر راحتی کار رو به برنامه نویس میده تعریف روتها تو ایی همونطور که خودتون فرمودید مثل الگوریتم ها pregMatch میمونه. لاراول هر بدی که داشته باشه ساده تر و قدرتمند تر به نظر میاد. البته اینطور هم هست. هر دو فریم ورک عالی هستن . ما که اونا رو ننوشتیم. استفاده کننده ایم پس تعصب معنایی نداره. واقع بینانه به موضوع نگاه کنیم

MMSHFE
سه شنبه 06 اسفند 1392, 10:37 صبح
ببینید، بحث اصلاً تعصب نیست چون نه Yii مال منه و نه Laravel و نه هیچ فریمورک دیگه. هرچقدر استفاده کنندگان از هرکدوم از این فریمورکها هم بیشتر بشن، هیچ نفع و ضرری به حال من نداره. منتها باید یکسری چیزهایی که اصولی هست رو گفت. چه بعضیها خوششون بیاد، چه نیاد. مهم اینه که یکی که تازه میخواد تصمیم بگیره، دید درستی پیدا کنه. اینکه یک فریمورک هزاران مدل امکانات مختلف ارائه کنه ولی هیچکدوم اصولی نباشن، معناش این نیست که فریمورک خوبیه. البته نمیگم هیچکدوم از امکانات لاراول خوب نیست و برعکس معتقدم امکانات خیلی خوب و قدرتمندی داره ولی حقیقتاً این مواردی که فهرست شده توی این تاپیک و تا اینجا بررسی کردیم، بیشتر باید بعنوان نقطه ضعف این فریمورک مطرح بشه نه بعنوان نقطه قوت. Routeها رو در Yii هم میشه بصورت RegExp نوشت و هم متن معمولی و اتفاقاً RegExp یکی از نقاط قوتش هست ولی اجبار نیست و میتونید معمولی هم بنویسید. باز هم تأکید میکنم برنامه ای که با یک فریمورک نوشته میشه، باید یکسری استانداردها پایه رو داشته باشه. مثلاً ساختار مشخصی داشته باشه که هیچ جا از اون ساختار خارج نشده باشیم. حالا این ساختار هرچی میخواد باشه مهم نیست. میتونه MVC باشه، میتونه MVVP باشه، میتونه HMVC باشه یا اصلاً میتونه همون ساختار سنتی باشه ولی بهرحال باید مشخص باشه و هیچ جا نشه از اون ساختار خارج شد و اصطلاحاً بزنیم جاده خاکی و هرجور دلمون خواست Routeها رو پردازش کنیم. الآن یکی دیگه که میاد سراغ پروژه ما توی لاراول، وقتی یک action خاص رو میخواد اصلاح کنه، کجا باید دنبالش بگرده؟ توی Routeها ببینه دستی تعریف شده؟ توی کنترلرها دنبال اکشنش باشه؟ توی گروهبندیهای Route دنبالش بگرده؟ قبول کنید ساختار نامنظمی رو ارائه میده درحالی که توی Yii همه Routeها توی فایل تنظیمات یا نهایتاً کلاسی که برای مسیریابی مینویسیم یا جدولی از دیتابیس که برای مشخص کردن Routeها ساختیم، خلاصه میشه و مسیرها بهرحال از هر جا خونده بشن، درخواستها به کنترلرها فرستاده میشه و جوابها هم با ویوها نمایش داده میشه و ارتباط با پایگاه داده ها هم ازطریق مدلها فراهم میشه و هیچ جا نه خود فریمورک از این ساختار خارج شده و نه اجازه میده برنامه نویس از این چهارچوب خارج بشه. اگه قرار بود (عذر میخوام) فَله ای کد بنویسیم، اصلاً چرا اومدیم سراغ فریمورک؟ بخاطر چهارتا کلاس کار با دیتابیس و مدیریت سشن؟ اونها رو که یکبار برای همیشه میتونیم خودمونم بنویسیم. چرا خودمون رو درگیر یادگیری ساختاری که باهاش کاملاً آشنا نیستیم کنیم؟! مطمئن باشید هر کسی بدون تعصب این تاپیک رو دنبال کنه، بی نظمی لاراول و کمک به کاربران برای استفاده از ساختار بی نظم رو متوجه میشه و این مسئله واقعاً یک امتیاز مثبت نیست. نمیدونم چرا منظورم رو متوجه نمیشین؟! باور کنید راحتی برنامه نویس مساوی با بی قید و بندی در کدنویسی نیست. مهمترین و طولانی ترین فاز یک پروژه برنامه نویسی، فاز پشتیبانیه و بهترین فریمورک، اونیه که توی این فاز، باعث راحتی برنامه نویس بشه. حالا هرچقدر برنامه روی اصول پیش رفته باشه، توی فاز پشتیبانی کار راحتتری دارین و هر کسی هم که بخواد روی پروژه کار کنه، کافیه به ساختار فریمورک آشنا باشه تا به راحتی بدونه هر قسمت از پروژه توی کدوم فایله و روند انجام کارها به چه شکل داره انجام میشه و مثلاً پیامها از کدوم فایلها داره خونده میشه و الی آخر. فکر میکنید بخاطر چیه که سیمفونی 2 اینقدر محبوبیت پیدا کرده؟ همه قبول دارن که حتی برخی جاها سختگیریهاش از خود PHP هم بیشتره ولی باز هم دوستش دارن چون نمیگذاره بی قید و بند کد بنویسید. این سیستم، تعریف دقیق Framework ( = چهارچوب کاری) هست.

tux-world
سه شنبه 06 اسفند 1392, 11:08 صبح
خوب ببینید آقای شهرکی.اینطوری مقایسه انجام نمیشه. مثال آبگوشت و اسپاگتی و اینچیزها خوب بی ادبیه. شما به این فکر کن هم لاراول بده هم yii . خوب ما میخواییم چیزی که میتونیم روش مانور بدیم رو انتخاب کنیم با توجه به زمان و اینده نگری پروژه. لاراول اگه بد بود فریم ورک سال نمیشد. قرار نیست بی نظمی در بیاره. این برای خودش یه سیاست رو دنبال میکنه yii هم یه جور دیگه.هر دو تاشون هم همدیگه رو قبول ندارن.اگه اینطوری نبود که تعداد فریم ورک ها اینقدر متنوع نبود. نوع دید برنامه نویس به قضیه مهمه. به صورت پیش فرض البته شاید بی نظمی هم باشه طبیعیه. برنامه نویس باید تو اپلیکیشنهایی که مینویسه باید دقت کنه مدیریت کنه. yii اومده این رو به صورت دیفالت گذاشته و سخت تر کرده مفاهیم رو و میگه این درسته.
نه، نه حرف لاراول درسته نه حرف yii . برنامه نویس و نوع دیدش مهمه. عبارت بی قید و بندی عبارت بسیار اشتباهیه که شما ازش استفاده کردید. همونطور که گفتید همه از سمفونی راضی هستن. پس لاراول هم یه توزیع از اون هستش. پس قدرتهاشو ازش به ارث برده.
ما میخواییم انتخاب درستی داشته باشیم. فردا پس فردا ممکنه یه فریم ورک بیاد زیر آب این دوتا رو بزنه و فوق العاده باشه.خیلی. یا اصلا اینا دیگه پشتیبانی نشن. خوب ما چیکار کنیم؟ حداقل قوانین و حد و حدوداستفاده رو یاد بگیریم.آقای rezakho هم کم با yii کار نکردن که به این فریم ورک رو اوردن. یا بچه های دیگه مثل آقای مقیمی خودش برای لاراول bundle نوشته الان اومده yii . منظورم از واقع بینانه نگاه کردن اینه.

موفق باشید

MMSHFE
سه شنبه 06 اسفند 1392, 11:42 صبح
الآن کی گفته لاراول فریمورک ساله؟ لابد همون مقاله وبلاگ توی SitePoint رو میخواین لینک بدین! ضمناً اصطلاح آبگوشتی رو اول بنده مطرح نکردم و دوستمون گفتن و من هم گفتم لابد ازنظرشون این اصطلاح اشکالی نداره و همون رو به کار بردم و گفتم سیستم کاری لاراول همون وضع رو داره اما اسپاگتی کد، اصلاً بی ادبی نیست و یک اصطلاح علمی برای مواقعی هست که جوری کدنویسی میشه که سر و تهش معلوم نیست (لینک (http://en.wikipedia.org/wiki/Spaghetti_code)). ضمناً لاراول یه توزیع از سیمفونی نیست، بلکه اومده بخشهایی از سورس اون رو برداشته و موارد خودش رو بهش اضافه کرده. این موضوع بد هم نیست چون بهرحال دنیای Open Source هست و قطعاً امتیازش رو اگه مستلزم هزینه بوده، خریده. درست مثل کاری که Yii کرده و بخشهایی از خودش رو مدیون سیمفونی هست ولی لاراول ابداً یک توزیع از سیمفونی محسوب نمیشه و قرار هم نیست هر کسی بخشهایی از اون رو توی کار خودش استفاده کرد و یک فریمورک دیگه نوشت، توزیع سیمفونی محسوب بشه. این حرفهایی هم که از بی نظمی در لاراول میزنم فقط حرف من نیست. کافیه کمی توی اینترنت جستجو کنید. بعلاوه Community لاراول عملاً مرده و اگه توی سایتش دقت کنید، میبینید که فقط به یکسری سؤالات یش پا افتاده جواب داده میشه و وقتی پای مسائل جدی و پیچیده مطرح میشه، همه سکوت اختیار میکنن. اینها برای یک فریمورک نقطه ضعفه ولی بهرحال لاراول Syntax قوی و قدرتمندی داره و جای کار هم زیاد داره. همین که مرتباً داره نسخه های جدید بیرون میده و توی هر نسخه هم تغییرات اساسی و بنیادی داره، معناش اینه که هنوز به اون ثبات لازم نرسیده و خیلی هنوز جای رشد و پیشرفت داره اما درهرحال میشه بعنوان یک فریمورک Stable روش تکیه کرد. تمام صحبت من اینه که این مواردی که بیان شده و فقط موجب راحتی در بی قید و بند نوشتن کدها میشه و امتیاز خاص دیگری نداره، مزیتهای این فریمورک نیستن و اگه کسی میخواد از این فریمورک دفاع کنه، باید دست روی موارد مهمتر بگذاره چون قطعاً بد دفاع کردن بدتر از حمله کردنه. بعلاوه همین عبارت بی قید و بند هم عبارت بدی نیست. نمیدونم چرا تا توی یک بحث علمی، یکم جدی میشیم و میخوایم حرفها رو رک بزنیم، بهمون بر میخوره و باید قبلش کلی معذرت خواهی کنیم درحالی که مباحث علمی جای تعارف و صحبتهای گل و بلبل نیست. هیچ قصدی هم برای توهین وجود نداره. برای مثال، همین اصطلاح بی قید و بند، معناش انجام یک کار بدون قاعده و اصوله. درسته که این اصطلاح بار منفی داره ولی به معنای توهین نیست. کما اینکه توی همون مباحث اجتماعی هم اگه یکنفر واقعاً بی قید و بند باشه و بهش این لقب رو بدن، کسی ایراد نمیگیره. شما ثابت کنید که لاراول اولاً قید و بند داره و چهارچوب کاریش دقیقاً مشخصه و ثانیاً نمیگذاره از اون چهارچوب خارج بشین، بنده هم اصطلاح بی قید و بند رو از روی صحبتهام درخصوص لاراول بر میدارم.
صحبت شما درسته، نوع دید برنامه نویس در سبک کدنویسیش اثر میگذاره ولی اینکه همه جور امکانات بدیم بعد بگیم خودت انتخاب کن که نشد چهارچوب کاری. مثل اینه که بگیم هیچ قانونی توی جامعه نیست ولی شما درست رفتار کنید! اگه قرار باشه همه چیز رو بعهده برنامه نویس بگذاریم برای انتخاب، میشه همون حالت عدم استفاده از فریمورک. نمیدونم چرا اکثراً فکر میکنن فریمورک فقط برای راحتی کار برنامه نویس اومده درحالی که همه جا توی مقالات معتبر نوشته شده فریمورک برای مقید کردن اعضا به اصولی که ازنظر تولیدکننده فریمورک صحیحه ایجاد میشه. برای مثال چرا توی NET. کسی نمیتونه Unsafe Code بنویسه؟ تا حالا کسی اومده بگه خوب این قابلیت رو هم به NET. اضافه کنن تا کاربرانش بیشتر بشه و کار برنامه نویسان راحت بشه؟ اینجور وقتها مایکروسافت به همه درخواستهایی که میخوان چنین قابلیتی رو اضافه کنن فقط یک جواب میده: اگه Unsafe Code میخواین، از NET. استفاده نکنید. اینجا هم همینه. اگه کسی ساختار MVC نمیخواد، با Yii کار نکنه. اگه قرار باشه لاراول بیاد بگه من همه جوره میگذارم کارتون رو انجام بدین و کلاسهای لازم رو براتون تأمین میکنم، بنظرم دیگه نباید اسمش رو بگذاریم فریمورک چون اصلاً چهارچوبی برای کارکردن وجود نداره و بیشتر اسم «کتابخانه کلاسهای لاراول» براش مناسبه (Laravel Class Library) که متأسفانه اصلاً در شأن یک فریمورک نیست.
باز شاید بیاین بگین من دارم با تعصب حرف میزنم ولی اگه کمی منصف باشین و منطقی به قضیه نگاه کنید، تأیید خواهید کرد که دارم درست میگم.
درمورد اینکه گفتین جناب rezakho هم با Yii کار کردن، باید بگم که توی مقایسه، باید امکانات روز رو درنظر گرفت. شاید اون موقع که به لاراول رو آوردن Yii اینقدر قوی نبوده یا بحث سلیقه و... مطرح باشه (این مسئله ارمورد آقای مقیمی که اشاره کردین هم صدق میکنه و اینکه ایشون از لاراول به Yii رو آوردن رو دلیل ضعف لاراول نمیدونم).

rezakho
سه شنبه 06 اسفند 1392, 11:54 صبح
ببخشید چند روز نبودم،
اولا من خواهش میکنم از آقای شهرکی قبل از ادامه مباحث یک نگاهی به داکیومنت لاراول بندازند، چون احساس میکنم هنوز درست نتونستند ساختارش رو مجسم کنند، تا تاپیک رو ادامه بدیم
دوما، این به برنامه نویس ربط داره که چجور کد بزنه، مفهوم اسپاگیتی هم که شما مرتب ازش استفاده کردید تا آخرش رسوندیدش به ابگوشتی و فله ای!، هیچ ربطی به این مواردی که اشاره کردید نداره
سوم، کد تمیز یعنی کد اصولی، کدی هایی که شما تا حالا مثال زدید خیلی شلوغ تر از کدهای لاراول بوده، چطور این کد شلوغ برای نگهداری و پشتیبانی نرم افزار دست و پا گیر نیست، ولی کدهای کم و خوانای لاراول هست؟
چهارم، دوستان هم گفتند، اگر روزی فریمورکی روان تر و بهتر از لاراول بیاد، حتما من با لاراول خداحافظی خواهم کرد
پنجم، Route::get و امثالهم، یک قابلیت در لاراول و هم خانواده هاش هست، شما ملاک حرفه ای بودن و یا نبودن در استفاده از ابزارها هستید؟ حداقل 6 فریمورک معروف این ساختار رو دارند، آیا سازندگان اینها حرفه ای نبودند؟! آیا اونها مفاهیم تفکیک منطق و MVC و ... رو آشنایی ندارند؟؟؟

MMSHFE
سه شنبه 06 اسفند 1392, 12:03 عصر
ببینید، گویا من هرچقدر صحبت کنم و توضیح بدم، فایده ای نداره و شما به دید تعصب بهشون نگاه میکنید، بهتره این بحث رو ادامه ندیم. شما یکسری امکانات رو گفتین و من هم همه جا گفتم از نظر من...
بنابراین، هر کسی که این تاپیک رو بخونه، میفهمه که من نظر شخصی خودم رو گفتم و میتونه قبول کنه یا نه و بهتره سر این موارد بحث نکنیم و مقایسه امکانات رو ادامه بدیم و تصمیم بر اینکه کدوم بهتره رو بگذاریم بعهده خوانندگان. شما امکانات لاراول رو میگین، من هم معادل Yii رو میگم. اینکه کدوم بهتر و اصولی تره هم بعهده خوانندگان این تاپیک باشه. من هم هرجا نظرم رو گفتم، اعلام کردم و خواهم کرد که نظر شخصی خودمه.
فقط یک نکته: اینکه 6 فریمورک یک ساختار اشتباه رو داشته باشن، معناش این نیست که فریمورک هفتم هم باید بیاد این ساختار رو ارائه بده. منظورم اینه که درسته که برنامه نویسهای اونها حرفه ای بودن ولی بهرحال خدا نبودن و توی کارشون قطعاً اشتباهاتی ممکنه وجود داشته باشه، همونطور که توی طراحی و تولید پدر همه اینها که خود PHP هست هم اشکالات فاحشی وارده و دلیل نمیشه که من نوعی وقتی اشتباهی رو میبینم، بگم چون اون حرفه ای بوده و PHP رو ساخته، من در حدی نیستم که اشتباهاتش رو گوشزد کنم. برای مثال، نمیگم کسانی که لاراول رو طراحی کردن با منطق MVC آشنا نبودن چون اتفاقاً خیلی خوب هم MVC رو پیاده سازی کردن ولی این مسئله، کار خاص و شق القمر نبوده و پیاده سازی MVC آنچنان هم سخت نیست. چیزی که مهمتره اینه که چهارچوب کاری توی فریمورکشون نیست و این رو هرجا برسم میگم. چه بقیه خوششون بیاد و موافق باشن، چه خوششون نیاد و مخالفت کنن ولی همه جا هم میگم که نظر شخصی خودمو گفتم و هیچکس مجبور به پذیرفتنش نیست. من حرفم رو با دلیل میگم و انتخاب و تصمیم گیری بعهده شنونده صحبتها و خواننده مطالبی هست که منتشر میکنم. ضمناً بله، هم من و هم شما و هم هر کسی دیگری که از ابزارها استفاده میکنه، ملاک حرفه ای بودنشونه نه کسی که طراحی و تولیدشون کرده چون اونها برای ما تولید کردن و این حق ماست که اگه جایی دیدیم حرفه ای عمل نشده، گوشزد کنیم، چه به خودشون، چه به سایر کاربران. به عقیده من این حرفتون (شما ملاک حرفه ای بودن و یا نبودن در استفاده از ابزارها هستید؟) به نوعی توهین و تحقیر محسوب میشه چون بنده و شما هیچی بابت اینکه ملاک حرفه ای بودن و یا نبودن در استفاده از ابزارها باشیم، کم نداریم!!! موفق باشید.

rezakho
سه شنبه 06 اسفند 1392, 12:22 عصر
اوایل تاپیک هم گفتم که از این دست پستها خوشم نمیاد
پس همین کار رو میکنیم، دوستان هم همکاری کنند تا ادامه بدیم
شما هم لطف کنید فقط معادل کدها رو بگذارید، با کمترین متن توضیحات، من هم همین کار رو میکنم
حالا برگردیم به آخرین پس من که آخرین مطالب در باره route بود

MMSHFE
سه شنبه 06 اسفند 1392, 12:37 عصر
اونو که جواب دادم.

tux-world
سه شنبه 06 اسفند 1392, 12:39 عصر
من فعلا لاراول رو انتخاب کردم و ترجیح میدم وقتمو رو اون بزارم. چون واقعا از سینتکس و بقیه چیزهایی که داره لذت بردم. میدونم تو این فریم ورک کامل اون چیزهایی که تو فکرم هستش رو میتونم پیاده سازی کنم.شاید ایرادی داشته باشه ولی هیچ فریم ورکی کامل نیست.با آقای فرمانی هم بارها صحبت کردم و به نکات ضعف و قوت yii اشاره کردن. ولی من لاراول رو دوست دارم.شاید روزی به yii برگردم ولی هیچ وقت خودمو محدود به یکیش نمیکنم

rezakho
سه شنبه 06 اسفند 1392, 12:40 عصر
1- ست کردم الگوی عمومی در روت ها
این کدی که شما نوشتید مال یک روت هست نه تمام روت ها




'rules'=array(

'<_c>/<_a>/<id:\d+>'=>'<_c>/<_a>',

);



2- در Yii نمیشه متغرهای POST رو به اکشن به صورت پارامتر ارسال کرد، توی خود داکیومنت Yii گفته http://www.yiiframework.com/doc/guide/1.1/en/basics.controller#action
قسمت Action Parameter Binding

3- قابلیت اعمال انواع ویژگی به روت ها، با یک خط روی همه روت ها هست، نه اکشن به اکشن یا کنترلر به کنترلر، Yii نمیتونه این کار رو به راحتی انجام بده

4- در مورد نام گذاری روت ها، شما نامی به روت ندادید، بلکه از نام اکشن و کنترلر دارید استفاده میکنید که لاراول این رو هم داره ولی Yii نام دهی به روت ها رو پشتیبانی نمیکنه

5- این مورد که ساب دومین بود رو یی داره، ولی شلوغ تر، مثلا همین روت profile که فقط نیست، ممکنه 20 تا روت دیگه داشته باشید که در Yii باید تک تک user رو توی روت ها تعریف کنید که در لاراول فقط یکبار اینکارو انجام میدید، نکته اصلی جلوگیری از تکرار هست (DRY)

6- منظور lazy لودینگ نیست، این رو هم که اکثر فریمورک ها دارند من جمله لاراول
منظور اینه که مدل User با شناسه مورد نظر خودکار لود میشه و نیازی به findByPk نیست مثل Yii

MMSHFE
سه شنبه 06 اسفند 1392, 12:57 عصر
1- اشتباه میکنید، مال همه هست چون RegExp مشخص نشده و هر زوج Controller/Action رو شامل میشه.
2- من دارم استفاده میکنم شما میگین نمیشه؟ توی Document هم به GET_$ اشاره کرده، نگفته POST_$ نمیشه!
3- به همون صورت Global که توی مثال 1 گفتم، به راحتی برای همه میشه انجام داد.
4- دوست عزیز، همونطور که توی مثال مشخص کردم، به کنترلر panel اسم dashboard رو دادم. حالا چطور میگین از نام دهی پشتیبانی نمیشه؟ الآن اگه بگیم:

$this->redirect('dashboard');
عمل Redirect به panel/index انجام میشه. حتی میشه برای dashboard خالی هم route دلخواه رو مشخص کرد. مثال:


'rules'=array(
'dashboard/<action:.+>'=>'panel/<action>',
'dashboard'=>'panel/home',
);

و به این شکل میشه Redirect کرد:


$this->redirect('dashboard'); // Redirects to panel/home
$this->redirect('dashboard/test'); // Redirects to panel/test

5- توی Yii هم مهمترین اصل DRY هست. برای همه Routeها میشه انجام داد. اونهم با یک خط:


array(
'http://<user:\w+>.example.com/<lang:(en|fa)>/<action:\w+>' => 'user/<action>',
)

خطاب به استارتر: شما که به بنده پیشنهاد میدین مستندات لاراول رو بخونم چون گویا برام هنوز جا نیفتاده (درحالی که بنده حداقل 3 کتاب مرجع در زمینه فریمورک لاراول مطالعه کردم و بعد وارد این بحث شدم)، خودتون گویا مستندات Yii رو نخوندین که چنین موارد پیش پا افتاده ای رو میگین Yii نداره یا باید چندین خط کد براش نوشت!
6- یعنی الآن نوشتن اون یک خط Route::model('user', 'User'); خیلی خلاصه تر از $user = $this->loadModel($id); هست؟ اگه منظورتون اینه که توی هر اکشن باید تکرار بشه هم باید بگم که خیر چنین نیازی نیست. کافیه یکبار توی متد init بنویسید تا توی همه اکشنها اجرا بشه.

rezakho
سه شنبه 06 اسفند 1392, 13:05 عصر
خوب، بریم سراغ Query Builder
البته قبلش یک سری قابلیت های پایه کار با پایگاه داده رو بررسی کنیم

ایجاد یک listener برای کوئری ها که مثل ایونت روی تمام کوئری ها اعمال و اجرا میشه


DB::listen(function($sql, $bindings, $time)
{
//
});

MMSHFE
سه شنبه 06 اسفند 1392, 13:32 عصر
توی Yii یکسری eventها از قبل تعریف شده مثل beforeSave یا afterFind و... (لینک (http://www.yiiframework.com/doc/api/1.1/CActiveRecordBehavior)) ولی درصورت تمایل میشه با overrideکردن متد events، رویدادهای سفارشی دلخواه خودمون رو تعریف کنیم و برای مثال، دقیقاً مثل لاراول، بگیم اگه فلان کوئری اجرا شد، فلان کار رو انجام بده ولی سیستم eventهای خاص مثل همونهایی که گفتم، به اندازه کافی کارآمد هست و نیازی به اینقدر حساسیت نیست. برای مثال، میشه به راحتی با overrideکردن متد afterSave در مدل User، کاری کنیم که هروقت یک کاربر جدید ثبت نام کرد، یک SMS برای مدیر ارسال بشه. البته اگه کاربرد DB::listen رو درست متوجه شده باشم، همینه که درصورت اجرای یک کوئری خاص، کار خاصی انجام بشه چون بیشتر از این توی مستندات خود سایتش و همچنین چندتا کتابی که درمورد لاراول خوندم، چیزی پیدا نکردم و توی فارومها هم زیاد درموردش صحبت نشده بود و گویا قابلیت خیلی مطرحی حتی بین خود کاربران لاراول هم نیست و بیشتر بخاطر مقاصدی مثل Log گرفتن از کوئریهای دیتابیس و... استفاده میشه. اما اگه منظورتون طبق پستتون، این باشه که هر کوئری اجرا شد، این تابع صدا زده بشه (بدون اهمیت دادن به اینکه چه کوئری بوده)، میشه با خاصیتهایی از Yii::app()->db->enableProfiling عمل Log گیری رو فعال کرد یا با Yii::app()->db->behaviors کنترل کاملی روی کلیه رفتارهای کل اتصالات به دیتابیس داشت که فکر میکنم این مورد بیشتر به منظور شما از DB::listen نزدیک باشه. در این مورد، هرچند اون رو قابلیت خیلی بزرگی نمیدونم ولی فکر میکنم Laravel ساده تر عمل کرده و کار رو برای برنامه نویس هم آسون تر کرده باشه. البته شاید با تحقیق بیشتر، به این نتیجه برسیم که Yii هم چنین قابلیتی داشته باشه و ما ازش بیخبر باشیم چون حقیقتش تا حالا به کاربرد چنین قابلیتی فکر نکرده بودم و نیازی هم بهش احساس نمیکردم.

tux-world
سه شنبه 06 اسفند 1392, 15:42 عصر
این حرفهایی هم که از بی نظمی در لاراول میزنم فقط حرف من نیست. کافیه کمی توی اینترنت جستجو کنید.

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


بعلاوه Community لاراول عملاً مرده و اگه توی سایتش دقت کنید، میبینید که فقط به یکسری سؤالات یش پا افتاده جواب داده میشه و وقتی پای مسائل جدی و پیچیده مطرح میشه، همه سکوت اختیار میکنن.

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


همین که مرتباً داره نسخه های جدید بیرون میده و توی هر نسخه هم تغییرات اساسی و بنیادی داره، معناش اینه که هنوز به اون ثبات لازم نرسیده و خیلی هنوز جای رشد و پیشرفت داره

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


اگه کسی میخواد از این فریمورک دفاع کنه، باید دست روی موارد مهمتر بگذاره چون قطعاً بد دفاع کردن بدتر از حمله کردنه.

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


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

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


اسم «کتابخانه کلاسهای لاراول» براش مناسبه (Laravel Class Library) که متأسفانه اصلاً در شأن یک فریمورک نیست.

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


درمورد اینکه گفتین جناب rezakho هم با Yii کار کردن، باید بگم که توی مقایسه، باید امکانات روز رو درنظر گرفت.

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

موفق باشید

MMSHFE
سه شنبه 06 اسفند 1392, 16:01 عصر
کامیونیتی ها همونطور که میدونین جایی برای بحث و رفع اشکال این چیزهاست. راکد بودن دلیلی بر مردن نیست. میتونین مثبت فکر کنید که همه راحت میتونن رفع اشکال کنن و نیازی به پرسیدن نباشه. در مورد مسایل جدیدی تقریبا برای همه موارد صدق میکنه. لاراول و ایی هم یکی از اینا. همه کسایی که حرفه ای شدن فکر میکنید چقدر از وقتشون رو اینجاها میزارن. سایت استک رو ببینید.
نه مسئله اینه که سؤال پرسیده میشه ولی کسی جواب نمیده. ضمناً StackOverflow رو نمیشه با Community اختصاصی مقایسه کرد. توی جامعه کاربران اختصاصی، حداقل تیم Support خود فریمورک باید فعال باشن (مثل فاروم Yii که به خیلی از سؤالات، حتی خود Quiang Xuo جواب میده).

خوب فریم ورک ایی هم داره میره رو نسخه دو. حتما مواردی بوده که نسخه جدید رو دارن روش کار میکنن. خودتون میدونین ضعفهای زیادی داشته. اگرم نداشته دلایلی بوده که اصل نسخه داره فرق میکنه. خیلی ها هم هنوز راضی نیستن از تغییرات. ولی در کل برای پیشرفت و توسعه نیازهایی سنجیده شده. اگه موردی نباشه که فریم ورک ها توسعه پیدا نمیکنن. حرفتون کاملا اشتباه هستش.
من نگفتم اینکه نسخه جدید میده، اشکالی داره یا بده، گفتم معناش اینه که هنوز جای کار داره ولی بهرحال اینکه توی هر نسخه، تغییرات اساسی پیدا میکنه (Major) و تغییراتش جزئی (Minor) نیست، یعنی اینکه تیم توسعه هنوز بطور کامل خودش هم تکلیفش با خودش معلوم نیست. بهرحال تیم دو نفره اینجور موارد رو زیاد داره و ثبات تصمیمات توش با یک تیم 10 - 12 نفره خیلی فرق میکنه.

انگار اشتباه متوجه شدید. کسی اینجا از این فریم ورک دفاع نمیکنه. یا زیر آب ایی رو نمیزنه. من هنوز هم میگم شما دارید یه طرفه بحث رو جلو میبرید.
قضاوت درباره اینکه من یکطرفه بحث رو جلو میبرم یا نه، با دیگران. نیازی نیست درباره اش بحث کنیم.

خوب ببینید فریم ورک چیکار میکنه؟ یه سری از مواردی رو اینطوری بگم که برای شما یه شهری با یه سری امکاناتش میده. برنامه نویس داخل این شهر میتونه هر کاری بر طبق اون انجام بده چه خوب چه بد. بستگی به حرفه ای بودنش داره. فریم ورک قوانینی تعریف میکنه برای برنامه نویس که ملزم صد در صد به استفاده از قسمتهایی از اون نیست. فریم ورک باید مدیریت کنه نه برخورد. حرف شما اینطوریه که ایی برخورد میکنه با نوع برنامه نویسی.
به نظر من تعریفتون از فریمورک کمی اشکال داره. درسته که مجبور نیستین از همه قسمتهای یک فریمورک استفاده کنید ولی قواعد اون بخشهایی که استفاده میکنید رو باید استفاده کنید و ازطرفی خود فریمورک هم باید یکپارچگی رویه و قواعد و قوانین داشته باشه (Consistency). ضمناً Yii هم اینطور نیست که داخل اکشنها هم جلوی کارتون رو بگیره و بگه حتماً باید این مدلی کار کنید ولی بهرحال سیستم MVC رو همه جا رعایت میکنه و دقیقاً مشخصه که Routeها کجا پردازش میشن و...

شاید شما دارید بد به موضوع نگاه میکنید. تشخیصش هم با ما نیست. در ضمن اینکه فرض کنید لاراول یه فریم ورک کاملا شخصیه و برای استفاده عموم برنامه نویسان منتشر نشده. اگه شما ازش خوشتون نمیاد خوب ازش استفاده نکنید.
پس چرا شما دارین برای استفاده سایرین، تبلیغش رو میکنید و استارتر تاپیک اومده Yii رو به چالش کشیده و قابلیتهاش رو با Yii مقایسه میکنه؟ این حرف شما کاملاً اشتباهه. اگه فریمورک شخصی بوده، نباید Release میشده و اینهمه هم کاربران میومدن مقاله میدادن که فریمورک سال! لاراول خواهد بود و از این قبیل حرفها

برای برنامه نویس حرفه ای امکانات محدودیت هستش. نوع استفاده از امکاناتی که در اختیارش قرار داده میشه مهمه نه خودش.
نه منظورم رو اشتباه متوجه شدین. میگم وقتی قراره دو مورد با هم مقایسه بشن، امکانات روزشون رو باید مدنظر قرار بدیم نه اینکه من مثلاً دو سال قبل با Yii کار میکردم و بخاطر یکسری مشکلات رفتم سمت لاراول و حالا امروز بیام یه مقاله بنویسم و امکاناتی که امروز لاراول داره رو با امکاناتی که دو سال قبل Yii نداشته، کنار هم بگذارم و نتیجه بگیرم لاراول خیلی از Yii سرتره! اگه قراره مقایسه کنم، باید امکانات همین امروز هر دو فریمورک رو مورد بررسی و مقایسه قرار بدم.

rezakho
سه شنبه 06 اسفند 1392, 16:19 عصر
در مورد پست آخرم، لاراول هم ایونت های مدل رو داره که بهشون میرسیم

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


$users = DB::connection('foo')->select(...);

MMSHFE
سه شنبه 06 اسفند 1392, 16:38 عصر
خوبه، پس لاراول در این مورد هم خوب عمل کرده. البته در Yii هم به همین سادگی میشه اتصالهای دلخواه و همزمان رو برقرار کرد.

rezakho
سه شنبه 06 اسفند 1392, 16:48 عصر
transaction ها
در لاراول اینجوری میشه بلوکی از دستورات رو به صورت تراکنشی! اجرا کرد که در صورت خطا، به صورت خودکار rollback میشه


DB::transaction(function()
{
DB::table('users')->update(array('votes' => 1));

DB::table('posts')->delete();
});


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


DB::beginTransaction();

DB::rollback();

DB::commit();

engmmrj
سه شنبه 06 اسفند 1392, 17:40 عصر
در Yii به راحتی میشه از 2 دیتابیس استفاده کرد :

'components' => array(
'db' => array(
'connectionString' => 'mysql:host=dbserver1;dbname=my1db',
...
),
'dbadvert' => array(
'connectionString' => 'mysql:host=adserver2;dbname=advertisingDB',
'username' => 'advertuser',
'password' => '***********',
...
'class' => 'CDbConnection' // DO NOT FORGET THIS!
),

engmmrj
سه شنبه 06 اسفند 1392, 17:43 عصر
cache فریمورک Yii هم قابل مقایسه با لاراول نیست !

rezakho
سه شنبه 06 اسفند 1392, 17:48 عصر
خواهش کردم تاپیک رو بهم نریزید!
جناب engmmrj (http://barnamenevis.org/member.php?262236-engmmrj) میشه بفرمایید اگر بخوایم یک مدل از کانکشن اول و یکی دیگه از کانکشن دوم استفاده کنه باید چه کرد؟؟؟
ضمنا داریم قدم به قدم جلو میریم، کو تا کش!!!

MMSHFE
سه شنبه 06 اسفند 1392, 18:33 عصر
کافیه به مدل، این متد رو اضافه کنیم:


public function getDbConnection() {
return Yii::app()->dbadvert;
}

MMSHFE
سه شنبه 06 اسفند 1392, 18:48 عصر
transaction ها
در لاراول اینجوری میشه بلوکی از دستورات رو به صورت تراکنشی! اجرا کرد که در صورت خطا، به صورت خودکار rollback میشه


DB::transaction(function()
{
DB::table('users')->update(array('votes' => 1));

DB::table('posts')->delete();
});


معادل Yii:


$transaction = Yii::app()->db->beginTransaction();
try {
Users::model()->updateAll('votes=1');
Posts::model()->deleteAll();
$transaction->commit();
}
catch(Exception $e) {
$transaction->rollback();
}


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


DB::beginTransaction();

DB::rollback();

DB::commit();

توی Yii هم این توابع وجود داره (توی مثالی که گفتم، استفاده شده).

engmmrj
سه شنبه 06 اسفند 1392, 19:41 عصر
ضمنا داریم قدم به قدم جلو میریم، کو تا کش!!!
اینو گفتم که یک وقت فکر تون سمت cache نره که به بن بست میرسید !

rezakho
چهارشنبه 07 اسفند 1392, 10:14 صبح
خوب بریم سراغ Query Builder

من از موارد ساده و مواردی که در هر دو وجود داره میگذارم، مواردی رو میگم که یا وجود نداره و یا در Yii سخت تر انجام میشه

اول همون سینتکس کوتاه و روانش هست برای گرفتن کوئری
در Yii


Yii::app()->db->createCommand()->...





DB::table()->...


برای واکشی تمام رکوردها


// Yii
Yii::app()->db->createCommand()->select('*')->from('table')->queryAll()

// Larave
DB::table('table')->all();



// Yii
Yii::app()->db->createCommand()->select('*')->from('table')->queryRow()

// Larave
DB::table('table')->first();


برای واکشی ستون (در یی فقط اولین ستون رو میشه واکشی کرد، ولی در لاراول هر ستونی رو)


// Yii
Yii::app()->db->createCommand()->select('*')->from('table')->queryColumn()

// Larave
DB::table('table')->lists('columnName', 'optionalKey');

برای واکشی یک سلول (سطر و ستون خاص) که در یی فقط میشه مقدار ستون اول از سطر اول رو کشید بیرون، ولی در لاراول سطر اول از هر ستونی


// Yii
Yii::app()->db->createCommand()->select('*')->from('table')->queryScalar()

// Larave
DB::table('table')->pluck('columnName');


اگر تعداد رکوردها زیاد باشه و بخواهیم همه رو یک جا واکشی کنیم، در لاراول از chunk استفاده میکنیم تا مثلا 200 تا 200 تا رکوردها از جدول واکشی بشند و رم سیستم رو به باد ندیم که در Yii همچین چیزی نداریم و باید خودمون پیاده سازیش کنیم با limit و ...


// Yii
$users = Yii::app()->db->createCommand()->select('*')->from('users')->queryAll();

foreach($users as $user) { ... }

// Larave
DB::table->chunk(200, function($users)
{
foreach ($users as $user)
{
//
}
});

MMSHFE
چهارشنبه 07 اسفند 1392, 10:44 صبح
لطفاً وقتی از ساختار جدید Yii اطلاع ندارین، لطف کنید فقط ساختار لاراول رو بگذارین و ارائه معادل Yii رو به ما واگذار کنید. اینطوری پستها هم طولانی نمیشه.

برای واکشی تمام رکوردها

DB::table('table')->all();

معادل Yii:

Table::model()->findAll();


برای واکشی اولین سطر

DB::table('table')->first();

معادل Yii:

Table::model()->find();

برای واکشی ستون (در یی فقط اولین ستون رو میشه واکشی کرد، ولی در لاراول هر ستونی رو)

DB::table('table')->lists('columnName', 'optionalKey');

باز هم مستندات رو نخونده، قضاوت کردین، گفتم که شما فقط امکانات لاراول رو بگین و به Yii کاری نداشته باشین. معادل Yii :

Table::model()->findAll(array('select'=>'columnName, 'optionalKey'));


برای واکشی یک سلول (سطر و ستون خاص) که در یی فقط میشه مقدار ستون اول از سطر اول رو کشید بیرون، ولی در لاراول سطر اول از هر ستونی

DB::table('table')->pluck('columnName');

دوباره مستندات نخونده، درمورد Yii قضاوت کردین؟! معادل Yii :

Table::model()->find(array('select'=>'columnName'));
حتی میشه ترتیب رو هم مشخص کرد که بر چه اساسی مرتب بشه و بعد، اولین رکورد انتخاب بشه. لطفاً از این به بعد اول مستندات Yii رو بطور کامل مطالعه کنید، بعد درموردش نظر بدین. درغیر اینصورت فقط لطف کنید امکانات خود لاراول رو مطرح کنید و درمورد چیزی که اطلاعات ندارین، مطلب ننویسید که باعث گمراهی بقیه بشه.


اگر تعداد رکوردها زیاد باشه و بخواهیم همه رو یک جا واکشی کنیم، در لاراول از chunk استفاده میکنیم تا مثلا 200 تا 200 تا رکوردها از جدول واکشی بشند و رم سیستم رو به باد ندیم که در Yii همچین چیزی نداریم و باید خودمون پیاده سازیش کنیم با limit و ...


// Yii
$users = Yii::app()->db->createCommand()->select('*')->from('users')->queryAll();

foreach($users as $user) { ... }

// Larave
DB::table->chunk(200, function($users)
{
foreach ($users as $user)
{
//
}
});


دوباره همون قضاوتهای نا عادلانه ناشی از عدم مطالعه مستندات و اطلاعات قدیمی درباره فریمورک. معادل Yii :

foreach(Post::model()->findAll(array('limit'=>200)) as $post) { ... }
بعلاوه با کمک اندیس offset میشه شروع انتخاب رو هم مشخص کرد. با اندیس order هم میشه ترتیب رو تعیین کرد.

rezakho
چهارشنبه 07 اسفند 1392, 10:51 صبح
چرا، اطلاع دارم، منتها شما لطف کنید هر وقت نسخه stable شد این کدها رو بگذارید، فعلا همون 1.14 رو بنویسید
برای من کاری نداره نسخه dev لاراول رو مثال بزنم

MMSHFE
چهارشنبه 07 اسفند 1392, 10:52 صبح
برادر من همه اینها مال نسخه 1.1.14 هست. چه ربطی به 2 داره. Syntax رو یه نگاه بنداز. اینم لینک (http://www.yiiframework.com/doc/guide/1.1/en/database.ar)

rezakho
چهارشنبه 07 اسفند 1392, 10:59 صبح
درسته، من چون کد پست قبل شلوغ بود، اشتباه کردم، ولی شما دارید الان از ActiveRecord استفاده میکنید، بحث ما Query Builder بوده

rezakho
چهارشنبه 07 اسفند 1392, 11:03 صبح
میدونید اشکال کجاست، اشکال اینجاست که من دارم قدم به قدم میرم جلو، ولی شما در جواب میای هر چی تو اون مبحث هست رو به کلی و کمی جلوتر جواب میدید، الان offset و order و ... من اصلا نگفتم، ما اصلا به ORM نرسیدیم!!!

MMSHFE
چهارشنبه 07 اسفند 1392, 11:05 صبح
چه ربطی داره؟ اینکه Yii قابلیت خیلی خوب و قدرتمندی به اسم ActiveRecord داره مهم نیست؟ وقتی چنین قابلیتی هست، چرا باید از Query Builder استفاده کنیم؟ با وجود AR در Yii عملاً استفاده از QueryBuilder فقط به تولید Queryهای پیچیده یا موارد خاص مثل ساخت Event و Trigger و... محدود میشه. شما جوری درمورد Query Builder لاراول صحبت میکنید که خواننده تاپیک فکر میکنه Yii کلاً همه کارها رو سخت کرده و نمیشه به راحتی لاراول داخلش کار کرد. بعلاوه توی همون Query Builder هم کارها به اون سختی که شما نوشتین نیست. برای مثال، همون مورد آخر (chunk) رو با QueryBuilder فریمورک Yii مینویسم:

foreach(Yii::app()->db->createCommand()->from('users')->limit(200)->queryAll() as $user) { ... }

rezakho
چهارشنبه 07 اسفند 1392, 11:05 صبح
در ضمن اون آخری، chunk، الان کد شما چند تا میکشه بیرون توی foreach ؟

rezakho
چهارشنبه 07 اسفند 1392, 11:07 صبح
محدود بشه، مگه لاراول چیزی مثل ActiveRecord نداره؟ گفتم که قدم به قدم بریم جلو! الان مبحث روی همون کوئری های پیچیده هست، مبحث ORM نیست!

MMSHFE
چهارشنبه 07 اسفند 1392, 11:15 صبح
میدونید اشکال کجاست، اشکال اینجاست که من دارم قدم به قدم میرم جلو، ولی شما در جواب میای هر چی تو اون مبحث هست رو به کلی و کمی جلوتر جواب میدید، الان offset و order و ... من اصلا نگفتم، ما اصلا به ORM نرسیدیم!!!
نه اشکال از اون نیست. اینکه من order و... رو گفتم بخاطر اینه که حدس زدم لابد بعدش میخواین سراغ Eloquent برین و گفتم همینجا آب پاکی رو روی دستتون بریزم و بگم ActiveRecord فریمورک Yii تمام اون امکانات رو داره که هیچ، یک سروگردن هم بالاتره و بهتره وقت خودمون و سایرین رو روی ORM نگیرین. شما میاین میگین فلان کار رو توی Yii نمیشه یا به سختی میشه انجام داد، من میام میگم برعکس، هم میشه انجام داد و هم میشه راحت انجام داد و هم میشه کارهای بیشتری هم انجام داد. کجای اینجور جواب دادن مشکل داره؟

rezakho
چهارشنبه 07 اسفند 1392, 11:21 صبح
حالا زیاد تند نرید، به eloquent هم میرسیم
فعلا اون آخری، chunk، الان کد شما چند تا میکشه بیرون توی foreach ؟

MMSHFE
چهارشنبه 07 اسفند 1392, 11:22 صبح
200 تا دیگه

metal gear solid 4
چهارشنبه 07 اسفند 1392, 11:37 صبح
با وجود AR در Yii عملاً استفاده از QueryBuilder فقط به تولید Queryهای پیچیده یا موارد خاص مثل ساخت Event و Trigger و... محدود میشه.
به این نتیجه رسیدید که Query هاتون پیچیده و ناخواناست؟ معادل همین موارد با QueryBuilder لاراول بسیار ساده نوشته شدن. آقای rezakho مثال های خیلی خوبی زدن.

rezakho
چهارشنبه 07 اسفند 1392, 11:40 صبح
خوب chunk اینکارو نمیکنه، بلکه تا انتها 200 تا 200 تا واکشی میکنه که رم رو قبضه نکنه، مثلا اگر نیاز باشه هزاران رکورد رو پیمایش کنید، شما چکار میکنید؟ البته همین الان بگم که راه داره، ولی منظور من راه کوتاه و تمیزیه کد و سینتکس هست ها!

MMSHFE
چهارشنبه 07 اسفند 1392, 11:41 صبح
به این نتیجه رسیدید که Query هاتون پیچیده و ناخواناست؟ معادل همین موارد با QueryBuilder لاراول بسیار ساده نوشته شدن. آقای rezakho مثال های خیلی خوبی زدن.
چه ربطی داشت الان؟ من گفتم QueryBuilder برای انجام کارهای پیچیده به کار میره نه اینکه این کوئریها پیچیده باشن. این موارد ساده رو با AR میشه به راحتی انجام داد و کسی مجبورمون نکرده از QueryBuilder استفاده کنیم. انجام کوئریهای پیچیده با QuieryBuilder خود لاراول هم همینقدر دستورات رو طولانی میکنه.

MMSHFE
چهارشنبه 07 اسفند 1392, 11:42 صبح
خوب chunk اینکارو نمیکنه، بلکه تا انتها 200 تا 200 تا واکشی میکنه که رم رو قبضه نکنه، مثلا اگر نیاز باشه هزاران رکورد رو پیمایش کنید، شما چکار میکنید؟
الآن متوجه منظورتون شدم. تا جایی که جستجو کردم، توی خود Yii این قابلیت نیست ولی خیلی چیز مهمی نیست چون با همین دو خط کد میشه معادلسازیش کرد:


for ($i = 0; $i < Table::model()->count(); $i += 200) {
foreach (Yii::app()->db->createCommand()->from('table')->limit(200)->offset($i)->queryAll() as $item) { ... }
}

rezakho
چهارشنبه 07 اسفند 1392, 11:49 صبح
متشکر
حالا بریم سراغ کوئری های پیچیده
ما همچین کوئری داریم، شما با Yii درش بیار بی زحمت


select * from users where name = 'John' or (votes > 100 and title <> 'Admin')

MMSHFE
چهارشنبه 07 اسفند 1392, 12:10 عصر
Users::model()->findAll('name=:name or (votes > :votes and title <> :title)', array(':name'=>'John', ':votes'=>100, ':title'=>'Admin'));
این روش، علاوه بر اجرای کوئری، مقادیر رو Escape هم میکنه.

SlowCode
چهارشنبه 07 اسفند 1392, 12:18 عصر
متشکر
حالا بریم سراغ کوئری های پیچیده
ما همچین کوئری داریم، شما با Yii درش بیار بی زحمت


select * from users where name = 'John' or (votes > 100 and title <> 'Admin')

گفتین با Yii اینم پاسخ:


Users::model()->findAllbySql("select * from users where name = 'John' or (votes > 100 and title <> 'Admin')");

من فکر نمیکنم این طرز مقایسه درست باشه!
شما باید امکاناتی از لاراول رو بگین که تو Yii وجود نداره!
شما الان گیر دادین به CreateCommand در صورتی که به قول خودتون و اون یکی دوستمون مهم اینه که فریم ورک راحت ترین راه رو جلوی برنامه نویس بذاره!
راحت ترین راه هم همون کدی هست که بالا گذاشتم! خود Yii زحمتش رو میکشه! پس نیازی نیست من وقتمو با تبدیل کوئری های پیچیده به زبون CreateCommand تلف کنم!
میدونم میخوایین برتری یه فریم ورک رو ثابت کنین ولی یکم دارین اشتباه میرین راه رو.

metal gear solid 4
چهارشنبه 07 اسفند 1392, 12:54 عصر
گفتین با Yii اینم پاسخ:


Users::model()->findAllbySql("select * from users where name = 'John' or (votes > 100 and title <> 'Admin')");

من فکر نمیکنم این طرز مقایسه درست باشه!
شما باید امکاناتی از لاراول رو بگین که تو Yii وجود نداره!
شما الان گیر دادین به CreateCommand در صورتی که به قول خودتون و اون یکی دوستمون مهم اینه که فریم ورک راحت ترین راه رو جلوی برنامه نویس بذاره!
راحت ترین راه هم همون کدی هست که بالا گذاشتم! خود Yii زحمتش رو میکشه! پس نیازی نیست من وقتمو با تبدیل کوئری های پیچیده به زبون CreateCommand تلف کنم!
میدونم میخوایین برتری یه فریم ورک رو ثابت کنین ولی یکم دارین اشتباه میرین راه رو.
ماهیت این تاپیک مقایسست. و به همین روال داره پیش میره. ضمناً معادل این دستور شما با لاراول به مراتب راحتتر نوشته میشه ;)

rezakho
چهارشنبه 07 اسفند 1392, 13:05 عصر
آقای شهرکی، منظورم با Query Builder بود، برادر SlowCode (http://barnamenevis.org/member.php?122371-SlowCode) این کد شما، کد sql خام هست، مثال رو با Query Builder بنویسید تا بتونیم مقایسه کنیم

MMSHFE
چهارشنبه 07 اسفند 1392, 13:10 عصر
نسخه معادلتون رو بگذارین. Speak in Codes

MMSHFE
چهارشنبه 07 اسفند 1392, 13:19 عصر
آقای شهرکی، منظورم با Query Builder بود، برادر SlowCode (http://barnamenevis.org/member.php?122371-SlowCode) این کد شما، کد sql خام هست، مثال رو با Query Builder بنویسید تا بتونیم مقایسه کنیم
چه اصراریه که از سیستم سنتی استفاده کنیم وقتی به راحتی میشه کار رو انجام داد؟ میخواین بگین لاراول اینقدر QueryBuilder رو ساده کرده که همه کارها رو میشه باهاش راحت و کوتاه انجام داد؟ خوب در عوض AR در Yii اینقدر قوی و منعطف هست که اصلاً به QueryBuilder نیازی نیست. ولی بهرحال برای اینکه موردی که گفتین جواب داده شده باشه و نخوایم به تفره رفتن از جواب دادن متهم بشیم، اینهم نسخه QueryBuilder :


Yii::app()->db->createCommand()
->from('table')
->where('name=John or (votes > 100 and title <> admin)')
->queryRow();

البته برای خوانایی اینطوری نوشتم و نیاز به توضیه نداره که میشه کوتاه هم نوشت:

Yii::app()->db->createCommand()->from('table')->where('name=John or (votes > 100 and title <> admin)')->queryRow();

metal gear solid 4
چهارشنبه 07 اسفند 1392, 14:38 عصر
چه اصراریه که از سیستم سنتی استفاده کنیم وقتی به راحتی میشه کار رو انجام داد؟ میخواین بگین لاراول اینقدر QueryBuilder رو ساده کرده که همه کارها رو میشه باهاش راحت و کوتاه انجام داد؟ خوب در عوض AR در Yii اینقدر قوی و منعطف هست که اصلاً به QueryBuilder نیازی نیست. ولی بهرحال برای اینکه موردی که گفتین جواب داده شده باشه و نخوایم به تفره رفتن از جواب دادن متهم بشیم، اینهم نسخه QueryBuilder :


Yii::app()->db->createCommand(
->from('table')
->where('name=John or (votes > 100 and title <> admin)')
->queryRow();

خب در حال حاظر در همین بخش QueryBuilder هستیم.در کوئری شما، نهایتاً شرطهارو باز هم به صورت خام نوشتید.
کوئری رو بسازید. نه اینکه دستورات خام بنویسید!!


معادل کدشما:
DB::table('table')
->whereRaw('name=John or (votes > 100 and title <> admin)')
->first()

با QueryBuilder

DB::table('table')
->where('name','John')
->orWhere(function($query){
$query->where('votes','>',100)
->where('title','!=','admin');
})
->first();

با اجازه ایجاد کننده ی تاپیک.

MMSHFE
چهارشنبه 07 اسفند 1392, 14:41 عصر
البته یک راه ساده تر هم هست:

Yii::app()->createCommand("select * from users where name = 'John' or (votes > 100 and title <> 'Admin')")->queryRow();

MMSHFE
چهارشنبه 07 اسفند 1392, 15:08 عصر
خوب معادل راهی که شما رفتین، توی Yii هم وجود داره. من خواستم کد رو ساده تر بنویسم :


Yii::app()->createCommand()
->from('table')
->where('name=:name', array(':name'=>'John')
->orWhere(array('and', 'votes=:votes', 'title<>:title'), array(':votes'=>100,':title'=>'Admin'))
->queryRow();

یا حتی به این شکل (برای خوانایی بیشتر، بازش کردم و نوشتم ولی بدیهیه که میشه خلاصه نوشت) :


Yii::app()->createCommand()
->from('table')
->where(
array(
'or',
'name=:name',
array(
'and',
'votes=:votes',
'title<>:title'
),
array(
':votes'=>100,
':title'=>'Admin'
)
),
array(':name'=>'John')
)->queryRow();

لینک برای مطالعه بی شتر (http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder) (به نظر میرسه شما حتی به اندازه Starter هم مستندات Yii رو نخوندین)

tux-world
چهارشنبه 07 اسفند 1392, 15:25 عصر
واقعا این فریم ورک ها قدرت بسیار زیادی دارن. درسته از نظر نوع استفاده فرق میکنن ولی خیلی از موارد رو دیدن و روش کار کردن. به این نتیجه رسیدم که لاراول چیز بیخودی نیست خیلی عالی روش کار شده و هم این که Yii هم خوب مانور داده و نیازسنجی های هر کودومشون عالیه

MMSHFE
چهارشنبه 07 اسفند 1392, 15:41 عصر
قطعاً تاپیکهای مقایسه ای از این دست، اگه به بحث و دعوا ختم نشه و فقط به کار مقایسه بپردازیم، باعث روشن شدن ذهن همه نسبت به تفاوتها و مزایا و معایب فریمورکها خواهد شد.

metal gear solid 4
چهارشنبه 07 اسفند 1392, 16:19 عصر
خوب معادل راهی که شما رفتین، توی Yii هم وجود داره. من خواستم کد رو ساده تر بنویسم :


Yii::app()->createCommand()
->from('table')
->where('name=:name', array(':name'=>'John')
->orWhere(array('and', 'votes=:votes', 'title<>:title'), array(':votes'=>100,':title'=>'Admin'))
->queryRow();

یا حتی به این شکل (برای خوانایی بیشتر، بازش کردم و نوشتم ولی بدیهیه که میشه خلاصه نوشت) :


Yii::app()->createCommand()
->from('table')
->where(
array(
'or',
'name=:name',
array(
'and',
'votes=:votes',
'title<>:title'
),
array(
':votes'=>100,
':title'=>'Admin'
)
),
array(':name'=>'John')
)->queryRow();

لینک برای مطالعه بی شتر (http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder) (به نظر میرسه شما حتی به اندازه Starter هم مستندات Yii رو نخوندین)

شما هم انگار فراموش کردید ماهیت این تاپیک چیه. مقایسه . آوردن معادل دستورات. بنده یک کوئری رو در لاراول با QueryBuilder مینوسم شما به خاطر ساده تر بودنش کوئری خام مینویسید؟!!! این چه جور مقایسه ایه؟ چه ارتباطی دارن اینا به هم!!!

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



من اون کدی که گذاشته بودم در جواب شما نبود. آقای rezakho گفتن شما این دستور رو توی yii بنویسید و بحث escape و build کردن و اینا نبود و من هم ساده ترین کدی که میشد کار رو انجام بده نوشتم ولی بعد که پست درج شد دیدم شما زودتر یه پست دیگه درج کردین و من هم پستمو ویرایش کردم. ضمناً بنده هرجایی که یه قابلیت که شاید تو هر صدتا پروژه ده بار هم بطور جدی به کار نیاد، بعنوان نکته کلیدی برای مقایسه مطرح بشه، بی تعارف میگم قابلیت مهمی نیست. اگه به درستی از تمام امکانات AR در yii استفاده بشه شاید تو هیچ پروژه ای نیاز به استفاده از QueryBuilder نباشه یا اگه هم لازم بشه در حد یکی دو تا کوئری پیچیده باشه که نشه با AR نوشت. بخاطر همینه که ساختار QB توی yii ساده سازی نشده. بعلاوه تیم توسعه yii هم بخاطر همین مشکلات بوده که نسخه 2 رو نوشتن که syntax اون فوق العاده بهتر شده ولی هنوز رسمی نیست و بخاطر همین توی این تاپیک من همه جوابها رو دارم با ساختار 1.1.14 میگم که نسبتاً قدیمیتره. پیشنهاد میکنم شما همچنان قابلیتهای لاراول رو مطرح کنید و چون با yii کار نکردین، درموردش قضاوت نکنید و بگذارین خواننده ها نظر بدن و تصمیم بگیرن. اینکه کدوم سینتکس گیج کننده است هم بستگی به خواننده کدها داره. برای مثال کدهای yii من رو برخلاف شما ابداً گیج نمیکنه و این مسئله از یکطرف به سلیقه شخصی و ازطرف دیگه به تواناییها و مهارتهای برنامه نویسی و تجزیه و تحلیل افراد بستگی داره. بنابراین اگه دیدین کدی شما رو گیج میکنه، نیازی نیست بیانش کنید چون شاید برای بقیه اینطور نباشه. بحث رو هم همینجا تمام کنید و به موضوع تاپیک برگردین.
با این طرز ارسال دادن های شما. مشخص میشه انسان خود بزرگ بینی هستید. سرگیجه شدن هم صرفاً برای بیان پیچیده بودن بی دلیل کوئری های شماست ( Yii ). منظور گیج شدن نیست. درسته مثل شما خودبزرگ بین نیستیم اما حداقل انقدر از خودم میتونم تعریف کنم که بگم با دو تا Array توی یک کوئری گیج نمیشم!!

rezakho
چهارشنبه 07 اسفند 1392, 16:32 عصر
دست همه درد نکنه، خیلی خوبه، کم کم داره حال و هوای مقایسه میگیره ;)
معادل کد لاراول همونی هست که اقای متال (کاش حداقل اسم کوچیک رو میدونستیم) گفتند
در ضمن نیازی به :filed نداره، خودش scape میکنه



DB::table('table')

->where('name','John')

->orWhere(function($query){

$query->where('votes','>',100)

->where('title','!=','admin');

})

->first();

MMSHFE
چهارشنبه 07 اسفند 1392, 19:07 عصر
شما هم انگار فراموش کردید ماهیت این تاپیک چیه. مقایسه . آوردن معادل دستورات. بنده یک کوئری رو در لاراول با QueryBuilder مینوسم شما به خاطر ساده تر بودنش کوئری خام مینویسید؟!!! این چه جور مقایسه ایه؟ چه ارتباطی دارن اینا به هم!!!

حداقل در زمینه ی سادگی، خوانایی و تمیزی کد، اونی که باید بفهمه میفهمه لاراول سینتکس ساده تر. خواناتر و تمیزتری داره. بحث قابلیتها به کنار.
من اون کدی که گذاشته بودم در جواب شما نبود. آقای rezakho گفتن شما این دستور رو توی yii بنویسید و بحث escape و build کردن و اینا نبود و من هم ساده ترین کدی که میشد کار رو انجام بده نوشتم ولی بعد که پست درج شد دیدم شما زودتر یه پست دیگه درج کردین و من هم پستمو ویرایش کردم. ضمناً بنده هرجایی که یه قابلیت که شاید تو هر صدتا پروژه ده بار هم بطور جدی به کار نیاد، بعنوان نکته کلیدی برای مقایسه مطرح بشه، بی تعارف میگم قابلیت مهمی نیست. اگه به درستی از تمام امکانات AR در yii استفاده بشه شاید تو هیچ پروژه ای نیاز به استفاده از QueryBuilder نباشه یا اگه هم لازم بشه در حد یکی دو تا کوئری پیچیده باشه که نشه با AR نوشت. بخاطر همینه که ساختار QB توی yii ساده سازی نشده. بعلاوه تیم توسعه yii هم بخاطر همین مشکلات بوده که نسخه 2 رو نوشتن که syntax اون فوق العاده بهتر شده ولی هنوز رسمی نیست و بخاطر همین توی این تاپیک من همه جوابها رو دارم با ساختار 1.1.14 میگم که نسبتاً قدیمیتره. پیشنهاد میکنم شما همچنان قابلیتهای لاراول رو مطرح کنید و چون با yii کار نکردین، درموردش قضاوت نکنید و بگذارین خواننده ها نظر بدن و تصمیم بگیرن. اینکه کدوم سینتکس گیج کننده است هم بستگی به خواننده کدها داره. برای مثال کدهای yii من رو برخلاف شما ابداً گیج نمیکنه و این مسئله از یکطرف به سلیقه شخصی و ازطرف دیگه به تواناییها و مهارتهای برنامه نویسی و تجزیه و تحلیل افراد بستگی داره. بنابراین اگه دیدین کدی شما رو گیج میکنه، نیازی نیست بیانش کنید چون شاید برای بقیه اینطور نباشه. بحث رو هم همینجا تمام کنید و به موضوع تاپیک برگردین.

rezakho
چهارشنبه 07 اسفند 1392, 19:32 عصر
در لاراول میشه به طریق زیر انواع قفل رو روی کوئری مورد نظر اجرا کرد


DB::table('users')->where('votes', '>', 100)->lock()->get();
DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();

MMSHFE
چهارشنبه 07 اسفند 1392, 21:48 عصر
در این مورد زیاد گشتم ولی چیز خاصی توی نسخه 1.1.14 ندیدم. البته میشه با اجرای کوئری انجام داد یکی دو مورد هم دیدم که کلاس ActiveRecord رو توسعه داده بودن و بهش قفل رو اضافه کرده بودن که کار راحتی هم بود. توی نسخه 1.1.14 دو تا Extension هم براش نوشته بودن ولی درهرصورت این قابلیت رو Yii بطور توکار نداشت (تا جایی که من بررسی کردم) و طبیعتاً به این راحتی که لاراول ارائه کرده نبود. توی 2 اعلام کردن بهش اضافه میشه.

rezakho
چهارشنبه 07 اسفند 1392, 22:28 عصر
و اما صفحه بندی!

در لاراول با یک متد میشه صفحه بندی رو اعمال و با یک متد در view، لینک صفحات رو چاپ کرد



// fetching
$posts = DB::table('posts')->paginate(15);


// writing pagination links
echo $posts->links();

MMSHFE
پنج شنبه 08 اسفند 1392, 08:37 صبح
البته نگفتین posts$ رو مستقیماً توی خود ویو تعریف میکنید یا توی کنترلر و روش ارسال مقادیر از کنترلر به ویو چیه ولی من طبق همون روش استاندارد (تعریف در کنترلر و ارسال به ویو) توضیح میدم:

$this->render('index', array('posts' => new CArrayDataProvider(Posts::model()->findAll(), array('pagination' => array('pageSize'=>15)))));
و توی View هم با این کد میشه لینکها رو نشون داد:

$this->widget('CLinkPager', array('pages' => $posts->pagination));
البته میشه توی خود ویو هم مقادیر رو بدست آورد ولی استاندارد نیست اما بهرحال، کد این شکلی میشه:


// fetching
$posts = new CArrayDataProvider(Posts::model()->findAll(), array('pagination' => array('pageSize'=>15)));
// writing pagination links
$this->widget('CLinkPager', array('pages' => $posts->pagination));

در اینجا باز هم ساختار لاراول رو خلاصه تر و بهتر میبینم ولی یه سؤال داشتم، وقتی از Pagination در لاراول استفاده میشه، با کلیک روی لینک هر صفحه، دوباره کل صفحه درخواست میشه و اندیس صفحه ارسال میشه یا اینکه مثل Yii از AJAX استفاده میکنه و فقط رکوردهای جدید رو استخراج میکنه؟ چون توی Yii فقط رکوردهای صفحه با AJAX درخواست میشه و یکبار هم که دریافت شد، Cache میشه و دوباره درخواست نمیکنه. اگر هم JS غیرفعال باشه بطور خودکار روش معمولی رو به کار میبره.

rezakho
پنج شنبه 08 اسفند 1392, 11:46 صبح
بله، واکشی رو در اکشن و نمایش در ویو انجام میشه
خودش به صورت داخلی ajax نداره، که البته 3-4 خط کد بیشتر نیست
ضمنا با عرض پوزش باید بگم متاسفانه Yii، ایجکس این موارد رو به بدترین نوع پیاده کرده که نشان از این داره که فقط میخواستند کار انجام بشه حتی به بدترین روش!!! همون که گفتم کل صفحه رو لود میکنه و قسمت مورد نظر رو با DOM میکشه بیرون و جاگذاری میکنه!!!
ذکر این نکته هم به جاست که چون موتور های جستجو قادر به دنبال کردن محتوای لود شده با ajax نیستند، لذا در سمت front-end عملا ajax لود شدن صفحات اشتباهه، مگر در سمت مدیریت یا مواردی که نیاز به SEO نیست

MMSHFE
پنج شنبه 08 اسفند 1392, 12:13 عصر
درسته ولی بهرحال، سؤال من فقط این بود که AJAX رو داره یا نه چون ممکنه بعضی جاها لازم بشه و بخوایم استفاده کنیم. به قول دوستمون، اینکه ازنظر من یا شما اشتباهه یا نه مهم نیست. مهم اینه که این قابلیت رو داره یا نه. ضمناً تمام موارد AJAX رو در Yii میشه Customize کرد که چی بره و چی بیاد و برای مثال، render کامل صدا زده بشه یا renderPartial یا renderInternal یا کلاً پیاده سازیش رو تغییر بدیم و از RegExp بجای DOM استفاده کنیم و کلی کارهای دیگه! بعلاوه بطور خودکار در Yii برای موتورهای جستجو و مواردی که نمیتونن JS و درنتیجه AJAX رو تفسیر و پردازش کنن (مثل مرورگرهای WAP و یا مواردی که JS توی مرورگر کاربر Disable شده)، لینکها بدون AJAX هم کار میکنن و بطور خودکار صفحه بدون قابلیت AJAX بارگذاری میشه. پس تا اینجا مشخص شد که لاراول AJAX بطور توکار نداره و Yii داره. خوبه که این تفاوتها مشخص بشه چون قصدمون امتیاز دادن نیست و فقط میخوایم تفاوتها رو مشخص کنیم. اینکه فرمودین با چند خط کد میشه اضافه کرد، درمورد Lock که گفتیم Yii در نسخه 1.1.14 نداره (تا جایی که من بررسی کردم) هم صدق میکنه ولی موضوع بحث نیست چون اصولاً هر کاری رو میشه اضافه کرد و موضوع بحث ما هسته (Core) فریمورکهاست وگرنه برای Lock توی Yii اکستنشهای خوبی طراحی شده.

rezakho
پنج شنبه 08 اسفند 1392, 12:22 عصر
بله، درسته
ولی اضافه کردن ajax به لاراول همون زمانی رو میبره که باید ajax در Yii رو کاستوم و یا تصحیح کرد، نه؟!

rezakho
پنج شنبه 08 اسفند 1392, 12:38 عصر
ما بقی موارد هم خیلی اختلاف نداره، مثل order و limit و having و ...، دیگه ازش میگذریم
خوب مبحث بعدی ORM و یا نام خودش در لاراول، Eloquent هست
برای تعریف مدل به صورت زیر عمل میکنیم که البته نام جدول در صورتی که جمع نام مدل باشه، نیازی به تعریفش نیست
مثلا اگر نام مدل User و نام جدول users باشه.


class User extends Eloquent {
protected $table = 'my_users';
}

از تمام متدهای Query Builder به صورت تمام و کمال با همون سبک و روش، میشه در Eloquent استفاده کرد، بدون هیچ تغییری
چند تا مثال میارم



// getting all record
User::all();

// by primary id field
User::find(1);

// by condition
User::where('votes', '>', 100)->get();

// by order , ...
User::order('votes')->order('id DESC')->limit(10)->get();

// by custom connection, crross-database
User::on('mssql')->find(1);

// aggregates
User::where('votes', '>', 100)->count();
User::where('votes', '>', 100)->min('old');

MMSHFE
پنج شنبه 08 اسفند 1392, 13:15 عصر
بله، درسته
ولی اضافه کردن ajax به لاراول همون زمانی رو میبره که باید ajax در Yii رو کاستوم و یا تصحیح کرد، نه؟!
کلاً اضافه کردن AJAX کار خاصی نداره ولی Customizeکردن AJAX در Yii هم خیلی راحته و کار زمانبری نیست. نکته مهم در Yii اینه که بطور خودکار اگه کلاینت امکان استفاده از AJAX رو نداشته باشه، غیرفعال میشه و مثل صفحه معمولی کار میکنه (که حالا کلاینت میتونه موتور جستجو یا مرورگر معمولی یا cURL و... باشه) و این مورد برای SEO و مواردی از این دست، خیلی سودمنده و پیاده سازی این مورد توی لاراول شاید یکم زمان زیادتری نسبت به AJAX ساده لازم داشته باشه.

MMSHFE
پنج شنبه 08 اسفند 1392, 13:54 عصر
ما بقی موارد هم خیلی اختلاف نداره، مثل order و limit و having و ...، دیگه ازش میگذریم
خوب مبحث بعدی ORM و یا نام خودش در لاراول، Eloquent هست
برای تعریف مدل به صورت زیر عمل میکنیم که البته نام جدول در صورتی که جمع نام مدل باشه، نیازی به تعریفش نیست
مثلا اگر نام مدل User و نام جدول users باشه.


class User extends Eloquent {
protected $table = 'my_users';
}

توی Yii هم به همین شکله فقط اسمش عوض شده و بجای Eloquent بهش میگه ActiveRecord و تعریفش هم اینطوریه:

class User extends CActiveRecord {
public function tableName() {
return {{users}};
}
که البته این ساختار {{users}} توی Yii که توی همه کوئریها میشه استفاده کرد و بجای users اسم جدول موردنظر رو گذاشت، خیلی سودمنده و مثلاً اگه توی تنظیمات اتصال دیتابیس خاصیت tablePrefix رو با مقدار _tbl تنظیم کرده باشیم، خروجی این متد tbl_users خواهد بود و بعداً هم اگه پیشوند جداول رو تغییر بدیم، یکجا توی تنظیمات اعمال میشه و هرجا از {{users}} استفاده کرده باشیم، پیشوند جدید بهش اضافه میشه.

از تمام متدهای Query Builder به صورت تمام و کمال با همون سبک و روش، میشه در Eloquent استفاده کرد، بدون هیچ تغییری
ActiveRecord معمولاً در Yii ساختار ساده تری نسبت به QueryBuilder ارائه میده ولی با $this->db و $this->commandBuilder میشه به اتصال و QueryBuilder مربوطه دسترسی داشت و دستورات پیچیده تر رو ازطریق اونها صدا زد. کلاً وجود دو قابلیت یکسان رو در دو جای مختلف نمیپسندم و اینکه ساختار AR در Yii دقیقاً مثل QB نیست و ساده تره، بنظرم یک مزیته. برای نمونه، همون مثالهای شما رو با AR در Yii بازنویسی میکنم:


// getting all record
User::model->findAll();

// by primary id field
User::model()->findByPk(1);

// by condition
User::model->findAll('votes > :votes', array(':votes'=>100));

// by order , ...
User::model()->findAll(array('order'=>'votes, id DESC'), 'limit'=>10);

// by custom connection, cross-database
// because multi-connection in one model is not exist and usual because of differences in DBMS's,
// we should use one model on each connect
// or add a method to the model to switch db connection
public static function switchDb() {
self::$db = (self::$db == Yii::app()->db ? Yii::app()->anotherDb : Yii::app()->Db);
self::$db->active = true;
}
User::model()->switchDb(); // switch
User::model()->findByPk(1); // fetch
User::model()->switchDb(); // revert

// aggregates
User::model()->count('votes > :votes', array(':votes'=>100));

// this one often done via CDbCommand->queryColumn
// but to do it via CActiveRecord, we should add a public propert to the model:
public $min_old;
// then use a code like this in controllers:
User::model()->find(
new CDbCriteria(
array(
'select'=>'min(old) as min_old',
'condition'=>'votes > :votes',
'params'=>array(':votes'=>100),
)
)
);

البته همونطور که گفتم، اگه مورد آخر رو با queryColumn از QB بدست بیاریم، کدمون خلاصه تر میشه که چون الآن موضوع بحث AR و مقایسه با Eloquent هست، از ارائه کدش صرفنظر کردم. البته این کار رو با اضافه کردن ارتباطهای self::STAT به AR هم میشه انجام داد ولی از اونجا که حدس میزنم Laravel هم چنین قابلیتی رو ممکنه داشته باشه، میگذارم واسه وقتی که بحث Statistic Relations رو توی لاراول مطرح کردین (اگه داشته باشه) درموردش کامل توضیح بدم.

mousavi711i
پنج شنبه 08 اسفند 1392, 22:46 عصر
قرار نیست از همه امکانات یک فریم ورک استفاده بشه، ما فقط داریم در این مورد، از روت ساده حرف میزنیم
نمیدونم، اگر نقطه ضعف هست که Symfony و Slim و Silex و Fuel و kohana و .... همه اینجوریند!!!
این مورد رو بگذریم و بگذاریم دیگران قضاوت کنند


چرا بسمت symfonyنمیری
نسخه 2.3 اش عالیه
تمامی این ویژگی های رو که میگید داره
و بسیاری از ویژگی های دیگر

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

mousavi711i
پنج شنبه 08 اسفند 1392, 23:00 عصر
درسته. سابقه کارکرد با هر دو خیلی در مقایسه منصفانه مؤثره به شرطی که با آخرین تغییرات در نسخه های جدید هم تجربه کارکرد داشته باشیم. برای مثال، اگه من دو سال قبل با NET. کار کرده باشم و بیام با امروز PHP مقایسه کنم، یک قیاس اشتباه رو انجام دادم.
دوست دارم نظر شما رو در رابطه با فریم ورک قدرتمند symfonyرو بدونم
مخصوصا نسخه 2 به بعدش عالیه یه نگاه به این آدرس بندازید
http://symfony.com/

تمام ویژگی های رو که گفتید داره

rezakho
پنج شنبه 08 اسفند 1392, 23:44 عصر
چرا بسمت symfonyنمیری
نسخه 2.3 اش عالیه
تمامی این ویژگی های رو که میگید داره
و بسیاری از ویژگی های دیگر

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


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

نظر من اینه که سیمفونی در عین کارایی و امکانات، سینتکس (البته منظور همون پیچیدگی هست) سخت تری نسبت به لاراول و حتی یی داره، لذا الان من سراغش نمیرم، شاید روزی باش کار کنم و ازش خوشم بیاد، در مقایسه هایی هم که تا به حال دیدم و خودم تست کردم، هسته اش بدون دستکاری کند تر از Yii و Laravel هست، به قول نیوتون (با دستکاری البته) لاراول و یی اگر در قله ها هستند، به این خاطره که بر روی دوش غول ها ایستاده اند.

rezakho
پنج شنبه 08 اسفند 1392, 23:58 عصر
کلاً وجود دو قابلیت یکسان رو در دو جای مختلف نمیپسندم و اینکه ساختار AR در Yii دقیقاً مثل QB نیست و ساده تره


به نظرم وجود یک ساختار واحد در تمام بخش های فریمورک مزیت هست، نه عیب!!!
و اینکه فرمودید ساختار AR در یی ساده تر از QB در لاراول هست، یکبار دیگه نمونه کدهای هر دو مون رو کنار هم میگذارم


// laravel
User::all();
// yii
User::model->findAll();


// laravel
User::find(1);
// yii
User::model()->findByPk(1);


// laravel
User::where('votes', '>', 100)->get();
// yii
User::model->findAll('votes > :votes', array(':votes'=>100));


// laravel
User::orderBy('votes')->orderBy('id DESC')->limit(10)->get();
// yii
User::model()->findAll(array('order'=>'votes, id DESC'), 'limit'=>10);


// laravel
User::on('mssql')->find(1);
// yii
public static function switchDb() {

self::$db = (self::$db == Yii::app()->db ? Yii::app()->anotherDb : Yii::app()->Db);

self::$db->active = true;

}
User::model()->switchDb(); // switch
User::model()->findByPk(1); // fetch
User::model()->switchDb(); // revert


// laravel
User::where('votes', '>', 100)->count();
// yii
User::model()->count('votes > :votes', array(':votes'=>100));


// laravel
User::where('votes', '>', 100)->min('old');
// yii
public $min_old;
User::model()->find(
new CDbCriteria(
array(
'select'=>'min(old) as min_old',
'condition'=>'votes > :votes',
'params'=>array(':votes'=>100),
)
)
);

MMSHFE
جمعه 09 اسفند 1392, 01:20 صبح
دوست عزیز من گفتم ساختار AR بهتر و خلاصه تر از QB هست و هر دوش منظورم تو خود Yii بود. ضمناً الآن مقایسه شما بین AR در Yii و Eloquent در لاراول هست نه با استفاده از QB لاراول. بعلاوه در Yii2 تابع ()model حذف شده و مثل لاراول خلاصه و کوتاه شده.

MMSHFE
جمعه 09 اسفند 1392, 01:24 صبح
دوست دارم نظر شما رو در رابطه با فریم ورک قدرتمند symfonyرو بدونم
مخصوصا نسخه 2 به بعدش عالیه یه نگاه به این آدرس بندازید
http://symfony.com/

تمام ویژگی های رو که گفتید داره

سیمفونی فریمورک خیلی خوب و قدرتمندیه و خیلی از فریمورکهای دیگه بخشهایی از خودشون رو مدیون اون هستن ولی دو مشکل لساسی داره که یکیش پرفورمنس پایینتر نسبت به بقیه و یکی دیگه هم سختگیریهایی هست که گاهی اوقات اعصاب برنامه نویس رو بهم میریزه تا جایی کع از خود PHP هم بعضاً سختگیرتر میشه. البته من با سختگیری قانونمند درجهت رعایت چهارچوب کاری موافقم ولی سیمفونی دیگه خیلی در این زمینه زیاده روی میکنه. بهرحال این تاپیک برای مقایسه Yii و لاراول هست و بهتره برای مقایسه یا معرفی سیمفونی تاپیک جداگانه ایجاد کنید.

rezakho
جمعه 09 اسفند 1392, 10:00 صبح
دوست عزیز من گفتم ساختار AR بهتر و خلاصه تر از QB هست و هر دوش منظورم تو خود Yii بود
راستش از جملتون من همچین برداشتی کردم! به هر حال ممنون



ضمناً الآن مقایسه شما بین AR در Yii و Eloquent در لاراول هست نه با استفاده از QB لاراول
عرض کردم،QB و Eloquent در لاراول یکی هستند، هر دو از متدهای مشترک استفاده میکنند

rezakho
جمعه 09 اسفند 1392, 10:21 صبح
خوب
یک سری متدهای جالب داره لاراول که همه رو یکجا میارم یک مرور کلی داشته باشیم
البته موارد اختلافی رو میارم و از مشترک ها میگذرم

ایجاد یک رکورد جدید (البته اون روش new رو ازش میگذرم)
رکورد ایجاد، ذخیره و برگشت داده میشه


$user = User::create(array('name' => 'John'));


رکورد در صورت وجود برگشت داده میشه و در غیر این صورت ایجاد، ذخیره و برگشت داده میشه


$user = User::firstOrCreate(array('name' => 'John'));


رکورد در صورت وجود برگشت داده میشه و در غیر این صورت فقط ایجاد میشه و ذخیره نمیشه


$user = User::firstOrNew(array('name' => 'John'));


ذخیره مدل به همراه relationship ها در پایگاه داده


$user->push();


ویرایش جمعی رکوردها


$affectedRows = User::where('votes', '>', 100)->update(array('status' => 2));


حذف رکورد ها با id


User::destroy(1);
User::destroy(array(1, 2, 3));
User::destroy(1, 2, 3);

$affectedRows = User::where('votes', '>', 100)->delete();


آپدیت کردن فیلد آخرین زمان تغییر


$user->touch();


برای اینکه شلوغ نشه، ما بقی رو توی پست جداگونه میارم

MMSHFE
جمعه 09 اسفند 1392, 12:38 عصر
عرض کردم،QB و Eloquent در لاراول یکی هستند، هر دو از متدهای مشترک استفاده میکنند
پس چرا لاراول اینهمه از Eloquent بعنوان یک ویژگی خوب یاد میکنه؟ خوب میومد رک و راست به همه میگفت یک Alias برای QB درست کرده و خیال خودش و بقیه رو راحت میکرد!

rezakho
جمعه 09 اسفند 1392, 13:00 عصر
پس چرا لاراول اینهمه از Eloquent بعنوان یک ویژگی خوب یاد میکنه؟ خوب میومد رک و راست به همه میگفت یک Alias برای QB درست کرده و خیال خودش و بقیه رو راحت میکرد!
عجب حرفی میزنید، Eloquent یک ORM هست، مثل ActiveRecord در یی، یعنی یک لفاف روی متدهای کار با پایگاه داده، اون موارد که من توی پست قبلی گفتم موارد اختلافی بود، وگرنه اون ساختار واسط شی گرایی رو به هیچ وجه از دست نداده و هنوز خیلی چیزهاش مونده، ضمن اینکه فکر میکنید ساختار داخلی AR در یی چه شکلیه؟!
در یی هم این اتفاق میافته، یعنی شما از AR استفاده میکنید، AR داده ها رو به QB میده و اونجا SQL اجرا میشه و روند معکوس اجرا میشه دوباره شما با شی سر و کار دارید.

MMSHFE
جمعه 09 اسفند 1392, 13:12 عصر
ایجاد یک رکورد جدید (البته اون روش new رو ازش میگذرم)
رکورد ایجاد، ذخیره و برگشت داده میشه

$user = User::create(array('name' => 'John'));

در Yii میشه اینکار رو اینطوری انجام داد:

$user = User::model()->insert(array('name'=>'John'));

رکورد در صورت وجود برگشت داده میشه و در غیر این صورت ایجاد، ذخیره و برگشت داده میشه

$user = User::firstOrCreate(array('name' => 'John'));

معادل Yii:

$user = User::model()->save(false, array('name'=>'John'));

رکورد در صورت وجود برگشت داده میشه و در غیر این صورت فقط ایجاد میشه و ذخیره نمیشه

$user = User::firstOrNew(array('name' => 'John'));

معادل Yii:

$user = User::model()->save(true, array('name'=>'John'));
توضیح: پارامتر اول وقتی True هست یعنی Validationها اعمال بشن. پس اگه یک فیلد رو توی Validaion Ruleها بصورت Unique تعریف کرده باشیم، دیگه ایجاد نمیکنه.

ذخیره مدل به همراه relationship ها در پایگاه داده

$user->push();

لطفاً درموردش بیشتر توضیح بدین چون منظورتون رو از این بخش متوجه نشدم.

ویرایش جمعی رکوردها

$affectedRows = User::where('votes', '>', 100)->update(array('status' => 2));

معادل Yii :

$affectedRows = Users::model()->updateAll(array('status'=>2), 'votes>:votes', array(':votes'=>100));

حذف رکورد ها با id


User::destroy(1);
User::destroy(array(1, 2, 3));
User::destroy(1, 2, 3);
$affectedRows = User::where('votes', '>', 100)->delete();

معادل Yii :


Users::model()->deleteByPk(1);
Users::model()->deleteByPk(array(1, 2, 3));
$affectedRows = Users::model()->deleteAll('votes>:votes', array(':votes'=>100));


آپدیت کردن فیلد آخرین زمان تغییر

$user->touch();

معادل Yii :

$user->saveCounters('visit'=>1);
البته ناگفته نمونه که اگه فیلد آخرین تغییرات رو از نوع timestamp گذاشته باشیم و مقدار Default رو هم CURRENT_TIMESTAMP تعیین کرده باشیم، با انجام $user->save(); بطور خودکار فیلد مذکور بروزرسانی میشه.

MMSHFE
جمعه 09 اسفند 1392, 13:17 عصر
عجب حرفی میزنید، Eloquent یک ORM هست، مثل ActiveRecord در یی، یعنی یک لفاف روی متدهای کار با پایگاه داده، اون موارد که من توی پست قبلی گفتم موارد اختلافی بود، وگرنه اون ساختار واسط شی گرایی رو به هیچ وجه از دست نداده و هنوز خیلی چیزهاش مونده، ضمن اینکه فکر میکنید ساختار داخلی AR در یی چه شکلیه؟!
در یی هم این اتفاق میافته، یعنی شما از AR استفاده میکنید، AR داده ها رو به QB میده و اونجا SQL اجرا میشه و روند معکوس اجرا میشه دوباره شما با شی سر و کار دارید.
بهرحال وقتی توی Eloquent هم همه کارها دقیقاً مثل همون QB انجام میشه و هیچ ساده سازی انجام نشده، عملاً یک ساختار اضافه است و کاری بیشتر از یک Alias انجام نداده. کاری به پشت پرده ندارم که AR هم داره با QB کار میکنه یا نه ولی بهرحال وقتی توی Yii با QB میگیم:

Yii::app()->db->createCommand()->from('users')->where('id=1')->delete();
و توی AR میگیم:

Users::model()->deleteByPk(1);
به این میگن دو ساختار متفاوت. میدونم که لاراول هم چنین تغییراتی داره ولی اولاً شما بهش اشاره نکردین و ثانیاً اینکه دقیقاً به همون ساختار QB میشه توی Eloquent هم کار کرد رو مزیت شمردین درصورتی که حرف من اینه که وقتی میایم سراغ این ساختار، یعنی نمیخواستیم با QB کار کنیم و دلیلی نداره همون متدها با همون ساختار اینجا کپی بشن. این یعنی افزونگی در پیاده سازی فریمورک که مورد مثبت و خوبی نیست و به نوعی در برنامه نویسی یک ضعف محسوب میشه (هرگونه Duplicate ضعف محسوب میشه - چه در طراحی دیتابیس که با مواردی مثل نرمالسازی باید جلوی اینکار رو گرفت و چه در کدنویسی). امیدوارم این حرفم رو تأیید کنید.

rezakho
جمعه 09 اسفند 1392, 13:46 عصر
من فقط این جمله رو میگم، چیزی کپی نشده، فقط به ارث برده شده، همین!

MMSHFE
جمعه 09 اسفند 1392, 13:51 عصر
لطفاً با کلمات بازی نکنید. صحبت سر رابط بیرونی ارتباط با کاربره. من میگم اگه همون کارها رو بدون Eloquent هم میشه با خود QB با همون ساختار انجام داد، دلیلی نداشته که توی Eloquent تکرار بشه وگرنه ارث بردن ساختار QB برای AR در Yii هم کاری نداشته که بخوان اضافه کنن.

tux-world
جمعه 09 اسفند 1392, 15:16 عصر
لطفاً با کلمات بازی نکنید. صحبت سر رابط بیرونی ارتباط با کاربره. من میگم اگه همون کارها رو بدون Eloquent هم میشه با خود QB با همون ساختار انجام داد، دلیلی نداشته که توی Eloquent تکرار بشه وگرنه ارث بردن ساختار QB برای AR در Yii هم کاری نداشته که بخوان اضافه کنن.
خوب خود شما هم گفتید که انگار همین کار هم در Yii انجام میشه نه؟ من اینطور احساس میکنم که البته جسارت نشه شما حرفهای rezakho رو درست متوجه نشدید.

rezakho
جمعه 09 اسفند 1392, 15:33 عصر
نمیدونم چرا مطلب پیچ میخوره بیخودی، ببینید، QB در لاراول سر جای خودش.
همیشه که در مدل ها شما با متدهای ساده find و all و ... سرو کار ندارید! خیلی وقت ها و خیلی وقت ها، پیش میاد که میخواید از مدل، با شرطهای مختلف و یا ترتیب مختلف و ...، داده ها رو واکشی کنید. خوب لاراول میگه میتونید بدون دردسر و یادگیری متد جدید یا پیچیدگی بی خودی، داده ها رو با همون متدهای QB در مدل، بکشید بیرون، همین!
حالا خواص خاص مدل بماند که به اونها هم میرسیم!

MMSHFE
جمعه 09 اسفند 1392, 18:09 عصر
خوب همین دیگه، مسئله اینه که اگه بخوایم با متدهای QB بکشیم بیرون، خوب از همون QB استفاده میکنیم دیگه چرا مدل Load بشه؟ خیلی تنوع بخوایم، مثل Yii یک متد findAllBySql یا findBySQL در اختیار کاربر میگذاریم که کارهای عجیب و غریبش رو انجام بده. مسئله اصلاً پیچیده نیست. نمیدونم چرا منظورم رو متوجه نمیشین.

MMSHFE
جمعه 09 اسفند 1392, 18:12 عصر
خوب خود شما هم گفتید که انگار همین کار هم در Yii انجام میشه نه؟
بله ولی در پشت پرده. یعنی اینکه کاربر توی مدل AR دوباره نمیاد مثل QB کدنویسی کنه و اگه بخواد اونجوری کار کنه میره سراغ همون QB و ارائه تمام قابلیتهای QB مجدداً در مدل رو اضافه میدونم و مثال بارزی از افزونگی. اینطوری عملاً QB بلااستفاده میشه و بهتر بود دیگه اون رو ارائه نکنن. ببینید، کاربر یا میخواد با ساختار ActiveRecord (یا Eloquent در لاراول) کار کنه یا کار پیچیده ای داره که نیاز به QueryBuilder داره. حالا اگه خود مدل هم دوباره از AR استفاده میکنه دیگه به ما ربطی نداره. مهم اینه که ما برای حذف یک پست بنویسیم:

Posts::model()->deleteByPk(1);
و اگه میخوایم کوئری بنویسیم، از همون اول بریم سراغ QueryBuilder

rezakho
جمعه 09 اسفند 1392, 18:23 عصر
جناب شهرکی، اجازه بدید مفاهیم Eloquent تمام بشه، خیلی از موارد حل میشه، لاراول برای مواردی که شما مد نظرتون هست مثل همین deleteByPk راه های بسیار کوتاه تری گذاشته

و اینکه میگید چرا دیگه Eloquent اومده، خوب خودتون جواب دادید، مثل یی، برای کوئری های پیچیده، جوین ها، union ها، select های تو در تو و ... از QB استفاده میکنیم و برای کار با سطرها بدون استفاده از sql، از Eloquent استفاده میکنیم
برای استفاده از رابطه های بین جداول در مدل از Eloquent استفاده میکنیم
این ها که همپوشانی نداره!

صبر کنید تا مثال ها رو بزنم

tux-world
جمعه 09 اسفند 1392, 18:23 عصر
قضیه اینه که شما آقای شهرکی و آقای rezakho دقیقا حرفهاتون یکی هستش و هر دو به یه موضوع دارید اشاره میکنید ولی به نتیجه نمیرسید.

rezakho
جمعه 09 اسفند 1392, 18:32 عصر
این مثال ها همون مشترک ها هست که قرار نبود گفته بشه، ولی به خاطر اینکه مفهوم بد جا نیافته، اینجا آورده شد

برای ایجاد سطر جدید



$user = new User;

$user->name = 'John';

$user->save();




برای ویرایش


$user = User::find(1);

$user->email = 'john@foo.com';

$user->save();


برای حذف



$user = User::find(1);

$user->delete();

// or
User::destroy(1);

rezakho
جمعه 09 اسفند 1392, 18:36 عصر
اگر میخواید من این جمله رو بگم که "عملاً یک ساختار اضافه است و کاری بیشتر از یک Alias انجام نداده"، باشه، قبول، تا اینجا من قبول میکنم که بحث تمام بشه
ولی صبر کنید تا موارد دیگه هم برسه

MMSHFE
جمعه 09 اسفند 1392, 19:04 عصر
برای ایجاد سطر جدید


$user = new User;
$user->name = 'John';
$user->save();


معادل Yii :


$user = new User;
$user->name = 'John';
$user->save();


برای ویرایش


$user = User::find(1);
$user->email = 'john@foo.com';
$user->save();

معادل Yii :


$user = User::model()->findByPk(1);
$user->email = 'john@foo.com';
$user->save();



برای حذف


$user = User::find(1);
$user->delete();
// or
User::destroy(1);
معادل Yii :


$User::model()->findByPk(1)->delete();
// or
User::model()->deleteByPk(1);

tux-world
جمعه 09 اسفند 1392, 19:10 عصر
در ByPk مربوط به Yii فرقی نمیکنه که کلید اصلی چی باشه درسته؟

MMSHFE
جمعه 09 اسفند 1392, 19:13 عصر
نه فرقی نداره. منظور همون فیلدی هست که Primary Key میگذارین که میتونه عددی یا رشته ای باشه. حتی اگه ترکیب همزمان چند فیلد رو Primary Key کرده باشین، میتونید اینطوری استفاده کنید:

$userTag = UserTags::model()->findByPk(array('user_id'=>5,'tag_id'=>25));

rezakho
جمعه 09 اسفند 1392, 19:27 عصر
در مورد push که گفتید نیاز به توضیح داره، این دستور مدل و تمام رکورد های رابطه ای مدل در جداول دیگه رو save میکنه

خوب
لاراول امکانی به نام soft deleting داره که اجازه میده رکوردها بعد از حذف، از جدول پاک نشند، بلکه تیکی بخورند به عنوان حذف شده ها یا اصطلاحا برن توی trash، که علاوه بر این، لاراول اجازه میده توی حذف شده جداگونه عملیاتی رو انجام بدیم و یا به رکودهای عادی بازیابی بشه و ...
در حالت عادی، رکوردهای حذف شده در نتیجه کوئری ها ظاهر نمیشند مگر با متد withTrashed مشخص کنیم که بشند
واکشی رکوردها همراه رکوردهای حذف شده (trashed)


$users = User::withTrashed()->where('account_id', 1)->get();


واکشی تمام پست های حذف شده کاربر (که البته از relationship استفاده شده که بعدا میرسیم)


$user->posts()->onlyTrashed()->get();


جستجو فقط در رکوردهای حذف شده


$users = User::onlyTrashed()->where('account_id', 1)->get();


بازیابی رکورد یا رکوردهای حذف شده


$user->restore();

User::withTrashed()->where('account_id', 1)->restore();




حذف فیزیکی رکوردهای موجود در trash


$user->forceDelete();


چک کردن پر یا خالی بودن trash


if ($user->trashed())
{
//
}

MMSHFE
جمعه 09 اسفند 1392, 19:30 عصر
تا جایی که از توضیحاتتون متوجه شدم این کار با کمک یک جدول واسطه که خود لاراول به دیتابیس اضافه میکنه انجام میشه درسته؟

rezakho
جمعه 09 اسفند 1392, 19:42 عصر
نه، یک فیلد timestamp که البته خودش اضافه میکنه

MMSHFE
جمعه 09 اسفند 1392, 23:38 عصر
خوب به این شکل Yii بطور توکار خودش نداره (تا جایی که بررسی کردم) ولی چند مورد Extension براش نوشته بودن که اونها رو که چک کردم، خوب پیاده سازی شده بودن. حتی یک نفر یک کلاس از ActiveRecord مشتق کرده بود و این قابلیت رو بهش اضافه کرده بود.

rezakho
شنبه 10 اسفند 1392, 16:56 عصر
خوب لاراول به صورت داخلی 2 تا فیلد به عنوان زمان ایجاد و تغییر رو برای تمام مدلها پشتیبانی میکنه، که البته میشه فرمت فیلدها رو هم برای هر مدل مشخص کرد


class User extends Eloquent {

protected function getDateFormat()
{
return 'U';
}

}

rezakho
شنبه 10 اسفند 1392, 17:02 عصر
در لاراول میشه به راحتی متدهای خوانا برای دستکاری شروط کوئری که خودش بهشون scope میگه اضافه کرد
مثلا برای انتخاب کاربران اقا یک scope و برای انتخاب کاربران خانم یک scope اضافه کرد و به راحتی استفاده کرد


// defination
class User extends Eloquent {

public function scopeMale($query)
{
return $query->where('gender', 'M');
}

public function scopeFemale($query)
{
return $query->where('gender', 'F');
}

}



// for use
$users = User::female()->orderBy('created_at')->get();

MMSHFE
شنبه 10 اسفند 1392, 17:17 عصر
معادل Yii :


class User extends CActiveRecord
{
...
public function scopes()
{
return array(
'male'=>array(
'condition'=>'gender=:gender',
'params'=>array(':gender'=>'M'),
),
'female'=>array(
'condition'=>'gender=:gender',
'params'=>array(':gender'=>'F'),
),
'orderCreate'=>array(
'order'=>'created_at',
),
);
}
...
}

// for use
$users = User::model()->male()->orderCreate()->findAll();

البته میشه Scope اضافه تر یعنی orderCreate رو هم تعریف نکرد و اینطوری ازش استفاده کنیم:

$users = User::model()->female()->findAll(array('order'=>'created_at'));

MMSHFE
شنبه 10 اسفند 1392, 17:21 عصر
ناگفته نمونه که در Yii میشه Scopeها رو بصورت متدهای مستقل هم تعریف کرد و حتی پارامتر ورودی بهشون داد. مثال:


public function recently($limit = 5)
{
$this->dbCriteria->mergeWith(array(
'order'=>'create_time DESC',
'limit'=>$limit,
));
return $this;
}

// for use
$posts = Post::model()->published()->recently(3)->findAll(); // last 3 published posts
$posts = Post::model()->published()->recently()->findAll(); // last 5 (default) published posts

MMSHFE
شنبه 10 اسفند 1392, 17:25 عصر
خوب لاراول به صورت داخلی 2 تا فیلد به عنوان زمان ایجاد و تغییر رو برای تمام مدلها پشتیبانی میکنه، که البته میشه فرمت فیلدها رو هم برای هر مدل مشخص کرد...
قابلیت خوبیه و قطعاً مفید بوده که توی Yii2 هم گفتن اضافه میشه ولی اون افزونه هایی که گفتم هم به شیوه جالبی کار میکردن (بجای تغییر تمام مدلها، یک جدول برای مدیریت این موارد ایجاد میکردن و تغییرات داخل اون اعمال میشد).

rezakho
شنبه 10 اسفند 1392, 21:06 عصر
در لاراول هم ارسال پارامتر به scope ها پشتیبانی شده


class User extends Eloquent {

public function scopeOfType($query, $type)
{
return $query->whereType($type);
}

}


// for user
$users = User::ofType('member')->get();

rezakho
شنبه 10 اسفند 1392, 21:11 عصر
خوب، بریم سراغ Relationship ها
در لاراول ارتباط های زیر پشتیبانی میشه

1- یک به یک
2- یک به چند
3- چند به چند
4- چند ریختی
5- چند به چند، چند ریختی


1- یک به یک


class User extends Eloquent {

public function phone()
{
return $this->hasOne('Phone');
}

}

// for user
$phone = User::find(1)->phone;

MMSHFE
یک شنبه 11 اسفند 1392, 13:16 عصر
1- معادل Yii :


class User Extends CActiveRecord
{
...
public function relations()
{
return array(
'phone'=>array(self::HAS_ONE, 'Phone', 'phone'),
);
}
...
}

// for use
$phone = User::model()->findByPk(1)->phone;

rezakho
یک شنبه 11 اسفند 1392, 14:19 عصر
2- یک به چند



class Post extends Eloquent {

public function comments()
{
return $this->hasMany('Comment');
}

}


که به صورت زیر دسترسی داریم


$comments = Post::find(1)->comments;

و حتی میشه در commencts دوباره کوئری زد و از QB استفاده کرد


$comments = Post::find(1)->comments()->where('title', '=', 'foo')->first();

MMSHFE
یک شنبه 11 اسفند 1392, 14:39 عصر
2- معادل Yii :


class Post Extends CActiveRecord
{
...
public function relations()
{
return array(
'comments'=>array(self::HAS_MANY, 'Comment', 'post_id'),
'fooComments'=>array(selef::HAS_MANY, 'Comment', 'post_id', 'where'=>'title=:title', 'params'=>array(':title'=>'foo')),
);
}
...
}

// for use
$comments = Post::model()->findByPk(1)->comments;
$comments = Post::model()->findByPk(1)->fooComments;

البته اینطوری هم میشه نوشت:


class Post Extends CActiveRecord
{
...
public function relations()
{
return array(
'comments'=>array(self::HAS_MANY, 'Comment', 'post_id'),
);
}
...
}

// for use
$comments = Post::model()->findByPk(1)->comments;
$comments = Post::model()->findByPk(1)->comments(array('condition'=>'title=:title','params'=>array(':title'=>'foo')));

حالا یک مثال جالب از Yii (میخوام ببینم لاراول برای معادلسازیش چطور عمل کرده). فرض کنید میخوایم تمام پستهایی رو پیدا کنیم که توی کامنتهاشون، عبارت PHP نوشته شده بوده:


class Post Extends CActiveRecord
{
...
public function relations()
{
return array(
'comments'=>array(self::HAS_MANY, 'Comment', 'post_id'),
);
}
...
}

// for use
$postsWithPHPComments = Post::model()->with('comments'=>array('contition'=>'LOWER(comment) LIKE :comment','params'=>array(':comment'=>'%php%')))->findAll();

MMSHFE
یک شنبه 11 اسفند 1392, 14:58 عصر
یک نکته: Yii در relations پارامترهای خیلی زیادی داره. برای مثال، یکی از این پارامترها together هست. اگه این پارامتر رو true بگذاریم، باعث میشه حتماً از Join استفاده بشه و تمام اطلاعات با یک کوئری از دیتابیس استخراج بشن ولی اگه false بگذاریم، خودش بطور خودکار دو کوئری جداگانه ارسال میکنه. برای مطالعه امکانات کامل Active Record Relations‌ در Yii توصیه میکنم این لینک (http://www.yiiframework.com/doc/guide/1.1/en/database.arr) رو حتماً ببینید. بعید میدونم Eloquent لاراول اینقدر منعطف و کامل باشه. برای اینکه کاربرد with رو هم متوجه بشین، اجازه بدین یکم توضیح بدم:
با کمک with به Yii میگیم که از حالت Lazy Loading به Eager Loading بره. در حالت معمول، ما برای اینکه مثلاً سه پست اخیر رو همراه با کامنتهاشون در بیاریم، اینطوری مینویسیم:


$posts = Post::model()->recently(3)->findAll();
foreach($posts as $post) {
...
foreach($post->comments as $comment) {
...
}
}

در این حالت، اول با یک کوئری سه پست اخیر استخراج میشن و داخل حلقه اول، برای هر پست، وقتی post->comments$ رو صدا میزنیم، یک کوئری دیگه زده میشه و کامنتها دوباره استخراج میشه. اما اگه بگیم:


$posts = Post::model()->recently(3)->with('comments')->findAll();
foreach($posts as $post) {
...
foreach($post->comments as $comment) {
...
}
}

همون اول، با یک Join سه پست اخیر همراه با Commentهاشون از دیتابیس استخراج میشه.

MMSHFE
یک شنبه 11 اسفند 1392, 15:06 عصر
حتی میشه عبارتهای Aggregate مثل count و min و max و... رو هم در Relationها بعنوان ارتباط تعریف کرد. مثال:


class Post extends CActiveRecord
{
public function relations()
{
return array(
'comments'=>array(self::HAS_MANY, 'Comment', 'post_id'),
'commentCount'=>array(self::STAT, 'Comment', 'post_id'),
);
}
}
// for use
echo Post::model()->findByPk(1)->commentCount;

MMSHFE
یک شنبه 11 اسفند 1392, 15:16 عصر
یه مثال دیگه: فرض کنید میخوایم تمام پستهای کاربر جاری رو همراه با تمام کامنتهاش، از دیتابیس بکشیم بیرون. به Relation زیر دقت کنید:


class Comment extends CActiveRecord
{
public function scopes()
{
return array(
'approved'=>array('condition'=>'confirmed=1'),
);
}
}
class Post extends CActiveRecord
{
public function relations()
{
return array(
'comments'=>array(self::HAS_MANY, 'Comment', 'post_id'),
);
}
}
class User extends CActiveRecord
{
public function relations()
{
return array(
'posts'=>array(self::HAS_MANY, 'Post', 'author_id',
'with'=>array('comments'=>array('scopes'=>'approved')),
),
);
}
}
$currentUserPosts = User::model()->with('posts')->findByPk(Yii::app()->user->id);
// or
$user = User::model()->findByPk(Yii::app()->user->id);
$posts = $user->posts;

در هر دو حالت بخاطر وجود with در relation خاصمون به اسم posts، حالت Eager Loading استفاده میشه و همه اطلاعات با یک Join استخراج میشه.

rezakho
یک شنبه 11 اسفند 1392, 15:24 عصر
در مورد معادل این کوئری زیر
در یی


$postsWithPHPComments = Post::model()->with('comments'=>array('contition'=>'LOWER(commen t) LIKE :comment','params'=>array(':comment'=>'%php%')))->findAll();



در لاراول


$postsWithPHPComments = Post::whereHas('comments', function($query)
{
$query->where('LOWER(commen t)', 'LIKE', '%php%');

})->get();

MMSHFE
یک شنبه 11 اسفند 1392, 15:34 عصر
البته میشد کد Yii رو هم اینطوری بنویسیم که طولانی تر از کد لاراول بنظر نیاد:


$postsWithPHPComments = Post::model()->with('comments'=>array(
'contition'=>'LOWER(comment) LIKE :comment',
'params'=>array(':comment'=>'%php%')
))->findAll();

MMSHFE
یک شنبه 11 اسفند 1392, 15:35 عصر
حالا نگفتین میشه توی لاراول کاری کرد که Join نزنه و با کوئریهای جداگانه اطلاعات رو استخراج کنه (و در عین حال با همون روش Eager Loading کار کنه یعنی پست و کامنتهاش با هم همزمان استخراج بشن) ؟

rezakho
یک شنبه 11 اسفند 1392, 16:37 عصر
حالا نگفتین میشه توی لاراول کاری کرد که Join نزنه و با کوئریهای جداگانه اطلاعات رو استخراج کنه (و در عین حال با همون روش Eager Loading کار کنه یعنی پست و کامنتهاش با هم همزمان استخراج بشن) ؟

ماشاالله اینقدر پست زدید من تازه تونستم بخونمشون، بله، لاراول هم Eager Loading , Lazy Loading رو به همون روش یی ساپورت میکنه
که البته قرار بود توی پست های آینده بگم که الان میگم

مجبور کردن مدل به بارگذاری author به صورت Eager


foreach (Book::with('author')->get() as $book)
{
echo $book->author->name;
}

لود چند رابطه به صورت eager


$books = Book::with('author', 'publisher')->get();

و حتی لود رابطهای تو در تو به صورت eager


$books = Book::with('author.contacts')->get();

MMSHFE
یک شنبه 11 اسفند 1392, 16:44 عصر
خیلی لذتبخشه که آدم میبینه اکثر فریمورکهای روز، قابلیتهای مفید و ضروری رو در خودشون قرار دادن. برای مثال بارگذاری چند رابطه همزمان و رابطه های تودرتو و ترکیب رابطه و Scope و... توی Yii هم پشتیبانی میشه که به دلیل طولانی نشدن تاپیک، اگه موافق باشین، دیگه تکرارش نکنم. فقط اگه ممکنه این بحث عدم استفاده از Join رو هم مشخص کنید چون بعضی جاها که جداول سنگین میشن و فیلدها و رکوردها زیاد میشه، Join واقعاً سربار ایجاد میکنه و اگه بشه از فریمورک خواست که بدون Join اطلاعات رو استخراج کنه، قابلیت سودمندی خواهد بود.

rezakho
یک شنبه 11 اسفند 1392, 16:52 عصر
این مطلب آخر رو درست متوجه نشدم، ولی اگر منظورتون استفاده از select های تو در تو و یا where in به جای join هست، باید بگم بله، لاراول این روش ها رو هم پشتیبانی میکنه

MMSHFE
یک شنبه 11 اسفند 1392, 17:05 عصر
نه ببینید:


public function relations() {
return array(
'posts'=>array(self::HAS_MANY, 'Post', 'user_id', 'together'=>false),
);
}

الآن بخاطر وجود together با مقدار false، حتی اگه بگیم:


$user = User::model()->with('posts')->findByPk(1);
echo $user->name;
foreach($user->posts as $post) {
...
}

با وجودی که حالت Eager Loading حفظ شده و کاربر و پستهاش همه همزمان استخراج میشن، ولی Yii از دو کوئری جداگانه برای استخراج اطلاعات استفاده میکنه و Join نمیزنه. البته این مسئله با حالت زیر کاملاً فرق داره:


$user = User::model()->findByPk(1);
foreach($user->posts as $post) {
...
}

چون در حالت اول، همون لحظه ای که متغیر user$ ساخته شده، پستهاش هم استخراج شدن و توی متغیر user->posts$ قرار گرفتن (توی RAM) یعنی حالت Eager Loading
ولی در حالت دوم، موقعی که حلقه foreach رو صدا میزنیم، تازه همون موقع یک کوئری دیگه اجرا میشه و پستها استخراج میشن یعنی حالت Lazy Loading

rezakho
یک شنبه 11 اسفند 1392, 17:53 عصر
منظور بنده هم همین بود، لاراول به صورت پیشفرض برای eager loading ها، از join استفاده نمیکنه و به جاش از where in استفاده میکنه و فقط از 2 تا کوئری ساده برای واکشی رابطه ها و مدل استفاده میکنه

MMSHFE
یک شنبه 11 اسفند 1392, 17:54 عصر
خوب اگه بخوایم مجبورش کنیم از Join استفاده کنه چه تغییری باید ایجاد کنیم؟ ضمن اینکه where in یه جاهایی کار نمیکنه. مثلاً من میخوام همه کاربران رو همراه با همه پستهاشون Load کنم. این کوئری که where in نداره.

rezakho
یک شنبه 11 اسفند 1392, 18:18 عصر
لاراول از چند روش در ارتباط ها استفاده میکنه، مثلا از where in و یا select های تو در تو برای بالابردن کارایی، خودش به صورت داخلی اینکار رو بر اساس نوع ارتباط و واکشی، انجام میده



ضمن اینکه where in یه جاهایی کار نمیکنه. مثلاً من میخوام همه کاربران رو همراه با همه پستهاشون Load کنم. این کوئری که where in نداره.

چرا میشه، لاراول اینجوری ارتباط یک به چند رو کوئری میگیره


select * from `user`
select * from `post` where `post`.`userId` in (1, 2, 3, 4, ...)

MMSHFE
یک شنبه 11 اسفند 1392, 18:40 عصر
نه دیگه نشد! ببینید، الآن این دو تا کوئری جواب user->posts$ رو نمیدن. دقت کنید که وقتی توی Yii میگیم:


public function relations() {
return array(
'posts'=>array(self::HAS_MANY, 'Post', 'user_id', 'together'=>false),
);
}

و بعد میگیم:

$user = User::model()->with('posts')->findAll();
اول این کوئری اجرا میشه:
SELECT * FROM `users`
و بعد برای هر رکورد، این کوئری رو اجرا میکنه:
SELECT * FROM `posts` WHERE (`user_id`='{$user->id}')
و این رو بطور خودکار توی فیلد posts شئ user مربوطه قرار میده. این الآن دو تا Select هست که به ازای هر User داره Select دوم انجام میشه. Performance این روش با Select تو در تو از زمین تا آسمون فرق میکنه و اصلاً این روش، Select تو در تو نیست. ضمناً با where in هم نمیشه اون رو پیاده سازی کرد چون where in میاد پستهای همه کاربران رو یکجا استخراج میکنه و تفکیک شده نیست و باز باید جداشون کنیم و پستهای هر کاربر رو توی Object خودش بگذاریم.

rezakho
یک شنبه 11 اسفند 1392, 21:15 عصر
من الان دارم تست میگیرم این نتیجه رو میده، شاید اشکال از ارتباط بین جداولم باشه، ولی دیدم که از جوین هم استفاده میکنه
باید بیشتر کدهاش رو بررسی کنم

rezakho
یک شنبه 11 اسفند 1392, 22:01 عصر
با بررسی هایی که کردم، لاراول از join ها در ارتباط یک به چند استفاده نمیکنه
و با 2 کوئری، همونطور که در بالا گفتم، کار رو انجام میده، که البته ارزش تست رو داره که معلوم بشه در رکوردهای بالا و تعداد فیلدهای زیاد، کدوم کارایی بیشتری دارند
join ها یا واکشی کلی و جداسازی در سمت php ؟!

MMSHFE
یک شنبه 11 اسفند 1392, 22:39 عصر
خوب البته برخی جاها واقعاً هیچ راهکاری مناسبتر و ساده تر از Join نیست. برای مثال، فرض کنید توی صفحه مربوط به پست، بخواین کاربرانی که برای اون پست کامنت گذاشتن رو استخراج کنید. توی Yii این مسئله رو میشه اینطوری انجام داد:

$users = Users::model()->with('comments', array('condition'=>'post_id=:postId','params'=>array(':postId'=>$this->id)))->findAll();
منظورم بحث ادغام سه جدوله. مطمئناً لاراول هم راه حل خاص خودش رو برای این موضوع داره و این مسئله، محور صحبتم نیست. میخوام بگم کلاً این قابلیت together که Yii اضافه کرده که به انتخاب خودمون بگیم کجا Join بزنه و کجا از Join استفاده نکنه، قابلیت خوبیه.

tux-world
دوشنبه 12 اسفند 1392, 13:00 عصر
به نظرم آقای rezakho منظورشون این بود که تو هسته لاراول هستش که به صورت پیش فرض از Join استفاده نمیکنه مگر اینکه مثل ایی مجبور به استفادش کنیم. در کل هر دو فریم ورک این قابلیت رو دارن و تفاوتی هم نداره

MMSHFE
دوشنبه 12 اسفند 1392, 13:14 عصر
همین دیگه میخوام ببینم این قابلیت رو داره که مجبورش کنیم Join بزنه؟ چون توی مستنداتش ندیدم (شایدم باشه و من نتونستم پیدا کنم).

tux-world
دوشنبه 12 اسفند 1392, 22:51 عصر
اینطور که من جستجو کردم و مطلع شدم اینه که لاراول از جوین استفاده نمیکنه. دلیلش رو متاسفانه پیدا نکردم.برای همین فکر میکنم راه دیگه ای رو برای استفاده نکردن انتخاب کرده که متاسفانه این مورد رو هم نتونستم بفهمم

rezakho
سه شنبه 13 اسفند 1392, 18:05 عصر
سلام
ببخشید وقت نبود
لاراول کلا از جوین در رابطه ها استفاده نمیکنه، دلیلش رو نمیدونم، و نمیتونه هم استفاده کنه به صورت خودکار، مگر خودمون جوین بزنیم در صورت نیاز با QB

rezakho
سه شنبه 13 اسفند 1392, 20:16 عصر
3- ارتباط چند به چند
که از جدول واسط با نام مثلا user_roles با فیلدهای user_id و role_id استفاده شده


class User extends Eloquent {

public function roles()
{
return $this->belongsToMany('Role', 'user_roles', 'user_id', 'foo_id');
}

}



class Role extends Eloquent {

public function users()
{
return $this->belongsToMany('User', 'user_roles', 'foo_id', 'user_id');
}

}

MMSHFE
چهارشنبه 14 اسفند 1392, 08:02 صبح
معادل Yii :


class User extends Eloquent {
public function relations() {
return array(
'roles'=>array(self::MANY_MANY, 'Role', 'user_roles(user_id,role_id)'),
);
}
}

class Role extends Eloquent {
public function relations() {
return array(
'users'=>array(self::MANY_MANY, 'User', 'user_roles(role_id,user_id)'),
);
}
}

MMSHFE
چهارشنبه 14 اسفند 1392, 08:03 صبح
سلام
ببخشید وقت نبود
لاراول کلا از جوین در رابطه ها استفاده نمیکنه، دلیلش رو نمیدونم، و نمیتونه هم استفاده کنه به صورت خودکار، مگر خودمون جوین بزنیم در صورت نیاز با QB
خوب پس این مورد رو میتونیم بعنوان یک امتیاز منفی محسوب کنیم یا حداقل بعنوان یک ویژگی که Yii داره و Laravel نداره.

tux-world
چهارشنبه 14 اسفند 1392, 17:18 عصر
برای Yii انگار فرمودید که به صورت داخلی تو هسته نیستش با اکستندهایی که انجام شده تونستن از این قابلیت استفاده کنن و در نسخه جدید هم قرار شده این قابلیت رو نهایی کنن. ولی خوب QB برای یه سری کارهای پیچیده و یا مواردی که به راحتی نمیشه از الکوئنت و یا اکتیو رکورد استفاده کرد کاربرد داره

engmmrj
چهارشنبه 14 اسفند 1392, 17:23 عصر
در یکی از سایت ها نوشته بود Laravel دارای code generator نیست ، درسته ؟

tux-world
چهارشنبه 14 اسفند 1392, 17:54 عصر
نه درست نیست. هستش.لاراول مثل Yii خودش ابزاری شبیه gii داره به اسم artisan که خودش شبیه gii در لاراول هستش که به صورت gui م قابل استفاده هستش و توسط بعضی از کاربراش توسعه داده شده و کاملترش کرده و به صورت باندل قابل استفاده هستش این لینک (https://github.com/JeffreyWay/Laravel-4-Generators)رو مطالعه کنید

rezakho
چهارشنبه 14 اسفند 1392, 21:48 عصر
سلام
ببخشید از تاخیرم

در مورد جوین ها در eloquent، نه که نداشته باشه، قبلا هم گفتم بحث اینه که به صورت پیشفرض برای ارتباط ها از جوین استفاده نمیکنه، من کدهای هسته اش رو بررسی کردم و تنظیمی برای مشخص کردن استفاده از جوین بجای where in نداره متاسفانه!
به مدیر تیم توسعه اش ایمیل دادم، ببینم چی جواب میده، دلیلش رو هم واقعا نمیتونم جوابی براش پیدا کنم، ولی به هر حال به این شکل میشه پیادش کرد



public function posts()
{
return $this->join('posts', 'users.id', '=', 'posts.user_id')
->select('posts.*')
->get();
;
}

metal gear solid 4
پنج شنبه 15 اسفند 1392, 09:49 صبح
ببینید، من اینقدر دیگه سن و تجربه دارم که نخوام احساساتی صحبت کنم. اینکه Yii دو ساله نسخه جدید نداده بخاطر این بوده که واقعاً نسخه قبلی جوابگو بوده و نیاز نبوده کلی مشکلات رو که ناشی از ناشی بودن طراحانش بوده، مرتب با نسخه های جدید، بپوشونه. کاری به این موضوع نداریم چون لاراول اگه خوب نوشته میشد از اول، توی هر نسخه از پایه تغییر نمیکرد و تغییراتش Minor میشد نه Major

به نقل از Yiiframework.com

The latest release of Yii 2 is 2.0.0 alpha.


Yii 2.0 is a complete rewrite of Yii on top of PHP 5.4.0. It is aimed to become a state-of-the-art of the new generation of PHP framework. Yii 2.0 is not compatible with 1.1.
Yii 2.0 is not ready for production use yet. It is currently under heavy development and we may introduce significant changes without prior notices. You may consider using Yii 2.0 if you just start to learn Yii or you do not have a tight project schedule.

این که نوشتند Yii داره با قابلیت های PHP 5.4 ساخته میشه رو زیاد جدی نگیرید. من چند ماه قبل نگاه میکردم PHP 5.3 بود. این یعنی با به روز شدن PHP این قسمت از متن هم به روز میشه! ( البته مطمعناً از قابلیت های نسخه های جدید PHP استفاده میکنن ... )
تغییرات Major هم یعنی این. مثل خیلی از فریمورک های دیگه.



راجع به JOIN زدن هم توجیه نمیکنم کار لاراول رو. ولی حداقل من خوشحالم که از JOIN استفاده نمیکنه. البته این که انتخاب داشته باشیم از JOIN استفاده کنیم یا خیر گزینه ی خوبیه اما حالا که استفاده نمیکنه پیش فرض بهتری از استفاده کردنشه. وقتی جداول سنگین بشن باید از روشهای غیر JOIN استفاده کرد.

tux-world
پنج شنبه 15 اسفند 1392, 11:28 صبح
البته این که انتخاب داشته باشیم از JOIN استفاده کنیم یا خیر گزینه ی خوبیه اما حالا که استفاده نمیکنه پیش فرض بهتری از استفاده کردنشه. وقتی جداول سنگین بشن باید از روشهای غیر JOIN استفاده کرد.
شما از چه راههای برای عدم استفاده از join استفاده میکنید؟ ممنون میشم کدی رو که استفاده میکنید بگید

metal gear solid 4
پنج شنبه 15 اسفند 1392, 11:48 صبح
شما از چه راههای برای عدم استفاده از join استفاده میکنید؟ ممنون میشم کدی رو که استفاده میکنید بگید
من توی دو پروژه ی اخیرم به دلیل تعداد درخواست های بسیار بالا به سرور و سنگین بودن جداول کلاً JOIN زدن رو بیخیال شدم. ( با استفاده از JOIN هم بنچمارک گرفتم. نتایج افتضاح بود ) بنا به نیاز حتی Normalization رو هم فدای Performance کردیم. در این مورد میشه از SELECT های تو در تو استفاده کرد اما خب من به دلیل نوع پروژه هام از روش های کاملاً نامرتبطی به بحث این تاپیک استفاده میکنم. از بانک های اطلاعاتی رابطه ای در کنار غیر رابطه ای استفاده میکنم. MySQL در کنار mongoDB و Redis

MMSHFE
پنج شنبه 15 اسفند 1392, 15:53 عصر
تغییرات Major هم یعنی این. مثل خیلی از فریمورک های دیگه.
درسته من نگفتم Yii تغییرات ماژور نداره و نسخه 2 کاملاً بازنویسی هسته Yii هست ولی بهرحال بعد از 6 سال این بازنویسی انجام شده و بخاطر این نبوده که نسخه قبلی کارآمد نبوده بلکه یکسری تغییرات در هسته اتفاق افتاده و خیلی چیزها رو ارتقا دادن و یکسری موارد هم بهش بطور کاملاً جدید اضافه شده (مثل پشتیبانی از دیتابیسهای جدید و ساختار مبتنی بر namespace که در پروژه های جدید مطرح شده). بهرحال موضوع صحبت این تاپیک، اینجور مسائل نیست و بهتره به همون روال قبل برگردیم و تفاوتهای فریمورکها رو مطرح کنیم تا دوباره کار به بحث و سوء تفاهم و کدورت و... کشیده نشه.

راجع به JOIN زدن هم توجیه نمیکنم کار لاراول رو. ولی حداقل من خوشحالم که از JOIN استفاده نمیکنه. البته این که انتخاب داشته باشیم از JOIN استفاده کنیم یا خیر گزینه ی خوبیه اما حالا که استفاده نمیکنه پیش فرض بهتری از استفاده کردنشه. وقتی جداول سنگین بشن باید از روشهای غیر JOIN استفاده کرد.
اتفاقاً اگه اصول نرمالسازی رعایت شده باشه و از شکل مناسب JOIN هم برحسب نیاز استفاده بشه (مثل LEFT OUTER JOIN و RIGHT JOIN و INNER JOIN و NATURAL JOIN و...) سربار آنچنانی روی نتیجه کلی ایجاد نمیکنه و درعوض ما رو از نوشتن چندین کوئری برای رسیدن به نتیجه ای که میشه با یک کوئری بدست آورد، بی نیاز میکنه. این مسئله حتی در دیتابیسهای سنگین و جداول با چندین میلیون رکورد هم صدق میکنه.

MMSHFE
پنج شنبه 15 اسفند 1392, 15:55 عصر
سلام
ببخشید از تاخیرم
در مورد جوین ها در eloquent، نه که نداشته باشه، قبلا هم گفتم بحث اینه که به صورت پیشفرض برای ارتباط ها از جوین استفاده نمیکنه، من کدهای هسته اش رو بررسی کردم و تنظیمی برای مشخص کردن استفاده از جوین بجای where in نداره متاسفانه!
به مدیر تیم توسعه اش ایمیل دادم، ببینم چی جواب میده، دلیلش رو هم واقعا نمیتونم جوابی براش پیدا کنم، ولی به هر حال به این شکل میشه پیادش کرد...
روشی که اشاره کردین، عملاً همون استفاده از QueryBuilder هست که گفتیم موضوع بحث ما نیست چون برای مثال، توی Yii هم با CDbCommand (همون QueryBuilder در Yii) میشه اعمالی مثل Lock و... رو انجام داد. بهرحال فکر میکنم بهتره این مورد رو به نفع Yii تمام کنیم و بریم سراغ بقیه موارد.

MMSHFE
پنج شنبه 15 اسفند 1392, 21:35 عصر
برای Yii انگار فرمودید که به صورت داخلی تو هسته نیستش با اکستندهایی که انجام شده تونستن از این قابلیت استفاده کنن و در نسخه جدید هم قرار شده این قابلیت رو نهایی کنن. ولی خوب QB برای یه سری کارهای پیچیده و یا مواردی که به راحتی نمیشه از الکوئنت و یا اکتیو رکورد استفاده کرد کاربرد داره
خیر پشتیبانی از Join در Yii بصورت داخلی هست. اون مورد که گفتم، بحث Lock و Soft Delete بود که گفتم توی نسخه جدید قراره اضافه بشه و فعلاً میشه از Extensionهایی که برای این مقاصد طراحی شده، استفاده کرد.

tux-world
پنج شنبه 15 اسفند 1392, 22:05 عصر
منم منظورم همون lock بود

MMSHFE
پنج شنبه 15 اسفند 1392, 23:36 عصر
بله Lock رو در نسخه فعلی، حداقل تا جایی که من بررسی کردم به راحتی لاراول نداره و باید از همون QueryBuilder استفاده کنیم.

rezakho
جمعه 16 اسفند 1392, 19:18 عصر
خوب در ارتباط چند به چند، لاراول میتونه ارتباطی میانی بین چداول تعریف کنه که از جدول اول به سوم برسیم
برای مثال اگر سه جدول با ساختار زیر داشته باشیم


countries
id - integer
name - string

users
id - integer
country_id - integer
name - string

posts
id - integer
user_id - integer
title - string

میشه به این صورت ارتباطی بین جدول countries و posts ایجاد کرد


class Country extends Eloquent {
public function posts()
{
return $this->hasManyThrough('Post', 'User', 'country_id', 'user_id');
}
}

و در نهایت اینطور ازش استفاده کرد


$posts = Country::find(1)->posts;

MMSHFE
جمعه 16 اسفند 1392, 20:33 عصر
معادل Yii :


class Country extends CActiveRecord {
public function relation(){
return array(
'users' => array(self::HAS_MANY, 'User', 'country_id'),
'posts' => array(self::HAS_MANY, 'Post', 'post_id', 'through'=>'users'),
);
}
}

$posts = Country::model()->findByPk(1)->posts;

rezakho
جمعه 16 اسفند 1392, 21:44 عصر
لاراول از ارتباط های چند ریختی! هم پشتیبانی میکنه
مثلا میشه 2 جدول رو به یک جدول ارتباط یک به چند زد
مثلا سه جدول به صورت زیر داریم


staff
id - integer
name - string

orders
id - integer
price - integer

photos
id - integer
path - string
imageable_id - integer
imageable_type - string

به صورت زیر روابط رو تعزیف میکنیم


class Photo extends Eloquent {

public function imageable()
{
return $this->morphTo();
}

}

class Staff extends Eloquent {

public function photos()
{
return $this->morphMany('Photo', 'imageable');
}

}

class Order extends Eloquent {

public function photos()
{
return $this->morphMany('Photo', 'imageable');
}

}

و به صورت زیر استفاده کنیم،
برای گرفتم تصاویر که مثل ارتباط یک به چنده
ولی برای گرفتن صاحب یک تصویر، خروجی یکی از مدل های User یا Staff خواهد بود


// fetching photos
$photos = Staff::find(1)->photos;


// $owner is a User or Staff model
$owner = Photo::find(1)->imageable;

tux-world
جمعه 16 اسفند 1392, 23:09 عصر
معادل Yii :


'posts' => array(self::HAS_MANY, 'Post', 'post_id', 'through'=>'users'),


منظور از این خط چیه؟ و همینطور through

MMSHFE
جمعه 16 اسفند 1392, 23:29 عصر
منظور از این خط چیه؟ و همینطور through
یعنی اینکه جدول Country با جدول Post ارتباط یک به چند داره ازطریق ارتباط users که در خط قبلی تعریف کردیم (through یعنی ازطریق). اینطوری وقتی مینویسیم:

$posts = Country::model()->findByPk(1)->posts;
مثل اینه که همه کاربران یک کشور خاص رو پیدا کنیم و بعد با حلقه foreach چنین دستوراتی رو بنویسیم:


$users = Country::model()->findByPk(1)->users;
$posts = array();
foreach($users as $user) {
array_push($posts, $user->posts);
}
$posts = array_unique($posts);

برای درک بهتر، این لینک (http://www.yiiframework.com/doc/guide/1.1/en/database.arr#relational-query-with-through) رو ببینید.

MMSHFE
شنبه 17 اسفند 1392, 00:09 صبح
لاراول از ارتباط های چند ریختی!...
طبق این لینک (http://www.slideshare.net/billkarwin/practical-object-oriented-models-in-sql) ارتباط چندریختی توی دیتابیس یک ارتباط مناسب نیست و توصیه نمیشه و به همین دلیل هم در Yii قرار داده نشده. بنا به دلایل زیر:
نمیتونید قید بزنید:

CREATE TABLE Comments (
comment_id SERIAL PRIMARY KEY,
comment TEXT NOT NULL,
issue_type VARCHAR(15) NOT NULL CHECK (issue_type IN (`Bugs`, `Features`)),
issue_id INT NOT NULL,
FOREIGN KEY issue_id REFERENCES ???
);

درنتیجه مجبورین جدول رو بدون کلید خارجی و Relation واقعی بسازین:

CREATE TABLE Comments (
comment_id SERIAL PRIMARY KEY,
comment TEXT NOT NULL,
issue_type VARCHAR(15) NOT NULL CHECK (issue_type IN (`Bugs`, `Features`)),
issue_id INT NOT NULL,
);

بنابراین نمیتونید از Join استفاده کنید:

SELECT * FROM Comments
JOIN ???
USING (issue_id);

یا اینکه همزمان روی هر دو جدول Join بزنید:

SELECT * FROM Comments c
LEFT JOIN Bugs b ON (c.issue_type = 'Bugs' AND c.issue_id = b.issue_id)
LEFT JOIN Features f ON (c.issue_type = 'Features' AND c.issue_id = f.issue_id);

تازه همه این توضیحات و دردسرها فقط توی SELECT هست و تصور کنید چه بلایی سر برنامه شما موقع UPDATE و DELETE و... و اصلاح ارتباطها میاد چون قید وجود نداره و باید همه چیز دستی با کوئریهای جداگانه انجام بشه.
البته یکسری راههای جایگزین هم هست:
کمانهای انحصاری (وجود دو فیلد bug_id و feature_id در مثال فوق به نحوی که در هر لحظه فقط یکیشون برای هر رکورد مقدار داشته باشه که فقط باعث میشه Joinها ساده تر بشه ولی باز هم باید هر دو Join انجام بشه
معکوس کردن Relation (از Bugs یا Features ارتباط HAS_MANY به Comments بزنیم و یا از جدولهای واسط استفاده کنیم)
استفاده از جدول والد مشترک

توضیح تخصصی این مقوله خارج از موضوع این تاپیکه و شدیداً مطالعه لینکی که گذاشتم رو توصیه میکنم (ساختار دستورات SQL بصورت استاندارد هست نه MySQL)

بهرحال این قابلیت که Yii ازش استفاده نکرده، فوق العاده Performance رو پایین میاره و حالا که لاراول اون رو داره، هرچند امتیاز منفی براش میدونم ولی بهرحال ابداً توصیه نمیکنم ازش توی پروژه ها استفاده کنید. امیدوارم این موضوع دوباره حاشیه ساز نشه و حرف و حدیث از توش در نیاد که اومد قضاوت کرد و یه چیزی گفتیم و Yii نداشت و خواست توجیه کنه و از اینجور حرفها. برای راندمان پروژه های خودتون میگم وگرنه باز هم تأکید میکنم Yii این قابلیت رو نداره و با هر متخصص دیتابیس هم که مشورت کنید، تأیید میکنه که نداشتن چنین قابلیتی و استفاده نکردن از چنین ارتباطهایی به نفع کارآیی برنامه شماست.

tux-world
شنبه 17 اسفند 1392, 09:08 صبح
به لحاظ چند ریختی بودن. برای یکی از پروژه های که داشتم مجبور به استفاده بودم. نیازی به پرفورمنس و چیزهای دیگه نداشتم ولی موضوعی که برام اهمیت داشت ارتباط یک داده با چند تا بود. مثل همونی که آقای rezakho گفتن و یه عکس رو مثال زدن

tux-world
شنبه 17 اسفند 1392, 22:15 عصر
یه سوال به ذهنم رسید.
اگه ما نخاییم از چند ریختی استفاده کنیم. چطور میتونیم مثل سایتهایی همانند گوگل و یا فیسبوک که چندین کاربر میتونن یک مطلب رو به اشتراک بزارن رو بفهمیم؟ راهی به غیر از این مدل استفاده میکنن؟

MMSHFE
شنبه 17 اسفند 1392, 22:56 عصر
این مسئله کاملاً بی ارتباط با چند ریختیه. اونجا فرضاً جدولی به نام users هست و جدولی به نام posts و جدول دیگری هم هست به نام shares با این ساختارهای فرضی:


Users
id
name
Posts
id
title
body
user_id
Shares
user_id
post_id

حالا با ارتباط بین Posts و Users میشه فرضاً فهمید هر پست در اصل توسط چه کسی ایجاد شده و هر کسی هم که یک مطلب رو Share میکنه، یک رکورد توی جدول Shares براش درج میشه. درواقع جدول Posts و Users ازطریق جدول Shares ارتباط چند به چند دارن (هم یک کاربر میتونه چند Post داشته باشه و هم یک پست میتونه توسط چند User به اشتراک گذاشته بشه). همونطور که گفتم، این مسئله کاملاً با چندریختی تفاوت داره چون توی چندریختی درواقع یک فیلد، کلید اتصال به بیش از یک جدول دیگه میشه و برای اینکار هم از یک فیلد واسطه کمکی استفاده میکنیم که مشخص میکنه فیلد کلید (که در واقعیت کلید نیست و ما خودمون بهش میگیم کلید)، به کدوم جدول داره اشاره میکنه و فرضاً اگه توی فیلد کلید مقدار 5 بود، این 5 یعنی رکورد پنجم از کدوم جدول. توصیه میکنم لینکی که گذاشته بودم درمورد چندریختی رو حتماً یکبار دیگه به دقت مطالعه کنید.

rezakho
دوشنبه 19 اسفند 1392, 23:22 عصر
ببخشید
خیلی وقتم کمه، به همین خاطر کم میرسم بیام
خوب، از ارتباط چند به چند چند ریختی هم میگذرم، عطاش رو به لقاش بخشیدیم !

در لاراول روش هایی برای درج های مدل رابطه ای گذاشته شده که کار رو خیلی آسون کرده

الصاق یک کامنت به یک پست (چند به یک)


$comment = new Comment(array('message' => 'A new comment.'));
$comment = Post::find(1)->comments()->save($comment);



درج کاربر در یک گروه کاربری خاص (یک به چند)


$account = Account::find(10);
$user->account()->associate($account);
$user->save();



انتصاب و گرفتن یک یا چند رول به یک کاربر (چند به چند)


$user->roles()->attach(1);
$user->roles()->detach(1);

// attach multi role
$user->roles()->sync(array(1, 2, 3));

MMSHFE
سه شنبه 20 اسفند 1392, 01:53 صبح
این مورد رو تا جایی که چک کردم پیدا نکردم. حدس میزنم خوب جستجو نکرده باشم چون قابلیت لازم و ضروری هست و قاعدتاً باید داشته باشه ولی راستش موندم چی جستجو کنم ولی بهرحال تا اینجا متوجه شدم توی هسته چیزی نبود و توی نسخه 2 اضافه شده و برای نسخه 1.1.14 چندتا افزونه خیلی خوب و کارآمد براش پیدا کردم که برای کسانی که از Yii استفاده میکنن، لینکشونو میگذارم:
- esaverelatedbehavior (http://www.yiiframework.com/extension/esaverelatedbehavior/)
- xrelationbehavior (http://www.yiiframework.com/extension/xrelationbehavior/)
- eadvancedarbehavior (http://www.yiiframework.com/extension/eadvancedarbehavior/)
- esaverelatedbehavior (http://www.yiiframework.com/extension/esaverelatedbehavior/)
- save-relations-ar-behavior (http://www.yiiframework.com/extension/save-relations-ar-behavior/)

rezakho
سه شنبه 20 اسفند 1392, 11:26 صبح
خوب، لاراول خروجی های کوئری و eloquent رو به صورت collection بر میگردونه که میتونه به صورت زیر مورد استفاده قرار بگیره

چک کردن وجود کلید خاص در مجموعه


//checking if users contains 2 key
$users = User::where('type', '=', 'admin')-.get();

if ($users->contains(2))
{
//
}


تبدیل به آرایه و json


//convert to array or json
User::find(1)->toArray();
User::find(1)->toJson();

//convert to json automatical
echo User::find(1);


پیمایش مجموعه


//iterating collections
$users = $users->each(function($user)
{
//
});


فیلتر عناصر مجموعه


//filtering collections
$users = $users->filter(function($user)
{
return $user->isAdmin();
});


الصاق یک callback به هر یک از اعضای مجموعه (برای این callback هم اگر هست معادل فارسی خوبی پیشنهاد بدید)


//applying a callback to each collection object
$users = User::all();

$users->each(function($user)
{
//
});


مرتب کردن


//sorting a collection by value
$users = $users->sortBy(function($user)
{
return $user->created_at;
});

//or

$users = $users->sortBy('created_at');

MMSHFE
سه شنبه 20 اسفند 1392, 13:23 عصر
از اونجایی که خروجی findAll توی AR در 1.1.14 یک آرایه است، درنتیجه یکسری کارها باید دستی توی Yii پیاده سازی بشه.

چک کردن وجود کلید خاص در مجموعه
معادل Yii:


$users = User::model()->findAll('type=:type', array(':type'=>'admin'));
foreach($users as $user) {
if($user->equals(User::model()->findByPk(2)) { // or if($user->id == 2) {
...
}
}
// or
if(in_array(User::model()->findByPk(2), $users)) {
...
}


تبدیل به آرایه و json
معادل Yii


User::model()->findByPk(1)->attributes;
CJSON::encode(User::model()->findByPk(1)->attributes);
$user = new User;
$user->attributes = CJSON::decode($json);


پیمایش مجموعه


foreach($users as $user) {
...
}


فیلتر عناصر مجموعه
این کار توی Yii با استفاده از Scopeها انجام میشه. روش معادل در Yii :


class User extends CActiveRecord {
public function scopes() {
return array(
'isAdmin'=>array('condition'=>'is_admin=:isAdmin', 'params'=>array(':isAdmin'=>1)),
);
}
}
$users = Users::model()->isAdmin()->findAll();


الصاق یک callback به هر یک از اعضای مجموعه (برای این callback هم اگر هست معادل فارسی خوبی پیشنهاد بدید)
از اونجا که در Yii خروجی findAll و... یک آرایه معمولی هست، نیازی به استفاده از callback و تعریف تابع بدون نام و... نیست. معادل Yii :


$users = User::model()->findAll();
foreach($users as $user) {
...
}
// or
while($user = each($users)) {
...
}

ضمناً معادل callback توی فارسی میشه «پاسخ به تماس» یا «تماس برگشتی» یا «تماس بازگشتی» که همون callback بگیم بهتره!

مرتب کردن
باز هم به دلیل اینکه خروجی findAll در Yii یک آرایه معمولی هست، باید از روشهای مربوط به آرایه ها استفاده کنیم. روشهای معادل در Yii :


function mySort($a, $b) {
if ($a->created_at == $b->created_at) {
return 0;
}
return ($a->created_at < $b->created_at ? -1 : 1);
}
$users = User::model()->findAll();
usort($users, 'mySort');
// or simply:
$users = User::model()->findAll(array('order'=>'created_at'));

rezakho
سه شنبه 20 اسفند 1392, 21:00 عصر
خوب در لاراول اوینت های زیر برای مدل معرفی شده
که البته در لاراول میشه چند دستگیره رو به یک ایونت اتچ کرد، دقیقا مثل C#‎‎‎ و jQuery
creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored
ing دارها همون before و ed دارها همون after هستند

برای انتصاب یک دستگیره به یک رخداد مدل بیرون از مدل


User::creating(function($user)
{
//
});

//another
User::creating(function($user)
{
//
});


همچنین برای نوشتن ایونت ها در داخل مدل، میشه از متد boot مدل که مثل متد سازنده شی ها هست، استفاده کرد


class User extends Eloquent {
public static function boot()
{
parent::boot();

static::creating(function($user)
{
//
});
}
}

MMSHFE
چهارشنبه 21 اسفند 1392, 00:07 صبح
خوب این مورد رو Yii هم داره و رویدادهای مختلف و پیشفرض زیادی داره و میشه رویدادهای جدید هم تعریف کرد و معادل متد boot هم در Eloquent توی Yii متد behaviors هست که در ActiveRecord نوعاً برای مدیریت رفتارها ازش استفاده میشه ولی میشه با متدهای جداگانه هم رفتار تعریف کرد که ساختارش یکم با لاراول فرق داره ولی خیلی کامل و راحته. برای شلوغ نشدن تاپیک (چون رفتارها در ActiveRecord خیلی کامل و جامع هستن تا جایی که کلاس جداگانه دارن)، صرفاً مطالعه دو لینک زیر رو برای علاقمندان توصیه میکنم:
Behaviors of CModel (http://www.yiiframework.com/doc/api/1.1/CModel#onAfterConstruct-detail)
CActiveRecordBehavior (http://www.yiiframework.com/doc/api/1.1/CActiveRecordBehavior)
CModelBehavior (http://www.yiiframework.com/doc/api/CModelBehavior)
CBehavior (http://www.yiiframework.com/doc/api/CBehavior)
ضمناً به علاقمندان حتماً مطالعه صفحات 226 تا 231 کتاب Yii application development cookbook 2nd edition رو توصیه میکنم. توی این بخش، بصورت عملی پیاده سازی Soft Delete رو (مشابه چیزی که توی لاراول هست) با کمک تعریف رفتارهای خاص برای کلاس مدل، توضیح داده.

rezakho
چهارشنبه 21 اسفند 1392, 21:28 عصر
خوب تقریبا eloquent تمام شد
مواردی دیگه مثل mass assignment و hidden properties و ... وجود داره که ازش میگذرم

بریم سراغ احراز هویت و ...

در لاراول کلاس احراز هویت به صورت اوتوماتیک به مدل User متصل میشه و به شکل زیر عملیات احراز هویت رو انجام میده
و به صورت Auth::user به مدل و کلاس احراز هویت، یکجا دسترسی دارم


$credential = array('username' => $username, 'password' => $password);

if (Auth::attempt($credential))
{
// user logged
}


گرفتن نام کاربر


Auth::user()->name


چک کردن ورود یوزر


if (Auth::check())
{
// The user is logged in...
}


ورود کاربر به صورت remember me
(سشن زمان دار، در صورت بسته شدن مرورگر، کاربر خارج نمیشود)


if (Auth::attempt($credential, true))
{
// user logged
}


چک کردن ورود کاربر به روش remember


if (Auth::viaRemember())
{
//
}


احراز هویت با id


Auth::loginUsingId(1);

احراز هویت با مدل


$user = User::find(1);
Auth::login($user);

تصدیق کاربر بدون لاگین


if (Auth::validate($credentials))
{
//
}

لاگین کاربر فقط برای request فعلی


if (Auth::once($credentials))
{
//
}

خروج کاربر


Auth::logout();

MMSHFE
پنج شنبه 22 اسفند 1392, 10:07 صبح
در لاراول کلاس احراز هویت به صورت اوتوماتیک به مدل User متصل میشه و به شکل زیر عملیات احراز هویت رو انجام میده
و به صورت Auth::user به مدل و کلاس احراز هویت، یکجا دسترسی دارم
معادل Yii :


$identity = new UserIdentity($username, $password);
$identity->authenticate();
if($identity->errorCode === UserIdentity::ERROR_NONE && Yii::app()->user->login($identity)) {
// user logged in
}


گرفتن نام کاربر
معادل Yii :


Yii::app()->user->name


چک کردن ورود یوزر
معادل Yii :


if(!Yii::app()->user->isGuest)
{
// The user is logged in...
}


ورود کاربر به صورت remember me
معادل Yii :


$duration = ($this->remember ? 1209600 : 0); // two weeks
if (Yii::app()->user->login($identity, $duration)) {
// user logged in
}


چک کردن ورود کاربر به روش remember
معادل Yii :


if($this->remember && !Yii::app()->user->isGuest) {
//
}


احراز هویت با id
معادل Yii :


$u = User::model()->findByPK(1);
Yii::app()->user->login(new UserIdendity($u['username'], $u['password']));


احراز هویت با مدل
مشابه کد قبلی

تصدیق کاربر بدون لاگین
معادل Yii :


if(Yii::app()->user->login($identity)) {
/* look at the difference with login via authentication
if($identity->errorCode === UserIdentity::ERROR_NONE && Yii::app()->user->login($identity)) {
*/
{
//
}

لاگین کاربر فقط برای request فعلی
معادل Yii :


if(Yii::app()->user->login($identity) {
// code
Yii::app()->user->logout();
}

خروج کاربر
معادل Yii

Yii::app()->user->logout();

rezakho
جمعه 23 اسفند 1392, 10:58 صبح
در مورد دسترسی به فیلدهای user، تا اونجا که من میدونم، در yii باید کلاس CWebUser رو دستکاری کرد، ولی شما توی پست قبل این مورد رو ذکر نکردید، این هم متنی که خود گوانگ زو! نوشته

By default, the expression Yii::app()->user returns a CWebUser (http://www.yiiframework.com/doc/api/CWebUser) application component (http://www.yiiframework.com/doc/guide/basics.application#application-component) which represents the information that are closely related with the current user. Some information can be persistent throughout the current user session. For example, CWebUser (http://www.yiiframework.com/doc/api/CWebUser) already comes with a name (http://www.yiiframework.com/doc/api/CWebUser#name) property that stores the username of the current user.
In order to store more information, we need to modify the identity (http://www.yiiframework.com/doc/api/CUserIdentity) class used together with CWebUser (http://www.yiiframework.com/doc/api/CWebUser). Each application may have one or several identity classes which are mainly responsible to provide ways of performing user authentication (http://www.yiiframework.com/doc/guide/topics.auth).


Resource: http://www.yiiframework.com/wiki/6/how-to-add-more-information-to-yii-app-user/


مثلا اگر جدول user ما، فیلدهای به نام family, old, avatar , ... داشته باشه، شما چطور بهش از طریق Yii::app()->user دسترسی پیدا میکنید

MMSHFE
جمعه 23 اسفند 1392, 13:13 عصر
کلاس CWebUser توی Yii کلاً بحثش از مدل User جداست. این کلاس وظیفه انجام کارهای مربوط به کابر جاری مثل لاگین و اعتبارسنجی و بررسی نقشها و خروج و... رو برعهده داره و منطقی هم نیست که با مدل User یکی باشه چون توی هر پروژه فیلدهای کاربران و حتی اسم جدولشون متغیره. بجای این کار خیلی راحت با دستور زیر میشه مدل کاربر جاری رو بدست آورد:

$user = User::model()->findByPk(Yii::app()->user->id);
حتی من توی پروژه هام میام توی کلاس CController که توی پوشه protected/components هست، کد زیر رو اضافه میکنم:


public $currentUser;
public function init() {
if (!Yii::app()->user->isGuest) {
$this->currentUser = User::model()->findByPk(Yii::app()->user->id);
}
}

و از اونجا که این کلاس، والد تمام کنترلرهاست و متد init هم همیشه در ابتدای هر درخواست اجرا میشه، به راحتی میتونم توی هر اکشن یا ویو با this->currentUser$ به مدل کاربر جاری و ازطریق اون به تمام فیلدهاش دسترسی پیدا کنم.

rezakho
جمعه 23 اسفند 1392, 13:21 عصر
خوب اینم که دوباره شد دستی!
روش شما روش خوبیه، اما خود Yii روش خوبی رو برای برنامه نویس ارائه نداده

MMSHFE
جمعه 23 اسفند 1392, 16:16 عصر
شاید حق با شما باشه ولی من خودم شخصاً اینکه کلاس مدیریت کاربر از مدل کاربر جدا باشه رو میپسندم (بازم تأکید میکنم نظر شخصیه) و ازطرفی Yii هم مکانیزمهایی برای اینکه بشه به راحتی مدل رو در همه کلاسها در اختیار داشت (مثل روشی که من استفاده کردم) فراهم کرده.

rezakho
جمعه 23 اسفند 1392, 23:30 عصر
خوب
نوبت request ها و input هاست
لاراول 2 کلاس Input , Request رو برای کارهای مختلف ارائه کرده

گرفتن داده های POST یا GET


$name = Input::get('filedName');
// or
$name = Input::get('filedName', 'defaultValue');


تست وجود یک داده POST یا GET


if (Input::has('name'))
{
//
}

دریافت تمام داده ها


$inputs = Input::all();


دریافت تعدادی از داده ها


$inputs = Input::only('username', 'password');


دریافت همه داده ها به غیر از تعدادی


$inputs = Input::except('credit_card');


دریافت داده هایی که به صورت آرایه ارسال شده اند


$input = Input::get('products.0.name');


ذخیره داده های POST یا GET در session


Input::flash();


پاک کردن داده های POST یا GET از session


Input::flush();


ذخیره برخی از داده های POST یا GET در session


Input::flashOnly('username', 'email');


ذخیره همه داده های POST یا GET در session به جز برخی


Input::flashExcept('password');


خواندن داده های POST یا GET ذخیره شده در session


$username = Input::old('username');


بقیه در پست های بعدی

MMSHFE
شنبه 24 اسفند 1392, 00:30 صبح
گرفتن داده های POST یا GET
معادل Yii


// get requests
$name = Yii::app()->request->getQuery('fieldName');
// or
$name = Yii::app()->request->getQuery('fieldName', 'defaultValue');

// post requests
$name = Yii::app()->request->getPost('fieldName');
// or
$name = Yii::app()->request->getPost('fieldName', 'defaultValue');

// get or post requests
$name = Yii::app()->request->getParam('fieldName');
// or
$name = Yii::app()->request->getParam('fieldName', 'defaultValue');

تست وجود یک داده POST یا GET


if (!Yii::app()->getQuery('name'))
{
//
}

دریافت تمام داده ها
نمیدونم چرا اصلاً براش متد جداگانه گذاشتن چون خیلی راحت میشه با خود PHP انجام داد و Yii هم وقتی پرسیدم که چرا چنین متدی نداره، گفتن چون وجودش بی معناست. مثال:


$inputs = $_POST
$inputs = $_GET
$inputs = $_REQUEST;


دریافت تعدادی از داده ها
معادل Yii


$inputs = array(Yii::app()->request->getParam('username'), Yii::app()->request->getParam('password'));


دریافت همه داده ها به غیر از تعدادی
این مورد رو هم معادلی پیدا نکردم ولی اینطوری میشه شبیه سازی کرد (البته برخلاف Input::all این مورد بنظرم سودمند اومد و نفهمیدم چرا نگذاشتن) :


$inputs = $_REQUEST';
unset($inputs['credit_card']);


دریافت داده هایی که به صورت آرایه ارسال شده اند
معادل Yii


$input = Yii::app()->request->getParam('products[0][name]');


ذخیره داده های POST یا GET در session
معادل Yii


// store
Yii::app()->user->setState('post', serialize($_POST));
// retrieve
$values = unserialize(Yii::app()->getState('post'));


پاک کردن داده های POST یا GET از session
معادل Yii

Yii::app()->user->setState('post', null);

ذخیره برخی از داده های POST یا GET در session
معادل Yii

Yii::app()->user->setState('post', serialize(array(Yii::app()->request->getParam('username'), Yii::app()->request->getParam('email'))));

ذخیره همه داده های POST یا GET در session به جز برخی


$inputs = $_REQUEST;
unset($inputs['password']);
Yii:app()->user->setState('post', serialize($inputs));


خواندن داده های POST یا GET ذخیره شده در session
معادل Yii :


$inputs = unserialize(Yii::app()->getState('post');
$username = $inputs['username'];

ناگفته نماند که در این مورد حقیقتش تابحال نیازی بهش پیدا نکرده بودم ولی از اونجا که دیدم کاربردهای زیادی میتونه داشته باشه (بخصوص در فرمهای چند قسمتی که نیاز به ذخیره اطلاعات فرم در سشن در زمان رفتن به مرحله بعد یا قبل هست)، برای کارهای خودم یک کلاس شخصی برای مدیریت این نواقص نوشتم ولی خوشبختانه گویا این مشکلات هم توی نسخه 2 قراره برطرف بشه.

tux-world
شنبه 24 اسفند 1392, 09:38 صبح
تو Yii چرا این قدر پیچیده هستش ؟ مثلا: ذخیره برخی از داده های POST یا GET در session . این واقعا آزار دهندست. تو نسخه جدید هم اینطوریه؟
به غیر اون بقیه توابعش برای input و request سخت تر و پیچیده تر از لاراول هستش. تو این کد مثلا:


if (!Yii::app()->getQuery('name'))

{

//

}



تو دید اول اصلا به ذهن نمیرسه که برای تست وجود یک داده POST یا GET هستش

MMSHFE
شنبه 24 اسفند 1392, 17:02 عصر
دوست عزیز، دید اول چیه؟ مثلاً برنامه نویسیم ها! توی مستنداتش نوشته که getQuery برای دریافت Getها و getPost برای دریافت Postها و getParam هم برای دریافت هر دو هست. ! هم که یعنی empty و null نباشه. حالا حتماً باید بگه Input::has تا خوانا بشه؟ بهرحال من هم مثل شما قبول دارم که ساختار Yii توی این مورد یکم پیچیده و دست و پاگیره ولی حقیقتش تا حالا موردی نبوده که بخوام توی اکشن خاصی، دستی مقادیر رو بگیرم و همیشه برای اکشن پارامتر تعریف میکنم و خود Yii اون رو توی پارامترها میچینه و هرجا هم احیاناً لازم بوده، از خود POST_$ و GET_$ استفاده کردم و با وجود دستوراتی مثل in_array و array_keys خیلی راحت میشه چک کرد فرضاً یک مقدار توی POST_$ هست یا نه. درهرصورت تا جایی که فهمیدم توی نسخه 2 یک کلاس مخصوص پردازش ورودیهای کاربر اضافه کردن.

tux-world
شنبه 24 اسفند 1392, 18:56 عصر
بحث Input::has بودن یا نبودن نیست اصلا. ولی مدت زمان به خاطر موندن خیلی از توابع به تعریف اونها بستگی داره. مثلا شما سعی میکنید توابعی رو تعریف کنید که همیشه تو دهنتون بمونه اگر هم بعضی هاشون سخت بود آلیاس تعریف میکنید. اون کلاسی که اضافه شده چیه؟ میتونین توضیحی بدید؟ (مختصر)

amirkheirabadi.com
شنبه 24 اسفند 1392, 20:32 عصر
منم فقط می خوام نظرمو بگم ...
من قبلا با yii کار کردم .... فریم ورک محشریه . از همه نظر عالیه هیچ شکی در اون نیست ... ولی مشکلی که داشت این بود که من کلا php رو با yii یاد گرفتم .. و بعد از یک مدتی به خاطر دستورات پیچیده بودن دستورات و کلا ساختار برای من ، کلا از php کشیدم بیرون و رفتم سراغ node تا حدود این یک سال که با فریم ورک sails کار کردم که واقعاااا عالی بود ... بعد خاطر دور نبودن از php دنبال یک فریم ورک برای کار بودم که فهمیدم laravel از نظر ساختار و حتی کد زدن چون ساختار جفتشون شبیه rails بود ....
و توی این دو هفته ای که اومدم سراغ laravel واقعاااا دیدم برای من خیلی خیلی خیلی بهتر از yii بوده...
در کل قابلیت های جفتشون یکیه ... بعضی جاها هم یک سری اختلافاتی هست که توی پروژه های بزرگ مشخص می شه ... و چیزی که بین این ها فاصله و رقابت ایجاد می کنه به نظرم فقط راحتی فرد در استفاده است ... که برای بنده به شخصه laravel خیلی قابل فهم تر بود ... بعضی از برنامه نویسان اینقدر مسائل پیچیده حل کردن که ماهیچه های مغر عادت کرده به پیچیده جل کردن مسئله ها ( به قول نویسنده کتابی که می خوندم ) بعضی ها هم مثل ما دنبال سریع و تمیز تر شدن هر چه بیشتر کد ها .....
هر کسی با یکی راحته و گرنه قابلیت ها تقریبا یکی است ....
استادان عزیز نظرمو گفتم ... نتوپید به ما .... همه جای متنم گفتم : به نظر من ، من فکر می کنم و.....

rezakho
شنبه 24 اسفند 1392, 21:21 عصر
خوب بریم سراغ فایل در فرم ها

گرفتن یک فایل که توسط فرم ارسال شده


$file = Input::file('photo');

چک کردن ارسال یک فایل


if (Input::hasFile('photo'))
{
//
}

جابجایی فایل آپلود شده


Input::file('photo')->move($destinationPath);

Input::file('photo')->move($destinationPath, $fileName);

گرفتن اطلاعات فایل آپلود شده


$path = Input::file('photo')->getRealPath();
$name = Input::file('photo')->getClientOriginalName();
$extension = Input::file('photo')->getClientOriginalExtension();
$size = Input::file('photo')->getSize();
$mime = Input::file('photo')->getMimeType();

tux-world
شنبه 24 اسفند 1392, 23:14 عصر
تو بخش نوبت request ها و input. کدهای لاراول واقعا بسیار کوچیک،سریع و آسون هستن. امیدوارم تو نسخه جدید Yii هم راحت تر شده باشن این قسمتها

MMSHFE
یک شنبه 25 اسفند 1392, 13:20 عصر
بحث Input::has بودن یا نبودن نیست اصلا. ولی مدت زمان به خاطر موندن خیلی از توابع به تعریف اونها بستگی داره. مثلا شما سعی میکنید توابعی رو تعریف کنید که همیشه تو دهنتون بمونه اگر هم بعضی هاشون سخت بود آلیاس تعریف میکنید. اون کلاسی که اضافه شده چیه؟ میتونین توضیحی بدید؟ (مختصر)
همون کلاس Request هست که تکمیل شده. این لینک (https://github.com/yiisoft/yii2/blob/master/framework/web/Request.php) رو ببینید.

MMSHFE
یک شنبه 25 اسفند 1392, 13:29 عصر
تو بخش نوبت request ها و input. کدهای لاراول واقعا بسیار کوچیک،سریع و آسون هستن. امیدوارم تو نسخه جدید Yii هم راحت تر شده باشن این قسمتها
بله خوشبختانه توی نسخه جدید خیلی راحت شده. مثلاً میگیم Request::get('name'); بجای اینکه بگیم Yii::app()->request->getQuery('name');

MMSHFE
یک شنبه 25 اسفند 1392, 14:21 عصر
گرفتن یک فایل که توسط فرم ارسال شده

$file = CUploadedFile::getInstanceByName('photo');

چک کردن ارسال یک فایل


if (!CUploadedFile::getInstanceByName('photo')) {
//
}


جابجایی فایل آپلود شده


$file->saveAs($destinationPath . '/' . $file->name);
$file->saveAs($destinationPath . '/' . $filename);

گرفتن اطلاعات فایل آپلود شده


$path = $file->tempName;
$name = $file->name;
$extension = $file->extensionName;
$size = $file->size;
$mime = $file->type;
$error = $file->error;
// Yii provides hasError property
if(!$file->hasError) {
$file->saveAs('uploads/' . $file->name);
}

tux-world
دوشنبه 26 اسفند 1392, 13:37 عصر
محض کمک به رونق بیشتر به تاپیک و اینکه کمکی بشه برای دوستان چند تا از خصوصیات لاراول رو می نویسم

بررسی وجود یا عدم وجود فایل:

File::exists()

دریافت محتویات یک فایل:

$contents = File::get($filename);

دریافت محتویات فایل به صورت ریموت (نتیجه دریافت به صورت بولین قابل دسترس است):

$contents = File::getRemote($url);
دریافت متغیرهای بازگشتی از فایل:

<?php
// file1.php - returns an array
return array(
'key1' => 'value1',
'key2' => 'value2',
);
?>

// Fetching the array of the file above
$value = File::getRequire('file1.php');

الحاق یک فایل یا همان require_once به صورت لاراولی:

File::requireOnce($some_php_file);

نوشتن محتوا در فایل:


$bytes_written = File::put($file, $contents);
if ($bytes_written === false)
{
die("Error writing to file");
}

اضافه کردن محتوا در ابتدای فایل:

$bytesWritten = File::prepend($filename, $content);
if ($bytesWritten === false)
{
die("Couldn't write to the file.");
}

اضافه کردن محتوا به انتهای فایل:

$bytesWritten = File::append($filename, $content);
if ($bytesWritten === false)
{
die("Couldn't write to the file.");
}


حذف یک فایل:

File::delete($filename);

حذف چند فایل:

File::delete($file1, $file2, $file3);


حذف فایل به روش استفاده از آرایه:

$files = array($file1, $file2);
File::delete($files);


انتقال فایل به مسیر جدید:

if ( ! File::move($oldfile, $newfile))
{
die("Couldn't rename file");
}

ایجاد یک نسخه دیگر از فایل در مسیر دیگر:

if ( ! File::copy($file, $dest))
{
die("Couldn't copy file");
}

استخراج پسوند فایل:

$extension = File::extension($filename);

دریافت نوع فایل (پوشه یا فایل ):

echo File::type($filename);

دریافت سایز یا همان حجم فایل:

$bytes = File::size($filename);

دریافت اطلاعات اعم از تاریخ و ساعت آخرین تغییرات اعمال شده در فایل:

$timestamp = File::lastModified($filename);
if ($timestamp === false)
{
die("Failure getting the time");
}

تشخیص پوشه بودن فایل:


if (File::isDirectory($filename))
{
echo "Yes. It's a directory.";
}

تشخیص قابلیت نوشتن در داخل فایل.( سطح دسترسی برای نوشتن اعمال شده است یا خیر ):

if (File::isWritable($filename))
{
echo "Yes. $filename is writable.";
}
if (File::isWritable($dirname))
{
echo "Yes. $dirname is writable.";
}

فعلا کافیه :)

MMSHFE
دوشنبه 26 اسفند 1392, 14:19 عصر
بررسی وجود یا عدم وجود فایل:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

file_exists

دریافت محتویات یک فایل:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

$contents = file_get_contents($filename);

دریافت محتویات فایل به صورت ریموت (نتیجه دریافت به صورت بولین قابل دسترس است):
از چه نسخه ای استفاد میکنید چون توی سایتش چنین دستوری رو توی لاراول ندیدم! لینک (http://laravel.com/api/4.1/Illuminate/Filesystem/Filesystem.html)

دریافت متغیرهای بازگشتی از فایل:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

<?php
// file1.php - returns an array
return array(
'key1' => 'value1',
'key2' => 'value2',
);
?>

// Fetching the array of the file above
$values = require 'file1.php';



الحاق یک فایل یا همان require_once به صورت لاراولی:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

require_once 'some_file.php';

نوشتن محتوا در فایل:

$bytes_written = file_put_contents($file, $contents);
if ($bytes_written === false)
{
die("Error writing to file");
}

اضافه کردن محتوا در ابتدای فایل:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

$bytesWritten = file_put_contents($file, $contents . file_get_contents($file));

اضافه کردن محتوا به انتهای فایل:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

$bytesWritten = file_put_contents($file, file_get_contents($file) . $contents);

حذف یک فایل:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

unlink($file);

حذف چند فایل:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

foreach(array($file1, $file2, $file3) as $file) { unlink($file); }

حذف فایل به روش استفاده از آرایه:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:
مثل کد قبل

انتقال فایل به مسیر جدید:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

if (!rename($oldfile, $newfile)) {
die("Couldn't rename file");
}

ایجاد یک نسخه دیگر از فایل در مسیر دیگر:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

if (!copy($oldfile, $newfile)) {
die("Couldn't copy file");
}

استخراج پسوند فایل:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

$extension = pathinfo($filename, PATHINFO_EXTENSION);

دریافت نوع فایل (پوشه یا فایل ):
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

echo filetype($filename);

دریافت سایز یا همان حجم فایل:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

$bytes = filesize($filename);

دریافت اطلاعات اعم از تاریخ و ساعت آخرین تغییرات اعمال شده در فایل:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

$timestamp = filemtime($filename);
if ($timestamp === false) {
die("Failure getting the time");
}

تشخیص پوشه بودن فایل:
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:


if (is_dir($filename)) {
echo "Yes. It's a directory.";
}

تشخیص قابلیت نوشتن در داخل فایل.( سطح دسترسی برای نوشتن اعمال شده است یا خیر ):
ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:

if (is_writable($filename)) {
echo "Yes. $filename is writable.";
}
if (is_writable($dirname)) {
echo "Yes. $dirname is writable.";
}

فعلا کافیه :)
دوست عزیز، فریمورک قرار نیست هر کاری که خود PHP به راحتی انجام میده رو بیاد شکلش رو عوض کنه و بگه من قابلیتهام زیاده! لطفاً توی این تاپیک، قابلیتهایی رو معرفی کنید که با خود PHP خام نمیشه به راحتی انجام داد. Yii هم دلیلی نداشته وقتی مثلاً fileatime توی خود PHP هست بیاد بگه (CFileHelper::AccessTime($filename رو به کار ببرین. در عوض یکسری چیزهای دیگه اضافه کرده:
CFileHelper::copyDirectory برای کپی بازگشتی یک پوشه و همه فایلهای داخلش
CFileHelper::findFiles برای جستجوی یک یا چند فایل در کل یک پوشه و همه پوشه های فرعی داخلش
CFileHelper::getExtension تشخیص پسوند فایل
CFileHelper::getMimeTypeByExtension تشخیص MIME Type از روی پسوند
CFileHelper::getMimeType تشخیص MIME Type از روی هدرهای فایل
CFileHelper::removeDirectory حذف یک پوشه و همه فایلهای داخلش

tux-world
دوشنبه 26 اسفند 1392, 20:14 عصر
اصلا بحث این که قراره عوض کنه نیست. تغییر بده و توسعه هم بده باز هم اشکالی نداره.ولی من خودم شخصا دوست دارم این تغییرات رو. اینایی هم که نوشتم نگفتم قابلیتهای لاراول هستش. قبل شما خودم اینا رو میدونستم. ولی به هر حال امکاناتی هستش که گذاشتن. شاید به نظر شما اضافی باشه ولی حداقلش برای من خوبه و ازشون استفاده میکنم. دل بخواه هستش بلاخره هم میشه استفاده کرد هم میشه نکرد. این اومده کار رو راحت تر کرده دست توش نبرده که
مثلا:


File::delete($file1, $file2, $file3);

راحت تر از :


foreach(array($file1, $file2, $file3) as $file) { unlink($file); }

هستش ولی باز هم میگم هیچ ضروریتی به استفاده از این خصوصیات نیست

tux-world
سه شنبه 27 اسفند 1392, 09:35 صبح
یه سوال. چطور میشه چند تا دستگیره با هم در Yii به ایونت ها نسبت داد. مستنداتی پیدا نکردم میشه راهنمایی کنید؟ البته
منظورم ایونت هایی هست که قبل از ایجاد مدل باید اتچ بشند نه بعد از ساخته شدن

MMSHFE
سه شنبه 27 اسفند 1392, 11:58 صبح
اصلا بحث این که قراره عوض کنه نیست. تغییر بده و توسعه هم بده باز هم اشکالی نداره.ولی من خودم شخصا دوست دارم این تغییرات رو. اینایی هم که نوشتم نگفتم قابلیتهای لاراول هستش. قبل شما خودم اینا رو میدونستم. ولی به هر حال امکاناتی هستش که گذاشتن. شاید به نظر شما اضافی باشه ولی حداقلش برای من خوبه و ازشون استفاده میکنم. دل بخواه هستش بلاخره هم میشه استفاده کرد هم میشه نکرد. این اومده کار رو راحت تر کرده دست توش نبرده که
مثلا:


File::delete($file1, $file2, $file3);

راحت تر از :


foreach(array($file1, $file2, $file3) as $file) { unlink($file); }

هستش ولی باز هم میگم هیچ ضروریتی به استفاده از این خصوصیات نیست
ببینید، اینجور موارد سلیقه ای هست و در کل امتیاز خاصی محسوب نمیشه چون همونطور که شما به File::delete برای حذف چند فایل اشاره کردین که ساختار ساده تری داره، ساختارهایی هم مثل $values = require 'file1.php'; وجود داره که ساده تر از $values = File::getRequire('file1.php'); هست. درهرصورت بهتره توی این تاپیک دنبال قابلیتهای واقعی فریمورکها باشیم. چیزهایی مثل Eloquent لاراول و ActiveRecord در Yii منظورمه.

MMSHFE
سه شنبه 27 اسفند 1392, 11:59 صبح
یه سوال. چطور میشه چند تا دستگیره با هم در Yii به ایونت ها نسبت داد. مستنداتی پیدا نکردم میشه راهنمایی کنید؟ البته
منظورم ایونت هایی هست که قبل از ایجاد مدل باید اتچ بشند نه بعد از ساخته شدن



میشه مثال بزنید؟ منظورتون رو متوجه نشدم. در هر حال لینکهای زیر رو یه نگاه بندازین:
http://www.yiiframework.com/wiki/637/attaching-multiple-event-handlers-to-onbeginrequest
http://www.yiiframework.com/wiki/44/behaviors-events

tux-world
سه شنبه 27 اسفند 1392, 12:29 عصر
مثال:


User::creating(function($user)
{
// some jobs
});

User::creating(function($user)
{
// some jobs
});

User::creating(function($user)
{
// some jobs
});‬



این کد نمونش در Yii به چه شکل هستش؟ تو اون لینکها موردی نبود

MMSHFE
سه شنبه 27 اسفند 1392, 15:02 عصر
البته اینهایی که شما نوشتین، Behavior هست نه Event ولی درهرصورت، توی Yii به این شکل میشه کار کرد:


class User extends CActiveRecord {
public static function model($className=__CLASS__) {
$model = parent::model($className);
$model->onBeforeSave = 'func1';
$model->onBeforeSave = 'func2';
$model->onBeforeSave = 'func3';
return $model;
}

private function func1() { ... }
private function func2() { ... }
private function func3() { ... }
}

bestirani2
سه شنبه 27 اسفند 1392, 21:15 عصر
در مورد دسترسی به فیلدهای user، تا اونجا که من میدونم، در yii باید کلاس CWebUser رو دستکاری کرد، ولی شما توی پست قبل این مورد رو ذکر نکردید، این هم متنی که خود گوانگ زو! نوشته

By default, the expression Yii::app()->user returns a CWebUser (http://www.yiiframework.com/doc/api/CWebUser) application component (http://www.yiiframework.com/doc/guide/basics.application#application-component) which represents the information that are closely related with the current user. Some information can be persistent throughout the current user session. For example, CWebUser (http://www.yiiframework.com/doc/api/CWebUser) already comes with a name (http://www.yiiframework.com/doc/api/CWebUser#name) property that stores the username of the current user.
In order to store more information, we need to modify the identity (http://www.yiiframework.com/doc/api/CUserIdentity) class used together with CWebUser (http://www.yiiframework.com/doc/api/CWebUser). Each application may have one or several identity classes which are mainly responsible to provide ways of performing user authentication (http://www.yiiframework.com/doc/guide/topics.auth).


Resource: http://www.yiiframework.com/wiki/6/how-to-add-more-information-to-yii-app-user/


مثلا اگر جدول user ما، فیلدهای به نام family, old, avatar , ... داشته باشه، شما چطور بهش از طریق Yii::app()->user دسترسی پیدا میکنید


چه نیازی هست به اون فیلدها دسترسی داشت؟
فرض رو بر این میگذاریم نیاز هست؟!

Yii::app()->user->setState('avatar', $user->avatar);

حالا هر جای برنامه میتونیم از طریق Yii::app()->user->avatar مقدارش رو بگیریم.

bestirani2
سه شنبه 27 اسفند 1392, 21:36 عصر
سیمفونی یکی از کارامدترین فریمورکهای موجوده، اوایل تاپیک هم گفته شد که بیش از 90 درصد کارها رو با هر فریمورک و حتی زبانی میشه انجام داد، شاید آیتم هایی که در انتخاب موثرند اینها باشند، کارایی، سرعت توسعه، کد قابل فهم تر و کوتاه تر، امکانات و در اخر سلیقه

نظر من اینه که سیمفونی در عین کارایی و امکانات، سینتکس (البته منظور همون پیچیدگی هست) سخت تری نسبت به لاراول و حتی یی داره، لذا الان من سراغش نمیرم، شاید روزی باش کار کنم و ازش خوشم بیاد، در مقایسه هایی هم که تا به حال دیدم و خودم تست کردم، هسته اش بدون دستکاری کند تر از Yii و Laravel هست، به قول نیوتون (با دستکاری البته) لاراول و یی اگر در قله ها هستند، به این خاطره که بر روی دوش غول ها ایستاده اند.

دوست عزیز این نکته رو بگم که خود لاراول بر اساس سیمفونی درست شده. لاراول به شکلی ساده شده سیمفونی هست و جاهایی که نیاز بوده رو به صورت خودکار کش کرده. کافیه شما کش کلی سیمفونی رو روشن کنید تا سرعتش از هر دو فریم ورک گفته شده بالاتر بره (البته در صورتی که از داکترین استفاده نکنید.)
در عوض پیچیدگی هایی که میگید انعطاف پذیری و قدرت + مهندسی بودنش رفته بالا. نمونه انعطاف پذیری هم همین لاراول
تنها فریم ورکی که میشه کلاْ همه چیز رو شخصی ساز کرد همین سیمفونی هست.

bestirani2
سه شنبه 27 اسفند 1392, 21:41 عصر
سیمفونی فریمورک خیلی خوب و قدرتمندیه و خیلی از فریمورکهای دیگه بخشهایی از خودشون رو مدیون اون هستن ولی دو مشکل لساسی داره که یکیش پرفورمنس پایینتر نسبت به بقیه و یکی دیگه هم سختگیریهایی هست که گاهی اوقات اعصاب برنامه نویس رو بهم میریزه تا جایی کع از خود PHP هم بعضاً سختگیرتر میشه. البته من با سختگیری قانونمند درجهت رعایت چهارچوب کاری موافقم ولی سیمفونی دیگه خیلی در این زمینه زیاده روی میکنه. بهرحال این تاپیک برای مقایسه Yii و لاراول هست و بهتره برای مقایسه یا معرفی سیمفونی تاپیک جداگانه ایجاد کنید.

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

rezakho
سه شنبه 27 اسفند 1392, 23:55 عصر
این تاپیک مقایسه لاراول و یی هست، بحث سیمفونی نیست که شما پست میزنی!

چه نیازی هست به اون فیلدها دسترسی داشت؟
اون فیلدها که برای قشنگی نیست، برای استفاده هست، در لاراول مدل user کاربر فعلی اوتوماتیک بار میشه و فیلد ها و ریلیشن ها و متدها و ... همگی از طریق Auth::user در دسترس هست
نیازی هم به تک تک تعریف کردن عضوها مثل کد شما نیست


دوست عزیز این نکته رو بگم که خود لاراول بر اساس سیمفونی درست شده. لاراول به شکلی ساده شده سیمفونی هست و جاهایی که نیاز بوده رو به صورت خودکار کش کرده. کافیه شما کش کلی سیمفونی رو روشن کنید تا سرعتش از هر دو فریم ورک گفته شده بالاتر بره (البته در صورتی که از داکترین استفاده نکنید.)
در عوض پیچیدگی هایی که میگید انعطاف پذیری و قدرت + مهندسی بودنش رفته بالا. نمونه انعطاف پذیری هم همین لاراول
تنها فریم ورکی که میشه کلاْ همه چیز رو شخصی ساز کرد همین سیمفونی هست.

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

MMSHFE
چهارشنبه 28 اسفند 1392, 00:22 صبح
درمورد اینکه توی این تاپیک درمورد سیمفونی صحبت نکنیم موافقم (البته نه با این لحن - یکم بنظرم خشن اومد و میشد ملایمتر هم تذکر بدیم). درخصوص اینکه در لاراول مدل کاربر جاری بطور خودکار بارگذاری میشه هم راستش شخصاً زیاد موافق این قضیه نیستم چون بحث Authentication کاربر جاری و دسترسی به مدل کاربر جاری بنظرم دو موضوع جداگانه هستن و کلاس Authentication وظیفه مدیریت ورود و خروج و اعتبارسنجی و یکسری کارهای اینچنین رو برعهده داره و مدل کاربر همه جا مورد نیاز نیست که بخوایم بارگذاریش کنیم. شاید یکی از دلایل بهینه تر بودن Yii توی Benchmarkها هم همین مسئله باشه که تا وقتی نیاز نیست، هیچ چیز غیر ضروری بطور خودکار بارگذاری نمیشه. هرجا هم لازم بود به راحتی میشه با یک خط کد مدل کاربر رو بدست آورد:

$user = User::model()->findByPk(Yii::app()->user->id);

MMSHFE
چهارشنبه 28 اسفند 1392, 00:28 صبح
اون فیلدها که برای قشنگی نیست، برای استفاده هست، در لاراول مدل user کاربر فعلی اوتوماتیک بار میشه و فیلد ها و ریلیشن ها و متدها و ... همگی از طریق Auth::user در دسترس هست
نیازی هم به تک تک تعریف کردن عضوها مثل کد شما نیست
نیازی به تعریف تک تک فیلدها نیست. مثال:


// mass assignment
Yii::app()->user->setState('attributes', $user->attributes);
// example of usage
echo Yii::app()->user->attributes['family'];

bestirani2
چهارشنبه 28 اسفند 1392, 00:49 صبح
این تاپیک مقایسه لاراول و یی هست، بحث سیمفونی نیست که شما پست میزنی!



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




منظور کارایی خود فریمورک بود، کسی از کش صحبت نکرد

منظور من کش خود فریم ورک بود نه قسمت خاصی. لاراول هم همین کار رو به صورت توکار میکنه.

mamal72
چهارشنبه 28 اسفند 1392, 13:12 عصر
$contents = File::getRemote($url);

از چه نسخه ای استفاد میکنید چون توی سایتش چنین دستوری رو توی لاراول ندیدم! لینک (http://laravel.com/api/4.1/Illuminate/Filesystem/Filesystem.html)

توی یکی دو نسخه پیش این تابع حذف شده. خود تیلور گفته کاربردی نداشته. ولی خب من برای دریافت محتوای فایل api گوگل‌مپ و ذخیره روی سرور خودم از این تابع استفاده میکردم. بعد از آپدیت لاراول، دیدم دیگه کار نمیکنه و خطا میده. تابع File::get هم کار نکرد (فک کنم مشکلم این بود که کلاً کارش لوکال بود یا که من گیج بودم اشتباه کردم) و از این رو از تابع file_get_contents خود پی‌اچ‌پی استفاده کردم.


منم فقط می خوام نظرمو بگم ...
من قبلا با yii کار کردم .... فریم ورک محشریه . از همه نظر عالیه هیچ شکی در اون نیست ... ولی مشکلی که داشت این بود که من کلا php رو با yii یاد گرفتم .. و بعد از یک مدتی به خاطر دستورات پیچیده بودن دستورات و کلا ساختار برای من ، کلا از php کشیدم بیرون و رفتم سراغ node تا حدود این یک سال که با فریم ورک sails کار کردم که واقعاااا عالی بود ... بعد خاطر دور نبودن از php دنبال یک فریم ورک برای کار بودم که فهمیدم laravel از نظر ساختار و حتی کد زدن چون ساختار جفتشون شبیه rails بود ....
و توی این دو هفته ای که اومدم سراغ laravel واقعاااا دیدم برای من خیلی خیلی خیلی بهتر از yii بوده...
در کل قابلیت های جفتشون یکیه ... بعضی جاها هم یک سری اختلافاتی هست که توی پروژه های بزرگ مشخص می شه ... و چیزی که بین این ها فاصله و رقابت ایجاد می کنه به نظرم فقط راحتی فرد در استفاده است ... که برای بنده به شخصه laravel خیلی قابل فهم تر بود ... بعضی از برنامه نویسان اینقدر مسائل پیچیده حل کردن که ماهیچه های مغر عادت کرده به پیچیده جل کردن مسئله ها ( به قول نویسنده کتابی که می خوندم ) بعضی ها هم مثل ما دنبال سریع و تمیز تر شدن هر چه بیشتر کد ها .....
هر کسی با یکی راحته و گرنه قابلیت ها تقریبا یکی است ....
استادان عزیز نظرمو گفتم ... نتوپید به ما .... همه جای متنم گفتم : به نظر من ، من فکر می کنم و.....

پیش‌نویس: چطوری امیر؟ :دی
با امیر موافقم. من فریم‌ورکای مختلفی رو تو زبون‌های مختلف سرک کشیدم. هیچ‌کدوم به قشنگی لاراول نبودند و نیستند. من تو حفظ کردن کلمات و عبارات عجیب و غریب ضعیفم. اسامی توابع و دستورات Yii اونقدر برام پیچیده بودن که وقتی بهش سر زدم، بیخیالش شدم.


در مورد پرفرمنس و بازدهی هم خب.. من یه سری بنچمارک بی طرف دیدم که توشون لاراول از یی سریعتر بود. یعنی بعد از فالکن و کد ایگنایتر و کُوهانا و یکی دو تا میکرو فریمورک دیگه، لاراول بودش. بعد از لاراول yii بود و اون پایین مایینا، زند و سیمفونی و سایر شرکا حضور داشتند. درسته که بیس لاراول سیمفونی هستش، ولی طبق بنچمارک‌های موجود، لاراول دو برابر سیمفونی بازدهی داره.

MMSHFE
چهارشنبه 28 اسفند 1392, 15:03 عصر
در مورد پرفرمنس و بازدهی هم خب.. من یه سری بنچمارک بی طرف دیدم که توشون لاراول از یی سریعتر بود. یعنی بعد از فالکن و کد ایگنایتر و کُوهانا و یکی دو تا میکرو فریمورک دیگه، لاراول بودش. بعد از لاراول yii بود و اون پایین مایینا، زند و سیمفونی و سایر شرکا حضور داشتند. درسته که بیس لاراول سیمفونی هستش، ولی طبق بنچمارک‌های موجود، لاراول دو برابر سیمفونی بازدهی داره.
اگه میشه لینک این پنچمارکهای بیطرف که گفتن لاراول سریعتر از Yii بوده رو بگذارین تا بیطرفیشون رو بررسی کنیم.

MMSHFE
چهارشنبه 28 اسفند 1392, 15:11 عصر
توجه داشته باشید که من در جواب پست شما دو عزیز که راجب سیمفونی بود صحبت کردم و شروع با کس دیگه ای بوده.
بحث رو من شروع کردم اما منظورم بد بودن سیمفونی نبود. منظورم این بود که فریمورکی مثل لاراول که اکثر قدرتش رو از یک فریمورک دیگه گرفته، نمیشه ازش انتظار تفاوت آنچنانی در Performance با فریمورک والدش داشته باشیم. ضمناً اینکه گفتین سیمفونی با فعال کردن کش سرعتش از Yii هم بیشتر میشه، باید بگم درصورتی که کش Yii غیرفعال باشه و از APC و Yiilite استفاده نکنیم، حرف شما صحیحه ولی اگه این دو مورد رو فعال کنیم و انجام بدیم، اونوقت دیگه سیمفونی و لاراول سرعتشون خیلی کمتر از Yii خواهد شد.

bestirani2
چهارشنبه 28 اسفند 1392, 15:50 عصر
بحث رو من شروع کردم اما منظورم بد بودن سیمفونی نبود. منظورم این بود که فریمورکی مثل لاراول که اکثر قدرتش رو از یک فریمورک دیگه گرفته، نمیشه ازش انتظار تفاوت آنچنانی در Performance با فریمورک والدش داشته باشیم. ضمناً اینکه گفتین سیمفونی با فعال کردن کش سرعتش از Yii هم بیشتر میشه، باید بگم درصورتی که کش Yii غیرفعال باشه و از APC و Yiilite استفاده نکنیم، حرف شما صحیحه ولی اگه این دو مورد رو فعال کنیم و انجام بدیم، اونوقت دیگه سیمفونی و لاراول سرعتشون خیلی کمتر از Yii خواهد شد.
من خودم با هر دو فریم ورک ورک کار کردم. سایت های بزرگی هم با YII زدم. تستی هم که بنده خودم گرفتم سیمفونی سرعتش با apc خیلی به فالکون نزدیک شد و از Yii با فعال YiiLite و بودن APC بیشتر بود. بازم تست میکنم که خدایی نکرده اشتباه نکرده باشم. البته اینم بگم که توی تست های انجام شده از Propel استفاده کردم که اونم اکتیو رکورد حساب میشه و سرعتش خیلی بیشتر از Doctrine هست. البته یه مزیت بزرگ YII توابع کش خوبی هست که داره که توی سیمفونی معادلش به صورت پیشفرض موجود نیست یا حداقل من ندیدم. مزیت دیگه YII پشتیبانی از وب ۲ هست که توی سیمفونی موجود نیست. نمیدونم واسه لاراول این مورد رو اضافه کردند یا نه ولی من واسه خودم توی سیمفونی اضافه کردم. در کل سیمفونی از نظر من برای پروژه های بزرگ مناسب هست و پروژه های متوسط و کوچکتر، YII‌ انتخاب مناسبتری هست.

پینوشت: مجدد بررسی کردم. YII 1 سریعتر بود ولی Yii 2 کندتر بود که فعلا نمیشه به دلیل الفا بودن این مورد رو حساب کنیم. البته این اختلاف برای مثال معروف Hello World بود و توی برنامه واقعی اختلاف بسیار ناچیز بود.

mamal72
چهارشنبه 28 اسفند 1392, 22:01 عصر
اگه میشه لینک این پنچمارکهای بیطرف که گفتن لاراول سریعتر از Yii بوده رو بگذارین تا بیطرفیشون رو بررسی کنیم.

من چند تایی قبلاً‌ دیده بودم که با یه سری کارا سریعتر شده بود. در حالت کلی معمولاً یی سریعتره ولی توی این یکی این طور نبود. البته این بنچمارک کاملی نیست. به هر حال، این لینک:

http://systemsarchitect.net/performance-benchmark-of-popular-php-frameworks/

MMSHFE
چهارشنبه 28 اسفند 1392, 22:11 عصر
خوب درهرصورت چیزی که مشخصه اینه که این بنچمارک کامل و دقیق نیست چون از Skeleton هر فریمورک برای تست استفاده کرده و امکانات پروژه Skeleton یا همون Scaffolding که هر فریمورک میسازه با فریمورک دیگه متفاوته و درنتیجه تفاوت در نتیجه ها پیش میاد که البته خودش هم اشاره کرده. ضمناً فقط به RPS (تعداد درخواست در ثانیه) اشاره کرده و برای مثال نگفته چند مورد با موفقیت پردازش شده و چند مورد Drop شده و مصرف حافظه چطور بوده و...

rezakho
پنج شنبه 29 اسفند 1392, 12:24 عصر
خوب عید همگی پیشاپیش مبارک باشه
انشالله امسال، سال گشایش گره های کشور و مردم باشه

من از کلاس های Request و Response و Cookie و Session و ... فعلا میگذرم
اینها هم همون ساختار و سینتکس کوتاه رو که تا به حال دیدید، دارند

بریم سراغ template
لاراول از موتور blade که داخلی خودش هست برای templating استفاده میکنه
کم حجم، سریع، و ساده
در حالت معمول در بلید، layout در ویو مشخص میشه و میتونه در کنترلر هم مشخص بشه
همچنین layout میتونه شامل چند قطعه باشه که هر کدام از طریق ویو قابل مقدار دهی هستند
محتوای هر قطعه میتونه در داخل ویو، append یا prepend و یا replace بشه
بلید از ویو های تو در تو و include کردن ویو ها هم پشتیبانی میکنه
بلید همچنین از ساختارهای کنترلی مثل if و foreach , ... برای کوتاه کردن کدها، پشتیبانی میکنه
از همه مهمتر به راحتی قابل توسعه و گسترش هست
ضمنا ویو ها و لیوت های پردازش شده اوتوماتیک کش شده و در صورت عدم تغییر، دوباره پردازش نمیشند


ساختار یک layout


<html>
<body>
@section('sidebar')
This is the master sidebar.
@show

<div class="container">
@yield('content')
</div>
</body>
</html>

استفاده از layout و مقداردهی قطعه ها
کد زیر از لیوت master واقع در پوشه layouts استفاده میکنه
در قطعه sidebar اول مقدار پیشفرض خود لیوت و بعد مقدار جدید رو قرار میده
در قطعه content هم مقدار مورد نظر قرار داده میشه


@extends('layouts.master')

@section('sidebar')
@parent

<p>This is appended to the master sidebar.</p>
@stop

@section('content')
<p>This is my body content.</p>
@stop

مابقی در پست های بعد

MMSHFE
پنج شنبه 29 اسفند 1392, 14:01 عصر
خوب Yii از این نظر خیلی منعطف تر و بهتر عمل کرده (بنظر من). بطور پیشفرض توی Yii نسخه 1.1 از BluePrint CSS و توی نسخه 2 از Bootstrap برای قالب استفاده شده و موتور قالب خاصی به کار نرفته هرچند به راحتی میتونه با Smarty و RainTPL و Twig و... ادغام بشه. اما ساختار فایلهای View در Yii به این صورته:
1- تم (Theme)
توی فایل تنظیمات میتونیم تم رو انتخاب کنیم (توی Yii هر تم میتونه فایلهای ویوی خاص خودش رو داشته باشه و به راحتی با تغییر یک پارامتر توی فایل تنظیمات، میشه تم رو عوض کرد) :


return array(
...
'theme'=>'mytheme',
...
);

اگه تم تعریف کنیم، فایلهای ویو از مسیر webroot/themes/mytheme/views خونده میشه (که mytheme اسم تمی هست که توی تنظیمات مشخص کردین) وگرنه از مسیر webroot/protected/views این فایلها مورد دستیابی قرار میگیره. ضمناً هر تم میتونه حاوی فایلهای CSS و JS و... مختص خودش باشه.
2- فایلهای Layout
توی هر کنترلر (یا کنترلر والد یعنی protected/components/Controller.php) میتونیم یک فیلد public بگذاریم که مشخص میکنه از چه layout خاصی باید استفاده بشه:


public $layout = '//layouts/layout1';
// or
public $layout = '/layouts/layout1';

اینجا اگه از // استفاده بشه، دنبال پوشه layouts توی مسیر ریشه تم یا مسیر ریشه views میگرده ولی اگه از / استفاده کنیم، برای هر ماژول میتونیم پوشه views داخلش بسازیم و layout مخصوص همون ماژول رو تولید کنیم و این یعنی هر ماژول میتونه به شکل متفاوتی ظاهر بشه (حتی با تم مختلف - برای مثال، سایت اصلی با یک قالب و بخش مدیریت با یک قالب دیگه ظاهر بشه و هر زمان خواستیم، قالب هرکدوم رو بطور جداگانه بتونیم تغییر بدیم)
ضمناً امکان تنظیم کردن layout بصورت جداگانه برای هر اکشن هم وجود داره. مثال:


class UserController extends Controller {
public $layout = '//layouts/layout1';
public function actionIndex() {
// uses layout1
}
public function actionView($id) {
$this->layout = '//layouts/layout2';
// uses layout2
}
}

ساختار یک Layout نمونه:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="language" content="en" />

<!-- blueprint CSS framework -->
<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/screen.css" media="screen, projection" />
<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/print.css" media="print" />
<!--[if lt IE 8]>
<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/ie.css" media="screen, projection" />
<![endif]-->

<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->theme->baseUrl; ?>/css/main.css" />
<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/form.css" />

<title><?php echo CHtml::encode($this->pageTitle); ?></title>
</head>

<body>

<div class="container" id="page">

<div id="header"></div><!-- header image is embeded into the #header declaration in main.css -->

<div id="mainmenu">
<?php $this->widget('zii.widgets.CMenu',array(
'items'=>array(
array('label'=>'Projects', 'url'=>array('/project')),
array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about')),
array('label'=>'Contact', 'url'=>array('/site/contact')),
array('label'=>'Admin', 'url'=>array('/admin/default/index'), 'visible'=>Yii::app()->user->checkAccess("admin")),
array('label'=>'Login', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest),
array('label'=>'Logout ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest)
),
)); ?>
</div><!-- mainmenu -->
<?php if(isset($this->breadcrumbs)):?>
<?php $this->widget('zii.widgets.CBreadcrumbs', array(
'links'=>$this->breadcrumbs,
)); ?><!-- breadcrumbs -->
<?php endif?>

<?php echo $content; ?>

<div class="clear"></div>

<div id="footer">
Copyright &copy; <?php echo date('Y'); ?> by TrackStar.<br/>
All Rights Reserved.<br/>
<?php echo Yii::powered(); ?>
</div><!-- footer -->

</div><!-- page -->

</body>
</html>

کمی بنظر ممکنه پیچیده بیاد ولی دقت کنید: این یک فایل HTML ساده است! یعنی فایلهای Layout در Yii یک قالب ساده HTML هستن که محتوای خروجی viewها رو میتونید در محل دلخواه با دستور زیر نمایش بدین:

<?php echo $content; ?>
3- فایلهای View
فایلهای ویو توی پوشه views (در مسیر تم یا مسیر پیشفرض ویوها) قرار میگیرن و وقتی تم تعریف کنیم، Yii اول توی پوشه views از مسیر تم دنبالش میگرده و اگه پیدا نکرد، توی پوشه views اصلی (داخل protected) دنبالش میگرده. ساختار یک یک فایل view نمونه:


<?php $this->pageTitle=Yii::app()->name; ?>

<h1>Welcome to <i><?php echo CHtml::encode(Yii::app()->name); ?></i></h1>

<?php if(!Yii::app()->user->isGuest):?>
<p>
You last logged in on <?php echo Yii::app()->user->lastLogin; ?>.
</p>
<?php endif;?>

اگه دقت کنید، این هم یک فایل HTML ساده است. حالا چطوری این رو باید صدا بزنیم؟ فرض کنید توی کنترلر SiteController چنین دستوری داریم:

$this->render('index');
خوب این کد ساده باعث میشه دنبال فایل index.php (همون ویوی بالا) توی پوشه site (همنام با کنترلر) در پوشه views (اول توی پوشه تم و اگه نبود، توی پوشه views اصلی) بگرده و اون رو پردازش کنه. کل خروجی این ویو تحت عنوان متغیر content$ به فایل layout جاری (در اینجا layout1) داده میشه که در مکان دلخواه با دستوری که گفتیم (;echo $content) نشونش بده.
4- استفاده فایلهای Layout از هم (Layoutهای واسط)
فرض کنید من چند Layout فرعی دارم (مثلاً یک ستونه و دو ستونه و...) که اینها Body صفحه من رو میسازن و من میخوام همه اینها توی یک Layout کلی و بزرگتر (شامل Header و Footer و...) قرار بگیره. کافیه توی Layoutهای فرعی اینطوری کار کنم:


<?php $this->beginContent('//layouts/main'); ?>
<div id="content">
<?php echo $content; ?>
</div><!-- content -->
<?php $this->endContent(); ?>

در اینجا اگه این Layout به اسم فرضی views/layouts/column1 ذخیره شده باشه و منبیام توی یک کنترلر بگم:

public $layout = '//layouts/column1';
باعث میشه وقتی میگم (...)this->render$ هر فایل view که برای رندر انتخاب کردم، خروجی خودش رو تحت عنوان content$ به column1 بده و این layout هم اون محتوا رو توی div با "id="content میگذاره و باز خروجی خودش رو تحت عنوان متغیر content$ به layout اصلی یعنی //layouts/main یعنی فایل views/layouts/main.php میده که میتونه در مکان مناسب (بین Header و Footer) اون رو echo کنه.
5- ارتباط بین Viewها با هم
توی Yii علاوه بر دستور render دستورات دیگری هم در اختیار کنترلر هست. برای مثال:
renderPartial (یک ویو رو رندر میکنه ولی مستقیماً خروجی رو چاپ میکنه و تحویل Layout نمیده)
renderText (یک متن ساده رو رندر میکنه و تحویل Layout میده - برای مواقعی که میخواین یک متن ساده رو توی قالب صفحه نشون کاربر بدین و نمیخواین فایل View جداگانه براش بسازین).
...
اما کاربرد اینها چه ارتباطی به رابطه Viewها با هم داره؟ ربطش اینه که توی Viewهای در Yii با کمک متغیر this$ به شئ کنترلر دسترسی داریم و مثلاً توی یک ویو (فرضاً user/index) میتونیم این دستور رو بنویسیم:

$this->renderPartial('user/login');
که باعث میشه فرم لاگین (محتوای views/site/login.php) توی صفحه index (محتوای views/site/index.php) هم ظاهر بشه.
5- ارسال پارامتر به ویو توسط کنترلر
توی Yii میشه به دو روش برای View پارامتر فرستاد.
روش اول دسترسی مستقیم به فیلدهای کنترلر هست:


// in controller action
$this->x = 'ali';
$this->render('index');

// in index.php view file
echo $this->x; // output: ali

روش دوم، تعریف پارامتر مستقیماً برای خود View هست:


// in controller action
$this->render('index', array('x' => 'ali'));

// in index.php view file
echo $x; // output: ali

یعنی درواقع عناصر آرایه ای که اونطرف میفرستیم، اینطرف تبدیل به متغیرهای مستقل میشن.
-----
شاید بگین هنوز به این چیزها نرسیده بودیم و باز من جلو جلو جواب دادم ولی خواستم همین اول کار بگم وارد این مبحث نشین چون لاراول رسماً کم میاره. برای مثال معادل همین امکانات رو خوشحال میشم بدونم لاراول چطوری پیاده سازی میکنه.

bestirani2
پنج شنبه 29 اسفند 1392, 14:55 عصر
لاراول از موتور blade که داخلی خودش هست برای templating استفاده میکنه

از حق نگذریم طراحی ویو با php اصلا جالب نیست و خلاف ایده ال های طراحی هست ولی اکستشن های زیادی برای Yii هم وجود داره که میتونه یه template رو برای Yii بیاره، به بیان دیگه Yii امکان پیاده سازی و استفاده از Template رو قرار داده و توی نسخه 2 هم به صورت پیشفرض دو موتور Twig و Smarty رو قرار داده. موتور blade هم میشه گفت تقلید کاملی از موتور Razor هست و ابتکار خاصی نیست.



در حالت معمول در بلید، layout در ویو مشخص میشه و میتونه در کنترلر هم مشخص بشه
همچنین layout میتونه شامل چند قطعه باشه که هر کدام از طریق ویو قابل مقدار دهی هستند

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



محتوای هر قطعه میتونه در داخل ویو، append یا prepend و یا replace بشه

منظورتون احتمالا Section یا همون Block موتور Twig هست، Yii هم این عملیات رو با clips پیاده سازی میکنه.



ضمنا ویو ها و لیوت های پردازش شده اوتوماتیک کش شده و در صورت عدم تغییر، دوباره پردازش نمیشند

چون در Yii به صورت php کد میشه نیازی به کش نیست ولی از موتور های دیگه استفاده بشه امکان کش شدن هم هست.

در کل تا اینجا به نظرم دو فریم ورک برابرند ولی Yii چون از Theme پشتیبانی میکنه در این بخش پیروز میدان هست.

rezakho
پنج شنبه 29 اسفند 1392, 17:33 عصر
خوب Yii از این نظر خیلی منعطف تر و بهتر عمل کرده (بنظر من).

خیلی زود قضاوت کردید


بطور پیشفرض توی Yii نسخه 1.1 از BluePrint CSS و توی نسخه 2 از Bootstrap برای قالب استفاده شده و موتور قالب خاصی به کار نرفته هرچند به راحتی میتونه با Smarty و RainTPL و Twig و... ادغام بشه

شما استفاده از یک کتابخونه css رو مزیت فریمورک میدونید؟؟؟
لاراول هم اونجاهایی که html تولید میکنه، در صورت نیاز از شیوه نامه های bootsrtap استفاده کرده
همونطور که گفتید yii موتور قالب داخلی نداره. ضمنا لاراول هم میتونه با دیگر موتورهای قالب کار کنه
پس میبینید که yii جایی بهتر عمل نکرده و حتی به قول خودتون کم هم آورده تا اینجا

و اما ادامه

1- تم (Theme)


توی فایل تنظیمات میتونیم تم رو انتخاب کنیم (توی Yii هر تم میتونه فایلهای ویوی خاص خودش رو داشته باشه و به راحتی با تغییر یک پارامتر توی فایل تنظیمات، میشه تم رو عوض کرد)

و


در کل تا اینجا به نظرم دو فریم ورک برابرند ولی Yii چون از Theme پشتیبانی میکنه در این بخش پیروز میدان هست.

به قول خودتون: کدهای لاراول رو بسپارید به اهلش!، نه تنها لاراول از تم ها پشتیبانی میکنه، بلکه میتونید چند مسیر رو برای جستجو ویوها مشخص کنید


'paths' => array(__DIR__.'/../views', __DIR__.'/../theme1', __DIR__.'/../theme2'),

که برای رندر کردن یک ویو یا لیوت درون مسیرهای بالا سرچ رو انجام میده و برای عوض کردن تم هم کافیه نام پوشه تم جدید رو به جای پوشه تم پیشفرض بگذاریم

2- فایلهای Layout


توی هر کنترلر (یا کنترلر والد یعنی protected/components/Controller.php) میتونیم یک فیلد public بگذاریم که مشخص میکنه از چه layout خاصی باید استفاده بشه

مشخص کردن لیوت در کنترلر


class UserController extends BaseController {
protected $layout = 'layouts.master';
...
}


ضمناً امکان تنظیم کردن layout بصورت جداگانه برای هر اکشن هم وجود داره.


public function index()
{
$this->layout = 'layouts.guest';
}


و حتی میتوان نام مستعار برای ماژول ها و یا تم ها نسبت داد که ویو را متناسب با نوع مازول و ... لود کرد


View::make('moduleName::viewName');




کمی بنظر ممکنه پیچیده بیاد ولی دقت کنید: این یک فایل HTML ساده است! یعنی فایلهای Layout در Yii یک قالب ساده HTML هستن که محتوای خروجی viewها رو میتونید در محل دلخواه با دستور زیر نمایش بدین

مگر در لاراول لیوت html غیر ساده هست؟!
در لاراول میتونید به جای یک content$، چند به اصطلاح متغیر داشت، حالا به چه درد میخورند؟، مثلا بدون عوض کردن لیوت میشه منوها رو کم یا زیاد یا عوض کرد، فوتر، کپی رایت و هر جایی از صفحه رو، با این نکته که موتور بلید روی همه قسمت ها پردازش انجام میده! و صرفا متغیر php خام نیستند مثل yii!

3- فایلهای View

در لاراول از داخل ویو ها هم امکان ست کردن لیوت وجود داره، ضمن اینکه ویو میتونه به تمام قسمت های تعریف شده در لیوت دسترسی داشته و تغییر هم اعمال کنه که توی مورد قبل گفته شد


@extends('layouts.master')

@section('head')
....
@stop

@section('content')
...
@stop

@section('footer')
...
@stop

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


View::make('index');
View::make('content.index');
View::make('content.crud.index');
View::make('alias::index');


4- استفاده فایلهای Layout از هم (Layoutهای واسط)

فراخوان ویو دیگه و یا ارسال پارامتر به ویو و فراخوانی
(توضیحات همانند پست شما)


@include('viewName')
//or
@include('viewName', array('some'=>'data'))


5- ارتباط بین Viewها با هم

(توضیحات همانند پست شما)


$view = View::make('user.login');


6- ارسال پارامتر به ویو توسط کنترلر

روش اول توسط کنترلر و اکشن


class UserController extends BaseController {
protected $layout = 'layouts.master';

public function showProfile()
{
$this->layout->content = View::make('user.profile');
}
}

روش دوم ارسال برای خود ویو
x$ در ویو ایجاد میشود


View::make('index', array('x' => 'ali'));


روش سوم ارسال برای خود ویو
تعداد with ها نا محدود


View::make('index')
->with('x', 'ali')
->with('some', 'date');


روش چهارم ارسال برای خود ویو


View::make('index')
->withX('ali')
->withSome('date');


روش پنجم به اشتراک گذاشتن داده ها در تمام ویوها


View::share('name', 'Steve');


روش ششم ارسال یک ویو به یک ویو دیگه به عنوان زیر-ویو


View::make('mainView')->nest('variable', 'childView', $data);




شاید بگین هنوز به این چیزها نرسیده بودیم و باز من جلو جلو جواب دادم ولی خواستم همین اول کار بگم وارد این مبحث نشین چون لاراول رسماً کم میاره. برای مثال معادل همین امکانات رو خوشحال میشم بدونم لاراول چطوری پیاده سازی میکنه.

امیدوارم به جوابتون رسیده باشید!
حالا خودتون بگید، لاراول کم آورده یا یی! البته من علاقه دارم به لاراول، ولی عاشق تعصبیش نیستم!
هر کس که نگاه تعصبی نداشته باشه، گواهی میده که لاراول اینجا هم سرتر هست

اگر چه ساختارهای کنترلی و ناظرهای ویو و ... هنوز مونده که اونا رو هم خواهم گفت

MMSHFE
پنج شنبه 29 اسفند 1392, 17:55 عصر
دوست عزیز، خیلی از این امکانات بخاطر موتور قالب Blade هست که Yii هم بطور توکار از Twig پشتیبانی میکنه و میشه درصورت نیاز ازش استفاده کرد ولی بدون موتور قالب هم خیلی از این امکانات رو داره. برای مثال به راحتی میشه با Clips بخشهای مختلف سایت رو به نحوی طراحی کرد که کاربر بتونه محل چیدمان بخشهای صفحه رو خودش تنظیم کنه و به راحتی بتونیم هر بخش رو در محلی که کاربر انتخاب کرده نشون بدیم. اما درمورد روشهای ارسال مقادیر که لاراول طبق گفته شما 6 روش ارائه کرده، دلیلی برای این کار وجود نداره چون اگه بخوایم برای یک ویو بفرستیم، این روش کافیه:

$this->render('user/view', array('id'=>5));
و اگه بخوایم برای همه ویوها قابل استفاده بشه، باز این روش کافیه:


$this->id = 5;
$this->render('site/index');

و توی همه ویوهای فرعی و... هم با this->id$ بهش دسترسی داریم. قبلاً هم گفتم اینکه یک فریمورک چند راه برای رسیدن به یک نتیجه ارائه بده مزیت نیست! مثلاً برای انجام روش ششم که شما اشاره کردین، اینطوری مینویسیم:


// in controller
$this->render('index', array('id'=>5));
// in index.php view
echo $id;
$this->renderPartial('view', artay('id'=>$id));
// in view.php view
echo $id;

// OR

// in controller
$this->id= 5;
$this->render('index');
// in index.php view
echo $this->id;
$this->renderPartial('view');
// in view.php view
echo $this->id;

ببینید چقدر ساده و با وحدت رویه همه جا عمل میشه! دیگه نیازی نیست کاربر with و withX و nest و share و make و چه میدونم include و section و stop و extends و اسامی مستعار و تنظیم مسیر و... رو بخواد یاد بگیره و به خاطر بسپره. امروزه دنیا داره به سمت ساده تر شدن کدها (البته سادگی اصولی نه اینکه صرفاً کوتاه شدن کد منظورمون باشه) پیش میره. اون جاهایی که لاراول کدهای بهینه تری داشت من قبول کردم که بهتر از Yii عمل کرده ولی در این مورد امیدوارم قبول کنید که Yii ساختار قابل درک تری داره.
ضمناً اینکه گفتین متغیرها توی Yii صرفاً متغیر ساده هستن! هم بخاطر اینه که وقتی از موتور قالب استفاده نکنیم، درستش همینه و متغیر، متغیره و تفسیر و توضیح نداره ولی اگه از موتور قالب استفاده کنیم (حالا هرچی میخواد باشه)، اونوقته که بحث تفسیرها میاد وسط و اینجا Yii هم چیزی کم نداره چون اصلاً مربوط به Yii و لاراول نیست و این کار، وظیفه موتورهای قالبه که متغیرها رو تفسیر کنن. تمام امکاناتی که گفتین (حلقه و...) رو Yii هم توی موتورهای قالب پشتیبانی میکنه.
یک نکته دیگه اینکه همین استفاده از موتور قالب و فعال بودنش بطور پیشفرض هم یکی از دلایل Performance پایینتر لاراول نسبت به Yii هست و بین اینهمه موتور قالب هم سر Performance دعواست. برای مثال Smarty موتور قالب فوق العاده قدرتمندیه ولی RainTPL خیلی محبوبتره بخاطر اینکه با 5 تا function همه کارهایی که توی 90٪ پروژه ها لازمه رو انجام میده و سازندگانش اون رو پیچیده و سنگین و کند نکردنش. کسی هم که امکانات زیاد موردنظرش باشه میره سراغ همون اسمارتی. Twig هم که موتور پیشفرض و رسمی Yii هست (ولی برخلاف لاراول بطور پیشفرض فعال نیست)، از نظر Performance و امکانات در حد وسط بین اسمارتی و RainTPL قرار داره.


امیدوارم به جوابتون رسیده باشد!
اگر چه ساختارهای کنترلی و ناظرهای ویو و ... هنوز مونده که اونا رو هم خواهم گفت
بله به جوابم رسیدم: لاراول خیلی ضعیف تر از Yii در این مورد عمل کرده (ازنظر فنی میگم نه حجم دستورات و امکانات غیر ضروری).
اگه ساختارهای کنترلی و ناظرها و... هم مربوط به موتور قالب Blade هست ازشون صرفنظر کنید چون بحث ما امکانات فریمورکهاست نه موتورهای قالب.

rezakho
پنج شنبه 29 اسفند 1392, 18:18 عصر
دوست عزیز، خیلی از این امکانات بخاطر موتور قالب Blade هست

بلید چیز جدایی از لاراول نیست، اگرچه یک موتور قالب هست، ولی جزو هسته لاراول هست



ببینید چقدر ساده و با وحدت رویه همه جا عمل میشه! دیگه نیازی نیست کاربر with و withX و nest و share و make و چه میدونم include و section و stop و extends و اسامی مستعار و تنظیم مسیر و... رو بخواد یاد بگیره و به خاطر بسپره

سادگی از منظر شما اینه؟!
فرق اساسی لاراول با یی میدونید چیه؟
اینه که لاراول با کدهای روان و قابل فهمتر از یی، به برنامه نویس این امکان رو میده که به جای درگیر شدن با خود فریمورک، به روش حل بهتر مسئله فکر کنه.



یک نکته دیگه اینکه همین استفاده از موتور قالب و فعال بودنش بطور پیشفرض هم یکی از دلایل Performance پایینتر لاراول نسبت به Yii هست

جالبه که یی توی مقایسه پرفورمنس ها بدون کش هیچی نیست! ولی وقتی فریمورک دیگه ای از کش صحبت کنه، شما سریع موضع میگیرید؟! بلید از کش استفاده میکنه و حتی کدهای خام Php رو هم مجدد اجرا نمیکنه در ویوها بر خلاف یی!، اونوقت چطور و بر اساس کدوم استدلال! مدعی میشید باعث پایین اومدن کارایی هست؟؟؟



بله به جوابم رسیدم: لاراول خیلی ضعیف تر از Yii در این مورد عمل کرده (ازنظر فنی میگم نه حجم دستورات و امکانات غیر ضروری).

نظر شما برای خودتون هست و محترم، صلاح کار خویش خسروان دانند!



اگه ساختارهای کنترلی و ناظرها و... هم مربوط به موتور قالب Blade هست ازشون صرفنظر کنید چون بحث ما امکانات فریمورکهاست نه موتورهای قالب.

نه، چرا صرف نظر کنم! بلید جزو هسته لاراول هست و گفتنش خالی از لطف نیست
اینم جالبه که شما و دوستان یی کارتون، بیشتر مواردی که در یی وجود نداره رو غیر ضروری، غیر اصولی، اضافه، سخت!!! و ... میدونید و الان هم که میگید جزو فریمورک نیست! صرف نظر کن!

bestirani2
پنج شنبه 29 اسفند 1392, 18:24 عصر
به قول خودتون: کدهای لاراول رو بسپارید به اهلش!، نه تنها لاراول از تم ها پشتیبانی میکنه، بلکه میتونید چند مسیر رو برای جستجو ویوها مشخص کنید

این مورد که شما گفتید مربوط میشه به تنظیم فولدر ویو که از طریق فایل view.php داخل فولدر کانفیگ انجام میدید که Yii هم همچین کاری رو میتونید داخل تنظیمات انجام بدید و با بحث Theme فرق میکنه.
البته در صورتی که بشه تنظیمش رو داینامیک عوض کرد که احتمالا بشه میشه راحت یه تابع برای تغییر Theme نوشت که لاراول انجام نداده متاسفانه.

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

rezakho
پنج شنبه 29 اسفند 1392, 18:30 عصر
این مورد که شما گفتید مربوط میشه به تنظیم فولدر ویو که از طریق فایل view.php داخل فولدر کانفیگ انجام میدید که Yii هم همچین کاری رو میتونید داخل تنظیمات انجام بدید و با بحث Theme فرق میکنه.

شما فقط با اسمش مشکل داری؟ مگه کارش فرق میکنه عزیزم


البته در صورتی که بشه تنظیمش رو داینامیک عوض کرد که احتمالا بشه میشه راحت یه تابع برای تغییر Theme نوشت که لاراول انجام نداده متاسفانه.

شما مثل اینکه عادت داری بدون اطلاع نظر بدی!
محض اطلاع


Config::set('view.paths', '../theme');




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

هر کاری رو هر جایی میشه انجام داد، ولی این جملتون:"ولی به نحوه ساده تر" واقعا جالب بود!!!

MMSHFE
پنج شنبه 29 اسفند 1392, 19:15 عصر
فرق اساسی لاراول با یی میدونید چیه؟
اینه که لاراول با کدهای روان و قابل فهمتر از یی، به برنامه نویس این امکان رو میده که به جای درگیر شدن با خود فریمورک، به روش حل بهتر مسئله فکر کنه.
خیلی جالبه. تمام امکاناتی که گفتین لاراول توی بحث Layoutها و ویوها داره رو Yii کلاً با حداکثر 3 متد در اختیار کاربر گذاشته و اونوقت لاراول که کلی مفاهیم رو باید برای استفاده مناسب از موتور قالبش یاد بگیریم، کدهاش قابل فهمتره و امکان میده بجای درگیر شدن با خود فریمورک، به روش حل بهتر مسئله فکر کنه؟! این حرفتون رو به حساب شوخی اول سال میگذارم و امیدوارم بهش معتقد نباشین و قصدتون مزاح بوده باشه چون حداقل درمورد ویوها و کار با قالب، لاراول درمقابل سادگی کار Yii هیچ حرفی برای گفتن نداره.

جالبه که یی توی مقایسه پرفورمنس ها بدون کش هیچی نیست! ولی وقتی فریمورک دیگه ای از کش صحبت کنه، شما سریع موضع میگیرید؟! بلید از کش استفاده میکنه و حتی کدهای خام Php رو هم مجدد اجرا نمیکنه در ویوها بر خلاف یی!، اونوقت چطور و بر اساس کدوم استدلال! مدعی میشید باعث پایین اومدن کارایی هست؟؟؟
هیچکس نگفت کش خوب نیست. حرفهایی که یک کاربر میزنه رو در جواب یک کاربر دیگه پاسخ ندین. هرچند ایشون گفتن کش کردن کدهای قالبی که کد PHP باشه کاربرد خاصی نداره که حرفشون هم صحیحه چون کدها پویاست و اینکه بخوایم چک کنیم ببینیم همون خروجی قبلی تولید میشه یا نه هم بهرحال نیازمند تفسیر کدهاست و درنتیجه کش کردن کد پویا واقعاً بیمعناست. اما بد نیست بدونید Yii بدون کش هم از لاراول سریعتره اما با کش خیلی سریعتره. لطفاً بدون دانش و غیرعلمی صحبت نکنید. اینکه گفتین حتی کدهای خام PHP رو هم مجدد اجرا نمیکنه رو از کجا درآوردین؟ از کجا میدونه همون خروجی قبلی داره تولید میشه (حتماً میدونید که یک کد PHP حتی بدون تغییر سورس هم میتونه نتایج مختلفی تولید کنه - فرض کنید جایی توی قالب، Timestamp رو echo کردیم). حالا از کجا میخواد بدونه این کد خروجی متفاوت با محتوای کش تولید میکنه؟ نباید پردازش کنه تا این رو بفهمه؟!
اما حالا که صحبت کش کردن قالب شد بد نیست بدونید Yii چندین مدل کش داره:
کش نتایج کوئریهای دیتابیس
کش بخشی از صفحه (ویو)
کش کل صفحه (ویو)
...
حالا لاراول توی بحث کش ویو چی داره که Yii نداره و اینقدر شما بخاطرش دارین سروصدا میکنین؟

نه، چرا صرف نظر کنم! بلید جزو هسته لاراول هست و گفتنش خالی از لطف نیست
اشکالی نداره. شما امکانات موتور قالب رو بگین، من هم معادل همونها رو بدون موتور قالب میگم ببینیم درک کدوم کد راحتتره، قضاوت هم با خوانندگان این تاپیک. بعد در انتها نحوه پیاده سازی همونها رو با موتور قالب Twig یا Smarty یا RainTPL توی Yii میگم ببینید کدهای لاراول رسماً باعث شرمندگی میشن یا نه (حداقل در این مورد تجربه کافی دارم و توی فارومهای انگلیسی خیلی بحث کردیم).

اینم جالبه که شما و دوستان یی کارتون، بیشتر مواردی که در یی وجود نداره رو غیر ضروری، غیر اصولی، اضافه، سخت!!! و ... میدونید و الان هم که میگید جزو فریمورک نیست! صرف نظر کن!
کسی نگفت موتور قالب توی Yii وجود نداره. گفتیم بطور پیشفرض فعال نیست (ولی میشه به راحتی فعالش کرد) چون خیلی از پروژه ها به موتور قالب احتیاج ندارن و اگه بخواین بگین موتور قالب باعث کاهش Performance نمیشه دیگه رسماً به دانش پایه برنامه نویسیتون شک میکنم. اون مواردی رو هم که من گفتم غیرضروریه (مثل کلاس File توی لاراول)، میتونید از هر کسی که برنامه نویسی حالیشه (نه کدنویسی) بپرسین و بخواین استدلالی که گذاشتم رو بخونه و اگه حرفم رو تأیید نکرد، حق با شماست و من اشتباه کردم که گفتم ضروری نیست!
-----
پی نوشت: من رفتم واسه تحویل سال سر سفره باشم، بقیه بحثها باشه واسه سال جدید! سال نوی همه پیشاپیش مبارک.

MMSHFE
پنج شنبه 29 اسفند 1392, 19:19 عصر
شما فقط با اسمش مشکل داری؟ مگه کارش فرق میکنه عزیزم
بله دوست عزیز، بحث Theme با مسیردهی Viewها فرق میکنه. دقت کنید که توی Theme میتونید به راحتی فایلهای CSS و JS و... رو جداگانه برای هر Theme توی پوشه خودش بگذارین و بین پروژه ها، Theme های مختلف رو مورد استفاده مجدد قرار بدین و هر بخشی از پروژه از یک Theme اختصاصی استفاده کنه.

شما مثل اینکه عادت داری بدون اطلاع نظر بدی!
دوست عزیز، ایشون گفتن: «که احتمالاً بشه». پست رو کامل بخونید بعد دیگران رو متهم به نظر دادن بدون اطلاع کنید.

هر کاری رو هر جایی میشه انجام داد، ولی این جملتون:"ولی به نحوه ساده تر" واقعا جالب بود!!!
توی پست قبلی گفتم، تعریف ما و شما از سادگی خیلی فرق میکنه.

bestirani2
پنج شنبه 29 اسفند 1392, 19:35 عصر
شما فقط با اسمش مشکل داری؟ مگه کارش فرق میکنه عزیزم

عزیز بحث اسم نیست. به هر حال همشون با php نوشته شده و هر کاری طبیعتا میتونند انجام بدند. فریم ورک باید ابزاری فراهم کنه که این کار راحت انجام بشه
خودتون بگید؟ واسه عوض کردن تم چند تا ویو رو پاس بدید به کانفیگ بهتره یا بگید تم عوض بشه؟ خود Yii هم میشه با تغییر همون path، قالب رو عوض کرد ولی برای راحتی منو شما اومده این امکان رو فراهم کرده + داخل تم امکانات دیگه ای هم فراهم شده و تغییر ادرس پچ ویو است.



شما مثل اینکه عادت داری بدون اطلاع نظر بدی!
خوب بخونید نوشتم که احتمالاً میشه چون طبیعیش هم این هست که احتمال بالا بشه ولی چون اطلاع نداشتم شرطی گفتم جمله رو



حتی کدهای خام Php رو هم مجدد اجرا نمیکنه

مگه امکان داره؟ اینطوری اگه ورودی ها فرق کنه نتیجه یکسان نمایش داده میشه؟! احتمالاً شما یک اکشن یا کنترل رو کش میکنید که در این صورت دیگه نیازی به پی اچ پی نیست ولی مشکل اینه با تغییر اطلاعات دیتابیس و ورودی صفحه تغییر نمیکنه که خوشبختانه YII در این مورد خیلی خوب عمل کرده. میشه کش رو طوری تعیین کرد تا در صورت تغییر دیتابیس یا ورودی، از نو ایجاد بشه از طرفی نسبت به کاربر هم میتونه حساس باشه مثلاً برای کاربران مهمان یه کش رو نشان بده ولی برای هر عضو یه کش جدا. این برای وقتی که اطلاعات کاربر توی صفحه میاد عالی هست. از طرفی حتی میتونیم داخل ویو تنظیم کنیم که کجا باید کش بشه و کجا نشه.

Veteran
جمعه 01 فروردین 1393, 00:28 صبح
اون مواردی رو هم که من گفتم غیرضروریه (مثل کلاس File توی لاراول)

دقیقا؛کاملا غیر ضروری هستند ! چه کاریه وقتی یک کارو میشه با یک فراخوانی یک تابع از خود PHP انجام داد،ما بیایم اونرو دوباره در یک متد قرار بدیم ؟

مثلا این تابع

File::delete($filename);

public function delete($paths)
{
$paths = is_array($paths) ? $paths : func_get_args();

$success = true;

foreach ($paths as $path) { if ( ! @unlink($path)) $success = false; }

return $success;
}
خوده این متد هم داره از تابع unlink استفاده میکنه
خب ؟؟ چرا بیایم لقمه رو دوره سرمون بچرخونیم !!!!! و بزاریم توی یک متد !!!
فکر کنم حافظه هم بیخود مصرف میشه :متفکر:
ما قراره کارمون راحتتر بشه !
مثلا برای دسترسی به بانک و اجرای دستورات از ORM استفاده کنیم
و .....
ولی نه به این صورت که یک تابع رو بیایم توی یک متد قرار بدیم !
====

File::requireOnce($some_php_file);


public function requireOnce($file)
{
require_once $file;
}

واااای خدایا مرسی،اگر این متد نبود،من چطور میتونستم یک فایل رو require_once کنم،خدایا شکرت،که Laravel خلق شد و این متد رو در اختیار ما گذاشتن:کف:
و ....



/**
* Move a file to a new location.
*
* @param string $path
* @param string $target
* @return bool
*/
public function move($path, $target)
{
return rename($path, $target);
}

/**
* Copy a file to a new location.
*
* @param string $path
* @param string $target
* @return bool
*/
public function copy($path, $target)
{
return copy($path, $target);
}

/**
* Extract the file extension from a file path.
*
* @param string $path
* @return string
*/
public function extension($path)
{
return pathinfo($path, PATHINFO_EXTENSION);
}

/**
* Get the file type of a given file.
*
* @param string $path
* @return string
*/
public function type($path)
{
return filetype($path);
}

/**
* Get the file size of a given file.
*
* @param string $path
* @return int
*/
public function size($path)
{
return filesize($path);
}

bestirani2
جمعه 01 فروردین 1393, 06:47 صبح
آقای شهرکی تا حالا با این فکر کردید یه تاپیک جامع مقایسه بین تمام فریم ورک ها بزنید؟ از هر بخش میتونید کاربران حرفه ایش رو دعوت کنید تا بیاند. اینطوری افرادی که تازه میخواند تازه یه فریم ورک رو انتخاب کنند به راحتی میتونند فریم ورک مورد نظر رو انتخاب کنند در پایان هم میشه به یک جمع بندی رسید و در پست اول آپدیت کنید.
به نظر من YII واسه سرعت توسعه، وب 2 و پرفورمنس خوبه
لاراول به خاطر سادگی ای که داره. بیشتر کاربران CodeIgniter اومدند سمتش. مثل CodeIgniter ساده است و مفاهیم پیچیده نداره در حین حال قدرتمنده و طبیعی هست که واسه حفظ سادگی، کمتر از YII مهندسی هست.