# زبان های اسکریپتی > PHP > Laravel Framework >  Yii vs Laravel

## rezakho

سلام
مطلب زیر رو برای یکی از دوستان فرستاده بودم، گفتم اینجا هم بگذاریمش
این مطلب مقایسه فریمورک 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

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


توی 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

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

موفق باشید

----------


## MMSHFE

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

----------


## بهزاد علی محمدزاده

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

----------


## rezakho

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

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

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

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

----------


## MMSHFE

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

----------


## rezakho

باشه قبول
اگر صلاح میدونید یک تاپیک جدید باز بشه یا که نه همین جا مورد به مورد بریم جلو ؟

----------


## MMSHFE

فرقی نمیکنه. با توجه به عنوان تاپیک، میتونیم همینجا ادامه بدیم.

----------


## rezakho

خوب من از موارد بالا شروع میکنم
در لاراول میشه به طریق زیر، درخواست رو بدون کنترولر و اکشن هندل کرد
البته بحث مقایسه هست، یعنی کد کمتر و تمیز تر با پیچیدگی کمتر

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

----------


## MMSHFE

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

----------


## rezakho

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

----------


## MMSHFE

از شما که تو این حرفه با سابقه هستین این حرفها واقعاً بعیده. 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

قرار نیست از همه امکانات یک فریم ورک استفاده بشه، ما فقط داریم در این مورد، از روت ساده حرف میزنیم
نمیدونم، اگر نقطه ضعف هست که Symfony و Slim و Silex و Fuel و kohana و .... همه اینجوریند!!!
این مورد رو بگذریم و بگذاریم دیگران قضاوت کنند

----------


## rezakho

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

در کد زیر تمام درخواست هایی که با 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

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

----------


## rezakho

نه، شما درست متوجه قابلیت های گروه بندی نشدید، این جمله من "(فقط بحث سر دسته بندی هست، فعلا به اکشن و کنترولر کاری نداریم، به اونها هم میرسیم)" دقیقا منظورم این بود که به روت ها که اکشن هستند یا کلوژر کاری نداشته باشید
ببینید، فرض کنید همچین آدرس هایی دارید


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

'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

بله، از جزئیات که بگذریم، ببینید لاراول تا 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

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

----------


## rezakho

عرض کردم که به کنترولر و اکشن میرسیم، اینجا فقط منظور دسته بندی بود، وگرنه برای ارسال درخواست ها به کنترولر میشه نوشت Route::controller که دقیقا مثل Yii کار میکنه

----------


## MMSHFE

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

----------


## rezaonline.net

سلام .
میشود یک کلاس برای هندل کردن 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

خوب، مورد سوم

در لاراول به دو طریق مسیرها رو میشه به کنترلر هدایت کرد
موردی که می خوایم در موردش صحبت کنیم 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

به نظر خودتون توی Yii دستتون بازتر نیست ؟
توی همین مقایسه خودتون یه نگاه بندازید :)

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

----------


## rezakho

آقا رضا! آهسته آهسته

----------


## MMSHFE

اینکه توی 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

> آقا رضا! آهسته آهسته


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

----------


## rezakho

حمله!!! 
 :متفکر: 
بگذریم

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

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

----------


## mojtaba.baghban

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

----------


## metal gear solid 4

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

----------


## MMSHFE

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

----------


## rezakho

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

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

> 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

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


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

----------


## engmmrj

آقای *rezakho* در Laravel میشه از چند لاگین استفاده کرد ؟ برای استفاده از معادل setFlash باید باید آگاهی داشته باشیم از اینکه session باز است یا نه ؟

----------


## metal gear solid 4

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


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

----------


## metal gear solid 4

> آقای *rezakho* در Laravel میشه از چند لاگین استفاده کرد ؟ برای استفاده از معادل setFlash باید باید آگاهی داشته باشیم از اینکه session باز است یا نه ؟


بله میشه. و من در پروژه ی فعلیم. با 4 لاگین همزمان میتونم وارد سیستم بشم.

----------


## engmmrj

> بله میشه. و من در پروژه ی فعلیم. با 4 لاگین همزمان میتونم وارد سیستم بشم.


بدون تنظیمات اضافی این کارو کردین ؟

----------


## MMSHFE

> من متعجبم شما چطور این صحبت هارو میکنید. شما که اصولاً برنامه نویسی بدون فریمورک رو ترجیح میدید. ( طبق پست های خودتون ). چرا؟ نمیدونم اما احساس میکنم به خاطر اینه که شاید دست و پاگیر باشه. شاید. ولی این دقیقاً دلیلی میشه که یک فریمورک باید دست برنامه نویس رو باز بزاره. ;) این که ما دقیقاً مطابق با چهارچوب بریم جلو رو کی تعریف کرده؟ کی گفته؟ شما؟ اگر شما میگید کاملاً مرتبط به نوع برنامه نویسی خود شماست. هیچ ارتباطی به من نوعی نداره. من سبک و سیاق خودم رو در برنامه نویسی دارم. شما سبک خودتون. اما یک سبک و قانونی هست که همه ی برنامه نویسا دوسش دارن. اینکه کد رو راحت بشه نوشت. کد رو تمیز بشه نوشت. 
> بله. کد تمیز. توی تمامی مواردی که در مقایسه با لاراول نوشتید کدهای لاراول بدون جانب داری کورکورانه تمیز تر هستند. خواناتر هستند. این رو هرکسی که هیچ اشرافی به این دوفریمورک نداره هم میتونه بفهمه.
> انقدر دم از قانون برنامه نویس نزنید. همونطور که گفتم قوانین هر کس مختص خودشه. درانتهای کار، کد من  و شما هردو یک کار رو انجام میدند. مشتریهای جفتمون هم راضی هستند. اصلاً هم براشون مهم نیست من از قانون و چهارچوب فریمورکم خارج شدم و شما نشدید!!! این قوانین نانوشته ای که میگید فقط دست برنامه نویس ها رو میبنده.


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

----------


## MMSHFE

> بدون تنظیمات اضافی این کارو کردین ؟


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

----------


## metal gear solid 4

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

----------


## MMSHFE

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

----------


## tux-world

سلام. آقای شهرکی فکر کنم با تعصب جلو میبرید بحث رو. بحث سر این که فریم ورکها چه قابلتهایی دارند یا ندارند بحثهو مخصوا سر اینکه چقدر راحتی کار رو به برنامه نویس میده تعریف روتها تو ایی همونطور که خودتون فرمودید مثل الگوریتم ها pregMatch میمونه. لاراول هر بدی که داشته باشه ساده تر و قدرتمند تر به نظر میاد. البته اینطور هم هست. هر دو فریم ورک عالی هستن . ما که اونا رو ننوشتیم. استفاده کننده ایم پس تعصب معنایی نداره. واقع بینانه به موضوع نگاه کنیم

----------


## MMSHFE

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

----------


## tux-world

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

موفق باشید

----------


## MMSHFE

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

----------


## rezakho

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

----------


## MMSHFE

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

----------


## rezakho

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

----------


## MMSHFE

اونو که جواب دادم.

----------


## tux-world

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

----------


## rezakho

1- ست کردم الگوی عمومی در روت ها
این کدی که شما نوشتید مال یک روت هست نه تمام روت ها



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


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

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

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

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

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

----------


## MMSHFE

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

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

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

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

----------


## MMSHFE

توی Yii یکسری eventها از قبل تعریف شده مثل beforeSave یا afterFind و... (*لینک*) ولی درصورت تمایل میشه با 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

> این حرفهایی هم که از بی نظمی در لاراول میزنم فقط حرف من نیست. کافیه کمی توی اینترنت جستجو کنید.


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



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


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



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


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



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


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



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


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



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


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



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


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

موفق باشید

----------


## MMSHFE

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


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



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


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



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


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



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


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



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


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



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


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

----------


## rezakho

در مورد پست آخرم، لاراول هم ایونت های مدل رو داره که بهشون میرسیم

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

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

----------


## MMSHFE

خوبه، پس لاراول در این مورد هم خوب عمل کرده. البته در Yii هم به همین سادگی میشه اتصالهای دلخواه و همزمان رو برقرار کرد.

----------


## rezakho

transaction ها
در لاراول اینجوری میشه بلوکی از دستورات رو به صورت تراکنشی! اجرا کرد که در صورت خطا، به صورت خودکار rollback میشه

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

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


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

DB::beginTransaction();

DB::rollback();

DB::commit();

----------


## engmmrj

در 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

cache  فریمورک Yii هم قابل مقایسه با لاراول نیست !

----------


## rezakho

خواهش کردم تاپیک رو بهم نریزید!
جناب* engmmrj*  	 میشه بفرمایید اگر بخوایم یک مدل از کانکشن اول و یکی دیگه از کانکشن دوم استفاده کنه باید چه کرد؟؟؟
ضمنا داریم قدم به قدم جلو میریم، کو تا کش!!!

----------


## MMSHFE

کافیه به مدل، این متد رو اضافه کنیم:

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

----------


## MMSHFE

> 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

> ضمنا داریم قدم به قدم جلو میریم، کو تا کش!!!


اینو گفتم که یک وقت فکر تون سمت cache نره که به بن بست میرسید !

----------


## rezakho

خوب بریم سراغ 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

لطفاً وقتی از ساختار جدید 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)
> ...


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

----------


## rezakho

چرا، اطلاع دارم، منتها شما لطف کنید هر وقت نسخه stable شد این کدها رو بگذارید، فعلا همون 1.14 رو بنویسید
برای من کاری نداره نسخه dev لاراول رو مثال بزنم

----------


## MMSHFE

برادر من همه اینها مال نسخه 1.1.14 هست. چه ربطی به 2 داره. Syntax رو یه نگاه بنداز. اینم *لینک*

----------


## rezakho

درسته، من چون کد پست قبل شلوغ بود، اشتباه کردم، ولی شما دارید الان از ActiveRecord استفاده میکنید، بحث ما Query Builder بوده

----------


## rezakho

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

----------


## MMSHFE

چه ربطی داره؟ اینکه 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

در ضمن اون آخری، chunk، الان کد شما چند تا میکشه بیرون توی foreach ؟

----------


## rezakho

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

----------


## MMSHFE

> میدونید اشکال کجاست، اشکال اینجاست که من دارم قدم به قدم میرم جلو، ولی شما در جواب میای هر چی تو اون مبحث هست رو به کلی و کمی جلوتر جواب میدید، الان offset و order و ... من اصلا نگفتم، ما اصلا به ORM نرسیدیم!!!


نه اشکال از اون نیست. اینکه من order و... رو گفتم بخاطر اینه که حدس زدم لابد بعدش میخواین سراغ Eloquent برین و گفتم همینجا آب پاکی رو روی دستتون بریزم و بگم ActiveRecord فریمورک Yii تمام اون امکانات رو داره که هیچ، یک سروگردن هم بالاتره و بهتره وقت خودمون و سایرین رو روی ORM نگیرین. شما میاین میگین فلان کار رو توی Yii نمیشه یا به سختی میشه انجام داد، من میام میگم برعکس، هم میشه انجام داد و هم میشه راحت انجام داد و هم میشه کارهای بیشتری هم انجام داد. کجای اینجور جواب دادن مشکل داره؟

----------


## rezakho

حالا زیاد تند نرید، به eloquent هم میرسیم
فعلا اون آخری، chunk، الان کد شما چند تا میکشه بیرون توی foreach ؟

----------


## MMSHFE

200 تا دیگه

----------


## metal gear solid 4

> با وجود AR در Yii عملاً استفاده از QueryBuilder فقط به تولید Queryهای پیچیده یا موارد خاص مثل ساخت Event و Trigger و... محدود میشه.


به این نتیجه رسیدید که Query هاتون پیچیده و ناخواناست؟ معادل همین موارد با QueryBuilder لاراول بسیار ساده نوشته شدن. آقای rezakho مثال های خیلی خوبی زدن.

----------


## rezakho

خوب chunk اینکارو نمیکنه، بلکه تا انتها 200 تا 200 تا واکشی میکنه که رم رو قبضه نکنه، مثلا اگر نیاز باشه هزاران رکورد رو پیمایش کنید، شما چکار میکنید؟ البته همین الان بگم که راه داره، ولی منظور من راه کوتاه و تمیزیه کد و سینتکس هست ها!

----------


## MMSHFE

> به این نتیجه رسیدید که Query هاتون پیچیده و ناخواناست؟ معادل همین موارد با QueryBuilder لاراول بسیار ساده نوشته شدن. آقای rezakho مثال های خیلی خوبی زدن.


چه ربطی داشت الان؟ من گفتم QueryBuilder برای انجام کارهای پیچیده به کار میره نه اینکه این کوئریها پیچیده باشن. این موارد ساده رو با AR میشه به راحتی انجام داد و کسی مجبورمون نکرده از QueryBuilder استفاده کنیم. انجام کوئریهای پیچیده با QuieryBuilder خود لاراول هم همینقدر دستورات رو طولانی میکنه.

----------


## MMSHFE

> خوب 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

متشکر
حالا بریم سراغ کوئری های پیچیده
ما همچین کوئری داریم، شما با Yii درش بیار بی زحمت

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

----------


## MMSHFE

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

----------


## SlowCode

> متشکر
> حالا بریم سراغ کوئری های پیچیده
> ما همچین کوئری داریم، شما با 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

> گفتین با Yii اینم پاسخ:
> 
> Users::model()->findAllbySql("select * from users where name = 'John' or (votes > 100 and title <> 'Admin')");
> 
> من فکر نمیکنم این طرز مقایسه درست باشه!
> شما باید امکاناتی از لاراول رو بگین که تو Yii وجود نداره!
> شما الان گیر دادین به CreateCommand در صورتی که به قول خودتون و اون یکی دوستمون مهم اینه که فریم ورک راحت ترین راه رو جلوی برنامه نویس بذاره!
> راحت ترین راه هم همون کدی هست که بالا گذاشتم! خود Yii زحمتش رو میکشه! پس نیازی نیست من وقتمو با تبدیل کوئری های پیچیده به زبون CreateCommand تلف کنم!
> میدونم میخوایین برتری یه فریم ورک رو ثابت کنین ولی یکم دارین اشتباه میرین راه رو.


ماهیت این تاپیک مقایسست. و به همین روال داره پیش میره. ضمناً معادل این دستور شما با لاراول به مراتب راحتتر نوشته میشه ;)

----------


## rezakho

آقای شهرکی، منظورم با Query Builder بود، برادر *SlowCode* این کد شما، کد sql خام هست، مثال رو با Query Builder بنویسید تا بتونیم مقایسه کنیم

----------


## MMSHFE

نسخه معادلتون رو بگذارین. Speak in Codes

----------


## MMSHFE

> آقای شهرکی، منظورم با Query Builder بود، برادر *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

> چه اصراریه که از سیستم سنتی استفاده کنیم وقتی به راحتی میشه کار رو انجام داد؟ میخواین بگین لاراول اینقدر 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

البته یک راه ساده تر هم هست:
Yii::app()->createCommand("select * from users where name = 'John' or (votes > 100 and title <> 'Admin')")->queryRow();

----------


## MMSHFE

خوب معادل راهی که شما رفتین، توی 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();

*لینک برای مطالعه بی    شتر* (به نظر میرسه شما حتی به اندازه Starter هم مستندات Yii رو نخوندین)

----------


## tux-world

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

----------


## MMSHFE

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

----------


## metal gear solid 4

> خوب معادل راهی که شما رفتین، توی 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();
> 
> یا حتی به این شکل (برای خوانایی بیشتر، بازش کردم و نوشتم ولی بدیهیه که میشه خلاصه نوشت) :
> ...


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

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





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


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

----------


## rezakho

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


DB::table('table')

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

->orWhere(function($query){

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

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

})

->first();

----------


## MMSHFE

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


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

----------


## rezakho

در لاراول میشه به طریق زیر انواع قفل رو روی کوئری مورد نظر اجرا کرد

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

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

----------


## rezakho

و اما صفحه بندی!

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


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


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

----------


## MMSHFE

البته نگفتین 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

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

----------


## MMSHFE

درسته ولی بهرحال، سؤال من فقط این بود که 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

بله، درسته
ولی اضافه کردن ajax به لاراول همون زمانی رو میبره که باید ajax در Yii رو کاستوم و یا تصحیح کرد، نه؟!

----------


## rezakho

ما بقی موارد هم خیلی اختلاف نداره، مثل 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

> بله، درسته
> ولی اضافه کردن ajax به لاراول همون زمانی رو میبره که باید ajax در Yii رو کاستوم و یا تصحیح کرد، نه؟!


کلاً اضافه کردن AJAX کار خاصی نداره ولی Customizeکردن AJAX در Yii هم خیلی راحته و کار زمانبری نیست. نکته مهم در Yii اینه که بطور خودکار اگه کلاینت امکان استفاده از AJAX رو نداشته باشه، غیرفعال میشه و مثل صفحه معمولی کار میکنه (که حالا کلاینت میتونه موتور جستجو یا مرورگر معمولی یا cURL و... باشه) و این مورد برای SEO و مواردی از این دست، خیلی سودمنده و پیاده سازی این مورد توی لاراول شاید یکم زمان زیادتری نسبت به AJAX ساده لازم داشته باشه.

----------


## MMSHFE

> ما بقی موارد هم خیلی اختلاف نداره، مثل 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

> قرار نیست از همه امکانات یک فریم ورک استفاده بشه، ما فقط داریم در این مورد، از روت ساده حرف میزنیم
> نمیدونم، اگر نقطه ضعف هست که Symfony و Slim و Silex و Fuel و kohana و .... همه اینجوریند!!!
> این مورد رو بگذریم و بگذاریم دیگران قضاوت کنند



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

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

----------


## mousavi711i

> درسته. سابقه کارکرد با هر دو خیلی در مقایسه منصفانه مؤثره به شرطی که با آخرین تغییرات در نسخه های جدید هم تجربه کارکرد داشته باشیم. برای مثال، اگه من دو سال قبل با NET. کار کرده باشم و بیام با امروز PHP مقایسه کنم، یک قیاس اشتباه رو انجام دادم.


دوست دارم نظر شما رو در رابطه با فریم ورک قدرتمند symfonyرو بدونم 
مخصوصا نسخه 2 به بعدش عالیه یه نگاه به این آدرس بندازید
http://symfony.com/

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

----------


## rezakho

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


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

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

----------


## rezakho

> کلاً وجود دو قابلیت یکسان رو در دو جای مختلف نمیپسندم و اینکه ساختار 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

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

----------


## MMSHFE

> دوست دارم نظر شما رو در رابطه با فریم ورک قدرتمند symfonyرو بدونم 
> مخصوصا نسخه 2 به بعدش عالیه یه نگاه به این آدرس بندازید
> http://symfony.com/
> 
> تمام ویژگی های رو که گفتید داره


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

----------


## rezakho

> دوست عزیز من گفتم ساختار AR بهتر و خلاصه تر از QB هست و هر دوش منظورم تو خود Yii بود


راستش از جملتون من همچین برداشتی کردم! به هر حال ممنون





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


عرض کردم،QB و Eloquent در لاراول یکی هستند، هر دو از متدهای مشترک استفاده میکنند

----------


## rezakho

خوب
یک سری متدهای جالب داره لاراول که همه رو یکجا میارم یک مرور کلی داشته باشیم
البته موارد اختلافی رو میارم و از مشترک ها میگذرم

ایجاد یک رکورد جدید (البته اون روش 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

> عرض کردم،QB و Eloquent در لاراول یکی هستند، هر دو از متدهای مشترک استفاده میکنند


پس چرا لاراول اینهمه از Eloquent بعنوان یک ویژگی خوب یاد میکنه؟ خوب میومد رک و راست به همه میگفت یک Alias برای QB درست کرده و خیال خودش و بقیه رو راحت میکرد!

----------


## rezakho

> پس چرا لاراول اینهمه از Eloquent بعنوان یک ویژگی خوب یاد میکنه؟ خوب میومد رک و راست به همه میگفت یک Alias برای QB درست کرده و خیال خودش و بقیه رو راحت میکرد!


عجب حرفی میزنید، Eloquent یک ORM هست، مثل ActiveRecord در یی، یعنی یک لفاف روی متدهای کار با پایگاه داده، اون موارد که من توی پست قبلی گفتم موارد اختلافی بود، وگرنه اون ساختار واسط شی گرایی رو به هیچ وجه از دست نداده و هنوز خیلی چیزهاش مونده، ضمن اینکه فکر میکنید ساختار داخلی AR در یی چه شکلیه؟!
در یی هم این اتفاق میافته، یعنی شما از AR استفاده میکنید،  AR داده ها رو به QB میده و اونجا SQL اجرا میشه و روند معکوس اجرا میشه دوباره شما با شی سر و کار دارید.

----------


## MMSHFE

> ایجاد یک رکورد جدید (البته اون روش 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

> عجب حرفی میزنید، 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

من فقط این جمله رو میگم، چیزی کپی نشده، فقط به ارث برده شده، همین!

----------


## MMSHFE

لطفاً با کلمات بازی نکنید. صحبت سر رابط بیرونی ارتباط با کاربره. من میگم اگه همون کارها رو بدون Eloquent هم میشه با خود QB با همون ساختار انجام داد، دلیلی نداشته که توی Eloquent تکرار بشه وگرنه ارث بردن ساختار QB برای AR در Yii هم کاری نداشته که بخوان اضافه کنن.

----------


## tux-world

> لطفاً با کلمات بازی نکنید. صحبت سر رابط بیرونی ارتباط با کاربره. من میگم اگه همون کارها رو بدون Eloquent هم میشه با خود QB با همون ساختار انجام داد، دلیلی نداشته که توی Eloquent تکرار بشه وگرنه ارث بردن ساختار QB برای AR در Yii هم کاری نداشته که بخوان اضافه کنن.


خوب خود شما هم گفتید که انگار همین کار هم در Yii انجام میشه نه؟ من اینطور احساس میکنم که البته جسارت نشه شما حرفهای rezakho رو درست متوجه نشدید.

----------


## rezakho

نمیدونم چرا مطلب پیچ میخوره بیخودی، ببینید، QB در لاراول سر جای خودش.
همیشه که در مدل ها شما با متدهای ساده find و all و ... سرو کار ندارید! خیلی وقت ها و خیلی وقت ها، پیش میاد که میخواید از مدل، با شرطهای مختلف و یا ترتیب مختلف و ...، داده ها رو واکشی کنید. خوب لاراول میگه میتونید بدون دردسر و یادگیری متد جدید یا پیچیدگی بی خودی، داده ها رو با همون متدهای QB در مدل، بکشید بیرون، همین!
حالا خواص خاص مدل بماند که به اونها هم میرسیم!

----------


## MMSHFE

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

----------


## MMSHFE

> خوب خود شما هم گفتید که انگار همین کار هم در Yii انجام میشه نه؟


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

----------


## rezakho

جناب شهرکی، اجازه بدید مفاهیم Eloquent تمام بشه، خیلی از موارد حل میشه، لاراول برای مواردی که شما مد نظرتون هست مثل همین deleteByPk راه های بسیار کوتاه تری گذاشته

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

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

----------


## tux-world

قضیه اینه که شما آقای شهرکی و آقای rezakho دقیقا حرفهاتون یکی هستش و هر دو به یه موضوع دارید اشاره میکنید ولی به نتیجه نمیرسید.

----------


## rezakho

این مثال ها همون مشترک ها هست که قرار نبود گفته بشه، ولی به خاطر اینکه مفهوم بد جا نیافته، اینجا آورده شد

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


$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

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

----------


## MMSHFE

> برای ایجاد سطر جدید
> 
> $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

در  ByPk مربوط به Yii فرقی نمیکنه که کلید اصلی چی باشه درسته؟

----------


## MMSHFE

نه فرقی نداره. منظور همون فیلدی هست که Primary Key میگذارین که میتونه عددی یا رشته ای باشه. حتی اگه ترکیب همزمان چند فیلد رو Primary Key کرده باشین، میتونید اینطوری استفاده کنید:
$userTag = UserTags::model()->findByPk(array('user_id'=>5,'tag_id'=>25));

----------


## rezakho

در مورد 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

تا جایی که از توضیحاتتون متوجه شدم این کار با کمک یک جدول واسطه که خود لاراول به دیتابیس اضافه میکنه انجام میشه درسته؟

----------


## rezakho

نه، یک فیلد timestamp که البته خودش اضافه میکنه

----------


## MMSHFE

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

----------


## rezakho

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

class User extends Eloquent {

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

}

----------


## rezakho

در لاراول میشه به راحتی متدهای خوانا برای دستکاری شروط کوئری که خودش بهشون 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

معادل 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

ناگفته نمونه که در 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

> خوب لاراول به صورت داخلی 2 تا فیلد به عنوان زمان ایجاد و تغییر رو برای تمام مدلها پشتیبانی میکنه، که البته میشه فرمت فیلدها رو هم برای هر مدل مشخص کرد...


قابلیت خوبیه و قطعاً مفید بوده که توی Yii2 هم گفتن اضافه میشه ولی اون افزونه هایی که گفتم هم به شیوه جالبی کار میکردن (بجای تغییر تمام مدلها، یک جدول برای مدیریت این موارد ایجاد میکردن و تغییرات داخل اون اعمال میشد).

----------


## rezakho

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

class User extends Eloquent {

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

}


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

----------


## rezakho

خوب، بریم سراغ 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

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

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

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','param  s'=>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(commen  t) LIKE :comment','params'=>array(':comment'=>'%php%')))->findAll();

----------


## MMSHFE

یک نکته: Yii در relations پارامترهای خیلی زیادی داره. برای مثال، یکی از این پارامترها together هست. اگه این پارامتر رو true بگذاریم، باعث میشه حتماً از Join استفاده بشه و تمام اطلاعات با یک کوئری از دیتابیس استخراج بشن ولی اگه false بگذاریم، خودش بطور خودکار دو کوئری جداگانه ارسال میکنه. برای مطالعه امکانات کامل Active Record Relations‌ در Yii توصیه میکنم *این لینک* رو حتماً ببینید. بعید میدونم 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

حتی میشه عبارتهای 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

یه مثال دیگه: فرض کنید میخوایم تمام پستهای کاربر جاری رو همراه با تمام کامنتهاش، از دیتابیس بکشیم بیرون. به 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'=>'approve  d')),
            ),
        );
    }
}
$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

در مورد معادل این کوئری زیر 
در یی

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



در لاراول

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

    })->get();

----------


## MMSHFE

البته میشد کد Yii رو هم اینطوری بنویسیم که طولانی تر از کد لاراول بنظر نیاد:

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

----------


## MMSHFE

حالا نگفتین میشه توی لاراول کاری کرد که Join نزنه و با کوئریهای جداگانه اطلاعات رو استخراج کنه (و در عین حال با همون روش Eager Loading کار کنه یعنی پست و کامنتهاش با هم همزمان استخراج بشن) ؟

----------


## rezakho

> حالا نگفتین میشه توی لاراول کاری کرد که 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

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

----------


## rezakho

این مطلب آخر رو درست متوجه نشدم، ولی اگر منظورتون استفاده از select های تو در تو و یا where in به جای join هست، باید بگم بله، لاراول این روش ها رو هم پشتیبانی میکنه

----------


## MMSHFE

نه ببینید:

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

منظور بنده هم همین بود، لاراول به صورت پیشفرض برای  eager loading ها، از join استفاده نمیکنه و به جاش از where in استفاده میکنه و فقط از 2 تا کوئری ساده برای واکشی رابطه ها و مدل استفاده میکنه

----------


## MMSHFE

خوب اگه بخوایم مجبورش کنیم از Join استفاده کنه چه تغییری باید ایجاد کنیم؟ ضمن اینکه where in یه جاهایی کار نمیکنه. مثلاً من میخوام همه کاربران رو همراه با همه پستهاشون Load کنم. این کوئری که where in نداره.

----------


## rezakho

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




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


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

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

----------


## MMSHFE

نه دیگه نشد! ببینید، الآن این دو تا کوئری جواب 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

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

----------


## rezakho

با بررسی هایی که کردم، لاراول از join ها در ارتباط یک به چند استفاده نمیکنه
و با 2 کوئری، همونطور که در بالا گفتم، کار رو انجام میده، که البته ارزش تست رو داره که معلوم بشه در رکوردهای بالا و تعداد فیلدهای زیاد، کدوم کارایی بیشتری دارند
join ها یا واکشی کلی و جداسازی در سمت php ؟!

----------


## MMSHFE

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

----------


## tux-world

به نظرم آقای rezakho منظورشون این بود که تو هسته لاراول هستش که به صورت پیش فرض از Join استفاده نمیکنه مگر اینکه مثل ایی مجبور به استفادش کنیم. در کل هر دو فریم ورک این قابلیت رو دارن و تفاوتی هم نداره

----------


## MMSHFE

همین دیگه میخوام ببینم این قابلیت رو داره که مجبورش کنیم Join بزنه؟ چون توی مستنداتش ندیدم (شایدم باشه و من نتونستم پیدا کنم).

----------


## tux-world

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

----------


## rezakho

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

----------


## rezakho

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

معادل 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

> سلام
> ببخشید وقت نبود
> لاراول کلا از جوین در رابطه ها استفاده نمیکنه، دلیلش رو نمیدونم، و نمیتونه هم استفاده کنه به صورت خودکار، مگر خودمون جوین بزنیم در صورت نیاز با QB


خوب پس این مورد رو میتونیم بعنوان یک امتیاز منفی محسوب کنیم یا حداقل بعنوان یک ویژگی که Yii داره و Laravel نداره.

----------


## tux-world

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

----------


## engmmrj

در یکی از سایت ها نوشته بود   Laravel  دارای code generator نیست ، درسته ؟

----------


## tux-world

نه درست نیست. هستش.لاراول مثل Yii خودش ابزاری شبیه gii داره به اسم artisan که خودش شبیه gii در لاراول هستش که به صورت gui م قابل استفاده هستش و توسط بعضی از کاربراش توسعه داده شده و کاملترش کرده و به صورت باندل قابل استفاده هستش این لینک رو مطالعه کنید

----------


## rezakho

سلام
ببخشید از تاخیرم

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


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

----------


## metal gear solid 4

> ببینید، من اینقدر دیگه سن و تجربه دارم که نخوام احساساتی صحبت کنم. اینکه  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

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


شما از چه راههای برای عدم استفاده از join استفاده میکنید؟ ممنون میشم کدی رو که استفاده میکنید بگید

----------


## metal gear solid 4

> شما از چه راههای برای عدم استفاده از join استفاده میکنید؟ ممنون میشم کدی رو که استفاده میکنید بگید


من توی دو پروژه ی اخیرم به دلیل تعداد درخواست های بسیار بالا به سرور و سنگین بودن جداول کلاً JOIN زدن رو بیخیال شدم. ( با استفاده از JOIN هم بنچمارک گرفتم. نتایج افتضاح بود ) بنا به نیاز حتی Normalization رو هم فدای Performance کردیم. در این مورد میشه از SELECT های تو در تو استفاده کرد اما خب من به دلیل نوع پروژه هام از روش های کاملاً نامرتبطی به بحث این تاپیک استفاده میکنم. از بانک های اطلاعاتی رابطه ای در کنار غیر رابطه ای استفاده میکنم. MySQL در کنار mongoDB و Redis

----------


## MMSHFE

> تغییرات Major هم یعنی این. مثل خیلی از فریمورک های دیگه.


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



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


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

----------


## MMSHFE

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


روشی که اشاره کردین، عملاً همون استفاده از QueryBuilder هست که گفتیم موضوع بحث ما نیست چون برای مثال، توی Yii هم با CDbCommand (همون QueryBuilder در Yii) میشه اعمالی مثل Lock و... رو انجام داد. بهرحال فکر میکنم بهتره این مورد رو به نفع Yii تمام کنیم و بریم سراغ بقیه موارد.

----------


## MMSHFE

> برای Yii انگار فرمودید که به صورت داخلی تو هسته نیستش با اکستندهایی که انجام شده تونستن از این قابلیت استفاده کنن و در نسخه جدید هم قرار شده این قابلیت رو نهایی کنن. ولی خوب QB برای یه سری کارهای پیچیده و یا مواردی که به راحتی نمیشه از الکوئنت و یا اکتیو رکورد استفاده کرد کاربرد داره


خیر پشتیبانی از Join در Yii بصورت داخلی هست. اون مورد که گفتم، بحث Lock و Soft Delete بود که گفتم توی نسخه جدید قراره اضافه بشه و فعلاً میشه از Extensionهایی که برای این مقاصد طراحی شده، استفاده کرد.

----------


## tux-world

منم منظورم همون lock بود

----------


## MMSHFE

بله Lock رو در نسخه فعلی، حداقل تا جایی که من بررسی کردم به راحتی لاراول نداره و باید از همون QueryBuilder استفاده کنیم.

----------


## rezakho

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

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

معادل 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

لاراول از ارتباط های چند ریختی! هم پشتیبانی میکنه
مثلا میشه 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

> معادل Yii :
> 
> 'posts' => array(self::HAS_MANY, 'Post', 'post_id', 'through'=>'users'),


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

----------


## MMSHFE

> منظور از این خط چیه؟ و همینطور 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);

برای درک بهتر، *این لینک* رو ببینید.

----------


## MMSHFE

> لاراول از ارتباط های چند ریختی!...


طبق *این لینک* ارتباط چندریختی توی دیتابیس یک ارتباط مناسب نیست و توصیه نمیشه و به همین دلیل هم در 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

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

----------


## tux-world

یه سوال به ذهنم رسید.
اگه ما نخاییم از چند ریختی استفاده کنیم. چطور میتونیم مثل سایتهایی همانند گوگل و یا فیسبوک که چندین کاربر میتونن یک مطلب رو به اشتراک بزارن رو بفهمیم؟ راهی به غیر از این مدل استفاده میکنن؟

----------


## MMSHFE

این مسئله کاملاً بی ارتباط با چند ریختیه. اونجا فرضاً جدولی به نام 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

ببخشید
خیلی وقتم کمه، به همین خاطر کم میرسم بیام
خوب، از ارتباط چند به چند چند ریختی هم میگذرم، عطاش رو به لقاش بخشیدیم !

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

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

$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

این مورد رو تا جایی که چک کردم پیدا نکردم. حدس میزنم خوب جستجو نکرده باشم چون قابلیت لازم و ضروری هست و قاعدتاً باید داشته باشه ولی راستش موندم چی جستجو کنم ولی بهرحال تا اینجا متوجه شدم توی هسته چیزی نبود و توی نسخه 2 اضافه شده و برای نسخه 1.1.14 چندتا افزونه خیلی خوب و کارآمد براش پیدا کردم که برای کسانی که از Yii استفاده میکنن، لینکشونو میگذارم:
- esaverelatedbehavior
- xrelationbehavior
- eadvancedarbehavior
- esaverelatedbehavior
- save-relations-ar-behavior

----------


## rezakho

خوب، لاراول خروجی های کوئری و 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

از اونجایی که خروجی 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

خوب در لاراول اوینت های زیر برای مدل معرفی شده
که البته در لاراول میشه چند دستگیره رو به یک ایونت اتچ کرد، دقیقا مثل 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

خوب این مورد رو Yii هم داره و رویدادهای مختلف و پیشفرض زیادی داره و میشه رویدادهای جدید هم تعریف کرد و معادل متد boot هم در Eloquent توی Yii متد behaviors هست که در ActiveRecord نوعاً برای مدیریت رفتارها ازش استفاده میشه ولی میشه با متدهای جداگانه هم رفتار تعریف کرد که ساختارش یکم با لاراول فرق داره ولی خیلی کامل و راحته. برای شلوغ نشدن تاپیک (چون رفتارها در ActiveRecord خیلی کامل و جامع هستن تا جایی که کلاس جداگانه دارن)، صرفاً مطالعه دو لینک زیر رو برای علاقمندان توصیه میکنم:
*Behaviors of CModel*
*CActiveRecordBehavior*
*CModelBehavior*
*CBehavior*
ضمناً به علاقمندان حتماً مطالعه صفحات 226 تا 231 کتاب Yii application development cookbook 2nd edition رو توصیه میکنم. توی این بخش، بصورت عملی پیاده سازی Soft Delete رو (مشابه چیزی که توی لاراول هست) با کمک تعریف رفتارهای خاص برای کلاس مدل، توضیح داده.

----------


## rezakho

خوب تقریبا 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

> در لاراول کلاس احراز هویت به صورت اوتوماتیک به مدل 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

در مورد دسترسی به فیلدهای user، تا اونجا که من میدونم، در yii باید کلاس CWebUser رو دستکاری کرد، ولی شما توی پست قبل این مورد رو ذکر نکردید، این هم متنی که خود گوانگ زو! نوشته

By default, the expression Yii::app()->user returns a CWebUser 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 already comes with a name property that stores the username of the current user.
  In order to store more information, we need to modify the identity class used together with CWebUser. Each application may have one or several identity classes which are mainly responsible to provide ways of performing user authentication.


Resource: http://www.yiiframework.com/wiki/6/h...-yii-app-user/


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

----------


## MMSHFE

کلاس 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

خوب اینم که دوباره شد دستی!
روش شما روش خوبیه، اما خود Yii روش خوبی رو برای برنامه نویس ارائه نداده

----------


## MMSHFE

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

----------


## rezakho

خوب
نوبت 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

> گرفتن داده های 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

تو Yii چرا این قدر پیچیده هستش ؟ مثلا: ذخیره برخی از داده های POST یا GET در session 			 		. این واقعا آزار دهندست. تو نسخه جدید هم اینطوریه؟  
	 به غیر اون بقیه توابعش برای input و request سخت تر و پیچیده تر از لاراول هستش. تو این کد مثلا:

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

{

    //

}



تو دید اول اصلا به ذهن نمیرسه که برای تست وجود یک داده POST یا GET هستش

----------


## MMSHFE

دوست عزیز، دید اول چیه؟ مثلاً برنامه نویسیم ها! توی مستنداتش نوشته که getQuery برای دریافت Getها و getPost برای دریافت Postها و getParam هم برای دریافت هر دو هست. ! هم که یعنی empty و null نباشه. حالا حتماً باید بگه Input::has تا خوانا بشه؟ بهرحال من هم مثل شما قبول دارم که ساختار Yii توی این مورد یکم پیچیده و دست و پاگیره ولی حقیقتش تا حالا موردی نبوده که بخوام توی اکشن خاصی، دستی مقادیر رو بگیرم و همیشه برای اکشن پارامتر تعریف میکنم و خود Yii اون رو توی پارامترها میچینه و هرجا هم احیاناً لازم بوده، از خود POST_$ و GET_$ استفاده کردم و با وجود دستوراتی مثل in_array و array_keys خیلی راحت میشه چک کرد فرضاً یک مقدار توی POST_$ هست یا نه. درهرصورت تا جایی که فهمیدم توی نسخه 2 یک کلاس مخصوص پردازش ورودیهای کاربر اضافه کردن.

----------


## tux-world

بحث Input::has بودن یا نبودن نیست اصلا. ولی مدت زمان به خاطر موندن خیلی از توابع به تعریف اونها بستگی داره. مثلا شما سعی میکنید توابعی رو تعریف کنید که همیشه تو دهنتون بمونه اگر هم بعضی هاشون سخت بود آلیاس تعریف میکنید. اون کلاسی که اضافه شده چیه؟ میتونین توضیحی بدید؟ (مختصر)

----------


## amirkheirabadi.com

منم فقط می خوام نظرمو بگم ...
من قبلا با yii کار کردم .... فریم ورک محشریه . از همه نظر عالیه هیچ شکی در اون نیست ... ولی مشکلی که داشت این بود که من کلا php رو با yii یاد گرفتم .. و بعد از یک مدتی به خاطر دستورات پیچیده بودن دستورات و کلا ساختار برای من ، کلا از php کشیدم بیرون و رفتم سراغ node تا حدود این یک سال که با فریم ورک sails کار کردم که واقعاااا عالی بود ... بعد خاطر دور نبودن از php دنبال یک فریم ورک برای کار بودم که فهمیدم laravel از نظر ساختار و حتی کد زدن چون ساختار جفتشون شبیه rails بود ....
و توی این دو هفته ای که اومدم سراغ laravel واقعاااا دیدم برای من خیلی خیلی خیلی بهتر از yii بوده...
در کل قابلیت های جفتشون یکیه ... بعضی جاها هم یک سری اختلافاتی هست که توی پروژه های بزرگ مشخص می شه ... و چیزی که بین این ها فاصله و رقابت ایجاد می کنه به نظرم فقط راحتی فرد در استفاده است ... که برای بنده به شخصه laravel خیلی قابل فهم تر بود ... بعضی از برنامه نویسان اینقدر مسائل پیچیده حل کردن که ماهیچه های مغر عادت کرده به پیچیده جل کردن مسئله ها ( به قول نویسنده کتابی که می خوندم ) بعضی ها هم مثل ما دنبال سریع و تمیز تر شدن هر چه بیشتر کد ها .....
هر کسی با یکی راحته و گرنه قابلیت ها تقریبا یکی است ....
استادان عزیز نظرمو گفتم ... نتوپید به ما .... همه جای متنم گفتم : به نظر من ، من فکر می کنم و.....

----------


## rezakho

خوب بریم سراغ فایل در فرم ها

گرفتن یک فایل که توسط فرم ارسال شده

$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

تو بخش نوبت request ها و input. کدهای لاراول واقعا بسیار کوچیک،سریع و آسون هستن. امیدوارم تو نسخه جدید Yii هم راحت تر شده باشن این قسمتها

----------


## MMSHFE

> بحث Input::has بودن یا نبودن نیست اصلا. ولی مدت زمان به خاطر موندن خیلی از توابع به تعریف اونها بستگی داره. مثلا شما سعی میکنید توابعی رو تعریف کنید که همیشه تو دهنتون بمونه اگر هم بعضی هاشون سخت بود آلیاس تعریف میکنید. اون کلاسی که اضافه شده چیه؟ میتونین توضیحی بدید؟ (مختصر)


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

----------


## MMSHFE

> تو بخش نوبت request ها و input. کدهای لاراول واقعا بسیار کوچیک،سریع و آسون هستن. امیدوارم تو نسخه جدید Yii هم راحت تر شده باشن این قسمتها


بله خوشبختانه توی نسخه جدید خیلی راحت شده. مثلاً میگیم Request::get('name'); بجای اینکه بگیم Yii::app()->request->getQuery('name');

----------


## MMSHFE

> گرفتن یک فایل که توسط فرم ارسال شده


$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

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

بررسی وجود یا عدم وجود فایل:
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

> بررسی وجود یا عدم وجود فایل:


ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:
file_exists



> دریافت محتویات یک فایل:


ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:
$contents = file_get_contents($filename);



> دریافت محتویات فایل به صورت ریموت (نتیجه دریافت به صورت بولین قابل دسترس است):


از چه نسخه ای استفاد میکنید چون توی سایتش چنین دستوری رو توی لاراول ندیدم! *لینک*



> دریافت متغیرهای بازگشتی از فایل:


ضرورتی نداره چون با خود 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

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

File::delete($file1, $file2, $file3);

راحت تر از :

foreach(array($file1, $file2, $file3) as $file) { unlink($file); }

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

----------


## tux-world

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

----------


## MMSHFE

> اصلا بحث این که قراره عوض کنه نیست. تغییر بده و توسعه هم بده باز هم اشکالی نداره.ولی من خودم شخصا دوست دارم این تغییرات رو. اینایی هم که نوشتم نگفتم قابلیتهای لاراول هستش. قبل شما خودم اینا رو میدونستم. ولی به هر حال امکاناتی هستش که گذاشتن. شاید به نظر شما اضافی باشه ولی حداقلش برای من خوبه و ازشون استفاده میکنم. دل بخواه هستش بلاخره هم میشه استفاده کرد هم میشه نکرد. این اومده کار رو راحت تر کرده دست توش نبرده که
> مثلا:
> 
> 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

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



 میشه مثال بزنید؟ منظورتون رو متوجه نشدم. در هر حال لینکهای زیر رو یه نگاه بندازین:
http://www.yiiframework.com/wiki/637...onbeginrequest
http://www.yiiframework.com/wiki/44/behaviors-events

----------


## tux-world

مثال: 

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



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

----------


## MMSHFE

البته اینهایی که شما نوشتین، 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

> در مورد دسترسی به فیلدهای user، تا اونجا که من میدونم، در yii باید کلاس CWebUser رو دستکاری کرد، ولی شما توی پست قبل این مورد رو ذکر نکردید، این هم متنی که خود گوانگ زو! نوشته
> 
> By default, the expression Yii::app()->user returns a CWebUser 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 already comes with a name property that stores the username of the current user.
>   In order to store more information, we need to modify the identity class used together with CWebUser. Each application may have one or several identity classes which are mainly responsible to provide ways of performing user authentication.
> 
> 
> Resource: http://www.yiiframework.com/wiki/6/h...-yii-app-user/
> 
> 
> مثلا اگر جدول user ما، فیلدهای به نام family, old, avatar , ... داشته باشه، شما چطور بهش از طریق Yii::app()->user دسترسی پیدا میکنید



چه نیازی هست به اون فیلدها دسترسی داشت؟
فرض رو بر این میگذاریم نیاز هست؟!
        Yii::app()->user->setState('avatar', $user->avatar);

حالا هر جای برنامه میتونیم از طریق Yii::app()->user->avatar مقدارش رو بگیریم.

----------


## bestirani2

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


دوست عزیز این نکته رو بگم که خود لاراول بر اساس سیمفونی درست شده. لاراول به شکلی ساده شده سیمفونی هست و جاهایی که نیاز بوده رو به صورت خودکار کش کرده. کافیه شما کش کلی سیمفونی رو روشن کنید تا سرعتش از هر دو فریم ورک گفته شده بالاتر بره (البته در صورتی که از داکترین استفاده نکنید.)
در عوض پیچیدگی هایی که میگید انعطاف پذیری و قدرت + مهندسی بودنش رفته بالا. نمونه انعطاف پذیری هم همین لاراول
تنها فریم ورکی که میشه کلاْ همه چیز رو شخصی ساز کرد همین سیمفونی هست.

----------


## bestirani2

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


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

----------


## rezakho

این تاپیک مقایسه لاراول و یی هست، بحث سیمفونی نیست که شما پست میزنی!



> چه نیازی هست به اون فیلدها دسترسی داشت؟


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




> دوست عزیز این نکته رو بگم که خود لاراول بر اساس سیمفونی درست شده. لاراول  به شکلی ساده شده سیمفونی هست و جاهایی که نیاز بوده رو به صورت خودکار کش  کرده. کافیه شما کش کلی سیمفونی رو روشن کنید تا سرعتش از هر دو فریم ورک  گفته شده بالاتر بره (البته در صورتی که از داکترین استفاده نکنید.)
> در عوض پیچیدگی هایی که میگید انعطاف پذیری و قدرت + مهندسی بودنش رفته بالا. نمونه انعطاف پذیری هم همین لاراول
> تنها فریم ورکی که میشه کلاْ همه چیز رو شخصی ساز کرد همین سیمفونی هست.





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


منظور کارایی خود فریمورک بود، کسی از کش صحبت نکرد

----------


## MMSHFE

درمورد اینکه توی این تاپیک درمورد سیمفونی صحبت نکنیم موافقم (البته نه با این لحن - یکم بنظرم خشن اومد و میشد ملایمتر هم تذکر بدیم). درخصوص اینکه در لاراول مدل کاربر جاری بطور خودکار بارگذاری میشه هم راستش شخصاً زیاد موافق این قضیه نیستم چون بحث Authentication کاربر جاری و دسترسی به مدل کاربر جاری بنظرم دو موضوع جداگانه هستن و کلاس Authentication وظیفه مدیریت ورود و خروج و اعتبارسنجی و یکسری کارهای اینچنین رو برعهده داره و مدل کاربر همه جا مورد نیاز نیست که بخوایم بارگذاریش کنیم. شاید یکی از دلایل بهینه تر بودن Yii توی Benchmarkها هم همین مسئله باشه که تا وقتی نیاز نیست، هیچ چیز غیر ضروری بطور خودکار بارگذاری نمیشه. هرجا هم لازم بود به راحتی میشه با یک خط کد مدل کاربر رو بدست آورد:
$user = User::model()->findByPk(Yii::app()->user->id);

----------


## MMSHFE

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


نیازی به تعریف تک تک فیلدها نیست. مثال:

// mass assignment
Yii::app()->user->setState('attributes', $user->attributes);
// example of usage
echo Yii::app()->user->attributes['family'];

----------


## bestirani2

> این تاپیک مقایسه لاراول و یی هست، بحث سیمفونی نیست که شما پست میزنی!


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




> منظور کارایی خود فریمورک بود، کسی از کش صحبت نکرد


منظور من کش خود فریم ورک بود نه قسمت خاصی. لاراول هم همین کار رو به صورت توکار میکنه.

----------


## mamal72

> $contents = File::getRemote($url);





> از چه نسخه ای استفاد میکنید چون توی سایتش چنین دستوری رو توی لاراول ندیدم! *لینک*


توی یکی دو نسخه پیش این تابع حذف شده. خود تیلور گفته کاربردی نداشته. ولی خب من برای دریافت محتوای فایل api گوگل‌مپ و ذخیره روی سرور خودم از این تابع استفاده میکردم. بعد از آپدیت لاراول، دیدم دیگه کار نمیکنه و خطا میده. تابع File::get هم کار نکرد (فک کنم مشکلم این بود که کلاً کارش لوکال بود یا که من گیج بودم اشتباه کردم) و از این رو از تابع file_get_contents خود پی‌اچ‌پی استفاده کردم.




> منم فقط می خوام نظرمو بگم ...
> من قبلا با yii کار کردم .... فریم ورک محشریه . از همه نظر عالیه هیچ شکی  در اون نیست ... ولی مشکلی که داشت این بود که من کلا php رو با yii یاد  گرفتم .. و بعد از یک مدتی به خاطر دستورات پیچیده بودن دستورات و کلا  ساختار برای من ، کلا از php کشیدم بیرون و رفتم سراغ node تا حدود این یک  سال که با فریم ورک sails کار کردم که واقعاااا عالی بود ... بعد خاطر دور  نبودن از php دنبال یک فریم ورک برای کار بودم که فهمیدم laravel از نظر  ساختار و حتی کد زدن چون ساختار جفتشون شبیه rails بود ....
> و توی این دو هفته ای که اومدم سراغ laravel واقعاااا دیدم برای من خیلی خیلی خیلی بهتر از yii بوده...
> در کل قابلیت های جفتشون یکیه ... بعضی جاها هم یک سری اختلافاتی هست که  توی پروژه های بزرگ مشخص می شه ... و چیزی که بین این ها فاصله و رقابت  ایجاد می کنه به نظرم فقط راحتی فرد در استفاده است ... که برای بنده به  شخصه laravel خیلی قابل فهم تر بود ... بعضی از برنامه نویسان اینقدر مسائل  پیچیده حل کردن که ماهیچه های مغر عادت کرده به پیچیده جل کردن مسئله ها (  به قول نویسنده کتابی که می خوندم ) بعضی ها هم مثل ما دنبال سریع و تمیز  تر شدن هر چه بیشتر کد ها .....
> هر کسی با یکی راحته و گرنه قابلیت ها تقریبا یکی است ....
> استادان عزیز نظرمو گفتم ... نتوپید به ما .... همه جای متنم گفتم : به نظر من ، من فکر می کنم و.....




پیش‌نویس: چطوری امیر؟ :دی
با امیر موافقم. من فریم‌ورکای مختلفی رو تو زبون‌های مختلف سرک کشیدم. هیچ‌کدوم به قشنگی لاراول نبودند و نیستند. من تو حفظ کردن کلمات و عبارات عجیب و غریب ضعیفم. اسامی توابع و دستورات Yii اونقدر برام پیچیده بودن که وقتی بهش سر زدم، بیخیالش شدم.


در مورد پرفرمنس و بازدهی هم خب.. من یه سری بنچمارک بی طرف دیدم که توشون لاراول از یی سریعتر بود. یعنی بعد از فالکن و کد ایگنایتر و کُوهانا و یکی دو تا میکرو فریمورک دیگه، لاراول بودش. بعد از لاراول yii بود و اون پایین مایینا، زند و سیمفونی و سایر شرکا حضور داشتند. درسته که بیس لاراول سیمفونی هستش، ولی طبق بنچمارک‌های موجود، لاراول دو برابر سیمفونی بازدهی داره.

----------


## MMSHFE

> در مورد پرفرمنس و بازدهی هم خب.. من یه سری بنچمارک بی طرف دیدم که توشون لاراول از یی سریعتر بود. یعنی بعد از فالکن و کد ایگنایتر و کُوهانا و یکی دو تا میکرو فریمورک دیگه، لاراول بودش. بعد از لاراول yii بود و اون پایین مایینا، زند و سیمفونی و سایر شرکا حضور داشتند. درسته که بیس لاراول سیمفونی هستش، ولی طبق بنچمارک‌های موجود، لاراول دو برابر سیمفونی بازدهی داره.


اگه میشه لینک این پنچمارکهای بیطرف که گفتن لاراول سریعتر از Yii بوده رو بگذارین تا بیطرفیشون رو بررسی کنیم.

----------


## MMSHFE

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


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

----------


## bestirani2

> بحث رو من شروع کردم اما منظورم بد بودن سیمفونی نبود. منظورم این بود که فریمورکی مثل لاراول که اکثر قدرتش رو از یک فریمورک دیگه گرفته، نمیشه ازش انتظار تفاوت آنچنانی در Performance با فریمورک والدش داشته باشیم. ضمناً اینکه گفتین سیمفونی با فعال کردن کش سرعتش از Yii هم بیشتر میشه، باید بگم درصورتی که کش Yii غیرفعال باشه و از APC و Yiilite استفاده نکنیم، حرف شما صحیحه ولی اگه این دو مورد رو فعال کنیم و انجام بدیم، اونوقت دیگه سیمفونی و لاراول سرعتشون خیلی کمتر از Yii خواهد شد.


من خودم با هر دو فریم ورک ورک کار کردم. سایت های بزرگی هم با YII زدم. تستی هم که بنده خودم گرفتم سیمفونی سرعتش با apc خیلی به فالکون نزدیک شد و از Yii با فعال YiiLite و بودن APC بیشتر بود. بازم تست میکنم که خدایی نکرده اشتباه نکرده باشم. البته اینم بگم که توی تست های انجام شده از Propel استفاده کردم که اونم اکتیو رکورد حساب میشه و سرعتش خیلی بیشتر از Doctrine هست. البته یه مزیت بزرگ YII توابع کش خوبی هست که داره که توی سیمفونی معادلش به صورت پیشفرض موجود نیست یا حداقل من ندیدم. مزیت دیگه YII پشتیبانی از وب ۲ هست که توی سیمفونی موجود نیست. نمیدونم واسه لاراول این مورد رو اضافه کردند یا نه ولی من واسه خودم توی سیمفونی اضافه کردم. در کل سیمفونی از نظر من برای پروژه های بزرگ مناسب هست و پروژه های متوسط و کوچکتر، YII‌ انتخاب مناسبتری هست.

پینوشت: مجدد بررسی کردم. YII 1 سریعتر بود ولی Yii 2 کندتر بود که فعلا نمیشه به دلیل الفا بودن این مورد رو حساب کنیم. البته این اختلاف برای مثال معروف Hello World بود و توی برنامه واقعی اختلاف بسیار ناچیز بود.

----------


## mamal72

> اگه میشه لینک این پنچمارکهای بیطرف که گفتن لاراول سریعتر از Yii بوده رو بگذارین تا بیطرفیشون رو بررسی کنیم.


من چند تایی قبلاً‌ دیده بودم که با یه سری کارا سریعتر شده بود. در حالت کلی معمولاً یی سریعتره ولی توی این یکی این طور نبود. البته این بنچمارک کاملی نیست. به هر حال، این لینک:

http://systemsarchitect.net/performa...hp-frameworks/

----------


## MMSHFE

خوب درهرصورت چیزی که مشخصه اینه که این بنچمارک کامل و دقیق نیست چون از Skeleton هر فریمورک برای تست استفاده کرده و امکانات پروژه Skeleton یا همون Scaffolding که هر فریمورک میسازه با فریمورک دیگه متفاوته و درنتیجه تفاوت در نتیجه ها پیش میاد که البته خودش هم اشاره کرده. ضمناً فقط به RPS (تعداد درخواست در ثانیه) اشاره کرده و برای مثال نگفته چند مورد با موفقیت پردازش شده و چند مورد Drop شده و مصرف حافظه چطور بوده و...

----------


## rezakho

خوب عید همگی پیشاپیش مبارک باشه
انشالله امسال، سال گشایش گره های کشور و مردم باشه

من از کلاس های 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

خوب 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

> لاراول از موتور 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

> خوب 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

دوست عزیز، خیلی از این امکانات بخاطر موتور قالب 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

> دوست عزیز، خیلی از این امکانات بخاطر موتور قالب Blade هست


بلید چیز جدایی از لاراول نیست، اگرچه یک موتور قالب هست، ولی جزو هسته لاراول هست




> ببینید چقدر ساده و با وحدت رویه همه جا عمل میشه! دیگه نیازی نیست کاربر  with و withX و nest و share و make و چه میدونم include و section و stop و  extends و اسامی مستعار و تنظیم مسیر و... رو بخواد یاد بگیره و به خاطر  بسپره


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




> یک نکته دیگه اینکه همین استفاده از موتور قالب و فعال بودنش بطور پیشفرض  هم یکی از دلایل Performance پایینتر لاراول نسبت به Yii هست


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




> بله به جوابم رسیدم: لاراول خیلی ضعیف تر از Yii در این مورد عمل کرده (ازنظر فنی میگم نه حجم دستورات و امکانات غیر ضروری).


نظر شما برای خودتون هست و محترم، صلاح کار خویش خسروان دانند!




> اگه ساختارهای کنترلی و ناظرها و... هم مربوط به موتور قالب Blade هست  ازشون صرفنظر کنید چون بحث ما امکانات فریمورکهاست نه موتورهای قالب.


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

----------


## bestirani2

> به قول خودتون: کدهای لاراول رو بسپارید به اهلش!، نه تنها لاراول از تم ها پشتیبانی میکنه، بلکه میتونید چند مسیر رو برای جستجو ویوها مشخص کنید


این مورد که شما گفتید مربوط میشه به تنظیم فولدر ویو که از طریق فایل view.php داخل فولدر کانفیگ انجام میدید که Yii هم همچین کاری رو میتونید داخل تنظیمات انجام بدید و با بحث Theme فرق میکنه.
البته در صورتی که بشه تنظیمش رو داینامیک عوض کرد که احتمالا بشه میشه راحت یه تابع برای تغییر Theme نوشت که لاراول انجام نداده متاسفانه.

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

----------


## rezakho

> این مورد که شما گفتید مربوط میشه به تنظیم فولدر ویو که از طریق فایل view.php داخل فولدر کانفیگ انجام میدید که Yii هم همچین کاری رو میتونید داخل تنظیمات انجام بدید و با بحث Theme فرق میکنه.


شما فقط با اسمش مشکل داری؟ مگه کارش فرق میکنه عزیزم



> البته در صورتی که بشه تنظیمش رو داینامیک عوض کرد که احتمالا بشه میشه راحت یه تابع برای تغییر Theme نوشت که لاراول انجام نداده متاسفانه.


شما مثل اینکه عادت داری بدون اطلاع نظر بدی!
محض اطلاع 

Config::set('view.paths', '../theme');





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


هر کاری رو هر جایی میشه انجام داد، ولی این جملتون:"ولی به نحوه ساده تر" واقعا جالب بود!!!

----------


## MMSHFE

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


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



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


هیچکس نگفت کش خوب نیست. حرفهایی که یک کاربر میزنه رو در جواب یک کاربر دیگه پاسخ ندین. هرچند ایشون گفتن کش کردن کدهای قالبی که کد PHP باشه کاربرد خاصی نداره که حرفشون هم صحیحه چون کدها پویاست و اینکه بخوایم چک کنیم ببینیم همون خروجی قبلی تولید میشه یا نه هم بهرحال نیازمند تفسیر کدهاست و درنتیجه کش کردن کد پویا واقعاً بیمعناست. اما بد نیست بدونید Yii بدون کش هم از لاراول سریعتره اما با کش *خیلی* سریعتره. لطفاً بدون دانش و غیرعلمی صحبت نکنید. اینکه گفتین حتی کدهای خام PHP رو هم مجدد اجرا نمیکنه رو از کجا درآوردین؟ از کجا میدونه همون خروجی قبلی داره تولید میشه (حتماً میدونید که یک کد PHP حتی بدون تغییر سورس هم میتونه نتایج مختلفی تولید کنه - فرض کنید جایی توی قالب، Timestamp رو echo کردیم). حالا از کجا میخواد بدونه این کد خروجی متفاوت با محتوای کش تولید میکنه؟ نباید پردازش کنه تا این رو بفهمه؟!
اما حالا که صحبت کش کردن قالب شد بد نیست بدونید Yii چندین مدل کش داره:
کش نتایج کوئریهای دیتابیس
کش بخشی از صفحه (ویو)
کش کل صفحه (ویو)
...
حالا لاراول توی بحث کش ویو چی داره که Yii نداره و اینقدر شما بخاطرش دارین سروصدا میکنین؟



> نه، چرا صرف نظر کنم! بلید جزو هسته لاراول هست و گفتنش خالی از لطف نیست


اشکالی نداره. شما امکانات موتور قالب رو بگین، من هم معادل همونها رو بدون موتور قالب میگم ببینیم درک کدوم کد راحتتره، قضاوت هم با خوانندگان این تاپیک. بعد در انتها نحوه پیاده سازی همونها رو با موتور قالب Twig یا Smarty یا RainTPL توی Yii میگم ببینید کدهای لاراول رسماً باعث شرمندگی میشن یا نه (حداقل در این مورد تجربه کافی دارم و توی فارومهای انگلیسی خیلی بحث کردیم).



> اینم جالبه که شما و دوستان یی کارتون، بیشتر مواردی که در یی وجود نداره رو غیر ضروری، غیر اصولی، اضافه، سخت!!! و ... میدونید و الان هم که میگید جزو فریمورک نیست! صرف نظر کن!


کسی نگفت موتور قالب توی Yii وجود نداره. گفتیم بطور پیشفرض فعال نیست (ولی میشه به راحتی فعالش کرد) چون خیلی از پروژه ها به موتور قالب احتیاج ندارن و اگه بخواین بگین موتور قالب باعث کاهش Performance نمیشه دیگه رسماً به دانش پایه برنامه نویسیتون شک میکنم. اون مواردی رو هم که من گفتم غیرضروریه (مثل کلاس File توی لاراول)، میتونید از هر کسی که برنامه نویسی حالیشه (نه کدنویسی) بپرسین و بخواین استدلالی که گذاشتم رو بخونه و اگه حرفم رو تأیید نکرد، حق با شماست و من اشتباه کردم که گفتم ضروری نیست!
-----
پی نوشت: من رفتم واسه تحویل سال سر سفره باشم، بقیه بحثها باشه واسه سال جدید! سال نوی همه پیشاپیش مبارک.

----------


## MMSHFE

> شما فقط با اسمش مشکل داری؟ مگه کارش فرق میکنه عزیزم


بله دوست عزیز، بحث Theme با مسیردهی Viewها فرق میکنه. دقت کنید که توی Theme میتونید به راحتی فایلهای CSS و JS و... رو جداگانه برای هر Theme توی پوشه خودش بگذارین و بین پروژه ها، Theme های مختلف رو مورد استفاده مجدد قرار بدین و هر بخشی از پروژه از یک Theme اختصاصی استفاده کنه.



> شما مثل اینکه عادت داری بدون اطلاع نظر بدی!


دوست عزیز، ایشون گفتن: «که احتمالاً بشه». پست رو کامل بخونید بعد دیگران رو متهم به نظر دادن بدون اطلاع کنید.



> هر کاری رو هر جایی میشه انجام داد، ولی این جملتون:"ولی به نحوه ساده تر" واقعا جالب بود!!!


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

----------


## bestirani2

> شما فقط با اسمش مشکل داری؟ مگه کارش فرق میکنه عزیزم


عزیز بحث اسم نیست. به هر حال همشون با php نوشته شده و هر کاری طبیعتا میتونند انجام بدند. فریم ورک باید ابزاری فراهم کنه که این کار راحت انجام بشه
خودتون بگید؟ واسه عوض کردن تم چند تا ویو رو پاس بدید به کانفیگ بهتره یا بگید تم عوض بشه؟ خود Yii هم میشه با تغییر همون path، قالب رو عوض کرد ولی برای راحتی منو شما اومده این امکان رو فراهم کرده + داخل تم امکانات دیگه ای هم فراهم شده و تغییر ادرس پچ ویو است.




> شما مثل اینکه عادت داری بدون اطلاع نظر بدی!


خوب بخونید نوشتم که احتمالاً میشه چون طبیعیش هم این هست که احتمال بالا بشه ولی چون اطلاع نداشتم شرطی گفتم جمله رو




> حتی کدهای خام Php رو هم مجدد اجرا نمیکنه


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

----------


## Veteran

> اون مواردی رو هم که من گفتم غیرضروریه (مثل کلاس 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

آقای شهرکی تا حالا با این فکر کردید یه تاپیک جامع مقایسه بین تمام فریم ورک ها بزنید؟ از هر بخش میتونید کاربران حرفه ایش رو دعوت کنید تا بیاند. اینطوری افرادی که تازه میخواند تازه یه فریم ورک رو انتخاب کنند به راحتی میتونند فریم ورک مورد نظر رو انتخاب کنند در پایان هم میشه به یک جمع بندی رسید و در پست اول آپدیت کنید.
به نظر من YII واسه سرعت توسعه، وب 2 و پرفورمنس خوبه
لاراول به خاطر سادگی ای که داره. بیشتر کاربران CodeIgniter اومدند سمتش. مثل CodeIgniter ساده است و مفاهیم پیچیده نداره در حین حال قدرتمنده و طبیعی هست که واسه حفظ سادگی، کمتر از YII مهندسی هست.

----------


## rezakho

ضمن تشکر از همه دوستان، اگر کسی بخواد بین یی و لاراول یکی رو انتخاب کنه، این تاپیک راهنمایی خوبه بوده و حتی نکات خوبی درباره مفاهیم کلی فریمورک در خودش داره
بنده دیگه علاقه ای به ادامه و پست مطلب ندارم، دوستان خودشون در صورت تمایل، میتونند تاپیک رو ادامه بدند
برای همه آرزوی موفقیت و ترفیع سطح دانش رو دارم
موفق و پیروز باشید
:)

----------


## MMSHFE

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

----------


## M.Rahi

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

1) اول از همه اینکه هر پروژه ای با هردو فریمورک قابل پیاده سازی است.
2) دستورات laravel کوتاه تر و خواناتر است.
3) قابلیت های کش yii بیشتر است.
4) کانفیگ laravel کامل تر و واضح تر است.
5) توضیحات مستندات yii بهتر است.

قطعا موارد دیگه ای هم است اما سعی کردم خلاصه و اصلی ها رو بگم.
به نظر من چون باید بیشتر وقتمون رو روی کاربرد سیستم و بخش تجزیه و تحلیل اون صرف کنیم، laravel کمک میکنه که سریعتر کد بزنیم و تا حدودی سرعت عمل بالاتر بره. همچنین با گذشت زمان، برای توسعه ی پروژه با نگاهی سریع به کدها میتونیم سریع تر دستوراتی که نوشتیم رو یادآوری کنیم.

در مورد کدهای غیر ضروری مثل کار با کلاس File نیز شایان ذکر هست که اینجور کدها درسته یه امکان اضافی هست و شاید مثلا تابع delete به کار بیاد و require و move و ... رو بشه معادل تابع php رو نوشت اما این میتونه به انعطاف پذیری فریم ورک کمک کنه، همونطور که توی وردپرس میشه با چند تابع مختلف یه مقدار رو گرفت.
این در واقع حق انتخاب بیشتری به برنامه نویس میده.
امیدوارم هیچ وقت تعصبی پیش نریم چرا که میشه با دلایل منطقی، نه تنها laravel و yii ، بلکه PHP رو کنار بذاریم و بریم سراغ ASP.

با آرزوی روزهای کامیابی

----------


## MMSHFE

خوب به امید خدا بعد از تعطیلات عید دوباره به این تاپیک سر بزنید چون قراره از اینجا به بعد من روی نقاط قوت Yii انگشت بگذارم و ببینیم لاراول چطور اونها رو مدیریت کرده تا این تاپیک کاملتر بشه.

----------


## bestirani2

> سلام، سال نو همگی مبارک باشه 
> با توجه به تحقیقاتم در مورد این دو فریمورک و مطالعه مستندات هر دوی آنها، فعلا به این نتایج رسیدم که ان شاء الله برای بقیه مثمر ثمر واقع بشه:
> 
> 1) اول از همه اینکه هر پروژه ای با هردو فریمورک قابل پیاده سازی است.
> 2) دستورات laravel کوتاه تر و خواناتر است.
> 3) قابلیت های کش yii بیشتر است.
> 4) کانفیگ laravel کامل تر و واضح تر است.
> 5) توضیحات مستندات yii بهتر است.
> 
> ...


سلام دوست عزیز
بی شک هر چیزی رو میشه با هر فریم ورک و هر زبونی فراهم کرد. مهم سرعت توسعه، خوانایی کد، قابلیت نگهداری، امنیت و ... هست.
پس با قسمت اول موافقم
با قسمت دوم مخالفم، به نظر YII کوتاهتر هست ولی Laravel ساده تر هست و راحتر میشه یاد گرفتش
با سه موافقم
با چهار مخالفم. کانفیگ هر دو دقیقاً یکی هست. هر دو یه آرایه پی اچ پی رو بر میگردونند، تنها فرقشون اینه لاراول به صورت پیش فرض کانفیگ هر قسمت رو جدا کرده مثل codeigniter که Yii این کارو نکرده ولی میشه توی YII هم اینکار رو کرد بدون نیاز به کدنویسی خاصی.
با پنجم موافقم.
قسمت ششم هم اضافه میکنم. YII 2 هم در راهه که خیلی امکانات خوبی میده + پلاگین های خیلی زیادی واسه YII وجود داره. تقریبا واسه هر کاری یه پلاگین میتونید پیدا کنید به بیان دیگه میتونید به جای برنامه نویسی برید دنبال پلاگین مورد نظرتون بگردید  :قهقهه: 

اما در مورد قسمت کلاس جدا و جدا سازی متد های POST و GET در لاراول
من با هر دوی این موارد موافقم و از نظر مهندسی نرم افزار تایید میشه.

در مورد کلاس جدا برای File باید بگم واسه این مورد میشه پلاگین نصب کرد برای YII هم. به هر حال لاراول هم کلی از قسمت هاش رو از باندل و ... میگیره ولی مزیت کلاس جدا برای File اینه که اگه دو روز دیگه توابعی که پی اچ پی برای اینکار معرفی کرده بد دانسته شده با آپدیت فریم ورک بتونیم از توابع جدید پی اچ پی استفاده کنیم. بهتر از این حالت هم تزریق وابستگی هست که نمیدونم لاراول داره یا نه. بدین صورت که برنامه به صورت خودکار یه کلاسی که از اینترفیس مورد نظر ارث بری کرده رو برای ما ایجاد میکنه. مزیتش این هست که میتونیم از کلاس های مختلف استفاده کنیم. فرضا کلاسی الان داریم که عملیات حذف کردن رو انجام میده. حال با توجه به نیاز های جدید کلاسی رو درست کردیم که فایل ها رو در زمانبدی خاصی پاک میکنه که به سرور فشار نیاد. در اینجا نیاز نیست از نو بریم فایلهامون رو دستکاری کنم و تنها وابستگی رو تغییر میدیم.

در مورد جدا سازی Post و Get در دو متد جدا خوبی این روش اینه که بین دو قسمت کامل جدا سازی انجام شده. در کل از نظر مهندسی به کار بردن دستورات شرطی خوب نیست و تا جایی که میشه نباید به کار برده بشه + راحت میشه RestFul رو پیاده سازی کرد.

درمورد دلایل منطقی برای کنار گذاشتن PHP موافق نیستم. واسه PHP هم فریم ورک به قدرت asp.net mvc هست ولی اگه منظورتون asp.net هست که من دلایلی میارم که اصلاً برای برنامه نویسی مناسب نیست

----------


## M.Rahi

> واسه PHP هم فریم ورک به قدرت asp.net mvc هست ولی اگه منظورتون asp.net هست که من دلایلی میارم که اصلاً برای برنامه نویسی مناسب نیست


بله منظورم همون asp.net mvc بود. در مورد php و asp خیلی تحقیق کردم و هرکی دلایلی میاورد که تصمیم گیری رو سخت میکرد!
آخرین بار توی نمایشگاه رسانه های دیجیتال، با برنامه نویس سایت راسخون کلی در این مورد صحبت کردیم و گفت:
 "من حدودا 8 سال با php کار کردم و تقریبا اکثر فریمورک ها مثل  (zend,codeigniter,cakephp,...) را امتحان کردم و در آخر تصمیم گرفتم با asp کار کنم چون این زبان توسط یک شرکت بزرگ و حرفه ای پشتیبانی میشه که برنامه نویسای مجربی داره و کار کردن باهاش سخت نیست. و الان حدود 3 سال هست که با asp کار میکنم و خیلی راضی ام."

با حرفش موافقم.

----------


## MMSHFE

بهتره توی این تاپیک نظرات شخصیمون رو که کدوم فریمورک رو میخوایم انتخاب کنیم و از کدوم بیشتر خوشمون میاد، درج نکنیم و بگذاریم این تاپیک همون حالت مقایسه ای خودش رو حفظ کنه و هر کسی برحسب نیاز خودش و بدون اینکه ما بهش سمت و سو بدیم، تصمیم بگیره. برای مثال بحث جداکردن Get و Post که اشاره کردین رو Yii هم داره (Yii::app()->request->getQuery و Yii::app()->request->getPost در نسخه 1.1 و Request::get و Request::post در نسخه 2).
درمورد اینکه ASP.NET حتی با MVC از PHP بهتره هم من شخصاً موافق نیستم چون Microsoft هرچقدر هم که بزرگ باشه (که بنظرم نیست و این مسئله از حفره های امنیتی محصولاتش مشخصه و این شرکت رو فقط یک حباب بزرگ میدونم)، باز هم توی پشتیبانی خوب عمل نمیکنه و فرضاً اگه شما یک باگ رو گزارش کنید، تا وقتی که شرکتی به بزرگی گوگل نباشین، اصلاً ایمیل شما خونده نمیشه (میتونید تست کنید). درهرصورت باز هم تأکید میکنم نظرات شخصی رو در این تاپیک وارد نکنید.

----------


## MMSHFE

> کانفیگ هر دو دقیقاً یکی هست. هر دو یه آرایه پی اچ پی رو بر میگردونند، تنها فرقشون اینه لاراول به صورت پیش فرض کانفیگ هر قسمت رو جدا کرده مثل codeigniter که Yii این کارو نکرده ولی میشه توی YII هم اینکار رو کرد بدون نیاز به کدنویسی خاصی.


من حتی با یک کد ساده توی متد init کلاس کنترلر در Yii اومدم توی یک پروژه خاص، امکان بازنویسی تنظیمات سایت (Yii::app()->params) رو به مدیر دادم و هرکدوم رو که بخواد میتونه تغییر بده (بدون اینکه فایل تنظیمات دست بخوره) و توی دیتابیس ذخیره میشه و هر تنظیمی که نسخه معادل توی دیتابیس داشته باشه، با نسخه دیتابیس بازنویسی میشه.

----------


## bestirani2

> جداکردن Get و Post که اشاره کردین رو Yii هم داره


منظورم از جدا کردن این بود 


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


که توی YII باید با if اینکارو کنیم.

----------


## bestirani2

> من حتی با یک کد ساده توی متد init کلاس کنترلر در Yii اومدم توی یک پروژه خاص، امکان بازنویسی تنظیمات سایت (Yii::app()->params) رو به مدیر دادم و هرکدوم رو که بخواد میتونه تغییر بده (بدون اینکه فایل تنظیمات دست بخوره) و توی دیتابیس ذخیره میشه و هر تنظیمی که نسخه معادل توی دیتابیس داشته باشه، با نسخه دیتابیس بازنویسی میشه.


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

----------


## bestirani2

> بله منظورم همون asp.net mvc بود. در مورد php و asp خیلی تحقیق کردم و هرکی دلایلی میاورد که تصمیم گیری رو سخت میکرد!
> آخرین بار توی نمایشگاه رسانه های دیجیتال، با برنامه نویس سایت راسخون کلی در این مورد صحبت کردیم و گفت:
>  "من حدودا 8 سال با php کار کردم و تقریبا اکثر فریمورک ها مثل  (zend,codeigniter,cakephp,...) را امتحان کردم و در آخر تصمیم گرفتم با asp کار کنم چون این زبان توسط یک شرکت بزرگ و حرفه ای پشتیبانی میشه که برنامه نویسای مجربی داره و کار کردن باهاش سخت نیست. و الان حدود 3 سال هست که با asp کار میکنم و خیلی راضی ام."
> 
> با حرفش موافقم.


امتحان کردن خیلی فرق داره با اینکه عمیقاً کار کنید. من الان با هر سه تا فریم ورک YII، سیمفونی و asp.net mvc کار میکنم. اگه بخواید ترتیبی که ترجیح میدم رو بدونید بگید که پیغام خصوصی بگم.
صرفاً اینکه یه برنامه نویس سایت ... گفته دلیل خوبی نیست. مطمئن باشید از بلاگفا هم بپرسید میگه asp.net mvc چون هر دو سایت دات نتی هستند ولی کلی سایت ایرانی بزرگ هست که با پی اچ پی هست که از اونها هم بپرسید میگند پی اچ پی که طبیعی هم هست.
در مورد پشتیبانی هم فریم ورکی مثل سیمفونی یا همون زند هست که یک شرکت مطرح پشتش هست. به فرض مثال سیمفونی به صورت منظم هر شش ماه یه بار آپدیت میشه. احتمالاً با asp وب فرم کار کرده نه asp.net mvc چون از نظر سختی کار کردن تقریبا همشون شبیه هم هستند ولی راجب وب فرم بگید قبول دارم راحتره ولی کلی معایب داره. شاید واسه پروژه دانشجویی و پروژه های خیلی کوچیک مناسب باشه ولی برای اکثر پروژه ها نه.
الان پی اچ پی هم فریم ورک هایی داره که اگه از asp.net mvc جلوتر نباشند، عقبتر هم نیستند.

----------


## tux-world

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

----------


## Amir_f

> خوب به امید خدا بعد از تعطیلات عید دوباره به این تاپیک سر بزنید چون قراره از اینجا به بعد من روی نقاط قوت Yii انگشت بگذارم و ببینیم لاراول چطور اونها رو مدیریت کرده تا این تاپیک کاملتر بشه.


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

با سپاس

----------


## MMSHFE

تاپیک حتماً بعد از تعطیلات ادامه پیدا میکنه. دارم توی اوقات فراغتم، امکانات Yii رو دسته بندی میکنم تا کم کم بریم سراغشون. مشابه همین تاپیک برای مقایسه سایر فریمورکها هم مدنظر دارم که ایجاد بشه.

----------


## metal gear solid 4

> ضمن تشکر از همه دوستان، اگر کسی بخواد بین یی و لاراول یکی رو انتخاب کنه، این تاپیک راهنمایی خوبه بوده و حتی نکات خوبی درباره مفاهیم کلی فریمورک در خودش داره
> بنده دیگه علاقه ای به ادامه و پست مطلب ندارم، دوستان خودشون در صورت تمایل، میتونند تاپیک رو ادامه بدند
> برای همه آرزوی موفقیت و ترفیع سطح دانش رو دارم
> موفق و پیروز باشید
> :)


بنده لحظه ی اولی که واکنش دوستان رو نسبت به Laravel دیدم قطع امید کردم. اینجا کسی قرار نیست فریمورکی که مدت هاست داره باهاش کار میکنه رو کنار بگذاره. حتی اگر قبول هم بکنه که رقیب بهتر عمل کرده. این تاپیک برای افرادی خوبه که قراره از ابتدا تصمیم به انتخاب یک فریمورک بگیرن.
ممنون که تا اینجا این تاپیک رو پیش بردید. اطلاعات خیلی خوبی بود. 
دوستانی که علاقه مند هستند میتونند از *این لینک* اطلاعات بیشتر کسب کنند. *البته کامل نیست*

----------


## bestirani2

> بنده لحظه ی اولی که واکنش دوستان رو نسبت به Laravel دیدم قطع امید کردم. اینجا کسی قرار نیست فریمورکی که مدت هاست داره باهاش کار میکنه رو کنار بگذاره. حتی اگر قبول هم بکنه که رقیب بهتر عمل کرده. این تاپیک برای افرادی خوبه که قراره از ابتدا تصمیم به انتخاب یک فریمورک بگیرن.
> ممنون که تا اینجا این تاپیک رو پیش بردید. اطلاعات خیلی خوبی بود. 
> دوستانی که علاقه مند هستند میتونند از *این لینک* اطلاعات بیشتر کسب کنند. *البته کامل نیست*


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

----------


## MMSHFE

البته Yii به جز سرعت بالا و سازگاری خیلی خوب و نسبتاً کامل با استانداردهای Web 2، امتیازهای دیگری هم داره که بعد از تعطیلات عید به اونها میپردازیم و خوشحال میشم برای تکمیل شدن این تاپیک، دوستانی که با لاراول کار میکنن، تاپیک رو ادامه بدن و جوابها رو در قالب نسخه معادل اون امکانات در لاراول، بیان کنن.

----------


## metal gear solid 4

> باید فریم ورک جدید حرفی برای گفتن داشته باشه که فریم ورک قبلی رو ول کنیم.
> البته باید دید هدف فریم ورک چیه؟ به نظر من YII و لاراول دو هدف متفاوت دارند و کسی که YII رو کار میکنه به دلیل سرعت بالاش، پشتیبانی قوی از وب 2 و این گونه موارد هست.


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

** ضمناً خوشحال میشم استانداردهای وب 2 رو بیان کنید. خیلی کنجکاو شدم بدونم Yii چطور این استانداردهارو برآورده میکنه که سایر فریمورک نمیتونن!!

----------


## tux-world

منم با حرف* metal gear solid 4* 	 کاملا موافقم. آقای شهرکی و دوستان چنان موضع گرفتن در مورد Yii که انگار خدا آفریده این فریم ورک رو. بابا جان هر دوی فریم ورک ها عالین. هیچ کسی هم نمیتونه بگه این بده اون خوبه.yii اگر چه خیلی عالیه ولی واقعا یادگیریش بسیار زمان بره . برای پروژه هایی که بخوایید به مرور زمان روی توسعش وقت بزارید به صرفه نیست. لاراول در عین سادگیش بسیار پر کاربرده ولی هیچ یک از ما لاراول کارا مثل دوستانی که با yii کار میکنن اصلا تعصبی نیستیم. کلا دوستان yii کار با مباحثی که لاراول در امکاناتش گذشته مشکل دارن و ادعا میکنن اگه فرد برنامه نویس باشه اینا چیزی نیستند. بلی این حرف رو منم تصدیق میکنم ولی چه کسی مادرزادی برنامه نویس بوده؟ هیچ کس همه ما از صفر شروع کردیم. تو برنامه نویسی سوتی هایی دادیم که خدا عالمه. پس این دید برنامه نویسا و دوستان هستش که با توجه به امکانات و توانمندیهای فریم ورک ها انتخاب میکنن.
جبهه گیری مسخره کردن. اضافه دونستن همه اینا کارای بچگانست. یه خورده واقع بین باشیم و در مورد خصوصیات و امکانات بحث کنیم نه جنگ کنیم و نه جبهه گیری کنیم.نه تعصب به خرج بدیم که خداییش تا الان فقط دوستان yii کار انجام دادن.
من با rezakho تماس گرفتم اصلا راضی نمیشن بحث رو ادامه بدن فقط به این کارای بچه گانه ای که دوستان انجام میدن.
خوب آقا جان اصلا yii خداست. شما برنده شدید و این فریم ورک عالیه و لاراول آشغال. شما رو به خیر و ما رو به سلامت ببینیم این تعصب شما رو به جا میروسونه

----------


## bestirani2

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


بنده از اخرهای تاپیک اومدم و تا حالا چیزی رو رد نکردم یا بگم با پلاگین هم میشه.
الان یه نگاه کوتاه به کل تاپیک کردم
موارد زیر خوب هستند که YII نداره، البته این موارد از سیمفونی اومدند و ابتکار لاراول نیست. بنده خودم با اینکه مدت خیلی زیادی YII کار میکردم، در حال حاضر دارم سیمفونی هم کنارش کار میکنم. همینطور asp.net mvc. همینطور که میبینید نه به زبون خاصی تعصب دارم و نه فریم ورک خاصی.

توی لاراول مسیر ها رو میشه بدون اکشن و کنترولر مدیریت کرد
میشه مسیرهای تو در تو تعریف کرد
میشه روت ها رو گروه بندی کرد
در لاراول امکان نام دادن به روت ها برای راحت تر کردن مسیر دهی و یا تولید url ها وجود داره
Route Model Binding
ایجاد یک listener برای کوئری ها که مثل ایونت روی تمام کوئری ها اعمال و اجرا میشه


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

----------


## bestirani2

> البته Yii به جز سرعت بالا و سازگاری خیلی خوب و نسبتاً کامل با استانداردهای Web 2، امتیازهای دیگری هم داره که بعد از تعطیلات عید به اونها میپردازیم و خوشحال میشم برای تکمیل شدن این تاپیک، دوستانی که با لاراول کار میکنن، تاپیک رو ادامه بدن و جوابها رو در قالب نسخه معادل اون امکانات در لاراول، بیان کنن.


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

----------


## tux-world

همه ما قصدمون انتخاب درست و به جای فریم ورک هستش نه ادعاها و تجربیات شخصی. همیشه ما فرض رو روی پیشفرض ها میزاریم تا مقایسه ها بدون مشکل و تعصب و جار و جنجال انجام بشه. همه کاراها رو تو هر فریم ورک و حتی بدون اون هم میشه انجام داد شرط اینه که ما خودمون بدونیم چقدر میتونیم توانمندیهامون رو در اون به اجرا بزاریم. Zend همه میدونن خفن ترین فریم ورک دنیاست. چقدر از برنامه نویسا ازش استفاده میکنن. معلومه یه تعدادی ولی صد در صد نیستن اونا با همه دردسر و سختی هایی که داره باهاش راحتن. یه کسایی با Yii یه کسایی با laravel. این ادعا رو هیچ بنی بشری نمیتونه نقض کنه.
ما هم میگیم شاید البته لاراول از یه لحاظی ممکنه به yii نرسه ولی ما به راحتی میتونیم روش مانور بدیم. شاید البته Yii قدرتمندترین قوی ترین فوق العاده ترین فریم ورک باشه ولی مغز یه انسان نیستش که. 
بلاخره اون هم زیر دست برنامه نویسه. یه مواردی رو ممکنه yii کارا دوست داشته باشن فریم ورک براشون انجام بده یه کارایی رو نه. دقیقا برعکس همین برای لاراول هستش. هیچ کس نمیتونه ادعا بکنه یک فریم ورک چقدر عالیه. این خود برنامه نویس هستش که قدرت خلاقیتش رو تو اون فریم ورک عرضه میکنه و فریم ورک کمکش میکنه.
ممکنه الان برای ما لاراول عالی باشه فردا پس فردا ببینیم نه yii بهتره مسلما با yii کار میکنیم. هیچ تعصبی بهش نداریم. ولی کسایی که با yii کار میکنن عمرا اگه به روی خودشون بیارن زمانی که مجبور باشن با لاراول یا هر فریم ورک دیگه ای کار کنن.

تعصب بیجا . الکی و بچه گانه از ما بعیده خداییش.
وقتی لاراول در مورد یه چیزی کمبودی داره ما به راحتی قبول میکنیم ولی وقتی در مورد yii پیش بیاد جنگ و دعوا و تعصب های بچگانه و قانع کننده ها شروع میشه.

----------


## bestirani2

> ** ضمناً خوشحال میشم استانداردهای وب 2 رو بیان کنید. خیلی کنجکاو شدم بدونم Yii چطور این استانداردهارو برآورده میکنه که سایر فریمورک نمیتونن!!


نتونستم معنی نداره. من به پشتیبانی بهتر از وب 2 اشاره کردم نه اینکه بقیه به کل نتونند.
به عنوان مثال تمام قسمت های فریم ورک به صورت آژاکس هست. صفحه بندی، دیتا گرید و ....
با همون ابزار خود YII یه CRUD رو درست کنید میبینید از فیلتر کردن و مرتب سازی، صفحه بندی و ... همگی آژاکس هستند و نیازی به تغییر صفحه ندارند.
از طرفی تمام Helper ها که استفاده میکنیم به صورت توکار از آژاکس پشتیبانی میکنند. 

به عنوان نمونه



<div id="data">
   <?php $this->renderPartial('_ajaxContent', array('myValue'=>$myValue)); ?>
</div>
 
<?php echo CHtml::ajaxButton ("Update data",
                              CController::createUrl('helloWorld/UpdateAjax'), 
                              array('update' => '#data'));
?>




اگه معادلش رو توی لاراول دارید بگید.

----------


## MMSHFE

> آقای شهرکی و دوستان چنان موضع گرفتن در مورد Yii که انگار خدا آفریده این فریم ورک رو.


خیلی جالبه. من درمورد Yii موضع گرفتم؟ چند مورد از امکاناتی که توی لاراول بود و توی Yii نبود رو مثال بزنم که توی همین تاپیک صادقانه گفتم لاراول بهتر عمل کرده؟ اما وقتی یه چیزی مثل کلاس File رو میاین بعنوان امکانات بیان میکنید که واقعاً هیچ چیزی نداره، انتظار نداشته باشین چون Yii چنین کاری نکرده و تنها دلیلش هم بیهوده بودنشه، باز هم بیام بگم اینجا هم لاراول یکسری امکانات داره که Yii نداره. برای مثال، خودتون بگین کدوم کد زیر بهتره:
foreach($files as $file) { @unlink($file); }
class File {
    ...
    public static function delete($paths)
    {
        $paths = is_array($paths) ? $paths : func_get_args();
        $success = true;
        foreach ($paths as $path) { if ( ! @unlink($path)) $success = false; }
        return $success;
    }
    ...
}
// Usage
File::delete($file1, $file2, $file3);
یا مثلاً این دو کد رو مقایسه کنید:
require_once $file;
class File {
    ...
    public static function requireOnce($file)
    {
        require_once $file;
    }
    ...
}
// Usage
File::requireOnce($file);
وقتی یک قابلیت واقعاً لازم و ضروری نیست، دلیلی نداره که حتماً پیاده سازیش کنیم چون میخوایم بگیم که روش منحصربفرد خودمون رو داریم و بعد توی روش منحصربفرد! خودمون، باز بیایم از همون توابع خود PHP که به راحتی کار رو انجام میدادن استفاده کنیم. اینکه یک تابع رو توی یک تابع دیگه صدا بزنیم برای اینکه همه توابع رو توی یک کلاس جمع کنیم، وقتی سودمنده که بخوایم یک کار پیچیده انجام بدیم نه کاری مثل تغییر نام فایل که یک خط کد PHP بیشتر نیست.
حالا هم طوری نشده، اجازه بدین بعد از تعطیلات، با امکاناتی که توی Yii هست در خدمت دوستان عزیز لاراول کار هستیم. امیدوارم دوباره این رو جبهه گیری فرض نکنید چون قصدم اینه که این تاپیک پربارتر بشه و نقاط و ضعف و قوت هر دو فریمورک مشخص بشه و یکطرفه نباشه که فرضاً مدام یکسری امکانات از لاراول رو بکشیم بیرون و بگیم توی Yii هست یا نه. مطمئناً Yii یا هر فریمورک دیگری هم حرفهای زیادی برای گفتن داره که روشن شدنشون میتونه توی گرفتن تصمیم صحیح به کسانی که قصد انتخاب دارن، کمک کنه. از جناب rezakho هم تقاضا دارم با توجه به اینکه استارتر تاپیک بودن و عنوان Yii vs Laravel رو انتخاب کردن و توی هر دو تالار Yii و Laravel پست گذاشتن، پا پس نکشن و معادلهای لاراول رو بیان کنن تا یکوقت کسانی که تازه میخوان فریمورک انتخاب کنن، فکر نکنن لاراول معادل اون چیزهایی که بنده مطرح خواهم کرد رو نداره. وقتی تاپیک مقایسه ای ایجاد میکنید، تا آخر باید پای مقایسه بایستین و این قبیل بچه بازیها (عذر میخوام) که فلانی با تعصب حرف میزنه و... رو بگذارین کنار.
قابلیت از لاراول معرفی کردین، معادلش رو در Yii اگه بود گفتیم و اگه نبود گفتیم لاراول خوب عمل کرده یا اگه قابلیت مهمی نبوده، گفتیم که مهم نیست (و اعلام کردیم که نظر شخصیمونه). حالا که نوبت به امکانات Yii رسیده، اونهم درحالی که از ابتدا اعلام کردم بودم که بعد از شما، نوبت ما خواهد بود، حق ندارید میدون رو ترک کنید. البته باز هم تأکید میکنم Yii و Laravel هر دو فریمورکهای خوب و قدرتمندی هستن و هرکدوم نقاط ضعف و قوت خاص خودشون رو دارن و قصد جنگ و دعوا نداریم و فقط میخوایم یک مقایسه جامع بین اونها داشته باشیم. شاید بعدها این تاپیک یک مرجع مقایسه خوب برای خیلی از افراد شد.

----------


## tux-world

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

----------


## MMSHFE

اولاً اگه میگین درخواست دادن و دلیل آوردن، لطفاً مستند صحبت کنید. سند این درخواستها رو مطرح کنید (لینک صفحه مربوطه در سایت لاراول - اگه هست) و ثانیاً حتی اگه اینطور باشه هم باز باعث نمیشه قابلیت بی فایده ای صرفاً بخاطر اینکه چند نفر از جامعه چند صد هزار نفری کاربران، درخواست داده باشن، قرار بگیره. این مسئله بخصوص در مواقعی که فریمورک، تیم توسعه بزرگی نداره (تأکید میکنم قصدم تخریب و اهانت به لاراول نیست) و یک یا دو نفره داره جلو میره، بیشتر خودش رو نشون میده. منظورم اینه که توی اینجور پروژه هاست که بیشتر قابلیتها بر اساس سلایق شخصی قرار میگیره (نه همه). درمورد پا پس کشیدن هم بگذارین خود جناب rezakho (اسمشون رو نمیدونم) جواب بدن چون بنده در 2 اسفند سال قبل گفتم که قراره بعداً امکانات Yii رو مطرح کنم (*لینک*).

----------


## metal gear solid 4

> نتونستم معنی نداره. من به پشتیبانی بهتر از وب 2 اشاره کردم نه اینکه بقیه به کل نتونند.
> به عنوان مثال تمام قسمت های فریم ورک به صورت آژاکس هست. صفحه بندی، دیتا گرید و ....
> با همون ابزار خود YII یه CRUD رو درست کنید میبینید از فیلتر کردن و مرتب سازی، صفحه بندی و ... همگی آژاکس هستند و نیازی به تغییر صفحه ندارند.
> از طرفی تمام Helper ها که استفاده میکنیم به صورت توکار از آژاکس پشتیبانی میکنند. 
> 
> به عنوان نمونه
> 
> 
> 
> ...


شما وب 2 رو در همین حد خلاصه کردید. حتماً پیشنهاد میکنم وب 2 رو از تمامی لحاظ بررسی کنید.
اگر واقعاً با همین وضعیت به استانداردهای وب 2 میرسید. خسته نباشیدی بزرگ خدمتتون عرض میکنم!!

----------


## MMSHFE

> شما وب 2 رو در همین حد خلاصه کردید. حتماً پیشنهاد میکنم وب 2 رو از تمامی لحاظ بررسی کنید.
> اگر واقعاً با همین وضعیت به استانداردهای وب 2 میرسید. خسته نباشیدی بزرگ خدمتتون عرض میکنم!!





> ...به عنوان نمونه...


جناب MGS4، شما واقعاً پستها رو بطور کامل میخونید؟ این بعنوان نمونه رو ندیدین؟! علی الحساب معادل همین رو توی لاراول مطرح کنید تا بعداً به بقیه امکانات وب 2 رسیدگی کنیم!

----------


## bestirani2

> شما وب 2 رو در همین حد خلاصه کردید. حتماً پیشنهاد میکنم وب 2 رو از تمامی لحاظ بررسی کنید.
> اگر واقعاً با همین وضعیت به استانداردهای وب 2 میرسید. خسته نباشیدی بزرگ خدمتتون عرض میکنم!!


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

----------


## tux-world

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


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

----------


## bestirani2

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


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

اتفاقاً شما فریم ورک رو با پی اچ پی خام اشتباه گرفتید. تمامی فریم ورکهایی که من تا حالا کار کردن یه سری قسمت های پیش فرض قرار دادند از دات نت بگیر تا سیمفونی و YII. لاگین کردن نیاز هر سایتی هست. برای چی به صورت ابتدایی توی پروژه نباشه تا کاربر با توجه به نیاز خودش شخصی سازی کنه؟
دقیقاً منم بالاتر همین رو گفتم هر فریم ورک سیاست خودش رو داره. سیاست لاراول پیچیدگی کم و سادگی یادگیری هست. سیاست سیمفونی انعطاف پذیری و مهندسی بالا که بهترین گزینه برای پروژه های بزرگ هست. سیاست YII سرعت توسعه بالا، پرفرومنس بالا، وب 2
حالا این سیاست ها رو من به نظر خودم گفتم که البته خود فریم ورک ها هم اکثرا در ویژگی هاشون این مواردی که من گفتم رو بیان کردند.

بحث جذاب و غیر جذاب نیست. همینطور که دیدید من لیست ویژگی های خوب لاراول که توی این فروم بود رو ذکر کردم
https://barnamenevis.org/showthread.p...=1#post1994731

به هر حال هم لاراول یک سری ویژگی خوب داره و هم YII و بسته به نیازتون میشه یکی رو انتخاب کنید.

----------


## tux-world

> بحث سلیقه نیست. بحث امکانات هست.
> 
> اتفاقاً شما فریم ورک رو با پی اچ پی خام اشتباه گرفتید. تمامی فریم ورکهایی که من تا حالا کار کردن یه سری قسمت های پیش فرض قرار دادند از دات نت بگیر تا سیمفونی و YII. لاگین کردن نیاز هر سایتی هست. برای چی به صورت ابتدایی توی پروژه نباشه تا کاربر با توجه به نیاز خودش شخصی سازی کنه؟


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

----------


## bestirani2

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


درسته امکانات خوبی داره ولی به فریم ورکی مثل YII نمیرسه. codeintiger هم یه فریم ورک هست که هدفش سادگی بوده که به نظرم لاراول موفق تر عمل کرده و با وجود سادگی، امکانات خوبی هم میده. البته به غیر از برنامه نویس، پروژه است که با توجه به نیازش باید فریم ورک انتخاب بشه. سیمفونی خیلی خوبه. اگه خواستی یاد بگیری میتونی سوالهات رو از من بپرسی. به نوعی توی هر فریم ورک قسمت هایی از سیمفونی دیده میشه. حتی YII هم توی نسخه جدیدش Composer و Twig رو اورده که بر میگرده به سیمفونی. YII هم واقعا لذت بخشه. کافیه باهش کمی کار کنید تا متوجه حرفم بشید. برای پروژه هایی که میخواید در کمترین زمان یک چیز عالی رو ارائه بدید خیلی خوبه.

یه سوال؟ توی لاراول اعتبار سنجی تحت کلاینت هم انجام میشه یا بر پایه Html 5 هست؟

----------


## MMSHFE

> خوب به نظرم یه خورده در مورد لاراول اشتباه میکنید. خود لاراول امکاناتش رو داره ولی نه به اون صورتی که در yii هستش.


الآن از امکانات وب 2 میشه دقیقاً بگین که کدوم موارد توی لاراول هست؟ خواهشاً با کلمات بازی نکنید (داره ولی نه به اون صورتی که در Yii هستش). منظورم اینه که یک لحظه اصلاً Yii رو فراموش کنیم، یکطرف وب 2 رو داریم و یکطرف لاراول رو. بفرمایید کدوم امکانات وب 2 توی لاراول پیاده سازی شده؟ AJAX رو داره؟ بطور خودکار اگه JS غیرفعال باشه تشخیص میده و به همون حالت رایج بدون AJAX برمیگرده؟ Client Side Validation داره؟ از کدوم کتابخانه JS بطور داخلی پشتیبانی میکنه؟ با Flex سازگاری داره؟ امکان تولید خودکار RSS و Atom و Sitemap داره؟ امکان ساخت WebService با SOAP یا Rest بصورت داخلی داره؟ کلاً *این لینک* رو ببینید و بفرمایید کدومها توی لاراول هست.



> فکر میکنم CMS رو با فریم ورک اشتباه گرفتید. از شما بعیده. هر فریم ورکی  سیاست خودش رو داره قرار نیست چون yii داره بقیه هم داشته باشن


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

----------


## abytools

صحبت های *MMSHFE*




> ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:
> 1
> file_exists





> ضرورتی نداره چون با خود PHP و با یک خط میشه انجام داد:
> 1
> $contents = file_get_contents($filename);


   من طرف دار هیچ فریمورکی نیستم .  ولی دوست داشتم چند نکته رو متذکر بشم .


 این قضیه که یک فریمورک تمامی امکانات رو تو خودش داشته باشه خیلی خوبه ولی باید از جهت دیگه هم نگاه بشه و اون هم اینه که یه حالت مثل ماکروسافت به وجود میاد .  مثلا orm  که من می گم . موتور قالبی که من می گم . امکانات ajax  که من میگم . Validation  که من می گم . و این من رو تیم yii تشکیل میده که میگیم 20 نفره . و این در حالیه که ممکنه یک تیم 10 نفره فقط روی یک orm کار کرده باشه  یه تیم 5 نفره اختصاصی روی validation های مختلف سمت کاربر و سمت سرور کار کرده باشه . و چرا نباید از این امکانات که حرفه ای تره استفاده نشه .
 پس اگر خود فریمورک orm داشته باشه کمک کننده است ولی ویژگی فوق العاده ای نیست .
 همه چیز رو همگان داند و نه یک تیم نهایت 30 نفره .
 اگر بخواهیم اینجوری حساب کنیم سیمفونی خیلی ضعیفه چون orm داخلی نداره . وب 2 نداره . اونها دیدن که چندین orm حرفه ای وجود داره . چرا دوباره کاری کنن . چرا سازگاری هایی با داکترین که حرفه ای ترین orm هست نداشته باشن ؟ چرا وقتشون رو صرف ajax کنن وقتی مسایل مهم تری هم هست . برای پروژه های بزرگ این چیز ها پیش پا افتاده هستش .


 این مسایلی که شما از امکانات ویژه وب 2 در yii می گید و بابتش این فریمورک رو برتر از همه فزیمورک ها می بینید . اینها امکاناتی است که از قبل وجود داشته پیاده سازی شده استفاده شده و چیز هایی نیستش که نشه با بقیه انجامش داد . فقط می تونه کمک کندده باشه از این باب که همه امکانات این چنینی یکجا جمع شده فقط همین . Ajax رو نمیشه با jq انجام داد ؟؟ به راحتی .  


 همون طور که کار با فایل رو با خود php  میشه انجام داد و تو لاراول مزیت نیست . کار های وب 2 رو هم میشه به راحتی با بقیه ابزار ها پیاده سازی کرد و مزیت نیست . و ضرورتی نداره

----------


## bestirani2

> همون طور که کار با فایل رو با خود php  میشه انجام داد و تو لاراول مزیت نیست . کار های وب 2 رو هم میشه به راحتی با بقیه ابزار ها پیاده سازی کرد و مزیت نیست . و ضرورتی نداره


فایل رو با وب 2 یکی میکنید؟
با کمک وب 2 YII
1. برنامه نویسی سمت کلاینت به حداقل میرسه.
2. یه نگاهی به سورس صفحه بکنید میبینید که دو خط کد ما شده 30 40 خط کد تحت کلاینت.

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

----------


## abytools

دوست من . دید من بسته است شما بازش کن . 
این صفحه سیمفونیه :
symfony
بعد من که توش doctrine  رو نمی بینم . twig رو مستقیما خودش ساخته که توش هست .
این هم صفحه doctrine است :
doctrine
بعضی از اعضای سیمفونی تو این پروژه مشارکت دارند . اصل موضوع doctrine 2 هستش . هم برای zend بسته براش در نظرگرفتن برای راحتی کار و هم برای سیمفونی bundle در نظر گرفتن  . و صد البته برای لاراول هم پکیج وجود داره که مستقیما توسط داکترین ایجاد نشده .
اگر سازنده های سیمفونی ساخته بودنش جاش تو پکیج های سیمفونی بود دوست عزیز . 
در مورد دیگران هم قضاوت نکن . فقط درمورد خودت حرف بزن

----------


## bestirani2

> دوست من . دید من بسته است شما بازش کن . 
> این صفحه سیمفونیه :
> symfony
> بعد من که توش doctrine  رو نمی بینم . twig رو مستقیما خودش ساخته که توش هست .
> این هم صفحه doctrine است :
> doctrine
> بعضی از اعضای سیمفونی تو این پروژه مشارکت دارند . اصل موضوع doctrine 2 هستش . هم برای zend بسته براش در نظرگرفتن برای راحتی کار و هم برای سیمفونی bundle در نظر گرفتن  . و صد البته برای لاراول هم پکیج وجود داره که مستقیما توسط داکترین ایجاد نشده .
> اگر سازنده های سیمفونی ساخته بودنش جاش تو پکیج های سیمفونی بود دوست عزیز . 
> در مورد دیگران هم قضاوت نکن . فقط درمورد خودت حرف بزن


من نگفتم بسته. منظور این بود به نظر میاد اشنایی کاملی با سیستم باندل بیس سیمفونی ندارید.
در مورد داکترین هم من نگفتم که توسط شرکت SensioLabs تولید شده. گفتم برنامه نویسان سیمفونی کد نویسی اون رو هم به عهده دارند.

----------


## salehforum

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

----------


## Amir_f

تعطیلات رو به پایان هست ، لطفا بحث رو ادامه بدید

----------


## MMSHFE

دارم مطالب رو دسته بندی میکنم که منظم جلو بریم. توی همین هفته بحث رو ادامه میدیم.

----------


## Mojtaba.Shateri

اینم دیدنش خالی از لطف نیست :
http://vschart.com/compare/laravel/vs/yii

----------


## SadeghPro19

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

----------


## M.Rahi

یه جمع بندی کلی کردم، شاید انتخاب نهایی فریم ورک رو راحتتر کنه.  :لبخند: 


*Laravel*
مزایا
خوانایی کدها (ایجاد فرم، مدل ها و ...)ساختار ساده تر view هااستفاده از config پیشفرض سادهبازخوانی سریعتر کدهامعایب
ناتوانی در اشتراک هسته فریم ورک برای چند پروژهنداشتن امکانات توکار پرکاربرد اعم از امکانات وب 2 ، تم، کتابخانه js و ...



*Yii*
مزایا
سیستم کش حرفه ای ترقابلیت استفاده از  تم و اسکینداشتن تعداد زیاد افزونهانجمن فعال ترقابلیت استفاده از کتابخانه jqueryمستندات کامل تراشتراک گذاری هسته فریم ورک برای چند پروژهکپچا (توکار)ایجاد وب سرویس راحت و سریع (توکار)منابع بیشترمعایب
خوانایی کد کمتر نسبت به laravel


مدتی پیش برای ایجاد یه پروژه تصمیم گرفتم که از yii استفاده کنم. به اتفاق بعد از گفتگو با یکی از دوستان، بهم laravel رو معرفی کرد و بعد از بررسی اون، دیدم سروساده تر از yii عمل کرده.
تصمیم داشتم که با laravel پروژه رو استارت بزنم اما بعد از بررسی های نهایی و با توجه به امکانات مورد نیاز پروژه، تصمیمم عوض شد و ترجیح میدم که با yii کار کنم.
امکانات توکار، افزونه ها و منابع گسترده، باعث افزایش سرعت عمل میشه.
yii 2 که منتشر بشه قطعا خیلی از کاستی های yii 1 مرتفع میشه. پس بهتره که خودمون رو از الان مسلط کنیم روی yii 1.
ان شاء الله که این جمع بندی ها برای بقیه مفید واقع بشه.

----------


## metal gear solid 4

> یه جمع بندی کلی کردم، شاید انتخاب نهایی فریم ورک رو راحتتر کنه. 
> 
> 
> *Laravel*
> مزایا
> خوانایی کدها (ایجاد فرم، مدل ها و ...)ساختار ساده تر view هااستفاده از config پیشفرض سادهبازخوانی سریعتر کدها معایب
> ناتوانی در اشتراک هسته فریم ورک برای چند پروژه ---- *این مورد رو حتماً کامل توضیح بدید.*نداشتن امکانات توکار پرکاربرد اعم از امکانات وب 2 ، تم، کتابخانه js و ... 
> 
> 
> ...


مشخصه این مقایسه منطقی انجام نشده. یا اطلاعاتتون کمه یا خدایی نکرده مغرضانست.
در رابطه با cache امروزه انواع و اقسام سیستم های کش کردن هست. memcached, redis, apc, opcache, mongo و خیلی های دیگه که به جز opcache و mongo تمامشون به صورت built-in در لاراول پیشتیبانی میشن به علاوه ی کش دیتابیس و فایل. بیشتر توضیح بدید. به تصور شما قابلیت استفاده از تم و اسکین در لاراول وجود نداره؟ برید مطالعه بفرمایید.لاراول در حال حاظر به خاطر استفاده از Package ها، 8000 افزونه داره. در حالی که Yii فکر میکنم 2500 افزونه داره.انجمن فعالتر رو یک مزیت برای فریمورک میدونید شما!!یا من خیلی کارم درسته یا شما نمیتونید توی لاراول از کتابخانه JQuery استفاده کنید!!!مستندات لاراول به اندازه Yii کامل نیست اما به قدری هست که یک فرد مبتدی و متوسط بتونه هازش به نحو احسنت استفاده کنه.کدهای کپچا رو اساساً بهتره به عهده ی سرویس های خارجی قرار بدیم. هم بار پردازشی از دوش سرور شما کم میشه هم امنیت بیشتری داره. بهترین گزینه کپچا گوگل هست.منابع بیشتر رو نفهمیدم بنده. به هر حال از نظر شما مزیته!!!

----------


## amirkheirabadi.com

همونطور که دوستمون گفتن این مقایسه ایراد داره ... البته بنده قصد جسارت ندارم ....
اول از همه سر مستندات ... من موقعی که می خواستم برم سراغ Yii خودم رو کشتم باور کنید حداقل تا چند ماه پیش با وجود چندین کتاب و سایت و... ولی بازم برای من مستندات yii عجیب و یک جورایی بی ساختار به نظر می رسید ... ولی از اون طرف laravel واقعا مستندات کوتاه و مفیدی در اختیار قرار داده که هر کی جزئیات بیشتر خواست بره دنبالش ... هر چند خود Tutsplus پشته کاره و کار این تیم مخصوصا آقای jeffery way در آموزش بر کسی پوشیده نیست ...


نقطه بعدی که من خواستم بگم افزونه هاست .. آقا من نمی گم yii زیاد افزونه نداره می گم کی گفته laravel کم افزونه داره ... البته به نظرم این نمی تونه گزینه خوبی برای مقایسه باشه .. چون خیلی چیزهای دیگه مثل سال تولید فریم ورک هم باید در نظر گرفته بشه .. به همراه خیلی چیزهای دیگه ....

و آخرین گزینه که الان به ذهنم رسید ... امکانات توکار ... به نظرم من این یک امر سلیقه ای هستش ... یک مثال بزنم ... خیلی ها به من گیر می دن چرا از sublime استفاده می کنی با وجود این همه برنامه قوی تر مثل phpstorm , pycharm , ........... ولی می دونی من نظرم چیه .. من می گم یک سیستم باشه که در نگاه اول ساده و خیلی ساده ولی با پتانسیل قوی که بتونی امکانات رو بهش اضافه کنی و خودت غولش کنی مثل sublime  و وردپرس ... 

به هر اینم نظر ما ... باز م بزرگتر ها باید نظر بدن ...

----------


## M.Rahi

> در رابطه با cache امروزه انواع و اقسام سیستم های کش کردن هست. memcached, redis, apc, opcache, mongo و خیلی های دیگه که به جز opcache و mongo تمامشون به صورت built-in در لاراول پیشتیبانی میشن به علاوه ی کش دیتابیس و فایل


در laravel خواستم از cache dependency استفاده کنم که دیدم نه در مستندات چیزی در موردش هست و نه توی گوگل!  درخواستم رو توی انجمن laravel مطرح کردم که هیچکس پاسخگو نبود!
الان هم توی گوگل سرچ کنید، اولین لینکی که میاره لینک تاپیک خودمه (که هنوز هم کسی جواب نداده) : http://laravel.io/forum/03-01-2014-cache-dependency




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


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




> لاراول در حال حاظر به خاطر استفاده از Package ها، 8000 افزونه داره. در حالی که Yii فکر میکنم 2500 افزونه داره.


مسلما چون laravel باندل بیس هست، سرعت رشد افزونه هاش زیاده اما افزونه های کاربردیش کمتر از yii هست (توی سرچ زدن مشخصه).




> انجمن فعالتر رو یک مزیت برای فریمورک میدونید شما!!


وقتی انجمن فعالتر باشه، سوالات سریعتر به جواب میرسه و کاربر مجبور نیست کلی از وقتش رو صرف انتظار برای جواب هدر بده! (نمونش همین سوال خودم که لینکش رو بالا گذاشتم)




> یا من خیلی کارم درسته یا شما نمیتونید توی لاراول از کتابخانه JQuery استفاده کنید!!!


شما که کارتون درسته :)  اما laravel به صورت "توکار" از jquery پشتیبانی نمیکنه و باید دستی به سیستم اضافه بشه اما در yii اینطور نیست و این سرعت عمل رو بالا میبره.




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


مستندات yii طوریه که اگر فرد خواست از بیس کار کنه و MVC هم بلد نباشه، میتونه با مستندات yii قدم به قدم ساختار فریم ورک رو یاد بگیره. همچنین تنظیم تاپیک ها خودش یه مزیته چراکه در laravel عناوین رو در بخش *Learning More* طبق حروف الفبا مرتب کرده نه بر اساس الویت یادگیری!




> کدهای کپچا رو اساساً بهتره به عهده ی سرویس های خارجی قرار بدیم. هم بار پردازشی از دوش سرور شما کم میشه هم امنیت بیشتری داره. بهترین گزینه کپچا گوگل هست.


چیزی مثل کپچا که توی اکثر پروژه ها استفاده میشه چرا بخوایم وقتمون رو صرف اضافه کردن آن و تنظیمات دستی کنیم؟! بهتره که توکار باشه.




> منابع بیشتر رو نفهمیدم بنده. به هر حال از نظر شما مزیته!!!


منابع بیشتر یعنی وقتی توی موتور جستجویی مثل گوگل در مورد yii سرچ میکنی با وب سایت های زیادی رو به رو میشی که آموزش های زیادی گذاشتن اما در مورد laravel این قضیه صدق نمیکنه!


لطفا واقع بین باشید. شاید به این دلیل که مدتیه با laravel کار کردین، دل کندن ازش براتون کمی سخت باشه، چون laravel از ابتدا مثل یه نوزاد میمونه که با باندل ها اون رو بزرگش میکنیم و شما ممکنه وقت زیادی صرف بزرگ کردنش کرده باشید و الان اون رو به yii خام رسونده باشید ولی برای اون کسی که میخواد تازه شروع کنه، باید وقت زیادی صرف پیدا کردن باندل ها و نوشتن کدهای js کنه که با انتخاب yii دیگه نیازی به این کارها نیست و مستقیما وقتش رو صرف آنالیز پروژه میکنه.

----------


## metal gear solid 4

> در laravel خواستم از cache dependency استفاده کنم که دیدم نه در مستندات چیزی در موردش هست و نه توی گوگل!  درخواستم رو توی انجمن laravel مطرح کردم که هیچکس پاسخگو نبود!
> الان هم توی گوگل سرچ کنید، اولین لینکی که میاره لینک تاپیک خودمه (که هنوز هم کسی جواب نداده) : http://laravel.io/forum/03-01-2014-cache-dependency
> 
> 
> 
> تا اونجایی که من در مستندات laravel خوندم همچین امکانی نداره! و سرچ کردم دیدم باید از یه باندل استفاده کنی که کلا نحوه صدا زدن ویوها عوض میشه و یه جورایی قابلیت استفاده مجدد کدها پایین میاد.
> 
> 
> 
> ...


من دونه به دونه پاراگراف های شمارو پاسخ میدم. خودتون مطابقت بدید.


سیستم کش کردن در لاراول به خوبی پشتیبانی میشه. Cache Dependency هم در سطح کد شما انجام میشه. فکر نمیکنم سیستم های کش این رو در اختیار شما قرار بدن. حداقل من ندیدم یا نیازم نبوده دنبالش باشم. قدر مسلم تمامی سیستم هایی که در Yii پشتیبانی میشند در لاراول نیز پیشتیبانی میشند. این ارتباطی به فریمورک نداره. اگر یک سیستم کش قابلیتی رو ارائه بده هر فریمورکی که ازش استفاده کنه اون قابلیت رو داره. شما اکستنشن موجود رو نصب میکنید پس فرقی نداره قاعدتاًLaravel دیگه باندل بیس نیست. الان یکسال بیشتره از یکساله که از Package استفاده میکنه و تا دلتون بخاد پکیج براش موجوده که همه نوع نیازشما رو از لحاظ پکیج یا به قول شما افزونه برطرف میکنه.خیر. برای استفاده از تم و اسکین هیچ نیازی به هیچ پکیجی ندارید. باید بیشتر مطالعه و جستجو میکردید.پکیج هایی که در لاراول استفاده میشه مختص لاراول نیست. پکیج های استانداردی هستند که لاراول از اونها استفاده میکنه. اگر از بین چندین هزار پکیج، نتونستید تعدادی کاربردی برای خودتون پیدا کنید پس Yii براتون بهتره.آخرین گام برای گرفتن یک جواب سوال کردن توی فروم هاست!. الان با وجود IRC های موجود، StackExchange و داکیومنت های خود لاراول. کمتر پیش میاد کسی به فروم ها رجوع کنه. من این حرف شمارو قبول ندارم. البته ممکنه روش جوابگیری شما با من فرق کنه.راجع به استفاده ی توکار Jquery که به نظر من اصلاً ربطی به یک فریمورک PHP نداره. اگر باشه بهتره اما اگر نیست نمیشه یک ضعف دونست. مثلاً من کتابخونه ی JQuery رو توی برنامم صدا بزنم و شما از طریق Yii اینکارو بکنید خیلی تفاوت ایجاد میشه؟ لطفاً آبروی یک فریمورک رو با این موارد خدشه دار نکنید. هم Yii هم Laravelدقیقاً به همین دلیل که کپچا توی اکثر پروژه ها استفاده میشه گفتم که از سرویس های خارجی استفاده کنیم. شما برنامه هاتون بزرگتر بشن از صف ها هم باید استفاده کنید. اینها تمامیشون پردازش لازم دارند. 

من هیچ گونه تعلق خاطری به Laravel ندارم. اخیراً هم دارم Phalconphp استفاده میکنم که از لحاظ سینتکس از لاراول  پیچیده تره. اما پرفورمنس خیلی بالایی داره. بخصوص شماره 2 که در آینده  عرضه میشه و از Zephir بهره میبره. به نظرمن این دو فریمورک Yii, Laravel تمامی ابزارهای سنتی یک فریمورک رو دارند. لاراول سینتکس ساده تری داره. فهمیدن کدهاش ساده تره. لطفاً اگر شماتصمیم گرفتید از Yii استفاده کنید آخر ارسالتون نگید بهتره بریم سمت Yii!!! بهتره خودتون برید سمت Yii و این اجازه روبدید هر کس برای خودش تصمیم بگیره.

----------


## bestirani2

> سیستم کش کردن در لاراول به خوبی پشتیبانی میشه. Cache Dependency هم در سطح کد شما انجام میشه. فکر نمیکنم سیستم های کش این رو در اختیار شما قرار بدن. حداقل من ندیدم یا نیازم نبوده دنبالش باشم. قدر مسلم تمامی سیستم هایی که در Yii پشتیبانی میشند در لاراول نیز پیشتیبانی میشند. این ارتباطی به فریمورک نداره. اگر یک سیستم کش قابلیتی رو ارائه بده هر فریمورکی که ازش استفاده کنه اون قابلیت رو داره. شما اکستنشن موجود رو نصب میکنید پس فرقی نداره قاعدتاً


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




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


اگه یادتون باشه قبلاً راجب این موضوع بحث شده




> راجع به استفاده ی توکار Jquery که به نظر من اصلاً ربطی به یک فریمورک PHP نداره. اگر باشه بهتره اما اگر نیست نمیشه یک ضعف دونست. مثلاً من کتابخونه ی JQuery رو توی برنامم صدا بزنم و شما از طریق Yii اینکارو بکنید خیلی تفاوت ایجاد میشه؟ لطفاً آبروی یک فریمورک رو با این موارد خدشه دار نکنید. هم Yii هم Laravel


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




> دقیقاً به همین دلیل که کپچا توی اکثر پروژه ها استفاده میشه گفتم که از سرویس های خارجی استفاده کنیم. شما برنامه هاتون بزرگتر بشن از صف ها هم باید استفاده کنید. اینها تمامیشون پردازش لازم دارند.


امکانات تو کار YII فقط مربوط به کپچا نمیشه.




> من هیچ گونه تعلق خاطری به Laravel ندارم. اخیراً هم دارم Phalconphp استفاده میکنم که از لحاظ سینتکس از لاراول پیچیده تره. اما پرفورمنس خیلی بالایی داره. بخصوص شماره 2 که در آینده عرضه میشه و از Zephir بهره میبره. به نظرمن این دو فریمورک Yii, Laravel تمامی ابزارهای سنتی یک فریمورک رو دارند. لاراول سینتکس ساده تری داره. فهمیدن کدهاش ساده تره. لطفاً اگر شماتصمیم گرفتید از Yii استفاده کنید آخر ارسالتون نگید بهتره بریم سمت Yii!!! بهتره خودتون برید سمت Yii و این اجازه روبدید هر کس برای خودش تصمیم بگیره.


اگه فقط به خاطر پرفورمنس دارید از Phalconphp استفاده میکنید. توجه داشته باشید شما نیاز به سرور اختصاصی دارید تا بتونید Extension اش  رو نصب کنید. حال اینکه اگه سرور اختصاصی دارید با کش پی اچ پی 5.5 + APC هم میتونید به این پرفورمنس برسید. لاراول هم به نظر من ساده تره ولی سرعت توسعه YII به دلیل امکانات تو کارش بیشتره.

----------


## metal gear solid 4

> ربطی به قابلیت سیستم کش نداره. سیستم کش فقط کش میکنه و بقیه چیزها بر میگرده سطح برنامه که YII ویژگی های خوبی ارائه کرده. مثلا میتونید بگید این قسمت از صفحه کش نشه و بقیه کش بشند یا هر جور که دلتون بخواد. میتونید وابستگی تعیین کنید نسبت به هر چیزی مثل بگید اگه تغییری در فایل های فلان پوشه ایجاد شد کش از نوع ساخته بشه . حال اینکه تو لااراول باید دستی کد بشه این قسمت.
> 
> 
> اگه یادتون باشه قبلاً راجب این موضوع بحث شده
> 
> 
> استفاده تو کار از Jquery رو نباید با صدا زدن Jquery اشتباه بگیرید. با استفاده از این قابلیت خودش ده ها خط کد Jquery مینویسه که شما برای انجام اون کار ها باید خودتون کد Jquery ایش رو بزنید.
> 
> 
> ...


من خودم در آخرین پروژه ای که کار میکنم از APC دقیقاً به روشی که گفتید بهره میبرم که بخش هایی از صفحه یا اطلاعات رو کش میکنم. و چندان کار پیچیده ای نیست و مطمئنم با Yii هم همین میزان کد نویسی لازمه. البته من دیدی نسبت به امکانات Yii در این زمینه ندارم اما در سطح لاراول پیچیدگی نمیبینم.JQuery خودش به اندازه کافی کوتاه شده هست. باز هم نمیفهمم منظورتون از این که ده ها خط را براتون مینویسه چیه. اما اگر مثال بزنید بهتره.استفاده از Phalconphp فقط به خاطر پرفورمنسش هست و بس. بله میدونم باید سرور اختصاصی باشه. برنامه ای که قراره روی یک سرور اشتراکی اجرا بشه نیازی به چنین سطح بالایی از پرفورمنس نداره. PHP 5.5 از APC پشتیبانی نمیکنه. با استفاده از APC هم شما به پرفورمنس Phalconphp که یک اکستنشن برپایه C هست نمیرسید.

----------


## bestirani2

> من خودم در آخرین پروژه ای که کار میکنم از APC دقیقاً به روشی که گفتید بهره میبرم که بخش هایی از صفحه یا اطلاعات رو کش میکنم. و چندان کار پیچیده ای نیست و مطمئنم با Yii هم همین میزان کد نویسی لازمه. البته من دیدی نسبت به امکانات Yii در این زمینه ندارم اما در سطح لاراول پیچیدگی نمیبینم.


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

$dependency = new CDbCacheDependency('SELECT MAX(update_time) FROM tbl_post');
$posts = Post::model()->cache(1000, $dependency)->with('author')->findAll();





همچنین میشه یه قسمت از صفحه رو کش کرد نه کل صفحه رو 



<?php if($this->beginCache($id, array('dependency'=>array(
'class'=>'system.caching.dependencies.CDbCacheDepe  ndency',
'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ?>
...content to be cached...
<?php $this->endCache(); } ?>


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



<?php $this->renderDynamic($callback); ?>





> JQuery خودش به اندازه کافی کوتاه شده هست. باز هم نمیفهمم منظورتون از این که ده ها خط را براتون مینویسه چیه. اما اگر مثال بزنید بهتره.



مثلاْ فرض کنید قرار هست یه dropdownlist داشته باشید که به یک dropdownlist دیگه وابسته هست. شما نیازی ندارید هیچ کد Jquery ای بزنید مثال



echo CHtml::dropDownList('country_id','', array(1=>'USA',2=>'France',3=>'Japan'),
array(
'ajax' => array(
'type'=>'POST', //request type
'url'=>CController::createUrl('currentController/dynamiccities'), //url to call.
'update'=>'#city_id', //selector to update




echo CHtml::dropDownList('city_id','', array());





> استفاده از Phalconphp فقط به خاطر پرفورمنسش هست و بس. بله میدونم باید سرور اختصاصی باشه. برنامه ای که قراره روی یک سرور اشتراکی اجرا بشه نیازی به چنین سطح بالایی از پرفورمنس نداره. PHP 5.5 از APC پشتیبانی نمیکنه. با استفاده از APC هم شما به پرفورمنس Phalconphp که یک اکستنشن برپایه C هست نمیرسید.



روی پی اچ پی ۵.۵ این رو نصب کنید
http://pecl.php.net/package/APCu
منم به دلیل پرفورمنس واسه یه برنامه میخواستم بیام سمت فالکون که با کمک کش پی اچ پی ۵.۵ و apc به پرفورمنس نزدیکی رسیدم. توجه کنید ترکیب این دو تا نه فقط apc

----------


## metal gear solid 4

برای قسمت اول* این بخش از لاراول* رو مطالعه بفرمایید. دقیقاً مثالی که زدید رو با استفاده از لاراول میشه داشت. منظورم پیاده سازی نیست. امکاناتش هست.

در رابطه با JQuery که نوشتید. خوبه. اما سینتکسش چندان هم راحت نیست. اما این رو نمیشه مزیت یک فریمورک PHP دونست. فریمورک PHP باید کار با PHP رو آسان کنه. در تمام پروژه که هزاران خط میشه. لاراول سینتکس ساده و سریعی رو در اختیار میگذاره که به قول شما سرعت برنامه نویس رو بالا میبره. اما اینکه JQuery رو من چطور استفاده میکنم یا شما ارتباطی به فریمورک PHP نداره!!

PHP 5.5 سیستم OPCache رو معرفی کرده که انگار اطلاعات رو کامپایل و کش میکنه که سرعت قابل ملاحضه ای داره نسبت به APC. خب اگر قرار باشه کسی از ابتدا یک فریمورک رو انتخاب و یاد بگیره. چه بهتره که از آپدیت ترین امکانات استفاده کنه. به همین خاطر میگم باید APC رو فراموش کرد.

----------


## bestirani2

> برای قسمت اول* این بخش از لاراول* رو مطالعه بفرمایید. دقیقاً مثالی که زدید رو با استفاده از لاراول میشه داشت. منظورم پیاده سازی نیست. امکاناتش هست.
> 
> در رابطه با JQuery که نوشتید. خوبه. اما سینتکسش چندان هم راحت نیست. اما این رو نمیشه مزیت یک فریمورک PHP دونست. فریمورک PHP باید کار با PHP رو آسان کنه. در تمام پروژه که هزاران خط میشه. لاراول سینتکس ساده و سریعی رو در اختیار میگذاره که به قول شما سرعت برنامه نویس رو بالا میبره. اما اینکه JQuery رو من چطور استفاده میکنم یا شما ارتباطی به فریمورک PHP نداره!!
> 
> PHP 5.5 سیستم OPCache رو معرفی کرده که انگار اطلاعات رو کامپایل و کش میکنه که سرعت قابل ملاحضه ای داره نسبت به APC. خب اگر قرار باشه کسی از ابتدا یک فریمورک رو انتخاب و یاد بگیره. چه بهتره که از آپدیت ترین امکانات استفاده کنه. به همین خاطر میگم باید APC رو فراموش کرد.


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

از نظر من مزیت بزرگی هست. باید دید نظر بقیه دوستان چیه.

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

----------


## MaSoUti

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

----------


## MMSHFE

> PHP 5.5 سیستم OPCache رو معرفی کرده که انگار اطلاعات رو کامپایل و کش میکنه که سرعت قابل ملاحضه ای داره نسبت به APC. خب اگر قرار باشه کسی از ابتدا یک فریمورک رو انتخاب و یاد بگیره. چه بهتره که از آپدیت ترین امکانات استفاده کنه. به همین خاطر میگم باید APC رو فراموش کرد.


نسخه 5.5 زبان PHP حالا حالاها روی 90٪ سرورهای اشتراکی نصب نمیشه و به تازگی به نسه 5.3 ارتقا پیدا کردن. قطعاً تا وقتی رواج پیدا کنه نسخه Yii2 با قابلیت پشتیبانی از OPCache عرضه خواهد شد ولی لاراول که همین حالا پشتیبانی از APC رو هم بصورت توکار نداره، بعیده OPCache رو هم اضافه کنه.

----------


## MMSHFE

> بعد از 303 پست... آخر هم نتیجه گیری درستی نشد. که ما متوجه شیم با توجه به آخرین نسخه ها و آخرین و بهترین تکنولوژی های این دو فریمورک کدوم کامل تر و بهتر هست. اکثر مقایسات روی ورژنهای پایینتر و با در نظر گرفتن نداشتن بعضی از امکانات بود... برای من که میخوام تازه شروع کنم مهم آخرین تکنولوژی هاست و ببینم با توجه به اونها کدوم فریمورک کامل تر هست. من جای دیگه هم که این سوال رو پرسیدم باز هم هر دو فریمورک رو پیشنهاد دادن و نگفتن کدوم بهتره. من از این موضوع میترسم که شروع کنم و بعد از رسیدن به قسمتی از پروژه که ببینم نیازهای خاص از یک فریمورک میشه اونجا فریمورک کم بیاره و من مجبور بشم که عوض کنم فریمورک مورد استفاده ام رو...


تا اینجا تاپیک بصورت مقایسه یکطرفه بود. درحال گردآوری و دسته بندی امکانات خاص Yii هستم که بیشتر از بقیه Bold هستن تا کم کم اینجا بگذارم و ببینیم لاراول چطور اونها رو پیاده سازی کرده (یا اصلاً معادلی براشون داره یا نه).

----------


## metal gear solid 4

> نسخه 5.5 زبان PHP حالا حالاها روی 90٪ سرورهای اشتراکی نصب نمیشه و به تازگی به نسه 5.3 ارتقا پیدا کردن. قطعاً تا وقتی رواج پیدا کنه نسخه Yii2 با قابلیت پشتیبانی از OPCache عرضه خواهد شد ولی لاراول که همین حالا پشتیبانی از APC رو هم بصورت توکار نداره، بعیده OPCache رو هم اضافه کنه.


کسی صحبت از این کرد که قراره OPCache رو روی سرور اشتراکی اجرا کنیم؟
کسی هم نگفته OPCache قراره به زودی روی لاراول بیاد و Yii بی نصیب میمونه!!

صحبت سر سرور مجازی و اختصاصی بود مهندس.

----------


## MMSHFE

:لبخند:

----------


## Elias.F

این چه تعطیلاتی و چه دسته بندی بود که تموم نشد :ناراحت:  :متفکر: 
جناب شهرکی، من خودم با هیچ کدوم کار نکردم :اشتباه: . ولی به عنوان یک خواننده ، نظرم رو راجع به این همه پست میگم. تمامی امکاناتی از لاراول که دوستان گفتن رو شما یا گفته بودین که مهم نیست ، یا هم گفته بودین در yii هم میشه پیاده سازی کرد. حالا اینکه چطور میشه رو باید گشت و پیدا کرد..................
البته با توجه به سابقه شما که به صورت حرفه ای کار میکنید، تمامی مطالبتون صحت داره. ولی از دید کاربرانی مثل من که اصلا تا حالا با فریمورک کار نکردن هم به موضوع نگاه کنین. 
کاش زیر مطلب که با yii هم میشه پیاده سازی کرد، طرز پیاده سازی رو هم میگفتین.
خواهشمندم زودتر امکانات yii رو بیان کنین که این تاپیک شاید به سرانجامی برسه.
ضمنا شما برای شروع یادگیری yii 2 رو پیشنهاد میکنی، یا yii 1?
ممنون از زحمات شما.

----------


## Elias.F

البته یک انتقادی هم از yii نسبت به لاراول میشه کرد و اون هم کمبود منابع آموزشیشه.
شما یه سرچ برای لاراول میزنی ، کلی مطلب و ویدئو آموزشی پیدا میکنی.
اما در مقایسه با اون برای yii خیلی خیلی کمتره.

----------


## MMSHFE

> کاش زیر مطلب که با yii هم میشه پیاده سازی کرد، طرز پیاده سازی رو هم میگفتین.


مواردی که در ابتدا فقط گفتم میشه رو بعداً یکی یکی مطرح کردن و معادل Yii اونها رو توضیح دادم.



> خواهشمندم زودتر امکانات yii رو بیان کنین که این تاپیک شاید به سرانجامی برسه.


هدفم این نیست که فقط امکانات Yii رو فهرست کنم. دنبال مواردی هستم که توی لاراول نمیشه با امکانات پایه خودش انجام داد یا لااقل مشکله تا این تاپیک حالت مقایسه و تقابل خودش رو حفظ کنه. بخاطر همین یکم طول میکشه. ضمناً بنده کارهای دیگری هم دارم (مثل ایران نهاد) که اولویت و اهمیت بیشتری برام داره نسبت به کشف نقاط قوت و ضعف Laravel و Yii دربرابر همدیگه یا مسائلی از این دست.



> ضمنا شما برای شروع یادگیری yii 2 رو پیشنهاد میکنی، یا yii 1?


هنوز Yii 2 آزمایشیه و برای همین من هنوز هم نسخه 1.1 رو توصیه میکنم ولی به محض اینکه نسخه 2 تولید بشه، پکیج پیشرفته رو با محوریت Yii 2 تولید میکنم و به همه توصیه میکنم حتی اگه از نسخه 1.1 استفاده میکنن (که تا 2016 پشتیبانی میشه)، باز هم با نسخه 2 آشنا بشن و کم کم به اون نسخه ارتقا بدن کدهاشون رو.

----------


## MMSHFE

> البته یک انتقادی هم از yii نسبت به لاراول میشه کرد و اون هم کمبود منابع آموزشیشه.
> شما یه سرچ برای لاراول میزنی ، کلی مطلب و ویدئو آموزشی پیدا میکنی.
> اما در مقایسه با اون برای yii خیلی خیلی کمتره.


تا جایی که من بررسی کردم چنین مشکلی نبوده و برای مثال، درمورد Yii پکیج آموزشی تصویر فارسی داریم (کار خودمه) ولی درمورد لاراول چنین منبعی نیست. درمورد منابع انگلیسی هم شما توی گوگل بنویسید laravel video learning و yii video training و میبینید که برای هر دو، منابع آموزشی تصویری زیادی میاد.

----------


## Elias.F

> تا جایی که من بررسی کردم چنین مشکلی نبوده و برای مثال، درمورد Yii پکیج آموزشی تصویر فارسی داریم (کار خودمه) ولی درمورد لاراول چنین منبعی نیست. درمورد منابع انگلیسی هم شما توی گوگل بنویسید laravel video learning و yii video training و میبینید که برای هر دو، منابع آموزشی تصویری زیادی میاد.


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

----------


## MMSHFE

تعداد آموزشهای بیشتر که خیلی مهم نیست. مهم اینه که چقدر این آموزشها کاربردی باشن. نمیگم آموزشهای لاراول خوب نیست ولی فرضاً وقتی شما با یک eBook مثل Web Application Development with Yii and PHP میتونید به راحتی آب خوردن کار با Yii رو یاد بگیرین، دلیلی نداره صدتا کتاب دیگه با مطالب تکراری و صرفاً بیان و نگارش متفاوت، تولید و عرضه بشه.

----------


## metal gear solid 4

> تعداد آموزشهای بیشتر که خیلی مهم نیست. مهم اینه که چقدر این آموزشها کاربردی باشن. نمیگم آموزشهای لاراول خوب نیست ولی فرضاً وقتی شما با یک eBook مثل Web Application Development with Yii and PHP میتونید به راحتی آب خوردن کار با Yii رو یاد بگیرین، دلیلی نداره صدتا کتاب دیگه با مطالب تکراری و صرفاً بیان و نگارش متفاوت، تولید و عرضه بشه.


 :لبخند:

----------


## Mahdi-563

باید قبول کرد اکثر قابلیت ها در YII 2 وجود داره و هنوز استیبل نشده در صورتی که خیلی فریم ورک ها یک قدم جلو تر هستن

منم یه مدت YII کار می کردم ولی در حال حاضر دارم فالکون با NGINX کار می کنم

----------


## AmirSky

من از سینکس لاراول بیشتر خوشم اوم . چون به نظر زیبا تر میاد.
در مورد قابلیت ها هم باید بگم تقریبا هر دو قابلیت های یکسانی دارند. و هر دو خوب هستند. 
البته داشتن داکیومنت و یوزر و منابع آموزشی بیشتر میتونه در انتخاب بسیار تاثیر گذار باشه.

----------


## mahmoodhacker

n تا تاپیک تو اینترنت هست
هزاران مقاله و پست
اما فقط ما ایرانیها هستیم که اینطور بحث رو به درازا میکشیم.
این داره و اون نداره اصلاً مطرح نیست!!
من قبل از اینکه سوادم قد بده که بدونم فریم ورک چی هستش در php یه فریم ورک برای خودم ساخته بودم :) البته نه به حرفه ای بودن اینا...
خواستم بگم فقط دوتا بحث مطرح هستش . 1- اشراف بیشتر 2-کاربردی برای جایی که میخوایم
که این دوتا چیزی از هم کم ندارن و بحث 1 فقط مطرحه
من از codeigniter خیلی خوشم  میاد چون اول mvc رو بهم یاد  داد و دوم باهاش کلی کار کردم و پول دراوردم
حالا هر وقت میخوام سایت کوچیک و ارزون بنویسم از CI استفاده میکنم که از هردوتای اینا به صرفه تره /.
پروژه سنگین باشه من به شخصه با laravel بیشتر حال کردم و مهم اصل حال بود/.
مقایسه laravel و Yii مثل مقایسه سالار عقیلی میمونه با علیرضا قزبانی . هر دو هم سبک و شبیه به هم هستند ولی خوب هرکی باصدای یکی حال میکنه!!!بحثم لاتی شد  :لبخند گشاده!:

----------


## ama-amir

سلام
دوستان من خیلی وقت هست که با yii کار کردم و پروژه های سطح بالایی رو باهاش بالا آوردم

الان هم مدتی هست به خاطر کارفرما با لاراول کار میکنم و پروژه سنگینی دارم که با لاراول مینیویسم

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

دوست دارم تجربم رو به صورت بی طرفانه تو قسمت های مختلف جفت فریم ورک ها براتون بنویسم

اولیش:
وقتی با لاراول کار میکنم اولین چیزی که خیلی اذیتم میکنه نبود یک code generator خوبه !!
اول که به صورت default هیچ code generatorی روی لاراول من ندیدم پس مجبور شدم پکیجش رو(معادل extension یا component در yii) نصب کنم
راستش اگه بخوام به صورت بی طرفانه بگم code generator لاراول هیچ حرفی در مقابل gii نداره و در مقابل gii بیشتر شبیه به شوخی هست !!!

gii واست فرم ها رو خیلی قشنگ نسبت به مدل و ruleها درست میکنه ولی تو لاراول یه فرم generator خیلی ساااده هست که اونم تو نسخه جدیدش برداشتن !!!


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


این پست ها ادامه داره ...

----------


## ama-amir

به نظرم لاراول تا موقعی که yii 2 نیومده بود خیلی نسبت به yii 1 پیشتاز بود
دلیل اصلیش هم استفاده از composer تا اون موقع بود
ولی الان دیگه yii 2 اومده و لاراول این برتری رو نداره.
.
یه چیز خوب و مثبتی که دیدم تو لاراول اینه که تو کنترلر هاش میشه get و post رو مشخص کرد
مثلا تو yii ما مینیویسیم:
actionLogin

تو لاراول مینیویسیم
getLogin
و
postLogin

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

ولی این ارتباط تنگاتنگ لاراول رو با rest نشون میده

----------


## ama-amir

در قسمت viewهای لاراول (که قسمت های html و template سایت رو شامل میشه) از موتور blade استفاده میشه.
blade تقریبا یه الگو برداری خیلی سبک تر نسبت به twig هست.
چیز خوبیه و باعث میشه کد html در نهایت تمیز تر در بیاد
ولی تا اینجا که من کار کردم تنها نتیجه ای که در نهایت کار دیدم فقط حذف موارد زیر در html بود:
<?php ?>
<?php echo ''; ?>
بقیش عینا سینتکس php بود  :لبخند گشاده!: 

چیز جالبی که داره یه چیزی اضافه کرده به اسم forelse
یه چیزی شبیه به foreach فقط موقعی که هیچی تو آرایه نیست که loop بزنه یه پیامی نشون میده
دقیقا اینجوری:


```
@forelse($articles as $article)
{{$article->title}}
@empty
هیچ مقاله ای موجود نیست
@endforelse
```

خب اگه بخوام با yii و widgetهاش مقایسه کنم:
تو yii از موتور template استفاده نمیشه
هرچند که این امکان رو به شما دادن که اگه دوست داشتید میتونید از smarty یا هر موتور templateی که دوست داشتید استفاده کنید.
خب این که از موتور template استفاده نکنی یه سری مزایا داره یه سری معایب
عیبش اینه که در نهایت بالای 80% کدهای html شما میشه php !!
ولی حسن هایی هم داره
از جمله performance!!
قطعا template engine ها performance رو پایین میارن و استفاده نکردن از اونها در نهایت موجب افزایش performance میشه
.
.
تو این قسمت نمیتونم نظری بدم که blade بهتره یا کار با widgetها در yii
هر کدومشون یه سری لذت هایی موقع کار کردن دارن

ولی به شخصه فکر میکنم دستم تو widgetهای yii بازتره
ولی به این هم باور دارم که کار با blade به مراتب خیلی ساده تره تا ساختن widgetهای yii

----------


## ama-amir

یه چیزی هم که خیلی برام عذاب آور شده از دست دادن widgetهای فوق العاده ی kartik-v در لاراول هست
بسیارررر این ویجت ها کاربردی و کار راه انداز هستن !!
از موقعی که اومدم لاراول باید همه این ها رو دستی پیاده کنم که پوستم کنده شده :D

دوستان لاراول کار حتما در این صفحه دموهای ویجت های kartik رو ببینن:
https://github.com/kartik-v/yii2-widgets

----------


## ama-amir

*میرسیم به بحث خیلی خیلی خیلی مهم routeها :


*تو لاراول ما یه فایل داریم به اسم routes
که میایم میگیم مثلا وقتی کاربر contactus زد بفرستش به این کنترلر و اکشن، وقتی رو post کلیک کرد بفرستش به این کنترلر و اکشن
یعنی قسمت به قسمت باید تعریف بشه که الان رو این کلیک شد چه *کنترلر* و *اکشنی* باید اجرا شه
کل تاپیک رو که میخوندم خیلی از دوستان لاراول کار به این قسمت تاکید داشتن و به عنوان امتیاز خیلی بزرگی نسبت به yii ازش یاد میکردن
.
اولش که داشتم با routeها کار میکردم یکم برام گنگ بود و چون پیش زمینه ذهنیم yii بود متوجه نمیشدم که کارش چیه
بعد از کلی کار باهاش که درکش کردم متوجه کمبود بزرگش نسبت به yii شدم !!!
.
*دوستان لاراول کار این جارو دقت کنن:*

تو yii کلا همه ی urlها دارای یک قاعده خاص هستن:(که البته نگران نباشید شما میتونید با htaccess و تنظیمات yii هرجوری دوست داشتید *نمایش* این قاعده رو تغییر بدید)*
site.com/?r=controllerName/actionName

*یعنی yii اومده گفته بابا جان شما بیا اینو بزن:
site.com/?r=site/contactus
خودش میره کنترلری به نام site رو پیدا میکنه و دنبال اکشن actionContactUs میگرده.

ولی ما تو لاراول واسه هرچیزی باید بیایم دستی تو route بنویسیم:
Route::get('contactus.', 'SiteController@getContactUs');
Route::post('contactus', 'SiteController@postContactUs');

اکثرا لاراول کارها از route به عنوان برتری و مزیت لاراول یاد میکنن ولی به نظر من فایل routes.php در آخر فایلی شلوغ و بهم ریخته و یک ماکارونی خوشمزه میشه

----------


## ama-amir

پشتیبانی لاراول از  internationalization بسیار ضعیف تر از yii هست.

به عنوان مثال وقتی که در yii میزنیم زبان سایت fa_ir هست
تمامی پیام ها فارسی میشه!
ارورهای validation هم فارسی میشه
در صورتی که لاراول همچین چیزی نداره و همه چیز رو باید خودمون فارسی کنیم!!
.
یه چیز خیلی مهم دیگه:
من در لاراول attribute label نمیبینم !!!
این یعنی اگه بخوایم اسم attribute label ها رو فارسی کنیم باید 100جا اسمش رو عوض کنیم
یا اینکه یه attribute label رو برای خودمون تو لاراول پیاده کنیم
که این یعنی پوستمون کندس
.
کجا کمبود attribute labelها رو بیشتر حس میکنیم؟
موقعی که validation فرم به ارور میخوره
پیام میاد:
وارد کردن فیلد Username اجباری است!!

----------


## rezakho

> در قسمت viewهای لاراول (که قسمت های html و template سایت رو شامل میشه) از موتور blade استفاده میشه.
> blade تقریبا یه الگو برداری خیلی سبک تر نسبت به twig هست.
> چیز خوبیه و باعث میشه کد html در نهایت تمیز تر در بیاد
> ولی تا اینجا که من کار کردم تنها نتیجه ای که در نهایت کار دیدم فقط حذف موارد زیر در html بود:
> <?php ?>
> <?php echo ''; ?>
> بقیش عینا سینتکس php بود 
> 
> چیز جالبی که داره یه چیزی اضافه کرده به اسم forelse
> ...


اصلا مایل نبودم پستی توی این تاپیک برنم، ولی اطلاعات غلطی که شما دارید منتشر می کنید رو هم نتونستم نادیده بگیرم
موتور قالب کارش همین تمیز کردن کدهای ویو و محل تداخل زبانی مثل Php با html هست
بلید یک موتور قالب الگوبرداری شده از razor ماکروسافت هست، منتها به مقدار نیاز! اینطور که شما گفتید فقط <?php رو حذف نمیکنه، از سکشن ها، لیوت، ساختارهای کنترلی و چاپ بگیرید تا افزودن دستور جدید توسط برنامه نویس در 1 خط!
این هم لیست دستورات و ویژگی های بلید


```
@extends('layout.name')
// Begin a section
@section('name')
// End a section
@stop
// End a section and yield
@show
@parent
// Show a section in a template
@yield('name')
@include('view.name')
@include('view.name', array('key' => 'value'));
@lang('messages.name')
@choice('messages.name', 1);
@if
@else
@elseif
@endif
@unless
@endunless
@for
@endfor
@foreach
@endforeach
@while
@endwhile
//forelse 4.2 feature
@forelse($users as $user)
@empty
@endforelse
// Echo content
{{ $var }}
// Echo escaped content
{{{ $var }}}
{{-- Blade Comment --}}
// Echoing Data After Checking For Existence
{{{ $name or 'Default' }}}
// Displaying Raw Text With Curly Braces
@{{ This will not be processed by Blade }}
```

در مورد performance هم باید بگم استفاده از موتور قالب تاثیری برو روی performance نداره، چرا؟ واضحه، performance مربوط به اجرای برنامه بعد از مرحله توسعه میشه، و تمام موتورهای قالب، بعد از کامپایل کد قالب در اولین درخواست، کد کامپایل شده php خام رو اجرا می کنند و نه کد اولیه قالب رو!

مورد سوم، موتور قالب ربطی به ویجت ها نداره! یی هم ویجت داره و هم قابلیت کار با موتورهای قالب، چرا این دو رو مقابل هم گذاشتید؟!

----------


## rezakho

> *میرسیم به بحث خیلی خیلی خیلی مهم routeها :
> 
> 
> *تو لاراول ما یه فایل داریم به اسم routes
> که میایم میگیم مثلا وقتی کاربر contactus زد بفرستش به این کنترلر و اکشن، وقتی رو post کلیک کرد بفرستش به این کنترلر و اکشن
> یعنی قسمت به قسمت باید تعریف بشه که الان رو این کلیک شد چه *کنترلر* و *اکشنی* باید اجرا شه
> کل تاپیک رو که میخوندم خیلی از دوستان لاراول کار به این قسمت تاکید داشتن و به عنوان امتیاز خیلی بزرگی نسبت به yii ازش یاد میکردن
> .
> اولش که داشتم با routeها کار میکردم یکم برام گنگ بود و چون پیش زمینه ذهنیم yii بود متوجه نمیشدم که کارش چیه
> ...


لاراول برای همین کار یی، Route::controller رو معرفی کرده، بگذارید یکم جا بیافته لاراول براتون، بعد برید سراغ مقایسه
البته نظر من اینه که بهتر از این هم میشد کار کنند این یکی رو، گرچه درمانش 2-3 خطه

----------


## rezakho

> پشتیبانی لاراول از  internationalization بسیار ضعیف تر از yii هست.
> 
> به عنوان مثال وقتی که در yii میزنیم زبان سایت fa_ir هست
> تمامی پیام ها فارسی میشه!
> ارورهای validation هم فارسی میشه
> در صورتی که لاراول همچین چیزی نداره و همه چیز رو باید خودمون فارسی کنیم!!
> .
> یه چیز خیلی مهم دیگه:
> من در لاراول attribute label نمیبینم !!!
> ...


اگر خوب مستندات رو می خوندید متوجه می شدید که اگر شما ندیدید دلیل نمیشه وجود نداره!
http://laravel.com/docs/4.2/localization

در مورد attribute label هم بیشتر مطالعه کنید!!! توی لینک بالا اشاره کرده

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

----------


## metal gear solid 4

ویدئوهای این لینک رو ببینید. برخی از قابلیت های جدیدی هستند که در لاراول 5 شاهدشون خواهیم بود.

*What's New In Laravel 5*

از بهترین بخش هاش FormRequests ها و MultipleFilesystem هاشه. از این راحتتر نمیشه PHP نویسی کرد. کش کردن روتینگ ها و سایر فیچرهای خوب دیگش به کنار ... 
استفاده ی مداوم از NameSpace ها هم به لطف PSR-4 هست امیدوارم کسی پیدا نشه به این مورد ایراد بگیره !!!!!

امیدوارم دوستان از تماشای ویدئوها لذت ببرن.

موفق باشید.

----------


## captain_hamid

laravel 5 چه موقع ارئه میشه نسخه نهایی؟ (تاریخ؟)
داکیومنت هم داره؟ در حال حاضر؟

----------


## metal gear solid 4

آخرین توئیتی که از Taylor Otwell خوندم دو روز قبل بود که وعده ی 72 ساعت آینده برای ریلیز نسخه ی 5 رو داد.
داکیومنت هم همراه با ریلیز نسخه 5 خواهد بود. طبق اظهارات خودش.

----------


## rezakho

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

http://laravel.com/docs/master

----------


## metal gear solid 4

منظور من هم نسخه ی نهای خود فریمورک و داکیومنت هاش بود. اگه نه نسخه 5 هم ریلیز بتا یا همون Dev ش در دسترس هست تا برنامه نویس ها باهاش کار کنند.

----------


## metal gear solid 4

خب نسخه 5 هم عرضه شد.
دوستان میتونن در کنار سادگی استفاده از لاراول از پیچیدگیهاش هم لذت ببرن.  :لبخند گشاده!:

----------


## captain_hamid

میشه درباره این نسخه توضیحی بدین؟

----------


## tux-world

تو این لینکی که دوستان لطف کردن  دادن توضیحاتی داده . 
https://laracasts.com/series/whats-new-in-laravel-5

----------


## captain_hamid

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

----------


## captain_hamid

کسانی که اسفاده کردن لطف کنن این نسخه های جدید  رو یه مقایسه اجمالی بکنن.

----------


## hooman.pro

بیخیال باو کل کل چیه؟؟× 
از هر کدوم نون میخوری همون خوبه، البته خودم yii2  رو فقط قبول دارما

اینم یه نوع مقایسه هست:
میگین laravel بهتره چون لاراول کار زیاده
پس پراید از بنز بهتره چون پراید سوار زیاده

----------


## moalla

> *میرسیم به بحث خیلی خیلی خیلی مهم routeها :
> 
> 
> *تو لاراول ما یه فایل داریم به اسم routes
> که میایم میگیم مثلا وقتی کاربر contactus زد بفرستش به این کنترلر و اکشن، وقتی رو post کلیک کرد بفرستش به این کنترلر و اکشن
> یعنی قسمت به قسمت باید تعریف بشه که الان رو این کلیک شد چه *کنترلر* و *اکشنی* باید اجرا شه
> کل تاپیک رو که میخوندم خیلی از دوستان لاراول کار به این قسمت تاکید داشتن و به عنوان امتیاز خیلی بزرگی نسبت به yii ازش یاد میکردن
> .
> اولش که داشتم با routeها کار میکردم یکم برام گنگ بود و چون پیش زمینه ذهنیم yii بود متوجه نمیشدم که کارش چیه
> ...


ماشالله اقا رضا خیلی مسلط هستن و جواب این قسمت رو نوشتن اما کوتاه نوشتن و من بیشتر توضیح بدم.
توی لرول برای هر کاری چند روش وجود داره. میتونید یه خط کد توی route بنویسید که بگید هر چی controller هست رو خودت تعریف کن. انوقت دقیقا میشه همونی که شما توی yii استفاده میکنی. استفاده از route::controller رو اینجا گفته.البته اینجا دیگه نگفته چطوری همه کنترلرر ها رو یه جا تعریف کنیم.
میتونید تک تک controller ها رو جدا تعریف کنید. و یا حتی میتونید تو هر خط controller و action رو بصورت جدا تعریف کنید. به عبارت دیگه میتونید خیلی کلی همه رو یجا تعریف کنید. میتونید خیلی دقیق تر دونه به دونه تعریف کنید. jeffery way همیشه اخری رو پیشنهاد میکنه تا دقت برنامه بالاتر بره که توی فیلمهاش توضیح دادن چرا دقیق تره.
بهرحال لرول برای هر چیزی راه های متفاوتی داره و امیدوارم این خصوصیتش شما رو به اشتباه نندازه.

لرول واقعا هوشمندانه طراحی شده و community خیلی خوبی هم داره. فقط یه مساله است که من رو اذیت میکنه!
اگه اشتباه نکنم asp.net بیش از 15 ساله اومده و تو این مدت فقط 5 نسخه از فریم ورکش رو داده بیرون! همیشه پشتیبانی خوبی هم از برنامه های نوشته شده به ورژن قبلی داره. تو خود visual studio خیلی از کارهای تغییر نسخه رو انجام میده. yii تا الان دوتا نسخه بیرون داده......
اما لرول تو مدت کمتر 5 تا ورژن عوض کرده. من شخصا روی لرول 4 مسلط شدم و یکدفعه 5 اومد! تفاوت ساختاری زیادی داشت و تبدیل پروژه از 4 به 5 هم زمان میبره. یه پروژه رو با 4 نوشته بودم مجبور شدم همه رو از اول به 5 بازنویسی کنم. هر چند بیشتر کدها یکی میشن اما تفاوتهای ساختاری زیاد باعث میشه زمان زیادی برای تسلط به 5 گرفته بشه.
asp.net 2015 روی هر سه پلت فرم نصب میشه و خروجی های بسیار متنوعی داره. خیلی وسوسه انگیز شده  :کف کرده!: 
با آرزوی بهترین ها برای هموطن های عزیز

----------


## imohammad

> asp.net 2015 روی هر سه پلت فرم نصب میشه و خروجی های بسیار متنوعی داره. خیلی وسوسه انگیز شده


asp.net بدون بانک اطلاعاتی SQLServer کارایی چندانی نداره!

----------


## maysam.m

بدترین نکته لاراول این انتشار نسخه های زیادشه !

----------

