این وب سایت با تمامی محتویات و دامین به فروش می رسد. لطفا جهت خریداری از طریق بخش ارتباط با ما در تماس باشید

جستجو ...


چگونه در لاراول یک پروژه ایجاد کنیم؟
هدف ما این است که شما، در بالاترین سطح برنامه نویسی و توسعه وب باشید.

ثبت نام کنید

ایجاد یک پروژه لاراول با استفاده از معماری سه لایه MVC کار چندان سختی نیست. با لیداوب همراه باشید تا با هم یک پروژه MVC لاراول را گام به گام پیش ببریم.


فریم ورک لاراول بر پایه معماری MVC طراحی شده و برای ساخت پروژه در لارول view ،controller و model سه بخش پروژه در این معماری خواهند بود. استفاده از این سه بخش، کار با این فریم ورک را برای طراحی وب راحت‌تر می‌کند. در این مقاله با استفاده از معماری سه لایه (MVC) یک پروژه لاراول ایجاد می‌کنیم و کارهایی از قبیل ایجاد گروه‌های کاربری، مدیریت کاربران، ایجاد پست‌ها توسط کاربران، مدیریت پست‌های کاربران و همچنین انتشار آن‌ها را بررسی می‌کنیم.

مراحل ساخت یک پروژه لاراول

در ابتدای کار، با دستور زیر یک اپلیکیشن لاراول ایجاد می‌کنیم:

laravel new blog

اگر laravel installer ندارید، بهترین راه برای نصب لاراول، استفاده از composer است. در صورتی که این برنامه را روی سیستم خود ندارید، حتما پیش از شروع کار Composer را برای لاراول دانلود و آن را روی سیستم خود نصب کنید. پس از آن، با دستور زیر یک پروژه لاراول ایجاد می‌کنیم:

composer create-project --prefer-dist laravel/laravel blog

تنظیمات پایه مربوط به پایگاه داده در پروژه لاراول

ابتدا فایل env. را باز کرده و تنطیمات آن را به صورت زیر تغییر می‌دهیم. با اعمال این تغییرات، لاراول اجازه دسترسی به پایگاه داده‌ای که ایجاد شده را خواهد داشت:

...
APP_URL=http://localhost:8000
...
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dbname
DB_USERNAME=dbuser
DB_PASSWORD=yoursecretdbuserpassword
...

 ایجاد مدل و جداول پایگاه داده در پروژه لاراول

لاراول بر پایه MVC پیاده‌سازی شده است، پس برای کار با پایگاه داده باید مدل‌های متناظر با جداول پایگاه داده را ایجاد کنیم. در اینجا یک مدل به نام post ایجاد می‌کنیم. با استفاده از آرگومان‌های c- و m- می‌توانیم یک migration و یک controller برای پست‌ها ایجاد کنیم:

php artisan make:model Post -m -c

فایل post migration را باز می‌کنیم و فیلد‌های جدول post را وارد می‌کنیم و جدول post را می‌سازیم:

Schema::create('posts', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->string('slug')->unique();
    $table->text('body');
    $table->boolean('published')->default(false);
    $table->unsignedInteger('user_id');
    $table->timestamps();

    $table->foreign('user_id')->references('id')->on('users');
});

حالا باید چند جدول دیگر مثل roles و user_roles اضافه کنیم. مجوزها را با دستور کدهای زیر داخل جدول roles در پروژه لاراول خود قرار می‌دهیم:

php artisan make:model Role -m

 

Schema::create('roles', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('slug')->unique();
    $table->jsonb('permissions')->default('{}'); // jsonb deletes duplicates
    $table->timestamps();
});

و در آخر، جدول role_users را ایجاد می‌کنیم:

php artisan make:migration create_role_users_table

 

Schema::create('role_users', function (Blueprint $table) {
    $table->unsignedInteger('user_id');
    $table->unsignedInteger('role_id');
    $table->timestamps();

    $table->unique(['user_id','role_id']);
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
});

مقدار دادن به جدول role در بخش seed در پایگاه داده

در بخش seed پایگاه‌داده، باید کارهایی که هر role می‌تواند انجام دهد، را برای role‌ها مشخص نماییم. کلاس rolesseeder را به صورت زیر ایجاد می‌کنیم:

php artisan make:seeder RolesSeeder

 

use Illuminate\Database\Seeder;
use App\Role;

class RolesSeeder extends Seeder
{
public function run()
{
        $author = Role::create([
            'name' => 'Author', 
            'slug' => 'author',
            'permissions' => [
                'create-post' => true,
            ]
        ]);
        $editor = Role::create([
            'name' => 'Editor', 
            'slug' => 'editor',
            'permissions' => [
                'update-post' => true,
                'publish-post' => true,
            ]
        ]);
    }
}

فراموش نکنید که RolesSeeder را از DatabaseSeeder با دستور زیر فراخوانی کنید:

$this->call(\RolesSeeder::class);

 ایجاد مدل های user و role برای مدیریت کاربران در پروژه لاراول

 اکنون اگر دستور seed را اجرا کنیم، fail می‌شود، چون هنوز مدل‌ها ست نشده است. فیلدهای قابل پر‌شدن را به مدل app/role اضافه می‌کنیم و برای مدل مشخص می‌کنیم که فیلد permissions یک فیلد از نوع json است.

همچنین باید بین مدل‌های app/Role و app/User ارتباط برقرار کنیم.

class Role extends Model
{
    protected $fillable = [
        'name', 'slug', 'permissions',
    ];
    protected $casts = [
        'permissions' => 'array',
    ];

    public function users()
    {
        return $this->belongsToMany(User::class, 'role_users');
    }

    public function hasAccess(array $permissions) : bool
    {
        foreach ($permissions as $permission) {
            if ($this->hasPermission($permission))
                return true;
        }
        return false;
    }

    private function hasPermission(string $permission) : bool
    {
        return $this->permissions[$permission] ?? false;
    }
}

 

class User extends Authenticatable
{
    use Notifiable;

    protected $fillable = [
        'name', 'email', 'password',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    public function roles()
    {
        return $this->belongsToMany(Role::class, 'role_users');
    }

    /**
     * Checks if User has access to $permissions.
     */
    public function hasAccess(array $permissions) : bool
    {
        // check if the permission is available in any role
        foreach ($this->roles as $role) {
            if($role->hasAccess($permissions)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Checks if the user belongs to role.
     */
    public function inRole(string $roleSlug)
    {
        return $this->roles()->where('slug', $roleSlug)->count() == 1;
    }
}

حالا با خیال راحت با دستور زیرمی‌توانیم، پایگاه داده را migrate و seed کنیم.

php artisan migrate --seed

اهراز هویت در لاراول

پس از ایجاد پایگاه داده یک راه سریع جهت ایجاد مسیرها، view‌ها و سیستم احراز هویت با دستور زیر ایجاد می‌کنیم:

php artisan make:auth

البته پس از ثبت‌نام یا registration و اضافه کردن role کاربری، این دستور کنترلرها، view‌ها و مسیر‌ها را در اختیار ما قرار می‌دهد.

ثبت نام یا registration کاربر در پروژه لاراول

در ابتدا دسترسی roleها را به ویو register ایجاد می‌کنیم.

برای این کار در قسمت Controllers/Auth/RegisterController.php تابع showRegistrationForm را به‌ صورت زیر می‌نویسیم:

Use App/Role;

...

public function showRegistrationForm()
{
    $roles = Role::orderBy('name')->pluck('name', 'id');
    return view('auth.register', compact('roles'));
}
...

<div class="form-group{{ $errors->has('role') ? ' has-error' : '' }}">
    <label for="role" class="col-md-4 control-label">User role</label>

    <div class="col-md-6">
        <select id="role" class="form-control" name="role" required>
        @foreach($roles as $id => $role)
            <option value="{{$id}}">{{$role}}</option>
        @endforeach
        </select>

        @if ($errors->has('role'))
            <span class="help-block">
                <strong>{{ $errors->first('role') }}</strong>
            </span>
        @endif
    </div>
</div>

...

پس از آن resources/views/auth/register.blade.php را ویرایش می‌کنیم و داده‌های ورودی را اضافه می‌کنیم.

فراموش نکنید که فیلد جدید اضافه شده را validate کنیم. این‌ کار را با تابع validator در RegisterController انجام می‌دهیم.
...

protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => 'required|max:255',
        'email' => 'required|email|max:255|unique:users',
        'password' => 'required|min:6|confirmed',
        'role' => 'required|exists:roles,id', // validating role
    ]);
}

...

پس از آن باید role را به کاربر ثبت‌نام شده اختصاص بدهیم، برای این کار تابع create را به صورت زیر می‌نویسیم:

...

protected function create(array $data)
{
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
    ]);
    $user->roles()->attach($data['role']);
    return $user;
}

...

پس از آن لینک تغییر مسیر را در کنترلرهای RegisterController و LoginController  قرار می‌دهیم.

...

protected $redirectTo = '/';

...

اجرای برنامه 

پس از اجرای سرور با دستور php artisan serve، می‌توانیم در مرورگر یک کاربر ایجاد کنیم و یک role به آن اختصاص بدهیم. به register/ سر می‌زنیم و کاربر جدید را ایجاد می‌کنیم.

تعریف خط‌مشی‌ها (policies) در پروژه لاراول

در این قسمت، ما خط‌مشی‌های دسترسی را برای حفاظت از اقداماتی که انجام دادیم، تعریف می‌کنیم.

این کار را با تغییر app/Providers/AuthServiceProvider.php انجام می‌دهیم تا تمام خط‌مشی‌ها یا policyهای برنامه را شامل شود.

use App\Post;

...

public function boot()
{
    $this->registerPolicies();
    $this->registerPostPolicies();
}

public function registerPostPolicies()
{
    Gate::define('create-post', function ($user) {
        return $user->hasAccess(['create-post']);
    });
    Gate::define('update-post', function ($user, Post $post) {
        return $user->hasAccess(['update-post']) or $user->id == $post->user_id;
    });
    Gate::define('publish-post', function ($user) {
        return $user->hasAccess(['publish-post']);
    });
    Gate::define('see-all-drafts', function ($user) {
        return $user->inRole('editor');
    });
}

مسیرها (Routes) 

پس از آن مسیرهای برنامه را تعریف می‌کنیم. تمام مسیرهای برنامه را در routes/web.php مشخص می‌کنیم:

Auth::routes();

Route::get('/', '[email protected]');
Route::get('/posts', '[email protected]')->name('list_posts');
Route::group(['prefix' => 'posts'], function () {
    Route::get('/drafts', '[email protected]')
        ->name('list_drafts')
        ->middleware('auth');
    Route::get('/show/{id}', '[email protected]')
        ->name('show_post');
    Route::get('/create', '[email protected]')
        ->name('create_post')
        ->middleware('can:create-post');
    Route::post('/create', '[email protected]')
        ->name('store_post')
        ->middleware('can:create-post');
    Route::get('/edit/{post}', '[email protected]')
        ->name('edit_post')
        ->middleware('can:update-post,post');
    Route::post('/edit/{post}', '[email protected]')
        ->name('update_post')
        ->middleware('can:update-post,post');
    // using get to simplify
    Route::get('/publish/{post}', '[email protected]')
        ->name('publish_post')
        ->middleware('can:publish-post');
});

مدیریت پست در لاراول

در اینجا پست‌های ایجاد شده توسط کاربران، و اعمالی که باید برای مدیریت آن‌ها انجام داد را توضیح می‌دهیم.

Post model

در این لایه ابتدا فیلدها را تعریف می‌کنیم و پس از آن روابط بین آن‌ها را مشخص می‌کنیم.

...

class Post extends Model
{
    protected $fillable = [
        'title', 'slug', 'body', 'user_id',
    ];

    public function owner()
    {
        return $this->belongsTo(User::class);
    }

    public function scopePublished($query)
    {
        return $query->where('published', true);
    }

    public function scopeUnpublished($query)
    {
        return $query->where('published', false);
    }
}

Posts Controller

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

برای مشخص کردن لیست پست‌های منتشر شده درون PostController.php ، تابع ()index را اضافه می‌کنیم:

use App\Post;

...

public function index()
{
    $posts = Post::published()->paginate();
    return view('posts.index', compact('posts'));
}

...

سپس resources/views/home.blade.php را ویرایش می‌کنیم و نام آن را به resources/views/posts/index.blade.php تغییر می‌دهیم.

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">
                    Posts
                    @can('create-post')
                    <a class="pull-right btn btn-sm btn-primary" href="{{ route('create_post') }}">New</a>
                    @endcan
                </div>

                <div class="panel-body">
                    <div class="row">
                    @foreach($posts as $post)
                        <div class="col-sm-6 col-md-4">
                            <div class="thumbnail">
                            <div class="caption">
                                <h3><a href="{{ route('edit_post', ['id' => $post->id]) }}">{{ $post->title }}</a></h3>
                                <p>{{ str_limit($post->body, 50) }}</p>
                                @can('update-post', $post)
                                <p>
                                    <a href="{{ route('edit_post', ['id' => $post->id]) }}" class="btn btn-sm btn-default" role="button">Edit</a> 
                                </p>
                                @endcan
                            </div>
                            </div>
                        </div>
                    @endforeach
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

اگر به عنوان کاربر مهمان وارد صفحه posts شویم، دکمه جدید را نمی‌بینیم، تنها کسانی می‌توانند آن را مشاهده کنند که مجوز دسترسی به آن را داشته باشند.

ایجاد پست ها در لاراول

برای ایجاد صفحه پست در لاراول، باید تابع زیر را به PostController اضافه کنیم:

...

public function create()
{
    return view('posts.create');
}

...

حال در فایل یک فایل view ایجاد می‌کنیم و نام آن را posts\create.blade.php قرار می‌دهیم و کارهای زیر را در آن انجام می‌دهیم:

use App\Http\Requests\StorePost as StorePostRequest;
use Auth;

...

public function store(StorePostRequest $request)
{
    $data = $request->only('title', 'body');
    $data['slug'] = str_slug($data['title']);
    $data['user_id'] = Auth::user()->id;
    $post = Post::create($data);
    return redirect()->route('edit_post', ['id' => $post->id]);
}

...

ذخیره پست

پس از آن تابع ذخیره‌سازی را ایجاد می‌کنیم:

use App\Http\Requests\StorePost as StorePostRequest;
use Auth;

...

public function store(StorePostRequest $request)
{
    $data = $request->only('title', 'body');
    $data['slug'] = str_slug($data['title']);
    $data['user_id'] = Auth::user()->id;
    $post = Post::create($data);
    return redirect()->route('edit_post', ['id' => $post->id]);
}

...

باید یک تابع StorePost ایجاد کنیم و داده‌ها را قبل از ذخیره‌سازی postها، اعتبار‌سنجی کنیم. این کار خیلی ساده است، دستور artisan زیر را برای انجام این کار اجرا می‌کنیم :

php artisan make:request StorePost

 app/Http/Requests/StorePost.php را ویرایش کرده و اعتبار‌سنجی را در تابع rules انجام می‌دهیم.

تابع authorize همواره باید یک مقدار true برگرداند، زیرا از Gatemiddlewares برای ایجاد مجوز دسترسی واقعی استفاده می‌کنیم:

public function authorize()
{
    return true; // gate will be responsible for access
}

public function rules()
{
    return [
        'title' => 'required|unique:posts',
        'body' => 'required',
    ];

   پیش نویس یا Drafts در لاراول

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

برای نمایش پیش‌نویس‌ها در پروژه لاراول ، تابع drafts را به PostController اضافه می‌کنیم:

use Gate;

...

public function drafts()
{
    $postsQuery = Post::unpublished();
    if(Gate::denies('see-all-drafts')) {
        $postsQuery = $postsQuery->where('user_id', Auth::user()->id);
    }
    $posts = $postsQuery->paginate();
    return view('posts.drafts', compact('posts'));
}

...

پس از آن ویو posts/drafts.blade.php را ایجاد می‌کنیم:

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">
                    Drafts <a class="btn btn-sm btn-default pull-right" href="{{ route('list_posts') }}">Return</a>
                </div>

                <div class="panel-body">
                    <div class="row">
                    @foreach($posts as $post)
                        <div class="col-sm-6 col-md-4">
                            <div class="thumbnail">
                            <div class="caption">
                                <h3><a href="{{ route('show_post', ['id' => $post->id]) }}">{{ $post->title }}</a></h3>
                                <p>{{ str_limit($post->body, 50) }}</p>
                                <p>
                                @can('publish-post')
                                    <a href="{{ route('publish_post', ['id' => $post->id]) }}" class="btn btn-sm btn-default" role="button">Publish</a> 
                                @endcan
                                    <a href="{{ route('edit_post', ['id' => $post->id]) }}" class="btn btn-default" role="button">Edit</a> 
                                </p>
                            </div>
                            </div>
                        </div>
                    @endforeach
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

باید یک لینک برای دسترسی به صفحه پیش‌نویس‌ها ایجاد کنیم. برای این کار در layouts/app.blade.php منوی کشویی را تغییر می‌دهیم و یک لینک به صفحه پیش‌نویس‌ها اضافه می‌کنیم.

...

<ul class="dropdown-menu" role="menu">
    <li>
        <a href="{{ route('list_drafts') }}">Drafts</a>

...

ویرایش پست‌ها

کارهای زیر را در PostController انجام می‌دهیم، تا امکان ویرایش پست‌ها و پیش‌نویس‌ها را فراهم کنیم.

use App\Http\Requests\UpdaPost as UpdatePostRequest;

...

public function edit(Post $post)
{
    return view('posts.edit', compact('post'));
}

public function update(Post $post, UpdatePostRequest $request)
{
    $data = $request->only('title', 'body');
    $data['slug'] = str_slug($data['title']);
    $post->fill($data)->save();
    return back();
}

همچنین باید FormRequest.جدید اضافه کنیم، ما باید عنوان پست را یک عنوان منحصر‌بفرد در نظر بگیریم، و اجازه ویرایش عنوان را بدهیم. ما از Rule در لاراول برای این کار استفاده می‌کنیم.

توجه داشته باشید که مدل post از شی Request قابل دسترسی خواهد بود، زیرا id را از route به مدل post لینک داده‌ایم.

php artisan make:request UpdatePost

 

use Illuminate\Validation\Rule;

...

public function authorize()
{
    return true;
}

public function rules()
{
    $id = $this->route('post')->id;
    return [
        'title' => [
            'required',
            Rule::unique('posts')->where('id', '<>', $id),
        ],
        'body' => 'required',
    ];
}

حالا باید ویو posts/edit.blade.php ایجاد کنیم.

انتشار پیش‌نویس

برای راحتی کار، پست‌ها را با بازدید از یک نقطه ورود منتشر می کنیم. استفاده از پست با یک فرم بهتر خواهد شد. publish را به PostController اضافه می‌کنیم.

...

public function publish(Post $post)
{
    $post->published = true;
    $post->save();
    return back();
}

...

نمایش پست 

حالا باید پست‌ها را منتشر کنیم، جهت انجام این کار تابع ()show را به صورت زیر نوشته و به PostController اضافه می‌کنیم.

...

public function show($id)
{
    $post = Post::published()->findOrFail($id);
    return view('posts.show', compact('post'));
}

ویو posts/show.blade.php به صورت زیر است.

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">
                    {{ $post->title }}
                    <a class="btn btn-sm btn-default pull-right" href="{{ route('list_posts') }}">Return</a>
                </div>

                <div class="panel-body">
                    {{ $post->body }}
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

ایجاد صفحه 404 در لاراول

هنگامی که یک کاربر سعی در بازدید از صفحه‌ای را داشته باشد که موجود نیست، بهتر است برای داشتن ظاهر تمیزتر باید یک صفحه 404 ایجاد کنیم. باید یک فایل blade  جدید به نام errors/404.blade.php به صورت زیر ایجاد کنیم، و دوباره کاربر را به یک صفحه مناسب برگردانیم.

<html>
    <body>
        <h1>404</h1>
        <a href="/">Back</a>
    </body>
</html>
 

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


متاسفانه فقط اعضای سایت قادر به ثبت دیدگاه هستند

برترین های