یادگیری constructor و dependency injection در لاراول

حمید تیموری 282 بازدید 1399/02/12
یادگیری constructor و dependency injection در لاراول

در این آموزش قصد داریم درباره Dependency injection به لاراول صحبت کنیم. تزریق وابستگی در لاراول زیاد استفاده می شود اگر بخواهیم مثال بزنیم باید اشاره کنیم به تزریق کلاس Request که در بیشتر متد ها از آن استفاده می کنیم. هنگامی که سعی می کنیم یک object را به کلاس خود تزریق کنیم ، Container از Reflection Api برای بررسی متد constructor استفاده می کند که کلاس هایی که inject شده اند را برگرداند.

ابزار قدرتمندی به نام Service Cointainer در لاراول وجود دارد که وظیفه مدیریت Dependency ها را بر عهده دارد.
مفهوم Dependency Injection یک عبارت فانتزی است که در اصل به این معنی است: وابستگی ها یا dependency class توسط متد constructor به کلاس تزریق میشوند.

حالا بهتره که یک مثال در لاراول بزنیم:
من میخوام یک TaskRepository تعریف کنم که کلیه منطق دسترسی به مدل Task را در خود داشته باشد. این کار مفید خواهد بود مخصوصا زمانی که پروژه رشد کند و بزرگ شود، باعث میشود شما بتوانید query ها را راحت تر مدیریت کنید.

 قدم اول : ساخت مدل Task
دستور زیر را اجرا کنید

php artisan make:model Task -fm

حالا فایل migration را باز کنید و کد زیر را در آن paste کنید

public function up()
{
     Schema::create('tasks', function (Blueprint $table) {
         $table->id('id');
         $table->string('title');
         $table->unsignedBigInteger('user_id')->index();
         $table->timestamps();
     });
}

برای ساخت اطلاعات fake فایل TaskFactory را باز کنید

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Task;
use Faker\Generator as Faker;

$factory->define(Task::class, function (Faker $faker) {
    return [
        'title' => $faker->paragraph,
        'user_id' => 1
    ];
});

حالا ترمینال را باز کنید و دستورات زیر را اجرا کنید:

php artisan tinker

//then

factory(\App\User::class,10)->create()

//then


factory(\App\Task::class,10)->create()

//then

exit

بعد از اجرای این دستورات،‌ اطلاعات fake ساخته شده و در جدول tasks و users میتوانید آنهار را مشاهده کنید.


قدم دوم : ساخت Auth
پکیج laravel/ui در لاراول یک راه خیلی سریع برای پیاده سازی سیستم authentication است که تمامی route و view های مورد نیاز را فقط با یک دستور برای شما میسازد

composer require laravel/ui --dev

// then

php artisan ui vue --auth

حالا پروژه را اجرا کنید و سپس در ثبت نام کنید که بتوانید task های کاربران را مشاهده کنید


قدم سوم: تعریف route

Route::get('/user', 'TaskController@index');


قدم چهارم : ساخت TaskRepository
در مسیر app/Repositories یک کلاس به نام TaskRepository بسازید. بخاطر داشته باشید که تمامی پوشه app از استاندارد PSR-4 aut-loading استفاده میکند و auto-loaded است. بنابراین شما میتوانید هر پوشه و فایلی که نیاز دارید در این پوشه app بسازید و از آنها استفاده کنید

حالا کلاس ساخته شده در مسیر app/Repositories/TaskRepository را باز کنید و کد زیر را به آن اضافه کنید:

namespace App\Repositories;

use App\User;
use App\Task;

class TaskRepository
{
    /**
     * Get all of the tasks for a given user.
     *
     * @param  User  $user
     * @return Collection
     */
    public function get_all_task_for_a_given_user(User $user)
    {
        return Task::where('user_id', $user->id)
                    ->orderBy('created_at', 'asc')
                    ->get();
    }
}



قدم پنجم: تزریق Repository
در متد constructor در کنترلر میتوانیم به TaskRepository را inject کنیم. لاراول استفاده از container همه ی کنترلر ها را  resolve میکند و یا به زبان ساده به کنترلر ها دسترسی پیدا میکند. بنابراین کلاس TaskRepository هم load خواهد شد:

namespace App\Http\Controllers;

use App\Task;
use App\Http\Requests;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Repositories\TaskRepository;


class TaskController extends Controller
{
    /**
     * The task repository instance.
     *
     * @var TaskRepository
     */
    protected $tasks;

    /**
     * Create a new controller instance.
     *
     * @param  TaskRepository  $tasks
     * @return void
     */
    public function __construct(TaskRepository $tasks)
    {
        $this->middleware('auth');

        $this->tasks = $tasks;
    }

    /**
     * Display a list of all of the user's task.
     *
     * @param  Request  $request
     * @return Response
     */
    public function index(Request $request)
    {
        return $this->tasks->get_all_task_for_a_given_user($request->user());
    }
}

در کد بالا میبینید که TaskRepository در کنترلر توسط متد constructor تزریق شده است. حالا اگر route را اجرا کنید خروجی زیر را خواهید دید که تسک های مربوط یه یک کاربر خاص را نشان میدهد:


به صورت کلی dependecy injection آموزش داده شد. امیدوارم که مطلب برای شما مفید باشد. اگر سوالی داشتید از قسمت نظرات بپرسید.

 
دیگر مقالات
امید کیانی 495 بازدید 1398/07/16
حمید تیموری 526 بازدید 1398/10/19
حمید تیموری 560 بازدید 1397/10/15
حمید تیموری 723 بازدید 1397/05/09
حمید تیموری 844 بازدید 1397/05/10


نظرات (0)
هنوز نظری ثبت نشده است
برای ثبت نظر ابتدا وارد سایت شوید