فانکشنهای جادویی در PHP وجود دارد که __invoke
یکی از آنهاست. از طریق متد __invoke
، فقط با یک فانکشن __invoke
کلاسهایی را ایجاد میکنیم و هر زمان که آبجکت آنها فراخوانی شود، مستقیماً متد __invoke
را فراخوانی میکند. پس دیگر نیازی نیست بهصورت دستی $obj->someFunction()
را بنویسید. با ما همراه باشید در این مقاله کلاسهای تک اکشن در کنترلر لاراول را با هم بررسی خواهیم کرد.
این یک سوال منطقی و معقول است. هر وقت که قابلیت جدیدی پیدا کردیم، باید بدانیم که کجا استفاده میشود. موردی که در اینجا نشان میدهیم SRP است.
SPR مخفف Single Responsibility Principle است و به عنوان کلاسی که فقط یک دلیل برای تغییر دارد، در PHP تعریف شده است. SPR اپلیکیشن ما را قویتر و قابل تست و آزمایش میکند. نکته خوب اینکه هر زمان که بخواهیم اپلیکیشن خود را تغییر دهیم، فقط باید در یک جا تغییرات خود را اعمال کنیم.
یکی از راههای پیادهسازی SRP در لاراول، استفاده از کنترلرهای تک اکشن است. کنترلر فقط یک متد __invoke
دارد و میتوانید مستقیماً از نام کنترلر در روت استفاده کنید، نه اینکه متد آن را در روت مشخص کنید.
قبل از هر کاری باید قطعه کد زیر را بنویسید.
Route::get('posts', '[email protected]');
و در ادامه:
Route::get('posts', 'PostIndexController');
این ویژگی جدیدی در لاراول نیست بلکه فقط روشی است که میتوانید از فانکشن جادویی PHP برای پیادهسازی SRP در پروژه لاراول خود استفاده کنید. این ویژگی از PHP 5.3 در دسترس قرار گرفته است.
در ادامه یک نسخه آزمایشی سریع ایجاد میکنیم تا بفهمیم چطور از __invoke
در یک اپلکیشن لاراول استفاده کنیم.
php artisan make:model Post -m
با دستور بالا یک مدل App\Post
و همچنین مایگریشن ایجاد میشود.
2. فایل مایگریشن را متناسب با آن تغییر دهید و php artisan migrate
را اجرا کنید.
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->timestamps();
});
3. برای ایجاد یک پست با دو فیلد title و body، یک ویو ایجاد کنید.
@extends('layouts.app')
@section('content')
<form action="{{ route('posts.store') }}" method="POST">
{{ csrf_field() }}
<div class="form-group">
<label for="title">Title</label>
<input name="title" type="text" class="form-control" id="title" placeholder="Enter Title" value="{{ old('title') }}">
</div>
<div class="form-group">
<label for="body">Body</label>
<textarea name="body" id="body" class="form-control" placeholder="Body">{{ old('body') }}</textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
@endsection
4- یک کنترلر برای این ویو ایجاد کنید. PostCreateController
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostCreateController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function __invoke()
{
return view('posts.create');
}
}
5. و حالا روت
Route::get('posts/create', 'PostCreateController');
توجه داشته باشید که لازم نیست نام متد را با route definition مشخص کنید.
حالا اگر دقت کنید، ویو را درست مانند زمانی که از یک کنترلر ساده استفاده میشود، رندر میکند.
دقیقاً مانند موارد بالا، میتوانید یک کلاس کنترلر برای هر متد در ریسورس خود ایجاد کنید.
تا اینجا فقط در مورد مزایای استفاده از __invoke
صحبت کردیم. اکنون ما در مورد ایراد استفاده از آن صحبت خواهیم کرد.
اگر از این متد استفاده کنید دیگر نمیتوانید از متد Route::resource
استفاده کنید. باید هر روت از ریسورس خود را مشخص کنید و کنترلر مربوطه باشد. تنها درصورتی میتوانید از Route::resource
استفاده کنید که یک کنترلر واحد داشته باشید که همه متدهای ریسورس شما را کنترل کند.
چیزی شبیه به این:
برای اجرای SRP میتوانید از SAC در اپلیکیشن لاراول خود استفاده کنید. ایجاد کنترلرها از این طریق هم مزایا دارد و هم اشکال دارد. اما مطمئناً روش بهتری برای معماری اپلیکیشن شماست.
خدمات توسعه لاراول، جامعه PHP را غافلگیر کرده است. به جرات میتوان گفت لاراول یکی از بهترین فریمورکهای PHP است که کار برنامهنویسی و کدزدن را سرعت بخشیده است. حتی ارتقا و توسعه هم با لاراول راحتتر شده است. به طوریکه توسعه برنامه به جای خستهکننده بودن، تبدیل به کاری جذاب و خلاقانه شده است.
2 سال پیش
7 دقیقه
قبل از شروع معرفی متد فیلتر، بهتر است بدانیم کالکشن چیست؟ متد filter کالکشن، همانطور که از نام آن پیداست، کار فیلتر را انجام می دهد. اما خب به چه صورت؟!
2 سال پیش
1 دقیقه
قابلیت محلی سازی لاراول روش مناسبی برای بازیابی استرینگها به زبانهای مختلف را برای ما فراهم میکند. در واقع با استفاده از این قابلیت است که میتوانیم با کمترین اتلاف وقت، از چند زبان در وب سایت خود پشتیبانی کنیم.
2 سال پیش
7 دقیقه
دیدگاهها