بهزاد شعبانی

توسعه دهنده پی‌اچ‌پی و لاراول

ساختار فولدرها در لاراول ۵

تیلور آتول (Taylor Otwell) مرداد ۹۳ (August 2014) شروع به توسعه نسخه ۴.۳ لاراول کرد. اما به مرور زمان تغییرات زیادی روی لاراول اعمال شد، به طوری که به راحتی نمی‌شد از لاراول ۴.۲ به ورژن جدید مایگریت (Migrate) کرد. به همین دلیل تصمیم گرفتن یک ورژن اصلی یعنی ورژن ۵.۰ رو منتشر کنن.

همونطور که گفتم لاراول ۵ نسبت به ۴.۲ تغیرات زیادی کرد، از جمله این تغییرات، تغییر در ساختار فولدرهای اپلیکیشن، جایگزینی فیلترها با Middlewares، اضافه کردن Form Request، اضافه کردن Method Injection و خیلی تغییرات دیگه که در ادامه درموردشون بحث می‌کنیم.

تغییرات به وجود اومده نسبتا گسترده‌ان که مسلما توی یه پست نمی‌شه همشون رو پوشش داد، به همین خاطر توی چند پست مجزا این تغییرات رو پوشش می‌دم. امروز در مورد ساختار جدید فولدر‌های اپلیکیش و تغییرات کلی در لاراول ۵ صحبت می‌کنیم.

نصب Laravel 5

نصب لاراول ۵ هم مثل لاراول ۴ از طریق Composer صورت میگیره و با اجرای دستور composer create-project می‌تونید لاراول رو دانلود و نصب کنید.

با توجه به اینکه، لاراول ۵ هنوز به طور رسمی منتشر نشده و هنوز درحال توسعه‌ست (در زمان انتشار این پست)، برای دریافت لاراول ۵ دستور زیر رو در ترمینال اجرا کنید:

$ composer create-project laravel/laravel {FOLDER_NAME} dev-develop

حالا که یه نسخه از ورژن ۴.۲ و یه نسخه از ورژن ۵ داریم، شروع به مقایسه این دو ورژن می‌کنیم.

ساختار اپلیکیشن و فولدرها

اولین چیزی که بعد از نصب لاراول ۵ به چشم میاد، تغییراتیه که تو فولدرها داده شده

مقایسه فولدرهای لاراول ۴.۲ با لاراول ۵

همونطور که تو عکس می‌بینید فولدرهای config، database، storage و tests از فولدر app به ریشه اپلیکیشن (application root) منتقل شدن. همچنین فولدر views به resource تغییر نام پیدا کرده و به ریشه اپلیکیشن منتقل شده.

تغییر دیگه ای که به چشم می‌خوره،جدا سازی فایل‌ها و کلاس‌های مربوط به وب، از کلاس‌ها و فایل‌های مربوط به کنسول از همدیگه‌ست. همه‌ی فایل‌های مربوط به وب مثل کنترلرها، میدل‌ویرها، routes.php در پوشه Http قرار گرفتن و کلاس‌های مربوط به کامندهای آرتیسن (Artisan Commands) در پوشه Console.

توجه داشته باشید که پوشه Commands در لاراول ۵ ربطی به کامند‌های آرتیسن نداره؛ این پوشه مربوط میشه به پترن Command Bus که در لاراول ۵ برای شما آماده شده. در پست‌های بعدی در مورد این پترن صحبت خواهیم کرد.

فولدرهای Commands، Events، Exceptions، Handlers، Providers و ‍Services هم در این نسخه به لاراول اضافه شدن که در پست‌های بعدی درموردشون صحبت می‌کنم.

مدل‌ها کجان؟

اگه دقت کرده باشین، می‌بینید که مدل User در ریشه فولدر app قرار گرفته، در این نسخه از لاراول، مدل ها در فولد app قرار میگیرن؛ هرچند می‌تونید اونها رو تو فولدر دلخواهی قرار بدید، فقط این کار چندتا نکته داره که در ادامه در موردش صحبت می‌کنیم.

‏PSR-4 Autoloading

لاراول ۵ یکی از اولین فریم‌ورک‌هاییه که از PSR-4 استفاده می‌کنه، توی نسخه‌های قبلی کلاس‌های اپلیکیشن مثل مدل‌ها و کنترلرها از طریق Class Map لود می‌شدن، اما تو لاراول ۵ برای لود کردن کلاس‌ها از PSR-4 استفاده شده.

‏PSR-4 چیه؟

‏PSR یا PHP Standards Recommendation، پروژه‌ای توسط تیم PHP-FIG هست که به منظور ایجاد استاندارد برای برنامه‌نویسی php ایجاد شد. در حال حاضر ۵ استاندارد توسط این تیم پیش‌نهاد شده که به اختصار در موردشون صحبت می‌کنم:

  1. PSR-0: استاندارد‌ Autoloading کلاس‌ها
  2. ‏PSR-1: استاندارد پایه‌ای Coding Styles
  3. ‏PSR-2: استاندارد کلی و جامع Coding Style
  4. ‏PSR-3: استاندارد لاگر‌های (Logger Interface Standard)
  5. ‏PSR-4: استاندارد بهبود یافته Autoloading کلاس‌ها

تفاوت PSR-0 با PSR-4

خیلی خلاصه در مورد تفاوت این دو استاندارد صحبت می‌کنم، که از مبحث اصلی دور نشیم. فرض کنید فایل composer.json به این شکل باشه:

{
    "autoload": {
        "psr-0": {
            "VendorName\\PackageName\\": "src/"
        }
    }
}

در این صورت namespace کلاس‌های شما با VendorName\PackageName شروع میشه و در مسیر src/VendorName/PackageName/YourClass.php قرار می‌گیرند.

اما در PSR-4 دیگه نیازی به درست کردن فولدر‌های Vendor و Package نیست و شما می‌تونید کلاس‌هاتون رو در شاخه src یا هر شاخه دیگه‌ای که تو composer.json تعریف کردین بذارید و Composer اونا رو براتون Autoload میکنه.

برای اطلاعات بیشتر در مورد PSR می‌تونید به سایت‌های زیر مراجعه کنید

‏PSR-4 در لاراول ۵

همونطور که گفتم لاراول ۵ از PSR-4 برای Autoloading استفاده می‌کنه. اگه فایل composer.json لاراول ۵ باز کنید، می‌بینید که در قسمت Autoload از PSR-4 استفاده شده:

{
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}

همه کلاس‌هایی که تو پوشه app قرار دارن تحت نیم‌اسپیس App هستند. مثلا کنترلرها که در مسیر app/Http/Controllers قرار دارن دارای نیم‌اسپیس App\Http\Controllers هستن.

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

$ php artisan app:name YourVendorName

بعد از اجرای این دستور، فایل composer.json و همه کلاس‌هایی که در فولد app قرار داشتن به نیم‌اسپیس جدید آپدیت می‌شن.

ممکنه با خودتون بگید، با اضافه شدن نیم‌اسپیس‌ به کنترلرها و مدل‌ها استفاده متدهایی مثل Route::controller یا تعیین رابطه بین مدل ها سخت میشه و باید مسیر کامل کلاس (نیم‌اسپیس + اسم کلاس) هر دفه بنویسید، اما نگران نباشید، کافیه فقط اسم کنترلر یا مدل بنویسید و لاراول براتون اون کلاس رو لود می‌کنه.

توجه داشته باشید که اگه کنترلر یا مدل‌تون توی یه زیر شاخه قرار داره، باید اسم اون زیر شاخه رو هم بیارید. مثلا اگه توی فولدر controller یه فولدر دیگه به اسم Admin دارید و کنترلرهای مربوط به بخش admin رو اونجا گذاشتین، کافیه Admin\AdminController رو به متد مورد نظرتون پاس بدید.

‏New Helpers

لاراول ۵ Helper functionهای زیادی رو اضافه کرده، که کار رو خیلی آسون می‌کنن. به نظر میاد که تیلور قصد داره Helperها رو جایگزین Facadeها بکنه. چندتا از این Helperها رو باهم مرور میکنیم:

Helper Facade alternative
app($abstract) App::make($abstract)
config($key = null, $default = null) Config::get($key = null, $default = null)
get($uri, $action) Route::get($uri, $action)
post($uri, $action) Route::post($uri, $action)
put($uri, $action) Route::put($uri, $action)
delete($uri, $action) Route::delete($uri, $action)
view($view = null, $data = [], $mergeData = []) View::make($view = null, $data = [], $mergeData = [])
event($event, $payload = array(), $halt = false) Event::fire($event, $payload = array(), $halt = false)

‏Routing

در لارول ۵ سه روش برای نوشتن فایل routes.php وجود داره که با مثال اونارو توضیح میدم:

روش اول، استفاده از Facade

<?php

Route::get('/', function () {
    return "Hello World";
});

روش دوم، استفاده از متغییر router

<?php

$router->get('/', function () {
    return "Hello World";
});

روش سوم، استفاده از Helper

<?php

get('/', function () {
    return "Hello World";
});

همچنین شما می‌تونید در این نسخه برای بازدهی و سرعت بیشتر، فایل routes.php رو Cache کنید. برای اینکه کافیه دستور زیر رو اجرا کنید:

$ php artisan route:cache

فیلترها و میدل‌ویرها (Middlewares)

یکی دیگه از تغییرات لاراول ۵، حذف فایل filters.php و اضافه کردن Middlewareهاست. میدل‌ویرها همون فیلترها هستن که در قالب یک کلاس قرار گرفتن. میدل‌ویرها دارای متد handle هستن که منطق فیلتر در اون متد قرار میگیره. برای مثال فیلتر auth که در لاراول ۴ به این شکل بود:

<?php

Route::filter('auth', function() {
    if (Auth::guest()) {
        if (Request::ajax()) {
            return Response::make('Unauthorized', 401);
        }
    return Redirect::guest('login');
}

که در لاراول ۵ به شکل زیر تغییر کرده:

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Guard;

class Authenticate {

    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $auth;

    /**
     * Create a new filter instance.
     *
     * @param  Guard  $auth
     * @return void
     */
    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->auth->guest())
        {
            if ($request->ajax())
            {
                return response('Unauthorized.', 401);
            }
            else
            {
                return redirect()->guest('auth/login');
            }
        }

        return $next($request);
    }

}
comments powered by Disqus