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

فانکشن‌های جادویی در PHP وجود دارد که __invoke یکی از آن‌هاست. از طریق متد __invoke، فقط با یک فانکشن __invoke کلاس‌هایی را ایجاد می‌کنیم و هر زمان که آبجکت آن‌ها فراخوانی شود، مستقیماً متد __invoke را فراخوانی می‌کند. پس دیگر نیازی نیست به‌صورت دستی $obj->someFunction() را بنویسید. با ما همراه باشید در این مقاله کلاس‌های تک اکشن در کنترلر لاراول را با هم بررسی خواهیم کرد.

کجا می‌توانم از آن استفاده کنم؟

این یک سوال منطقی و معقول است. هر وقت که قابلیت جدیدی پیدا کردیم، باید بدانیم که کجا استفاده می‌شود. موردی که در اینجا نشان می‌دهیم SRP است.

SRP

SPR مخفف Single Responsibility Principle است و به عنوان کلاسی که فقط یک دلیل برای تغییر دارد، در PHP تعریف شده است. SPR اپلیکیشن ما را قوی‌تر و قابل تست و آزمایش می‌کند. نکته خوب اینکه هر زمان که بخواهیم اپلیکیشن خود را تغییر دهیم، فقط باید در یک جا تغییرات خود را اعمال کنیم.

 

SPR چه ارتباطی با لاراول دارد؟

یکی از راه‌های پیاده‌سازی SRP در لاراول، استفاده از کنترلرهای تک اکشن است. کنترلر فقط یک متد __invoke دارد و می‌توانید مستقیماً از نام کنترلر در روت استفاده کنید، نه اینکه متد آن را در روت مشخص کنید.

قبل از هر کاری باید قطعه کد زیر را بنویسید.

Route::get('posts', 'PostController@index');

و در ادامه:

Route::get('posts', 'PostIndexController');

توجه

این ویژگی جدیدی در لاراول نیست بلکه فقط روشی است که می‌توانید از فانکشن جادویی PHP برای پیاده‌سازی SRP در پروژه لاراول خود استفاده کنید. این ویژگی از PHP 5.3 در دسترس قرار گرفته است.

چگونه می‌توان از کلاس‌های تک اکشن در کنترلر لاراول، در یک پروژه لاراول استفاده کرد؟

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

  1. 1. برای پست‌ها مدل و مایگریشن ایجاد کنید. (با پست‌ها ادامه می‌دهیم)
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 استفاده کنید که یک کنترلر واحد داشته باشید که همه متدهای ریسورس شما را کنترل کند.

چیزی شبیه به این:

مثال برای invoke

نتیجه

برای اجرای SRP می‌توانید از SAC در اپلیکیشن لاراول خود استفاده کنید. ایجاد کنترلرها از این طریق هم مزایا دارد و هم اشکال دارد. اما مطمئناً روش بهتری برای معماری اپلیکیشن شماست.
نسخه آزمایی کنترل واحد

رقیه اباذری

رقیه اباذری

تو دانشگاه IT خوندم و اکثر منابع کتاب‌های ترجمه شده بودند و صدالبته مبهم :( مثلا element رو "عنصر" ترجمه می‌کردن و من همیشه می‌رفتم تو شیمی و جدول مندلیف. تو باورژن سعی کردم تا حد ممکن مطالب رو با زبان ساده و قابل درک بنویسم. باشد که کسانی که تازه پا به عرصه برنامه‌نویسی گذاشتن، راغب‌تر بشن و با نظرات و فیدبک‌های شما راه هموارتر بشه:)

دیدگاه‌ها


ثبت دیدگاه