همیشه دستیابی به تمام امکانات و ویژگی های یک فریم ورک امکان پذیر نیست. اما در اختیار داشتن یک لیست کامل از ترفندها و نکات به شما کمک می کند تا کمترین زمان ممکن بهترین نکات آموزشی را دریافت کنید. در این مقاله قصد داریم ۲۵ نکته و ترفند در فریم ورک لاراول را خدمت شما عزیزان مطرح کنیم:
لاراول یکی از قدرتمندترین پیاده سازی های Active Record را در دنیای PHP ارائه می کند. به عنوان مثال فرض کنید که شما یک جدول orders به همراه یک مدل Eloquent به نام order دارید:
class Order extends Eloquent {}
ما می توانیم هر تعداد کوئری که خواستیم روی دیتابیس انجام دهیم و برای اینکار نیازی نیست که از کدهای sql استفاده کنیم. بنابراین کد زیر برای دسترسی به تمام سفارش ها کافیست:
$orders = Order::all();
اما شاید بخواهید سفارشات را بر اساس تاریخ مرتب کرده و نتیجه را برگردانید:
$orders = Order::orderBy('release_date', 'desc')->get();
با دستورهای بالا ما توانستیم رکوردها را از دیتابیس واکشی کنیم اما اگر بخواهیم رکوردها را در پایگاه داده ذخیره کنیم از دستور زیر استفاده می کنیم:
$order = new Order; $order->title = 'Xbox One'; $order->save();
با لاراول کارهایی را که قبلا انجام دادنشان سخت بود، خیلی راحت می شود انجام داد.
لاراول یک فریم ورک منحصربه فرد است که می توان مسیردهی در آن را به روش های مختلف مورد استفاده قرار داد. اگر شما نیز به دنبال یک فریم ساده جهت مسیردهی هستید، با لاراول می توانید اینکار را انجام دهید:
Route::get('orders', function() { return View::make('orders.index') ->with('orders', Order::all()); });
این کار برای پروژه های کوچک و API ها مفید است. اما اگر در قسمت هایی از پروژه بخواهید از کنترلرها استفاده کنید باید مطابق کد زیر عمل کنید:
Route::get('orders', 'OrdersController@index');
دیدید که چطور لاراول بسته به نیازمندی های شما به طور مرتب رشد می کند. لاراول به خاطر این سطح از انعطاف در بین توسعه دهندگان محبوب شده است.
اما در صورتی که بخواهیم بین جداول ارتباط برقرار کنیم باید چکار کنیم؟ فرض کنید هر task به یک کاربر یا user متعلق است. تعریف رابطه بین جداول مطابق روش زیر عمل می کنید:
class Task extends Eloquent { public function user() { return $this->belongsTo('User'); } } class User extends Eloquent { public function tasks() { return $this->hasMany('Task'); } }
حالا میخواهیم همه task های یک کاربر خاص با id=1 را از دیتابیس برگردانیم .با دو خط زیر می توان اینکار را انجام داد:
$user = User::find(1); $tasks = $user->tasks;
چون ما روابط را برای دو جدول تعریف کردیم، اگر بخواهیم کاربرانی را که به یک task خاص مرتبط شده را برگردانیم از کد زیر استفاده می کنیم:
$task = Task::find(1); $user = $task->user;
اغلب می خواهیم که بین فرم با مدل مان یک اتصال برقرار کنیم. به عنوان مثال موقعی که شما می خواهید تعدادی رکورد را در دیتابیس ویرایش کنید با Form Model Binding می توانید به راحتی فیلدهای فرم را با مقادیر رکوردهای جدول پر کنید:
{{ Form::model($order) }} <div> {{ Form::label('title', 'Title:') }} {{ Form::text('title') }} </div> <div> {{ Form::label('description', 'Description:') }} {{ Form::textarea('description') }} </div> {{ Form::close() }}
با این بخش از کد هر زمان که ویوی layout/nav.blade.php بارگذاری شود می تواند به متغیر $tag دسترسی داشته باشد. چون فرم به یک نمونه خاصی از جدول order متصل شده، فیلدهای فرم به درستی مقادیر جدول را نشان می دهند.
اجرای تعداد زیاد کوئری روی دیتابیس می تواند روی سرعت برنامه تان تاثیر بگذارد، خوشبختانه لاراول مکانیزم ساده ای برای کش کردن این کوئری ها ارائه می دهد و اینکار را با فراخوانی یک متد انجام می دهد.
فرض کنید میخواهید تمام رکوردهای question را از دیتابیس بگیریم، چون این جدول به طور مداوم به بروز نمی شود می توانیم کوئری را کش کنیم:
$questions = Question::remember(60)->get();
حال، تا یک ساعت کوئری ها کش می شوند و در صورت درخواست کاربران برنامه اطلاعات را از کش می خواند و به دیتابیس متصل نمی شود.
احتمالا بعضی مواقع شما می خواهید که چند تا از View ها به یک متغیر خاص و یا بخشی از اطلاعات نیاز داشته باشند که بین این ویوها مشترک باشد. به عنوان مثال فرض کنید Navigation bar که لیستی از تگ ها را نشان می دهد:
View::composer('layouts.nav', function($view) { $view->with('tags', ['tag1', 'tag2']); });
با این کد، هر زمان که ویوی layout/nav.blade.php لود شود، می تواند به متغیر $tag دسترسی داشته باشد.
لاراول از یک روش ساده برای احراز هویت استفاده می کند. به این صورت که لیستی از درخواست های احرازهویت (Credential) را که معمولا از فرم لاگین می گیرد به Auth::attempt() پاس می دهد. اگر این مقادیر با مقادیر موجود در جدول users مطابقت داشت کاربر می تواند به برنامه log in کند:
$user = [ 'email' => 'email', 'password' => 'password' ]; if (Auth::attempt($user)) { // user is now logged in! // Access user object with Auth::user() }
اما کاربران چگونه می توانند با ورود به آدرس /logout از حساب کاربری خود خارج شوند؟
اینکار به راحتی امکان پذیر است:
Route::get('logout', function() { Auth::logout(); return Redirect::home(); });
کار با Restfull در لاراول هیچ وقت تا این اندازه راحت نبوده است. برای ثبت یک کنترلر resourceful باید متد Route::resource() را فراخوانی کنید:
Route::resource('orders', 'OrdersController');
با این کد لاراول شش Route یا مسیر مانند زیر ثبت می کند:
همچنین می توان ان کنترلر ها را با خط فرمان ایجاد کرد:
php artisan controller:make OrdersController
داخل کنترلر ایجاد شده به ازای هر کدام از route های بالا یک متد اضافه شده است. برای مثال /order به متدindex نگاشت شده است و /orders/create به create نگاشت شده و ... . اکنون توانایی این را داریم که به راحتی برنامه های restful و api را ایجاد کنیم.
در حالی که php به طور طبیعی یک زبان templating است، اما هیچگاه تلاشی نکرده است تا اشکالاتش را در این حوزه برطرف کند. به این خاطر لاراول برای پر کردن این شکاف موتور Blade را ارائه کرده است. نامگذاری ویوها با پسوند .blade.php به طور خودکار آنها را مطابق روش templating تجزیه می کند:
@if ($orders->count()) <ul> @foreach($orders as $order) <li>{{ $order->title }}</li> @endforeach </ul> @endif
چون لاراول ازcomposer استفاده می کند، ما توانیم از فریم ورک PHPUnit برای تست برنامه استفاده کنیم. ابتدا فریم ورک را نصب کرده سپس با وارد کردن دستور PHPUnit برنامه خود را تست کنیم. همچنین لاراول یک مجموعه توابع کمکی test ها را برای انواع مختلف تست برنامه ها آماده کرده است. به عنوان مثال می خواهیم بررسی کنیم که آیا صفحه اصلی سایت کد وضعیت 200 را بر می گرداند یا نه:
public function test_home_page() { $this->call('GET', '/'); $this->assertResponseOk(); }
و می خواهیم بررسی کنیم که موقعی که کاربر یک فرم را ارسال کرد توسط Flash message ها به صفحه اصلی هدایت (Redirect ) می شود یا نه؟
public function test_contact_page_redirects_user_to_home_page() { $postData = [ 'name' => 'Joe Example', 'email' => 'email-address', 'message' => 'I love your website' ]; $this->call('POST', '/contact', $postData); $this->assertRedirectedToRoute('home', null, ['flash_message']); }
در لاراول 4.1 که درتاریخ نوامبر 2013 منتشر شد می توانستید توسط Artisan روی سرورتان SSH بنویسید و هر کاری را انجام دهید. این کار براحتی با دستور SSH مطابق زیر انجام می شود:
SSH::into('production')->run([ 'cd /var/www', 'git pull origin master' ]);
همان طور که می بینید یک آرایه از دستورات را به متد run() پاس می دهیم و این متد بقیه کارها را برای ما انجام می دهند. چون این متد، کدها را همانند artisan command اجرا می کند، می توانید با دستور php artisan command:make DeployCommand آنرا اجرا کنید و کد قابل اجرا را داخل متد fire() قرار داده تا به سرعت یک دستور Deployment اختصاصی ایجاد شود.
لاراول پیاده سازی خوبی از الگوی طراحی observer ارائه کرده است که شما احتمالا در برنامه تان از آن استفاده کرده اید. استفاده از Event ها در یک برنامه می تواند تاثیر زیادی روی قابلیت نگهداری و ساختار برنامه داشته باشد:
Event::listen('user.signUp', function() { // do whatever needs to happen // when a new user signs up });
مانند بیشتر مسائل در لاراول، اگر ترجیح می دهید به جای نوشتن مستقیم کدها درمتد listen از ارجاع به نام کلاس استفاده کنید، اینکار به راحتی امکان پذیر است. دراینصورت لاراول از طریق کانتینر IoC آنرا دریافت می کند:
Event::listen('user.signUp', 'UserEventHandler');
هنگامی که برنامه تان روز به روز توسعه می کند، نمی توان به راحتی همه مسیرهایی که در پروژه تان ثبت شده را مشاهده کرد. این مورد وقتی صادق است که شما به درستی از فایل routes.php استفاده نکرده باشید:
لاراول یک دستور rotues را ارائه کرده است که توسط آن می توان مسیرهای ثبت شده در برنامه را به همراه متدهای کنترلری که آنها را اجرا می کند مشاهده کرد:
php artisan routes
هنگامی که یک کاربر عضو وب سایت می شود، تعداد زیادی رویداد باید اتفاق بیافتد، مثلا جدول های دیتابیس باید بروزرسانی شوند، یک لیست خبرنامه به آن اضافه شود، یک ایمیل خوشامدگویی به آن ارسال شود و... . متاسفانه این وقایع مدت زمان زیادی را برای تکمیل شدن نیاز دارند. چرا باید کاربر را مجبور کنیم تا زمان تکمیل این فرآیندها صبر کند؟ در صورتی که می شود این کارها را در پشت صحنه انجام داد؟
Queue::push('SignUpService', compact('user'));
یکی از نقاط قوت لاراول این است که از کتابخانه iron.io برای ارسال رویدادها به داخل صف استفاده می کند. به این وسیله می توان بدون داشتن تجربه از قدرت صف ها استفاده کرد. اینکار با دستور php artisan queue:subscribe انجام می شود که یک url را برای اینکار ثبت میکند و دراینصورت کتابخانه iron.io هر بار که یک کار جدید به صف اضافه شود آدرس url را ping می کند.
هر وقت که نیاز به اعتبارسنجی بود، لاراول اینبار هم با استفاده از کلاس Validator به کمک شما می آید. شیءای که می خواهید اعتبارسنجی کنید به همراه لیستی از وظایف را به متد make ارسال کنید تا لاراول بقیه کارها را برای شما انجام دهد:
$order = [ 'title' => 'Wii U', 'description' => 'Game console from Nintendo' ]; $rules = [ 'title' => 'required', 'description' => 'required' ]; $validator = Validator::make($order, $rules); if ($validator->fails()) { var_dump($validator->messages()); // validation errors array }
معمولا این نوع از کدها داخل مدلتان ذخیره می شود و به این ترتیب فرآیند اعتبارسنجی به یک متد کاهش پیدا می کند:
$order->isValid();
هنگامی که برای اولین بار لاراول را یاد میگیرد ضروری است که با Tinker آشنا شوید. لاراول یک دستور Artisan به نام tinker برای اینکار دارد. از نسخه های قبلی تا کنون، دستورtinker قدرت بیشتری پیداکرده است:
$ php artisan tinker > $order = Order::find(1); > var_dump($order->toArray()); > array(...)
به Migration ها همانند کنترل نسخه (Version Control) برای پایگاه دادهتان نگاه کنید. در هر نقطه که خواستید می توانید migration ها را rollback کنید. علاوه بر این با دستور php artisan migrate می توانید پایگاه داده خود را ایجاد کنید. برای تهیه Schema یا شماتیک جدول کاربران از دستور زیر استفاده کنید:
php artisan migrate:make create_users_table
این کد یک فایل Migration ایجاد می کند که می توانید مطابق با نیازتان آن را ویرایش کنید. بعد از کامل شدن آن با دستور php artisan migrate جدول را ایجاد کنید. در صورتی که نیاز داشتید عمل rollback را انجام دهید از دستور php artisan migrate:rollback استفاده کنید. در زیر یک مثال از نحوه ساخت Schema برای جدول سوالات متداول آورده شده است:
public function up() { Schema::create('faqs', function(Blueprint $table) { $table->integer('id', true); $table->text('question'); $table->text('answer'); $table->timestamps(); }); } public function down() { Schema::drop('faqs'); }
دقت کنید که متد drop() عکس متد up() کار می کند. دقیقا به دلیل وجود این متدهاست که می توانیم عمل rollback را انجام دهیم.
لاراول دارای تعداد زیادی Generator با نام Laravel 4 Generator ارائه کرده است که کارهایی از قبیل تولید منابع، Seed کردن فایل، جداول pivot، و Migration کردن Schema ها را شامل می شود. در مثال قبلی ما به صورت دستی Schema را نوشتیم درحالی که می شود با پکیج های Generator این کار را مانند زیر انجام داد:
php artisan generate:migration create_users_table --fields="username:string, password:string"
Generator بقیه کارها را برای ما انجام می دهد. با این دو دستور شما می توانید یک جدول جدید دردیتابیس تان ایجاد کنید. Laravel 4 Generator توسط Composer نصب می شود.
همان طور که قبلا هم گفته شد، روش های زیادی برای نوشتن یک دستور سفارشی وجود دارد. لاراول می تواند برای چهارچوب بندی برنامه ها، تولید فایل ها ، انتشار برنامه ها و هر کاری از دستورها استفاده کند.
چون این یک کار خیلی رایج است لاراول پروسه ایجاد یک Command سفارشی را توسط کد زیر انجام می دهد:
php artisan command:make MyCustomCommand
این دستور کدهای ضروری برای Command سفارشی جدیدتان ایجاد می کند. سپس فایل app/commands/myCustomCommand.php را ویرایش کرده و یک نام و یک توضیح دلخواه درباره نحوه کارکرد Command را وارد کنید:
protected $name = 'command:name'; protected $description = 'Command description.';
و در انتها داخل متد Fire() در کلاس Command هر کاری را که نیاز داشتید، می توانید انجام دهید. بعد از اتمام کار باید این Command را در فایل app/start/Artisan.php ثبت کنید:
Artisan::add(new MyCustomCommand);
حال به راحتی می توانید از این دستور سفارشی در ترمینال استفاده کنید.
لاراول از الگوی Facade به دفعات استفاده کرده است که اجازه می دهد شما از یک ساختار استاتیک مثل Route::get() و config::get() استفاده کنید. همچنین به شما این امکان را می دهد که بتوانید این متدها را در پشت صحنه به آسانی تست کنید. از آنجا که این کلاس های پایه از کانتینر IoC گرفته شده اند می توانید این نمونه ها را با نام های ساختگی عوض و سپس برای تست برنامه از این نام ها استفاده کنید:
Validator::shouldReceive('make')->once();
می توانیم shouldrecieve را بطور مستقیم در خارج از facade فراخوانی کنیم. در پشت صحنه، لاراول از فریم ورک Mockery برای اینکار استفاده می کند. بدین معنی است که شما می توانید از facade به طور آزادانه در کد خود استفاده کنید و در عین حال امکان تست پذیری 100 درصدی را داشته باشید.
ساخت فرم ها یکی از رایج ترین کارها در طراحی وب سایت است. لاراول برای ساخت راحت تر فرم ها از ویژگی تحت عنوان Form Helper ها استفاده می کند:
{{ Form::open() }} {{ Form::text('name') }} {{ Form::textarea('bio') }} {{ Form::selectYear('dob', date('Y') - 80, date('Y')) }} {{ Form::close() }}
هسته لاراول از کانتینر قدرتمندIoC استفاده می کند که یک ابزار قوی برای مدیریت کلاس ها و وابستگی های آن است. وابستگی های خود را داخل متد سازنده نوشته و هنگام نصب، لاراول توسط php reflection API به طور هوشمند typehint را از روی آن خوانده و تلاش می کند آن را به برنامه شما تزریق کند:
public function __construct(MyDependency $thing) { $this->thing = $thing; }
به خاطر داشته باشید که کنترلرها همیشه از کانتینر IoC فراخوانی می شوند و شما می توانید آزادانه وابستگی های کنترلرتان را به صورت typehint تعریف کنید چون در این صورت لاراول آن را به برنامه تان تزریق می کند.
برای پروژه های کوچک معمولا یک Environment توصیه می شود، اما در کل توصیه می شود که صرف نظر از اندازه پروژه، از چند environment برای کارتان استفاده کنید. مرحله توسعه، تست و تولید، همه ی اینها نیاز دارند که پیکربندی خودشان را داشته باشند. شاید محیط تست شما از یک دیتابیسی که در حافظه قرار گرفته برای تست استفاده کند.یا ممکن است environment ها از api key ها استفاده کنند. به احتمال زیاد محیط توسعه محصول (production( از یک رشته اتصال سفارشی برای اتصال به دیتابیس استفاده کند.
خوشبختانه لاراول اینبار هم کارتان را راحت کرده است. یک نگاهی به فایل bootstrap/start.php داخل برنامه تان بیندازید. در اینجا یک توصیف ابتدایی از تنظیم پروپرتی های local و production مربوط به environment آورده ایم:
$env = $app->detectEnvironment(array( 'local' => array('localhost'), 'production' => array('*.com') ));
لاراول از روش dead-simple برای پیکربندی استفاده می کند. به ازای هر محیط (environment) که دارید یک فولدر داخل app/config ایجاد و فایل های پیکربندی خودتان را داخل آنها قرار دهید.
همچنین می توانید billing api key متفاوت برای محیط تان تنظیم کنید:
<?php app/config/development/billing.php return [ 'api_key' => 'your-development-mode-api-key' ];
در صورت تایپ config::get(‘billing.api_key’) لاراول به درستی تشخیص می دهد که کدام فایل را از داخل آن بخواند.
فریم ورک لاراول به دلیل محبوبیت بسیار زیادی که در طی سال های گذشته بدست آورده است، منابع غنی و سرشار از مثال های متنوع را در اختیار کاربران گذاشته که وب سایت آکادمی آنلاین روکسو به عنوان اولین مرجع لاراول ایران همواره سعی داشته تا مفاهیم عمیقی از این فریم ورک قدرتمند را خدمت شما عزیزان ارائه دهد.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.