معرفی معروف‌ترین فریمورک‌های زبان برنامه‌نویسی PHP


زمانی که پای توسعهٔ‌ وب اپلیکیشن به میان می‌آید، بر سر چندراهی قرار خواهیم گرفت که کدام زبان برنامه‌نویسی را انتخاب کنیم؛ آیا به سمت دات‌نت برویم و یا به دنبال راه‌کارهای اپن‌سورسی مثل پی‌اچ‌پی، روبی، پایتون و … برویم. اگر فرض را بر این بگذاریم که به دلایل شخصی و تجاری زبان برنامه‌نویسی پی‌اچ‌پی نظر شما را به خود جلب کرده باشد، باز هم باید تصمیم بگیرید که با Pure PHP شروع به طراحی وب اپلیکیشن خود نمایید و یا اینکه دست به انتخاب یک Framework بزنیم (به طور کلی، منظور از کدنویسی اصطلاحاً Pure این است که بدون استفاده از هیچ لایبرری یا فریمورکی، شخصاً اقدام به توسعهٔ اپلیکیشن مد نظر کنیم.)

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

توسعهٔ فریمورک اختصاصی یا استفاده از نمونه‌های اپن‌سورس؟
مزایا و معایب استفاده از فریمورک در توسعهٔ نرم‌افزار

حال اگر مجاب شده‌اید که استفاده از فریمورک کاری منطقی است، اکنون باید ببینید از میان تعداد نسبتاً قابل‌توجهی فریمورک‌ زبان برنامه‌نویسی پی‌اچ‌پی، کدامیک را باید انتخاب کنیم که در ادامه برخی از معروف‌ترین فریمورک‌های این زبان را بررسی خواهیم کرد (جهت یادگیری زبان پی‌اچ‌پی می‌توانید به دورهٔ آموزش PHP در سکان آکادمی مراجعه نمایید.)

Laravel
فریمورک لاراول جزو یکی از فریمورک‌هایی است که در این لیست خیلی جوان است که عرضهٔ آن به سال ۲۰۱۱ باز می‌گردد اما با استقبال خوبی در میان دولوپرهای سرتاسر دنیا، من‌جمله ایران، مواجه شده و جالب است بدانیم که معمولاً به عنوان محبوب‌ترین فریمورک پی‌اچ‌پی از دید دولوپرها انتخاب می‌شود. به عنوان نمونه کد نوشته‌شده با لاراول داریم:

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Show a list of all of the application's users.
     *
     * @return Response
     */
    public function index()
    {
        $users = DB::select('select * from users where active = ?', [1]);

        return view('user.index', ['users' => $users]);
    }
}

این فریمورک اپن‌سورس و رایگان از ابتدا همواره این شعار را داشته که «ساخت وب اپلیکیشن‌ها با این فریمورک بسیار سریع و آسان است» مضاف بر اینکه در طراحی این فریمورک از معماری MVC استفاده شده است که همین مسئله آن را برای ساخت وب اپلیکیشن‌های تجاری بزرگ مناسب می‌سازد (البته در عین حال پروژه‌های کوچک نیز می‌توان با آن پیاده‌سازی کرد.)

در طراحی این فریمورک، از تعدادی کامپوننت‌های فریمورک Symfony نیز استفاده شده است که در ادامه بیشتر با این فریمورک آشنا خواهید شد. یکی دیگر از خصیصه‌های این فریمورک، وب‌سایت کامل و جامع و همچنین سورس‌کدی است که به خوبی مستندسازی شده است که این امکان را به برنامه‌نویسان می‌دهد تا به راحتی از کلیه کدها سر در بیاورند (علاوه بر مستندات رسمی این فریمورک، Laracasts هم مجموعه ویدیوهای ارزشمندی است که شروع کار با این فریمورک را تسهیل می‌سازد.)

در کنار Laravel، فریمورک دیگری تحت عنوان Lumen عرضه شده است که با هدف بهینه‌سازی بیشتر لاراول برای پروژه‌هایی که پرفورمنس آن‌ها حائز اهمیت می‌باشد طراحی شده است که برای کسب اطلاعات بیشتر، می‌توانید به مقالهٔ‌ Lumen: میکروفریمورک مبتنی بر لاراول اما سبک‌تر با پرفورمنس بیشتر مراجعه نمایید.

Phalcon
در میان کلیهٔ فریمورک‌های پی‌اچ‌پی، فالکون لقب سریع‌ترین فریمورک را به خود اختصاص داده است و اگر در صدد طراحی وب اپلیکیشنی هستید که سرعت اجرای آن برای شما حائز اهمیت می‌باشد، یکی از بهترین گزینه‌های پیش روی شما فریمورک فالکون خواهد بود (با مراجعه به پادکست محمد رستمی: برنامه‌نویس ارشد وب در شیپور، با دیدگاه‌های یکی از دولوپرهای این فریمورک بیشتر آشنا خواهید شد.) به عنوان یک مدل نوشته‌شده با فالکون داریم:

namespace Store\Toys;

use InvalidArgumentException;
use Phalcon\Mvc\Model;

class Robots extends Model
{
    protected $id;

    protected $name;

    protected $price;

    public function getId()
    {
        return $this->id;
    }

    public function setName($name)
    {
        // The name is too short?
        if (strlen($name) < 10) {
            throw new InvalidArgumentException(
                'The name is too short'
            );
        }

        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setPrice($price)
    {
        // Negative prices aren't allowed
        if ($price < 0) {
            throw new InvalidArgumentException(
                "Price can't be negative"
            );
        }

        $this->price = $price;
    }

    public function getPrice()
    {
        // Convert the value to double before be used
        return (double) $this->price;
    }
}

پایه و اساس این فریمورک با زبان برنامه‌نویسی C نوشته شده است. با توجه به اینکه فالکون با زبان سی نوشته شده است، نه تنها سرعت آن بسیار بالا است، بلکه منابع سخت‌افزاری اندکی نیز استفاده می‌کند (طبقه گفتهٔ‌ سایت رسمی این فریمورک، فالکون یک اِکستنشن برای زبان سی است.) نیاز به توضیح نیست که PHP یک زبان تفسیری است اما کدی که با این فریمورک زده می‌شود، کامپایل می‌شود که این به یمن استفاده از Zephir امکان‌پذیر شده است.

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

Symfony
فریمورک سیمفونی هم جزو فریمورک‌هایی است که به خوبی مستندسازی شده است و تحت لیسانس MIT به صورت رایگان عرضه شده است. سیستم مدیریت محتوای Drupal و همچنین phpBB، که یکی از سیستم‌های تالار گفتگو است، از فریمورک سیمفونی استفاده می‌کنند. به عنوان نمونه کنترلر نوشته‌شده با سیمفونی داریم:

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class LuckyController
{
    /**
     * @Route("/lucky/number/{max}", name="app_lucky_number")
     */
    public function number($max)
    {
        $number = random_int(0, $max);

        return new Response(
            '<html><body>Lucky number: '.$number.'</body></html>'
        );
    }
}

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

آنچه در مورد سیمفونی حائز اهمیت است اینکه این فریمورک پایه و اساس بسیاری از دیگر فریمورک‌ها همچون لاراول و زند است مضاف بر اینکه کامپوننت‌های این فریمورک را می‌توان به سادگی در دیگر پروژه‌های مبتنی بر پی‌اچ‌پی‌ نیز به کار برد.

Yii
نام این فریمورک مخفف واژگان Yes It Is است و به صورت Yee تلفظ می‌شود (Yee به زبان چینی به معنی «ساده» است.) سایت رسمی این فریمورک ادعا می‌کند که YII سریع، ایمن و بهینه است. به عنوان نمونه مدل نوشته شده با این فریمورک داریم:

namespace app\models;

use yii\base\Model;

class ContactForm extends Model
{
    public $name;
    public $email;
    public $subject;
    public $body;

    public function attributeLabels()
    {
        return [
            'name' => 'Your name',
            'email' => 'Your email address',
            'subject' => 'Subject',
            'body' => 'Content',
        ];
    }
}

YII مبتنی بر معماری MVC است مضاف بر اینکه بسته به نیاز پروژه می‌توان هستهٔ آن را دستخوش تغییر ساخت، چیزهایی به آن افزود و یا کامپوننت‌هایی از آن را حذف نمود. برای استفاده از Yii 2.0 نیاز به PHP 5.4.0 خواهید داشت اما توصیه می‌شود از PHP 7 خواه برای این فریمورک و خواه دیگر فریمورک‌ها استفاده کرد.

CodeIgniter
این فریمورک MVC تقریباً نیاز به تنظیمات خاصی نداشته و خیلی سریع می‌توانید با آن شروع به کدنویسی کنید. کدایگنایتر جزو فریمورک‌های سریع محسوب می‌شود زیرا برای اجرای هستهٔ این فریمورک فقط تعداد محدودی کامپوننت اجرا می‌شود و سایر کامپوننت‌ها بسته به درخواست‌های ارسالی اجرا شده و از همین روی هیچ‌گونه بار اضافی به سرور تحمیل نمی‌شود. به عنوان نمونه مدل نوشته شده با این فریمورک داریم:

class Blog_model extends CI_Model {

    public $title;
    public $content;
    public $date;

    public
    function get_last_ten_entries() {
        $query = $this - > db - > get('entries', 10);
        return $query - > result();
    }

    public
    function insert_entry() {
        $this - > title = $_POST['title']; // please read the below note
        $this - > content = $_POST['content'];
        $this - > date = time();

        $this - > db - > insert('entries', $this);
    }

    public
    function update_entry() {
        $this - > title = $_POST['title'];
        $this - > content = $_POST['content'];
        $this - > date = time();

        $this - > db - > update('entries', $this, array('id' => $_POST['id']));
    }

}

این فریمورک نیاز به کانفیگ خاصی نداشته و به سرعت قابل‌استفاده است (البته این فیچر در مورد اکثر فریمورک‌ها صادق است.)

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

class PostsController extends AppController
{
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('Auth', [
            'authorize' => 'Controller',
            'loginAction' => ['controller' => 'Users', 'action' => 'login']
        ]);
        $this->loadComponent('Cookie', ['expires' => '1 day']);
    }
}

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

Zend
این فریمورک توسط شرکت Zend Technologies توسعه داده شده است که این شرکت به عنوان توسعه‌دهندهٔ اصلی خود زبان برنامه‌نویسی PHP نیز می‌باشد. شما در طراحی وب اپلیکیشن‌ها با استفاده از زِند می‌توانید صرفاً آن کامپوننت‌هایی که نیاز دارید را فراخوانی کنید لذا سرعت وب اپلیکیشن شما تاحدودی ارتقاء یابد. به عنوان نمونه مدل نوشته‌شده با این فریمورک داریم:

namespace Zend\Db\TableGateway;

use Zend\Db\ResultSet\ResultSetInterface;
use Zend\Db\Sql\Where;

interface TableGatewayInterface
{
    public function getTable() : string;
    public function select(Where|callable|string|array $where = null) : ResultSetInterface;
    public function insert(array $set) : int;
    public function update(
        array $set,
        Where|callable|string|array $where = null,
        array $joins = null
    ) : int;
    public function delete(Where|callable|string|array $where) : int;
}

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

Slim
پیش از این با میکرو فریمورکی تحت عنوان Lumen آشنا شدیم که مبتنی بر Laravel است اما اگر به دنبال میکرو فریمورک دیگری می‌گردید که سبُک و در عین حال کاربردی باشد، Slim گزینهٔ خوبی است (از جمله سایر میکرو فریمورک‌هایی که رقیبی برای اِسلیم محسوب می‌شوند می‌توان به Silex ،Limonade و Flight اشاره کرد.) به عنوان نمونه مدل نوشته‌شده با اسلیم داریم:

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Cache\FilesystemCache;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
use Doctrine\ORM\Tools\Setup;
use Slim\Container;

require_once __DIR__ . '/vendor/autoload.php';

$container = new Container(require __DIR__ . '/settings.php');

$container[EntityManager::class] = function (Container $container): EntityManager {
    $config = Setup::createAnnotationMetadataConfiguration(
        $container['settings']['doctrine']['metadata_dirs'],
        $container['settings']['doctrine']['dev_mode']
    );

    $config->setMetadataDriverImpl(
        new AnnotationDriver(
            new AnnotationReader,
            $container['settings']['doctrine']['metadata_dirs']
        )
    );

    $config->setMetadataCacheImpl(
        new FilesystemCache(
            $container['settings']['doctrine']['cache_dir']
        )
    );

    return EntityManager::create(
        $container['settings']['doctrine']['connection'],
        $config
    );
};

return $container;

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

FuelPHP
این فریمورک مبتنی بر معماری MVC از معماری HMVC نیز پشتیبانی می‌کند که برای استفاده از آن نیاز به نسخهٔ 5.4.0 PHP به بالا خواهید داشت. به عنوان نمونه کنترلر نوشته‌شده با این فریمورک داریم:

class Controller_Example extends Controller
{

    public function action_index()
    {
        $data['css'] = Asset::css(array('reset.css','960.css','main.css'));
        return Response::forge(View::forge('welcome/index'));
    }
}

همچون فریمورک زند، از این فریمورک نیز می‌توان به صورت ماژولار استفاده نمود و کدهایی که می‌نویسیم را در سایر پروژه‌ها مورد استفاده قرار داد.

در انتخاب یک فریمورک چه معیارهایی را باید رعایت کرد؟
به جز نوع پروژه‌ای که قرار است کدنویسی کنیم، یکسری معیارهای دیگر نیز هستند که با مد نظر قرار دادن‌ آن‌ها می‌توانیم این تضمین را ایجاد کنیم که در پروسهٔ تصمیم‌گیری کمتر دچار اشتباه شویم که برخی از مهم‌ترین آن‌ها عبارتند از:

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

- ساپورت: یکی از چیزهایی که در انتخاب یک فریمورک باید مد نظر قرار داد، راه‌کارهایی است که از آن طریق می‌توان پشتیبانی گرفت که از آن جمله می‌توان به مستندات سایت رسمی پروژه و همچنین پرسش و پاسخ‌های سایت‌هایی همچون استک اورفلو اشاره کرد.

- تکنیک‌های به‌کاررفته در فریمورک: اینکه فریمورکی بر اساس استانداردها، دیزاین پترن‌ها و دیگر اصول توسعهٔ نرم‌افزار طراحی شده باشد بسیار حائز اهمیت است.

- امنیت: هر وب اپلیکیشنی می‌تواند در معرض آسیب‌پذیری قرار گیرد و در همین راستا توصیه می‌شود فریمورکی را در توسعهٔ نرم‌افزار به کار گرفت که تا حد قابل‌توجهی جلوی آسیب‌پذیری‌ها را به صورت پیش‌فرض گرفته باشد (نیاز به توضیح نیست به هر میزان هم که فریمورکی ایمن باشد، کدنویسی غیراصولی می‌تواند به سادگی وب اپلیکیشن را آسیب‌پذیر سازد.)

- یافتن آسان دولوپر: اگر قرار است پروژه‌ای بزرگ را شروع به توسعه کنید، نکته‌ای که بسیار حائز اهمیت می‌باشد این است که دولوپرهای مسلط به فناوری‌هایی که به خدمت می‌گیرید باید به سادگی یافت شوند که در غیر این صورت، در ادامهٔ توسعهٔ پروژه به مشکل خواهید خورد (به طور مثال، از میان فریمورک‌های فوق‌الذکر، دولوپرهای بسیاری برای لاراول آماده به کار هستند.)

جمع‌بندی
نیاز به توضیح نیست که سایت رسمی هیچ فریمورکی از نقاط ضعف احتمالی محصول خود صحبتی به میان نخواهد آورد به علاوه اینکه معمولاً دولوپرهایی که سال‌ها است از یک فریمورک خاص استفاده می‌کنند دیدی متعصبانه نسبت به انتخاب خود خواهند داشت و اینجا است که در انتخاب فریمورک به مشکل خواهیم خورد. راه‌کاری که در این راستا پیشنهاد می‌شود این است که اگر فرصت کافی در اختیار داشته باشیم، بهتر است بسته به نوع پروژه‌ای که داریم از یکسو و همچنین فیچرهای فریمورک‌های مختلف از سوی دیگر، یک به اصطلاح Short List درست کرده سپس تک‌تک فریمورک‌های انتخابی را نصب کرده و یک بررسی اجمالی کنیم تا با دید به مراتب بازتری بتوانیم دست به انتخاب بزنیم. 

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



بهزاد مرادی