اذهب إلى المحتوى

السؤال

نشر

لقد قمت بإضافة roles and permission جديدة حسب التوثيق الموجود ضمن Entrust في ملف App\models\Role.php:

<?php namespace App;

use Zizaco\Entrust\EntrustRole;

class Role extends EntrustRole
{

    $admin = new Role();
    $admin->name         = 'admin';
    $admin->display_name = 'Project Admin';
    $admin->description  = 'admin is the owner of a project';
    $admin->save();
}

ولكن عندما أقوم بإضافة الصلاحيات يظهر هذا الخطأ مباشرةً:

"Parse error: syntax error, unexpected '$admin' (T_VARIABLE), expecting function (T_FUNCTION) or const (T_CONST)"

كيف يمكنني معالجة هذا الخطأ؟

Recommended Posts

  • 0
نشر

يبدو أنك تضع الكود البرمجي بداخل الكلاس مباشرة بدون استخدام دالة setup بهذا الشكل 

public function setup() 
{
    $admin = new Role();
    $admin->name         = 'admin';
    $admin->display_name = 'Project Admin';
    $admin->description  = 'admin is the owner of a project';
    $admin->save();
}

فيكون كاملا الكود 

<?php namespace App;

use Zizaco\Entrust\EntrustRole;

class Role extends EntrustRole
{

    public function setup() 
	{
		$admin = new Role();
		$admin->name         = 'admin';
		$admin->display_name = 'Project Admin';
		$admin->description  = 'admin is the owner of a project';
		$admin->save();
	}
}

 

  • 0
نشر (معدل)

بقراءة متمعنة للخطأ الظاهر نجده يشير الى خطأ بسياق اللغة فهو لم يتوقع ادراج المتغير الذي اسمه $admin و الجائز في اللغة أن يعرف اما ثابت const أو دالة function : أي كلاس class و بداخله دوال methods و بداخل هاته الدوال يكون الكود و الlogic لا خارجها 

فالتخلص من هاته المشكلة بسيط و هو باضافة هذا الكود : 

$admin = new Role();
$admin->name         = 'admin';
$admin->display_name = 'Project Admin';
$admin->description  = 'admin is the owner of a project';
$admin->save();

الى داخل دالة معينة ننشئها . لكن هذا قد يحل المشكلة لكنه لن يجعل الباكاج تعمل بشكل صحيح و لربما قد يضيف مشاكل اخرى 

فالحل هو : 
بعدما قمنا بانشاء كلاس باسم Role الان نحتاج الى انشاء ادوار , أي انشاء نماذج من هذا الكلاس فالأصح ليس استعمال الكود السابق داخل الكلاس , بل استعمالها في أي مكان ثان غير داخل هذا الكلاس حتى يكون سهل الوصول و قابل للاستنتساخ منه .
فالان أنت قد قمت بعمل الكلاس , وقد قمت بتوريثه دوال معينة باستعمال extends و لا تحتاج الى تعريف دوال اخرى , فتحتاج فقط الى انشاء هاته النماذج 

و عن نفسي احبذ انشاءها داخل ملف التهجير الخاص بالمستخدمين بدالة خاصة يتم استدعاءها قبل انشاء المستخدم الافتراضي أو السوبر ادمن ومن ثم اعطاء الدور له .
فيكون ملف Role.php هكذا : 

<?php 
namespace App;

use Zizaco\Entrust\EntrustRole;

class Role extends EntrustRole
{
   // 
}

و يكون ملف التهجير الخاص بالمستخدمين هكذا :

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

use Illuminate\Support\Facades\Hash;

use App\Role; // لا تنسى تضمين الكلاس بشكل صحيح 

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
        
        // استدعاء الدالة التي تقوم بانشاء الادوار الافتراضية
        $adminRole = $this->createeSuperAdminRole();
        
        // انشاء العضو الافتراضي او السوبر ادمن 
        $user = App\Models\User::create([
            'name'=>'SuperAdmin',
            'email'=>'super@admin.co',
            'password' => Hash::make('12345678'),
        ]);
        
        // اضافة الدور للعضو
        $user->attachRole($adminRole); 
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }

    private function createeSuperAdminRole()
    {
        $admin = new Role();
		$admin->name         = 'admin';
		$admin->display_name = 'Project Admin';
		$admin->description  = 'admin is the owner of a project';
		$admin->save();

        return $admin; // نقوم باعادته حتى يسهل اعطاء العضو الافتراضي هذا الدور 
    }
}

و يمكنك معاملة الاذونات و الملف باسم Permission.php بنفس المنطق و انشاء الاذونات واضافتها للادوار بمنطق مشابه  
 

تم التعديل في بواسطة Adnane Kadri
  • 0
نشر

المشكله اخى الكريم ان الكود مكتوب داخل الكلاس بصورة مباشرة وتلك الطريقة لا تعمل يجب ان نقوم بكتابة الاكواد فى الكلاس عن طريق ال methods او بمعنى اخر functions فانت لدى اكثر من حل :

اولا ممكن تقوم بعمل كنترولر وتكتب هذا الكود فى اى فنكشن كالمثال التالى : 

namespace App\Http\Controllers;

use Illuminate\Http\Request;

/**
 * Class UserController
 * @package App\Http\Controllers
 */
class UserController extends Controller
{
    public function index()
    {
        $owner = new Role();
        $owner->name         = 'owner';
        $owner->display_name = 'Project Owner'; // optional
        $owner->description  = 'User is the owner of a given project'; // optional
        $owner->save();

        $admin = new Role();
        $admin->name         = 'admin';
        $admin->display_name = 'User Administrator'; // optional
        $admin->description  = 'User is allowed to manage and edit other users'; // optional
        $admin->save();
    }
}

الحل الاخر وهذا الأفضل انه تقوم بعمل seed لل roles والبيرميشن الخاصة بك عن طريق Laravel seeder نقوم بعمل seeder عن طريق تنفيذ السطر التالى 

php artisan make:seeder PermissionSeeder

ويكون الكود فى هذا الملف كالتالى : 

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class PermissionSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $createPost = new Permission();
        $createPost->name         = 'create-post';
        $createPost->display_name = 'Create Posts'; // optional

        $createPost->description  = 'create new blog posts'; // optional
        $createPost->save();

        $editUser = new Permission();
        $editUser->name         = 'edit-user';
        $editUser->display_name = 'Edit Users'; // optional

        $editUser->description  = 'edit existing users'; // optional
        $editUser->save();
    }
}

طبعا قم بأضافة كل ال permissions الموجودة بالسيستم لديك عن طريق ال seeder 

ملحوظة : لاتنسا ان تقوم بعمل امبورت لكلاس ال Permission وال Role

واخيرا نقوم بتنفيذ هذا ال seeder عن طريق : 

//seeder لتنفيذ كل ملفات ال 
php artisan db:seed  


//معين seeder  لتنفيذ  
php artisan db:seed  --class=PermissionSeeder   

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...