1402/03/06 570 کلمه 3 دقیقه

وابستگی‌ها: فراخوانی پکیج اضافی

آموزش ساخت پکیج لاراول

تا این درس ما با نحوه ساخت کنترلرها، مسیردهی و viewها در پکیج‌های لاراول آشنا شدیم. حالا به کد پروژه لاراولی برمی‌گردیم و کدهای داخل permission editor که ساختیم را کپی پوشه پکیج می‌کنیم. فقط نیاز هست حتما namespace ها را تغییر دهیم.

برای مثال کد زیر کنترلر کامل RoleController می‌باشد:

packages/themahdavi/laravel-permission-editor/src/Http/Controllers/RoleController.php:

namespace themahdavi\LaravelPermissionEditor\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

class RoleController extends Controller
{
	public function index()
	{
		$roles = Role::withCount('permissions')->get();
		
		return view('permission-editor::roles.index', compact('roles'));
	}
	
	public function create() 
	{
		$permissions = Permission::pluck('name', 'id');
		
		return view('permission-editor::roles.create', compact('permissions'));
	}
	
	public function store(Request $request)
	{
		$request->validate([
			'name' => ['required', 'string', 'unique:roles'],
			'permissions' => ['array'],
		]);
		
		$role = Role::create(['name' => $request->input('name')]);
		$role->givePermissionTo($request->input('permissions'));
		
		return redirect()->route('permission-editor.roles.index');
	}
	
	public function edit(Role $role)
	{
		$permissions = Permission::pluck('name', 'id');
		
		return view('permission-editor::roles.edit', compact('role', 'permissions'));
	}
	
	public function update(Request $request, Role $role)
	{
		$request->validate([
			'name' => ['required', 'string', 'unique:roles,name,' . $role->id],
			'permissions' => ['array'],
		]);
		
		$role->update(['name' => $request->input('name')]);
		$role->syncPermissions($request->input('permissions'));
		
		return redirect()->route('permission-editor.roles.index');
	}
	
	public function destroy(Role $role)
	{
		$role->delete();
		
		return redirect()->route('permission-editor.roles.index');
	}
}

در نهایت نیاز هست تمام فایل‌های داخل پوشه‌های کنترلر و views را داخل پوشه پکیج کپی کنیم. برای اینکه کدها اینجا زیاد نشود مثال‌ها در نهایت روی ریپازیتوری خواهیم داشت.

حالا اگه پروژه را دوباره باز کنیم به خطای زیر مواجه خواهیم شد:

Class "Spatie\Permission\Models\Permission" not found

البته این خطا بدان معنا نیست که پروژه لاراولی ما متوجه شده است که پکیج موردنظر وجود ندارد و باید نصب شود. در حقیقت خطا نشان‌گر آن است که لاراول کلاس را پیدا نمی‌کند.

پس حالا نوبت آن رسیده تا به composer.json پکیج برگردیم و پکیج Spatie را در وابستگی‌ها بیافزاییم.

{
	"name": "themahdavi/laravel-permission-editor",
	// ...
	"require": {
		"spatie/laravel-permission": "^5.0"
	}
}

برای اینکه نسخه پکیج با پروژه شما همخوانی داشته باشد باید به نسخه‌ای که وارد می‌کنید دقت کنید. در زمان نگارش این درسنامه آخرین نسخه پکیج spatie/laravel-permission نسخه 5.x است.

حالا وقت آن شده تا دستور composer update را اجرا کنیم. این دستور علاوه بر وابستگی‌های پکیج ما، وابستگی‌های پروژه لاراول هم بروزآوری می‌کند.

اگر در ترمینال نتایج زیر را خروجی بگیریم یعنی تا اینجا درست پیش رفتیم:

Package operations: 1 install, 1 update, 0 removals
	- Installing spatie/laravel-permission (5.7.0): Extracting archive
	- Upgrading themahdavi/laravel-permission-editor (dev-main a066e56 => dev-main 274d508): Source already present

حالا اگر مرورگر را رفرش کنیم با خطای زیر مواجه خواهیم شد:

Base table or view not found: 1146 Table 'permissions' doesn't exist

این خطا به ما یادآور می‌کند که تنها نصب پکیج spatie/laravel-permission کافی نیست و نیاز هست تا تنظیمات آن انجام شود. برای اطلاعات بیشتر به مستندات رسمی آن مراجعه کنید زیرا در چارچوب این درسنامه مطالعه مستندات پکیج موردنظر قرار نمی‌گیرد. برای نمونه دستورات زیر باید پس از نصب پکیج spatie/laravel-permission نیاز است.

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate

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

حالا اگر صفحه مرورگر را رفرش کنیم تصویر زیر را خواهیم دید:

dependencies-require-external-packages

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

توجه: اگر بعد از هربار رفرش، اطلاعات صفحه بروز نشدند حتما دستور php artisan view:clear را اجرا کنید تا کش صفحات پاک شوند.