لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 02/15/21 في كل الموقع
-
السلام عليكم عند بدء عمل admin panel للمشروع اين انشئ الcontrollers الخاصه بال routes مع العلم انني اعمل على اصدار laravel7 هل انشئ لها controller جديده غير الcontroller الخاصه بجزء الfront في مجلد controller2 نقاط
-
يبدو أن الأمور مُختلطة عليك قليلاً، في المُتحكم كل تابع يُؤدي مهمة مُعينة مثلاً إن قمنا بإنشاء مُتحكم PostController فالتابع index مسؤول عن إرجاع صفحة عرض واحدة و تمرير المقالات لها مثلا بهذا الشكل: <?php public function index() { $posts = Post::latest()->get(); return view("posts.index", compact('posts')); } إذا أضفنا أي كود بعد التعليمة return هذا الكود يُسمى dead code و لن يتم تنفيذه، أي ما تُحاولين القيام به غير مُمكن. بما أنك تريدين القيام بجزء لوحة التحكم و جزء الواجهة فيُنصح بفصل الجزئين عن بعضهما و هذا ما أفعله: إنشاء مُجلد خاص لمُتحكمات لوحة التحكم و ليكن Dashboard داخل مُجلد Controllers و أي مُتحكم أحتاجه في لوحة التحكم أضعه فيه. أحيانا قد يكون المشروع كبير فالأحسن إنشاء ملف مسارات خاص بلوحة التحكم أيضاً مثلاً admin.php و نضع فيه كافة مسارات لوحة التحكم سيكون بهذا الشكل مثلاً: <?php use Illuminate\Support\Facades\Route; Route::prefix('dashboard') ->name('dashboard.') ->group(function () { // هنا نضع أي مسار خاص بلوحة التحكم و أي مسار يكون مسبوق تلقائياً ب dashboard في الرابط }); الآن يجب أن نُخبر laravel أن هناك ملف مسارات جديد يجب أن تأخذه بعين الإعتبار و يتم ذلك على مُستوى مزود الخدمة RouteServiceProvider: اولاً نُضيف مجال الأسماء لمُتحكمات لوحة التحكم في مُتغير: <?php protected $dashboard_namespace = 'App\Http\Controllers\Dashboard'; حيث كافة المتحكمات الموجودة في المُجلد Dashboard الذي أنشأناه سابقاً يجب أن تكون تابعة لهذا المجال. ثانياً في التابع map نضيف سطر جديد لعمل map لمسارات ملف admin.php بهذا الشكل: <?php public function map() { $this->mapApiRoutes(); // هذا السطر يكون موجود $this->mapWebRoutes(); // هذا السطر يكون موجود ايضاً $this->mapDashboardRoutes(); // هذا ما نضيفه // } ثالثاً بعدما استدعينا التابع mapDashboardRoutes نقوم بإنشائه لأنه لن يكون موجوداً ضمن نفس مزود الخدمة: <?php protected function mapDashboardRoutes() { Route::middleware('web') ->namespace($this->dashboard_namespace) // هذا السطر لتحديد مجال الأسماء ->group(base_path('routes/admin.php')); // و هنا حددنا ملف المسارات } الآن بعدما أعددنا كل شيء نحتاج فقط لإضافة المسار الذي نُريده و المتحكم الذي نريده مثلاً نريد عرض المقالات في لوحة التحكم فنُنشئ المسار على شكل resource لأنه سيضم مُختلف العمليات في ملف مسارات لوحة التحكم admin.php: <?php use Illuminate\Support\Facades\Route; Route::prefix('dashboard') ->name('dashboard.') ->group(function () { // admins routes Route::resource('posts', 'PostController'); }); بعدما أعددنا المسار نحتاج إنشاء مُتحكم للمقالات PostController في المُجلد Dashboard الذي أنشأناه سابقاً: <?php namespace App\Http\Controllers\Dashboard; use App\Http\Controllers\Controller; use App\Post; class PostController extends Controller { public function index() { $posts = Post::latest()->get(); return view('dashboard.posts.index', compact('posts')); } } هذا يعني أننا سنُضيف مُجلد dashboard داخل مُجلد views و فيه نضع كافة صفحات العرض الخاصة بلوحة التحكم، و بما أننا نعمل على المقالات فسنضع مُجلد إسمه posts و فيه نضع كافة صفحات العرض الخاصة بالمقالات: views |_ dashboard |__|___ posts |__|____|__ index.blade.php |__|____|__ create.blade.php |__|____|__ edit.blade.php |__|____|__ show.blade.php |__|___ categories |__|____|__ index.blade.php |__|____|__ create.blade.php |__|____|__ edit.blade.php |__|____|__ show.blade.php |... هذا فيما يخص جزء لوحة التحكم، فيما يخص جزء الواجهة فسيبقى كما كان، المسارات الخاصة به سيتم وضعها في ملف web.php و المُتحكمات الخاصة به ستكون في مُجلد Controllers مُباشرة، يُمكنك التنظيم أيضاً فبما أننا وضعنا مُجلد يضم كافة صفحات العرض الخاصة بلوحة التحكم يُمكنك وضع مُجلد يضم كافة صفحات العرض الخاصة بالواجهة، الأمر يعود لك بهذا الخصوص. الآن إذا اردنا الذهاب إلى صفحة المقالات الموجودة في لوحة التحكم سنستعرض الرابط التالي: /dashboard/posts أما صفحة المقالات الخاصة بالواجهة: /posts بالتوفيق.2 نقاط
-
يحدث الخطأ التالي عند استدعاء Scaffold.of(context) لإظهار snackbar : هذا هو الكود الخاص بالشاشة الذي يحدث بها الخطأ: import 'package:flutter/material.dart'; void main() => runApp(MyHomePage()); class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'test', theme: ThemeData( primarySwatch: Colors.cyan, ), home: Page1(), ); } } class Page1 extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('page1'), ), body: Center( child: RaisedButton( color: Colors.cyan, textColor: Colors.white, onPressed: (){ Scaffold.of(context).showSnackBar(SnackBar(content: Text('Hey there'))); }, child: Text('show snackbar'), ), ), ); } }2 نقاط
-
نعم من الأفضل فصل المتحكمات controllers تبعاً للوظائف التي تقوم بها، لأن جمع عدّة وظائف أو وجود توابع كثيرة ضمن متحكم controller واحد سيجعل من الصعب على المبرمج العودة إلى الكود وصيانته أو تحسينه أو ملاحقة الأخطاء فيما بعد. لذلك يفضّل دوماً فصل المتحكمات عن بعضها. بحيث يتم تجميع الخصائص التي ترتبط بكيان واحد في المتحكّم المستقل لها. وذلك يتيح لك أيضاً أريحية في إضافة الوسائط middlewares بشكل منفصل بدلاً من دمجها في متحكّم واحد. أيضاً، وكلما زادت عملية التفصيل هذه زادت سرعة تحديد الخطأ وصيانة الكود مما يتيح لك في حال حدوث خطأ معيّن يمكنك بسهولة التوجه إلى المتحكّم المسؤول عن هذه الوظيفة ومعالجتها ، لذلك ينصح أيضاً بفصل حتى (العمليات) على عدة متحكمات، على سبيل المثال (متحكم خاص بعملية تسجيل الدخول والتحقق ونسميه: AuthenticationController،... وهكذا). حيث أن النمط المتّبع لفصل المتحكّمات الخاصة بالمدراء admins عن مستخدمي الموقع يمكن أن يكون على الشكل التالي: app http controllers Admin //نضع ضمن هذا المجلد جميع المتحكمات الخاصة بلوحة التحكم AuthenticationController AnotherController ..... MainController // باقي المتحكمات التابعة للموقع ... ولكن في النهاية، أي نمط متّبع سيعمل بالتأكيد ولن يسبب أخطاء، ولكن هذه النصائح فقط لجعل الكود مرن وقابل للقراءة أكثر.2 نقاط
-
بما أن إطار العمل Flutter ينشئ تطبيقات native ويتعامل مع الـandroid والـIOS كل على حدة. إذاً كيف يمكنني أن أنفذ كود بلغة java على الـandroid فقط ؟2 نقاط
-
2 نقاط
-
يمكنك تشغيل كود بلغة java للاندرويد وبلغة swift للـIOS عن طريق الـmethod channels حيث تمكننا من إستدعاء دوال معرفة مسبقاً بلغة java وتلقي القيم المرجعة منها. لاحظ كيف يتم التواصل عبر الـchannels بين التطبيق والدوال الخاصة بالـandroid والـIOS. لنأخذ مثالاً لتنفيذ كود بلغة java على الاندرويد لجلب معلومات عن الجهاز: أولا يجب كتابة الكود الذي نريد استدعائه من خلال الـmethod channles، نذهب إلى الملف " MainActivity.java " الموجود في مجلد android/java حيث سيكون الملف كالتالي: import io.flutter.embedding.android.FlutterActivity; public class MainActivity extends FlutterActivity { } نقوم بإضافة التعديلات الموضحة في الكود التالي: import androidx.annotation.NonNull; import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.plugin.common.MethodChannel; import android.os.Build; public class MainActivity extends FlutterActivity { private static final String CHANNEL = "com.myapp.getInfo"; // اسم القناة الخاصة بنا @Override public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { super.configureFlutterEngine(flutterEngine); new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL) .setMethodCallHandler( (call, result) -> { //سيتم تنفيذ الكود في الـ // main thread if (call.method.equals("getManufacturer")) { // التحقق من إسم الدالة التي تم إستدعائها في حال كانت مطابقة String manufacturer = Build.MANUFACTURER; // جلب إسم الشركة المصنعة result.success(manufacturer); // إرجاع القيمة ليتم إستخدامها من قبل التطبيق } } ); } } بعد تعريف قناة خاصة بنا وهي " com.myapp.getInfo " وتعريف إسم الإستدعاء " getManufacturer" يمكننا الآن إستدعاء تلك الوظائف بلغة dart لترجع لنا إسم الشركة المصنعة للهاتف. أولاً وقبل إستدعاء الدالة getManufacturer يجب تهيئة القناة الخاصة بنا كالتالي: import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; //... class _MyHomePageState extends State<MyHomePage> { static const platform = const MethodChannel('com.myapp.getInfo'); // تعريف القناة //... } //... ثم نستدعي الدالة getManufacturer ونخزن القيمة المرجعة منها في متغير: final String result = await platform.invokeMethod('getManufacturer'); // إستدعاء الدالة وتخزين القيمة المرجعة منها في متغير وبذلك نكون قد كتبنا كود بلغة java وقمنا بإستدعائه عن طريق الـmethod channels.2 نقاط
-
تم حل امشكلة شكرا جزيلا لك نفذت ماكتبته لي وتم حلها شكرا لك ولكن اريد ان افهم لماذا كتبنا هذا الامر ولما حدثت المشكله من البدايه ارجو الاجابة على سؤالي حتى لاتتكرر معي المشكله وشكرا2 نقاط
-
call()__ وcallStatic()__ يُستدعى التابعين __call() و__callStatic() عندما تريد استدعاء تابع كائن غير موجود في سياق تابع أو سياق ساكن. في الشيفرة التالية يُستدعى التابع __call() عندما يحاول شخص ما استدعاء تابع في سياق كائن غير موجود مثل $foo->method($arg, $arg1);، سيحتوي الوسيط الأول على اسم التابع وهو method في مثالنا وسيحتوي الوسيط الثاني على قيم $arg و$arg1 كمصفوفة. ويُستدعى التابع __callStatic() من محتوى ساكن عند استدعاء تابع ساكن غير موجود، مثلًا Foo::buildSomethingCool($arg);، سيحتوي الوسيط الأول على اسم التابع وهو buildSomethingCool في مثالنا ويحتوي الوسيط الثاني على قيمة $arg في مصفوفة. لاحظ أنّ بصمة هذا التابع مختلفة (يتطلب الكلمة المفتاحية static)، هذا التابع لم يكن موجودًا قبل الإصدار PHP 5.3. class Foo { public function __call($method, $arguments) { // (1) $snakeName = CaseHelper::camelToSnake($method); // الحصول على البادئة $subMethod = substr($snakeName, 0, 3); // إسقاط اسم التابع $propertyName = substr($snakeName, 4); switch ($subMethod) { case "get": return $this->data[$propertyName]; case "set": $this->data[$propertyName] = $arguments[0]; break; case "has": return isset($this->data[$propertyName]); default: throw new BadMethodCallException("Undefined method $method"); } } public static function __callStatic($method, $arguments) { // يمكن استخدام هذا التابع عندما تحتاج شيء ما مثل مصنع عام أو شيء ما آخر print_r(func_get_args()); } } في الموضع (1) نفعل شيء ما مع المعلومات مثل زيادة التحميل أو شيء عام، فمثلًا لنفرض أننا نكتب صنفًا عامًا يحمل بعض البيانات ويسمح للمستخدم بأن يجلبها ويضبطها باستخدام التوابع الجالب والضابط، وكان لدينا الصنف CaseHelper يساعد على تحويل نمط سنام الجمل (camelCase) إلى نمط الثعبان (snake_case). هذا التابع مبسّط لذا لا يتحقق من صلاحية الاسم أو عدمها. مثال: $instance = new Foo(); $instance->setSomeState("foo"); var_dump($instance->hasSomeState()); // bool(true) var_dump($instance->getSomeState()); // string "foo" Foo::exampleStaticCall("test"); /* Array ( [0] => exampleCallStatic [1] => test ) */ get()__ و__set() و__isset() و__unset() كلما حاولت استعادة حقل معين من صنف كما في الشيفرة: $animal = new Animal(); $height = $animal->height; تستدعي PHP التابع السحري __get($name) ويكون $name هو "height" في حالتنا. كتابة حقل ما من الصنف كالتالي: $animal->height = 10; ستستدعي التابع السحري __set($name, $value), ويكون $name هو "height" و$value هو 10. لدينا في PHP أيضًا تابعين مدمجين هما isset() الذي يتحقق من وجود متغير، وunset() الذي يدمر متغير. إنّ الشيفرة التالية: isset($animal->height); ستستدعي الدالة __isset($name) على ذلك الكائن، كما أنّ إزالة تعيين متغير كما في الشيفرة: unset($animal->height); ستستدعي الدالة __unset($name) على ذلك الكائن. تستعيد PHP الحقل كما هو مخزن في الصنف عندما لاتعرّف هذه التوابع في صنفك، لكن يمكنك تجاوز هذه التوابع لإنشاء أصناف يمكنها أن تحمل بيانات مثل المصفوفة لكنها قابلة للاستخدام ككائن: class Example { private $data = []; public function __set($name, $value) { $this->data[$name] = $value; } public function __get($name) { if (!array_key_exists($name, $this->data)) { return null; } return $this->data[$name]; } public function __isset($name) { return isset($this->data[$name]); } public function __unset($name) { unset($this->data[$name]); } } $example = new Example(); // وقيمتها 15 $data في المصفوفة 'a' تخزين $example->a = 15; // $data من المصفوفة 'a' استعادة مفتاح المصفوفة echo $example->a; // 15 // null محاولة استعادة مفتاح غير موجود في المصفوفة تُعيد echo $example->b; // لا يطبع شيء if (isset($example->a)) { unset($example->a)); } الدالة empty() والتوابع السحرية لاحظ أنّ استدعاء الدالة empty() على خاصيّة صنف ستستدعي الدالة __isset($name) حسب ما ورد في توثيق PHP: empty() هي المكافئ المختصر للشيفرة: !isset($var) || $var == false __construct() و__destruct() __construct() هو التابع السحري الأشهر في PHP لأنّه يُستخدم لضبط صنف عند تهيئته، أما التابع العكسي له __destruct() فإنّه يُستدعى عندما لا يوجد مراجع متبقية للكائن الذي أنشأته أو عندما تفرض حذفه وعندها ستقوم مجموعة المهملات بتنظيف الكائن عن طريق استدعاء الهادم أولًا ثمّ حذفه من الذاكرة: class Shape { public function __construct() { echo "Shape created!\n"; } } class Rectangle extends Shape { public $width; public $height; public function __construct($width, $height) { parent::__construct(); $this->width = $width; $this->height = $height; echo "Created {$this->width}x{$this->height} Rectangle\n"; } public function __destruct() { echo "Destroying {$this->width}x{$this->height} Rectangle\n"; } } function createRectangle() { // (1) $rectangle = new Rectangle(20, 50); // (2) } createRectangle(); // (3) // (4) unset(new Rectangle(20, 50)); في الموضع (1) ستستدعي تهيئة الكائن الباني مع الوسطاء المحددين. في الموضع (2) سيُطبع 'Shape Created' ثم 'Created 20x50 Rectangle'. في الموضع (3) سيُطبع 'Destroying 20x50 Rectangle' لأنّ الكائن $rectangle هو كائن محلي بالنسبة للدالة createRectangle لذا عندما ينتهي نطاق الدالة سيُدمَّر الكائن ويُستدعى هادمه. في الموضع (4) سيُستدعى هادم الكائن عند استخدام الدالة unset. __toString() يُستدعى التابع __toString() عندما يُعامل الكائن على أنّه سلسلة نصية، ويعيد سلسلة نصية تمثّل الصنف: class User { public $first_name; public $last_name; public $age; public function __toString() { return "{$this->first_name} {$this->last_name} ($this->age)"; } } $user = new User(); $user->first_name = "Chuck"; $user->last_name = "Norris"; $user->age = 76; // في سياق سلسلة $user كلما اُستخدم الكائن __toString() سيُستدعى التابع echo $user; // Chuck Norris (76) // Selected user: Chuck Norris (76) :أصبحت قيمة السلسلة النصية $selected_user_string = sprintf("Selected user: %s", $user); // __toString() التحويل إلى سلسلة نصية يستدعي أيضًا $user_as_string = (string) $user; __clone() يُستدعَى التابع __clone باستخدام الكلمة المفتاحية clone، ويستخدم لمعالجة حالة كائن عند النسخ بعد أن يكون الكائن قد نُسخَ فعلًا. class CloneableUser { public $name; public $lastName; // "Copy " سيُستدعى هذا التابع بعامل النسخ ويضيف قبل خاصيّات الاسم والاسم الأخير الكلمة public function __clone() { $this->name = "Copy " . $this->name; $this->lastName = "Copy " . $this->lastName; } } مثال: $user1 = new CloneableUser(); $user1->name = "John"; $user1->lastName = "Doe"; // __clone تنفيذ التابع السحري $user2 = clone $user1; echo $user2->name; // Copy John echo $user2->lastName; // Copy Doe __invoke() يُستدعى هذا التابع السحري عندما يحاول المستخدم استدعاء كائن كدالة، قد تتضمن حالات الاستخدام الممكنة بعض الطرق مثل البرمجة الوظيفية أو بعض ردود النداء. سيُستدعى التابع في الشيفرة التالية إذا نُفِّذ الكائن كدالة: $invokable(); وستمرر الوسائط كما في استدعاء التابع العادي: class Invokable { public function __invoke($arg, $arg, ...) { print_r(func_get_args()); } } مثال: $invokable = new Invokable(); $invokable([1, 2, 3]); /* Array ( [0] => 1 [1] => 2 [2] => 3 ) */ __sleep() و__wakeup() يرتبط التابعان __sleep و__wakeup بعملية السَلسَلة، تتحقق الدالة serialize إذا كان للصنف تابع __sleep، إذا كان موجودًا سيُنفَّذ قبل أي سَلسَلة ويُفترض أن يعيد مصفوفة من أسماء كل المتغيرات للكائن الذي يجب أن يُسلسَل. وسيُنفَّذ التابع __wakeup بدوره من قبل الدالة unserialize إذا وُجد في الصنف، ويهدف إلى إعادة إنشاء الموارد والأشياء الأخرى التي نحتاج تهيئتها بعد إلغاء التسلسل. في الشيفرة التالية سيُنفَّذ التابع السحري __sleep من قِبل الدالة serialize ولاحظ أنّ $dbConnection مُستبعد، وسيُنفَّذ التابع السحري __wakeup من قِبل الدالة unserialize، لنفرض مثلًا أنّ $this->c الذي لم يُسَلسَل هو نوع من الاتصال بقاعدة البيانات سيُعيد الاتصال عندما نستخدم تابع الاستيقاظ. class Sleepy { public $tableName; public $tableFields; public $dbConnection; public function __sleep() { // فقط $this->tableNameو $this->tableFields سيُسَلسَل return ['tableName', 'tableFields']; } public function __wakeup() { // الاتصال بقاعدة البيانات الافتراضية وتخزين المُعالج/المُغلِّف فيها // $this->dbConnection $this->dbConnection = DB::connect(); } } __debugInfo() يُستدعى هذا التابع من قِبل الدالة var_dump() عند تفريغ كائن للحصول على الخاصيّات التي يجب عرضها، إذا لم يُعرَّف التابع على الكائن ستُعرَض كل الخاصيّات العامة والمحمية والخاصة. class DeepThought { public function __debugInfo() { return [42]; } } الإصدار PHP ≤ 5.6 var_dump(new DeepThought()); خرج الشيفرة السابقة: class DeepThought#1 (0) { } الإصدار PHP ≥ 5.6 var_dump(new DeepThought()); خرج الشيفرة السابقة: class DeepThought#1 (1) { public ${0} => int(42) } ترجمة -وبتصرف- للفصل [Magic Methods] من كتاب PHP Notes for Professionals book اقرأ أيضًا المقال التالي: معالجة الملفات والبيانات المرمزة بترميز UTF-8 في PHP المقال السابق: مدخل إلى الملحن composer: مدير الاعتماديات والحزم في PHP1 نقطة
-
كيف يُمكن إنشاء مُستخدمين و تقسيمهم حسب صلاحيات مُحددة، مثلاً إنشاء مُستخدمين لهم دور مدير و مستخدمين لهم دور مٌحاسب في النظام مع تحديد صلاحيات المُحاسب و مُستخدمين عاديين ... الخ1 نقطة
-
1 نقطة
-
تعد المصادقة المتعددة مهمة جدًا إذا كنت تعمل على تطبيق ويب كبير الحجم، فتمكنك من استخدام صلاحيات مختلفة تابعة لجداول مختلفة للمستخدمين مثل جدول "المستخدمين" لتسجيل مستخدم الموقع وجدول "المشرفين" للمستخدم المسؤول أو للدخول إلى لوحة التحكم على سبيل المثال. وبهذه الطريقة توفر أمانًا وقوةً حيث يمكنك الفصل بين المستخدمين وإعطاء صلاحيات وصول مختلفة لكل نوع. مثال عن تطبيقها: أولاً نقوم بإنشاء مصادقة في حال لم تكن موجودة كالتالي: php artisan make:auth نقوم بإنشاء مودل للمدراء كالتالي، ونقوم بملء الحقول اللازمة ضمنه: php artisan make:model Admin ثم نقوم بإنشاء المتحكم الخاص بالمدراء: php artisan make:controller AdminController class AdminController extends Controller { public function __construct() { $this->middleware('auth:admin'); } public function index() { return view('admin'); } } ونلاحظ هنا أنه تم استخدام middleware وهو admin، ولكن لمستخدمي الموقع يجب أن نستخدم مصادقة أخرى، حيث لا يجب على المستخدمين العاديين الدخول إلى لوحة التحكم للموقع، فنقوم أولاً بمعالجة عملية المصادقة وتسجيل الدخول للمدراء عن طريق إنشاء متحكّم خاص بذلك كالتالي: php artisan make:controller Auth/AdminLoginController أما للمستخدمين العاديين فسيتم التحقق والمصادقة بشكل منفصل كالتالي: public function showLoginForm() { return view('auth.login'); } وأخيراً لا ننسى تعديل ملف config/auth.php وإضافة الجزئية الخاصة بمصادقة المدراء كالتالي: //المصادقة الافتراضية 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], //مصادقة المدراء أو المشرفين التي قمنا بإنشائها 'admins' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ], // // 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], // // 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ], ], // وهنا يمكننا ملاحظة أنه تمكّنا من فصل كيان المستخدم المدير عن كيان المستخدم العادي، عن طريق استخدام جدولين مختلفين في قاعدة البيانات واستخدام guard مختلف وجلسات مختلفة لكل منهما. وبنفس الطريقة يمكن إضافة نوع جديد آخر ينتمى أيضاً لجدول آخر في قاعدة البيانات وله صلاحيات وصول مختلفة.1 نقطة
-
1 نقطة
-
الحذف الناعم أو soft delete هي نوع من أنواع حذف البيانات ولكن بدل من التخلص من البيانات بشكل تام يتم إخفائه والاحتفاظ بالبيانات في الجداول لديك. ويتم ذلك عن طريق إضافة عمود جديد في الجدول باسم deleted_at أو أي اسم تريده ولكن هذا هو المتعارف عليه, حيث يكون فارغاً أو null بالوضع الطبيعي ولكن عن تطبيق ال soft delete على أحد العناصر يتم إضافة تاريخ الحذف في deleted_at. ويمكن تفعيل هذه الميزة عن طريق إضافة Trate use SoftDeletes; بداخل ال Model المراد تطبيق هذه الخاصية عليها وكذلك بداخل الجدول أو migration الخاص بهذا ال Model نضيف $table->softDeletes(); حتى يضيف العمود deleted_at بنوع date على هذا الجدول. وهكذا تضاف الحذف الناعم لدينا. ويترتب على هذه الميزة أنه في حال كانت هنالك بيانات محذوفة بالطريقة الناعمة فلا يمكنك إستدعائها بالطريقة العادية مثلاً: Product::all(); فيجب أن تضيف عليها الدالة withTrashed كما يلي: Product::withTrashed() ->get(); هذا في حال كنت تريد تضمين البيانات الغير محذوفة مع البيانات المحذوفة حذفاً ناعماً, أما إذا كنت تريد فقط البيانات المحذوفة بشكل ناعم نستخدم: Product::onlyTrashed(); وفي حال كنت تريد إستعادة إحدى البيانات من كونها محذوفة بطريقة ناعمة نستخدم الدالة restore كالتالي: $product = Product::withTrashed()->where('id', 1)->restore(); وأي معلومات إضافية يمكننا مساعدتك بها ولكن يمكن التوجه أيضاً إلى التوثيق الرسمي للارافيل.1 نقطة
-
السلام عليكم ورحمة الله وبركاته تحيه طيبه للجميع يا اخوان انا احاول اعمل مشروعي من نوع فلاتر نسخة APK ولكن كل ما احاول اعمل BUILD تجيني المشكله التاليه : C:\src\flutter\bin\flutter.bat --no-color build apk You are building a fat APK that includes binaries for android-arm, android-arm64, android-x64. If you are deploying the app to the Play Store, it's recommended to use app bundles or split the APK to reduce the APK size. To generate an app bundle, run: flutter build appbundle --target-platform android-arm,android-arm64,android-x64 Learn more on: https://developer.android.com/guide/app-bundle To split the APKs per ABI, run: flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi Learn more on: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split Running Gradle task 'assembleRelease'... Plugin project :firebase_core_web not found. Please update settings.gradle. Note: C:\src\flutter\.pub-cache\hosted\pub.dartlang.org\cloud_firestore-0.12.11\android\src\main\java\io\flutter\plugins\firebase\cloudfirestore\CloudFirestorePlugin.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: C:\src\flutter\.pub-cache\hosted\pub.dartlang.org\cloud_firestore-0.12.11\android\src\main\java\io\flutter\plugins\firebase\cloudfirestore\CloudFirestorePlugin.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. Removed unused resources: Binary resource data reduced from 235KB to 212KB: Removed 9% FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':path_provider:verifyReleaseResources'. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade > Android resource linking failed C:\Users\*****\.gradle\caches\transforms-2\files-2.1\733257008ca62c5b6ddfd0e885c42d88\core-1.1.0\res\values\values.xml:142:5-173:25: AAPT: error: resource android:attr/fontVariationSettings not found. C:\Users\*****\.gradle\caches\transforms-2\files-2.1\733257008ca62c5b6ddfd0e885c42d88\core-1.1.0\res\values\values.xml:142:5-173:25: AAPT: error: resource android:attr/ttcIndex not found. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 1m 19s Running Gradle task 'assembleRelease'... 80.8s The built failed likely due to AndroidX incompatibilities in a plugin. The tool is about to try using Jetfier to solve the incompatibility. Building plugin cloud_firestore... Running Gradle task 'assembleAarRelease'... The plugin cloud_firestore could not be built due to the issue above. Process finished with exit code 1 في احد يعرف سبب المشكله هذا او كيف يمكن حلها؟1 نقطة
-
1 نقطة
-
انا اود تكرار نفس الاستعلام في نفس ال controller بهذا الشكل فهل هو صحيح public function index(){ $blog_list = Blog::all(); return view('front.blog', compact('blog_list')); return view('back.blog.index', compact('blog_list')); } هل الكود صحيح1 نقطة
-
يمكن تكرار الاستعلام مرة داخل controller الخاص ب admin panel و مرة في الcontroller الخاص بالموقع. يجوز تكرار نفس الاستعلام داخل أي controller تريدين.1 نقطة
-
أخي يبدو أن هناك أجزاء من gradle لم يتم تحميلها بشكل صحيح. لذلك هناك عدة حلول وهي يمكن استدعاء هذه الحزمة مرة أخرى cloud_firestore و العمل على تثبيتها في مشروعك بشكل صحيح ممكن تقرأ أكثر عنها هنا , ومن ثم تشغيل الأمر flutter clean , و من ثم الأمر flutter run, ومن ثم الأمر flutter build apk. ممكن أن تقوم بصنع مشروع جديد و من ثم نقل الملفات إليه و المحاولة مرة أخرى. ومن ثم تشغيل الأمر flutter build apk. التأكد من الحزم التي تم استخدامها في المشروع و التأكد من أنها ثبتت بشكل صحيح و هناك بعض الحزم مثل cloud_firestore تحتاج إلى إضافة بعض الأوامر إلى الملفات. تشغيل الأمر flutter doctor وفحص النتيجة و العمل على حل جميع المشاكل.1 نقطة
-
هل موجود في ملف gradle.properties هذه الأوامر org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true android.enableR8=true ممكن لقطة شاشة من ملف gradle.properties؟1 نقطة
-
تحدث هذه المشكلة بسبب إرفاقك للـcontext الذي قام بإنشاء الـscaffold بدلاً من إرفاق context ضمن الـscaffold. يمكن حل المشكلة من خلال إحدى الطرق التالية: الطريقة الأولى: إضافة Builder بحيث يعطينا context ضمن الـscaffold ومن ثم نقوم بإرفاقه للـ scaffold.of: body: Builder( Builder: (context){ //نضع هنا كل العناصر المراد عرضها لتأخذ الـ //context //الخاص بالـ //scaffold } ); إليك الكود الكامل بعد التعديل: import 'package:flutter/material.dart'; void main() => runApp(MyHomePage()); class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'test', theme: ThemeData( primarySwatch: Colors.cyan, ), home: Page1(), ); } } class Page1 extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('page1'), ), body:Builder( builder: (context) => Center( //*** child: RaisedButton( color: Colors.cyan, textColor: Colors.white, onPressed: (){ Scaffold.of(context).showSnackBar(SnackBar(content: Text('Hey there'))); }, child: Text('show snackbar'), ), ) ), ); } } الطريقة الثانية: حفظ الـscaffold في GlobalKey الذي سيلزمنا في إظهار الـsnackbar. class Page1 extends StatelessWidget { final GlobalKey<ScaffoldState> _myScaffold = new GlobalKey(); //… } بعد تعريف GlobalKey نقوم بتعيينه في خصائص الـScaffold: Scaffold( key: _myScaffold, //... ); الآن يمكننا إظهار الـsnackbar بدون الحاجة للـcontext من خلال الـGlobalKey: _myScaffold.currentState.showSnackBar(SnackBar(content:Text('Hey there'),)); مرفق الكود الكامل بعد التعديل: import 'package:flutter/material.dart'; void main() => runApp(MyHomePage()); class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'test', theme: ThemeData( primarySwatch: Colors.cyan, ), home: Page1(), ); } } class Page1 extends StatelessWidget { final GlobalKey<ScaffoldState> _myScaffold = new GlobalKey(); @override Widget build(BuildContext context) { return Scaffold( key: _myScaffold, appBar: AppBar( title: Text('page1'), ), body:Center( child: RaisedButton( color: Colors.cyan, textColor: Colors.white, onPressed: (){ _myScaffold.currentState.showSnackBar(SnackBar(content:Text('Hey there'),)); }, child: Text('show snackbar'), ), ), ); } }1 نقطة
-
يمكنك صنع مجلد جديد داخل المسار التالي app\Http\Controllers وليكن Admin و من ثم في هذا المجلد نخزن أي controller خاص بالادمن أو عن طريق الأمر التالي نستطيع تخزين الcontroller في أي مجلد نريده php artisan make:controller Admin\PostsController --resource لو لاحظتي جيدا أننا قمنا بتوجيه تخزين الcontroller إلى المجلد Admin كما في الأمر إعلاه. طبعا لوحة التحكم ستكون مختلفة التصميم و الأوامر عن تصميم الموقع فينصح بفصل controllers الخاصة بالموقع عن لوحة التحكم , أيضا نادراُ ما يتم استخدام نفس الcontroller لكل من اللوحة أو الموقع. و أيضا يمكن في ملف web.php الخاص ب routes تمييز لكل من اللوحة و الموقع عن طريق Route::group ففي المثال التي حددنا مسارات لوحة التحكم داخل Route::group Route::group(['prefix' => 'admin', 'as' => 'admin.'], function () { Route::get('/login', 'Admin\Auth\LoginController@showLoginForm')->name('adminlogin'); Route::post('/login', 'Admin\Auth\LoginController@login')->name('adminloginsubmit'); Route::get('/logout', 'Admin\Auth\LoginController@logout')->name('adminlogout'); Route::post('/logout', 'Admin\Auth\LoginController@logout')->name('adminlogout'); }); كلما كانت طريقة تنظيم المشروع ممتازة وجيدة فيسهل مستقبلا التطوير على المشروع و أيضا هذا قد يساعدكي في مشروعات أخرى من الأستفادة من العناصر المشتركة في مشاريع مستقبلية.1 نقطة
-
اي ملف معين في المشروع تريد مراجعته ؟ وسوف ارسله اليك1 نقطة
-
1 نقطة
-
صحيح , لاحظت هو عدم وجود متغير about وهو مسبب المشكلة ممكن ترفقي اول جزء من الملف هنا أو التأكد من متغير about في ملف FrontController.php1 نقطة
-
1 نقطة
-
ممكن يكون عدة أسباب لذلك, قد تكون مش مفعل multiDexEnabled true defaultConfig { multiDexEnabled true } في المسار التالي أو ناسي وضعها android > app > build.gradle, ومن ثم في defaultConfig بدك ترقي gradle في ملف android/build.gradle classpath 'com.android.tools.build:gradle:3.3.1' طبعا مع تغيير 3.3.1 إلى أخر أصدار gradle, ومن ثم في المسار التالي android/app/gradle.properties ستضع التالي android.useAndroidX=true android.enableJetifier=true و من ثم تشغيل الأمر التالي flutter clean1 نقطة
-
عليك فتح المشروع باستخدام أندرويد استديو (في حال لا تستخدمه أقترح تحميله لهذه الجزئية التالية)، حيث سيقوم بالبحث عن تحديثات للتضمينات من Gradle وغيرها، عليك فقط تصفح الملفات في مشروع أندرويد وهو سيقوم على اقتراح التحديثات. تحميل أحدث إصدار من Flutter و أحدث android sdk ووضع الإصدارالخاص به في المشروع، حل الخطأ الأول لديك هو جعل compileSdkVersion 28 و compileSdkVersion ..مثلا. لكن قم باستخدام الأحدث. يمكنك بناء مشروع فلاتر جديد بعد التعديلات السابقة، ثم تضمين ملفات إعدادت البيئة منه والتي ستكون في جزء مشروع أندرويد بالشكل التالي في settings.gradle: ربما يوجد سطر ناقص لديك. include ':app' def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() def plugins = new Properties() def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') if (pluginsFile.exists()) { pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } } plugins.each { name, path -> def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() include ":$name" project(":$name").projectDir = pluginDirectory } في ملف gradle.properties أضف: android.useAndroidX=true android.enableJetifier=true أعتقد أن أغلب المشاكل بسبب تضارب إصدار المكتبات (مكتبات فلاتر حديثة أما أندرويد قديمة) فاعمل التعديل على نسخة منفصلة من المشروع في حال حدوث مشاكل غير الحالية (للحفاظ على نسخة من المشروع)1 نقطة
-
حسب سياسية الإستخدام الخاصة بموقع Pinterest فإنه لا يمتلك الصور التي يتم نشرها من قبل المستخدمين بل هي لمالك/ناشر الصور فقط. لإستخدام الصور في أي أغراض أُخرى يجب أخذ إذن مسبق من مالك حقوق النشر للصورة حيث يمكن أن يكون المستخدم الذي قام نشرها. في النهاية يمكنك نشر ما تريد إلا في حال تقدم أحد ما بطلب حذف الصورة الخاصة بك مع إثبات ملكيته لحقوق النشر الخاصة بالصورة.1 نقطة
-
حاول إنشاء تطبيقك لمنصة واحدة محددة فقط. Fat APK يعني أن تطبيقك يتم إنشاؤه للعديد من الأنظمة الأساسية. جرب بناؤه مرة واحدة ولكن لمنصة محددة فقط وكما يقترح عليك ضمن رسالة الخطأ يمكنك تجربة إحدى الأوامر: flutter build appbundle --target-platform android-arm,android-arm64,android-x64 حيث تقوم بتحديد المنصة التي تريد البناء عليها. مثلاً android-x64 يمكنك أيضاً أن تقوم ببناء التطبيق مباشرةً من Android Studio أو Xcode وبذلك سيتم بناؤه لمنصة واحدة. وأيضاً لاحظت وجود خطأ آخر وهو: Plugin project :firebase_core_web not found. Please update settings.gradle. ولمعالجة هذه المشكلة يجب أن تقوم بتحديث ملف android/app/build.gradle كالتالي: من: android { // ... defaultConfig { // ... minSdkVersion 16 } } إلى: android { // ... defaultConfig { // ... minSdkVersion 23 } } لأنه عند استخدام flutter يجب أن تكون قيمة minSdkVersion 231 نقطة