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

admin panel in laravel

Hafsa Aly

السؤال

السلام عليكم

عند بدء عمل admin panel للمشروع اين انشئ الcontrollers  الخاصه بال routes مع العلم انني اعمل على اصدار laravel7

هل انشئ لها controller جديده غير الcontroller  الخاصه بجزء الfront  في مجلد controller

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

نعم من الأفضل فصل المتحكمات controllers تبعاً للوظائف التي تقوم بها، لأن جمع عدّة وظائف أو وجود توابع كثيرة ضمن متحكم controller واحد سيجعل من الصعب على المبرمج العودة إلى الكود وصيانته أو تحسينه أو ملاحقة الأخطاء فيما بعد.
لذلك يفضّل دوماً فصل المتحكمات عن بعضها. بحيث يتم تجميع الخصائص التي ترتبط بكيان واحد في المتحكّم المستقل لها. وذلك يتيح لك أيضاً أريحية في إضافة الوسائط middlewares بشكل منفصل بدلاً من دمجها في متحكّم واحد.
أيضاً، وكلما زادت عملية التفصيل هذه زادت سرعة تحديد الخطأ وصيانة الكود مما يتيح لك في حال حدوث خطأ معيّن يمكنك بسهولة التوجه إلى المتحكّم المسؤول عن هذه الوظيفة ومعالجتها ، لذلك ينصح أيضاً بفصل حتى (العمليات) على عدة متحكمات، على سبيل المثال (متحكم خاص بعملية تسجيل الدخول والتحقق ونسميه: AuthenticationController،... وهكذا).

حيث أن النمط المتّبع لفصل المتحكّمات الخاصة بالمدراء admins عن مستخدمي الموقع يمكن أن يكون على الشكل التالي:

app
    http
        controllers
            Admin  //نضع ضمن هذا المجلد جميع المتحكمات الخاصة بلوحة التحكم
                AuthenticationController
		AnotherController
		.....
            MainController // باقي المتحكمات التابعة للموقع
		...


ولكن في النهاية، أي نمط متّبع سيعمل بالتأكيد ولن يسبب أخطاء، ولكن هذه النصائح فقط لجعل الكود مرن وقابل للقراءة أكثر.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك صنع مجلد جديد داخل المسار التالي 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');
});

كلما كانت طريقة تنظيم المشروع ممتازة وجيدة فيسهل مستقبلا التطوير على المشروع و أيضا هذا قد يساعدكي في مشروعات أخرى من الأستفادة من العناصر المشتركة في مشاريع مستقبلية.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يتم فصل المتحكمات حسب عملها بوضعها في مجلدات فرعية ضمن المجلد controller.

المتحكمات الخاصة بالعرض تكون ضمن مجلد مثلا view، المتحكمات الخاصة بلوحة التحكم تكون ضمن مجلد وليكن  admin.

وطبعا كل متحكم يكون مسؤول عن أمر محدد ووظائف ترتبط بنفس الغرض الوظيفي/العرض/النموذج.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ منذ ساعة مضت قال بلال زيادة:

يمكنك صنع مجلد جديد داخل المسار التالي 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');
});

كلما كانت طريقة تنظيم المشروع ممتازة وجيدة فيسهل مستقبلا التطوير على المشروع و أيضا هذا قد يساعدكي في مشروعات أخرى من الأستفادة من العناصر المشتركة في مشاريع مستقبلية.

public function show($id){
        $blog_item = Blog::find($id);
        return view('front.blog-post','back.blog.edit',compact('blog_item'));
    }
في حال اذا اردت  عرض هذه البانات على 
اولا view  خاصه بال backend
وثانيا  ايضا نفس البيانات اود عرضها على front view
فكيف اكتبها

 

public function show($id){
        $blog_item = Blog::find($id);
        return view('front.blog-post','back.blog.edit',compact('blog_item'));
    }
في حال اذا اردت  عرض هذه البانات على 
اولا view  خاصه بال backend
وثانيا  ايضا نفس البيانات اود عرضها على front view
فكيف اكتبها

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 23 دقائق مضت قال Hafsa Aly:

public function show($id){ $blog_item = Blog::find($id); return view('front.blog-post','back.blog.edit',compact('blog_item')); } في حال اذا اردت عرض هذه البانات على اولا view خاصه بال backend وثانيا ايضا نفس البيانات اود عرضها على front view فكيف اكتبها

أرجو كتابة السؤال خارج محرر الأكواد لأنه غير مفهوم، مع التوضيح من فضلك

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 42 دقائق مضت قال Wael Aljamal:

أرجو كتابة السؤال خارج محرر الأكواد لأنه غير مفهوم، مع التوضيح من فضلك

انا لدي تابع داخل داخل controller سيقوم بارجاع نفس البيانات  وهذه البيانات اود عرضها مرة  البيانات داخل view خاصه بالموقع مرة  ومرة اخرى اود عرضها في view خاصه بجزء الadmin panel   

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 20 دقائق مضت قال Hafsa Aly:

انا لدي تابع داخل داخل controller سيقوم بارجاع نفس البيانات  وهذه البيانات اود عرضها مرة  البيانات داخل view خاصه بالموقع مرة  ومرة اخرى اود عرضها في view خاصه بجزء الadmin panel   

يمكن تكرار الاستعلام مرة داخل controller الخاص ب admin panel و مرة في الcontroller الخاص بالموقع. يجوز تكرار نفس الاستعلام داخل أي controller تريدين.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ الآن قال بلال زيادة:

يمكن تكرار الاستعلام مرة داخل controller الخاص ب admin panel و مرة في الcontroller الخاص بالموقع. يجوز تكرار نفس الاستعلام داخل أي controller تريدين.

انا اود تكرار نفس الاستعلام في نفس ال controller بهذا الشكل فهل هو صحيح

public function index(){
        $blog_list = Blog::all();
        return view('front.blog', compact('blog_list'));
        return view('back.blog.index', compact('blog_list'));

    }

 

بتاريخ 18 دقائق مضت قال Hafsa Aly:

انا اود تكرار نفس الاستعلام في نفس ال controller بهذا الشكل فهل هو صحيح


public function index(){
        $blog_list = Blog::all();
        return view('front.blog', compact('blog_list'));
        return view('back.blog.index', compact('blog_list'));

    }

 

هل الكود صحيح

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يبدو أن الأمور مُختلطة عليك قليلاً، في المُتحكم كل تابع يُؤدي مهمة مُعينة مثلاً إن قمنا بإنشاء مُتحكم 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

بالتوفيق.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 ساعات قال Hafsa Aly:

انا اود تكرار نفس الاستعلام

المتحكمات التي تريدين تطبيقها نفسها في أكثر من جزء من المشروع، يمكنك وضعها في مجلد منفصل مثلا sharedControllers ضمن مجلد controllers

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...