انتشار اولین مطلب در Symphony – قسمت ۱

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

ادامه خواندن انتشار اولین مطلب در Symphony – قسمت ۱

پیاده سازی صفحات bundle و مسیردهی آنها

در مقاله‌ قبل ( ساخت bundle جدید در Symfony ) با استفاده از دستورات  console به راحتی یک bundle جدید ایجاد کردیم، با توجه به اینکه در قسمت سوم مقاله ( بخش view در symfony ) در رابطه با view صحبت کرده بودیم و ساختار کلی view  را پیاده سازی کردیم در این قسمت سایر بخش‌های view و صفحات و جزئیات آن را پیاده سازی می‌کنیم.

ادامه خواندن پیاده سازی صفحات bundle و مسیردهی آنها

ساخت bundle جدید در Symfony

در مقاله قبل در رابطه با ساختار viewها در سیمفونی صحبت کردیم و یک قالب وبلاگی را مطابق Twig template engine پیاده سازی کردیم. با توجه به اینکه قصد داریم در این پروژه آزمایشی صرفا یکسری مطالب را اضافه کنیم یک bundle جدید به نام BlogBundle ایجاد می‌کنم و ادامه کار را با هم پیش میبریم.

ادامه خواندن ساخت bundle جدید در Symfony

بخش view در symfony

در مقاله قبل در رابطه با مقدمات و آشنایی اولیه با ساختار سیمفونی صحبت کردم در این مقاله بخش view  آن را با هم بررسی می‌کنیم.

Symfony برای مدیریت قالب‌ها از یک Template Engine به نام Twig استفاده می‌کند که کار مدیریت و پیاده سازی ساختارهای قالب را به طرز فوق العاده ای بهتر و آسانتر کرده است. اگر مقاله قبل را خوانده باشید متوجه می‌شوید که TwigBundle در ابتدا در فایل AppKernel  لود می‌شود.

ادامه خواندن بخش view در symfony

آشنایی اولیه با فریمورک Symfony

در مقاله قبل در رابطه با نصب و شروع کار با فریمورک Symfony  صحبت کردیم در این مقاله قصد دارم نگاهی به ساختار این فریمورک بندازیم و مقدمات اولیه آن را با هم یاد بگیریم.

Symfony structure version 3.3
ادامه خواندن آشنایی اولیه با فریمورک Symfony

سلام Symfony

با توجه به اینکه من قبلا با لاراول شروع به کار کردم و از آن لذت زیادی بردم و از آنجایی که میدونستم که لاراول بسیاری از بخش‌های خودش رو از Symfony دریافت می‌کنه تمایل زیادی داشتم که کار با سیمفونی رو امتحان کنم تا ببینم چقدر میتونم ازش لذت ببرم! در این مقاله با هم سیمفونی رو نصب می‌کنیم و یکسری مقدمات اولیه را اینجا آرشیو میکنم 🙂 

ادامه خواندن سلام Symfony

پکیج‌های کاربردی لاراول ( ۱ )

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

۱- لاراتراست (Laratrust)

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

در این بین پکیج‌های مختلفی هستند به نام‌های Laravel ACL و laratrust  اشاره کرد که من با لاراتراست و Spatie تجربه کار را دارم.

ادامه خواندن پکیج‌های کاربردی لاراول ( ۱ )

خطایابی و Debug کردن برنامه‌ها در php

همانطور که میدونید هنگام توسعه یک برنامه با انواع خطاها روبرو هستیم، برای دیباگ کردن برنامه لازم است در فاز توسعه این خطاها را مشاهده کنیم تا نسبت به دیباگ کردن آنها اقدام کنیم.

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

ادامه خواندن خطایابی و Debug کردن برنامه‌ها در php

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

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

فایل‌های مختلفی همچون config.php , functions.php , actions.php , … را بر اساس سلیقه های شخصی می‌توان ساخت.

ساختاری که بسیاری از پروژه‌ها و فریمورک‌های معروف از آن استفاده می‌کنند ساختار MVC است که بر اساس Model , View , Controller این ساختار تعریف شده است. در مقاله ای دیگر در این رابطه خواهم نوشت ولی فعلا تا حد امکان سعی میکنم ساختار منظمی برای پروژه تعریف کنم و با شما به اشتراک بذارم.

مواردی که برای یک پروژه که با php خام ایجاد می‌شود را برای خودم توی این مقاله ذخیره میکنم.

فایل config پروژه :

فایلی را برای کانفیگ و تنظیمات کل پروژه در نظر می‌گیریم که در تمام بخش های پروژه در دسترس است.

۱ – ذخیره اطلاعات عمومی کل پروژه

اولین مورد ذخیره تمام اطلاعات کلی پروژه است که قرار است در کل پروژه استفاده شود. برای مثال نام کامل پروژه، آدرس دامنه وبسایت، تعداد مطالب/مقالات منتشر شده در هر صفحه و ….که من به صورت زیر این موارد را تعریف میکنم.

define('project_name', 'نام پروژه');
define('project_url', 'http://mekaeil.me'); 
...

۲ – مشخصات اکانت ادمین ( اختیاری )

برای هر پروژه معمولا یک مدیرکل وجود دارد که به همه بخش‌های وب‌سایت دارد. این نقش باید هنگام راه اندازی پروژه به صورت اتوماتیک ایجاد و در دیتابیس ثبت شود.

define('admin_username','mekaeil.me')
define('admin_email','[email protected]')

۳ –  فعال کردن نمایش خطاهای برنامه نویسی

قطعا در هنگام پیاده سازی پروژه نیاز داریم که خطاهایی که هنگام پیاده سازی و برنامه نویسی پروژه انجام می‌دهیم به ما نمایش داده شود. پس در ابتدای کار حتما این خطاها را نمایش می‌دهیم.

ini_set('display_errors','on');
error_reporting(E_ALL);

نکته مهم : هنگام اتمام پروژه و راه اندازی این موارد باید غیرفعال شوند.

۴ – اتصال به دیتابیس

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

$db_host = 'localhost';
$db_user = 'user_project';
$db_password = 'database password';
$db_name = 'database name';

با توجه به اینکه فایل کانفیگ در کل پروژه استفاده می‌شود میتوان اتصال به دیتابیس را هم در همین قسمت انجام داد به طوریکه لازم نباشد در هر قسمتی از پروژه این اتصال انجام شود.

همچنین اتصال دیتابیس را چک کنیم که در صورتی‌که به هر دلیلی دیتابیس وصل نبود پروژه نمایش داده نشود.

$db = new mysqli($db_host,$db_user,$db_password,$db_name);

// checking connection Database
if ( $db->connect_errno ) {
	print_r("connection Faild : ", $db->connect_error );
	exit();
}

۵ –  تنظیم یونیکد برای حروف فارسی

برای ثبت و نمایش درست اطلاعات فارسی لازم است یونیکد پروژه را روی utf-8تنظیم کنیم که داده‌ها به درستی ذخیره و نمایش داده شوند.

$db->query('SET NAMES UTF8;');

۶ – تعریف جدول‌های دیتابیس

در طول پروژه لازم است که queryهایی نوشته و اجرا شوند که باید به جداول مختلف دیتابیس برای اجرای این queryها نیاز داریم. برای اینکه راحتتر بتوانیم به آنها دسترسی داشته باشیم آنها را در فایل کانفیگ ست میکنیم. همانطور که مشاهده میکنید برای جداول users و posts  من نام آنها را تعریف کردم.

( نکته :  $db در کدهای بالاتر فایل کانفیگ به دیتابیس متصل شده است.  )

$db->usersTable = "users";
$db->postsTable = "posts";

فایل کانفیگ میتواند به مرور بر اساس پروژه کاملتر شود، بعد از ساخت فایل cconfig.php در قسمت هدر پروژه که در تمام بخش‌های پروژه تعریف شده است این فایل را به صورت  include_once ‘config.php’ فراخوانی می‌کنید، از این پس در تمام بخش ها به محتواهای این فایل دسترسی دارید.

فایل توابع پروژه php :

همانطور که در ساختار پروژه فایلی برای تنظیمات کل پروژه داریم قطعا باید فایلی برای توابع پر کاربرد و مورد استفاده در طول پروژه داشته باشیم. برای مثال در سیستم مدیریت محتوای وردپرس فایلی به نام functions.php  در پروژه استفاده می‌شود که تمامی توابع مورد نیاز را در آن قرار می‌دهیم.

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

برای مثال توابعی همچون is_login , create_user , update_post  و … را می‌توان در این فایل تعریف کرد.

فایلی برای مدیریت فرم‌ها و اکشن‌ها :

فایلی را با نامی دلخواه مثلا actions.php در نظر بگیریم که برای مقادیری که فرم‌ها ارسال می‌کنند مدیریت نماید. در واقع در این فایل چک می‌شود که آیا مقادیر این فرم ست شده است ( isset($_POST[‘input’]) ) که توابع داخل آن اجرا شود یا خیر.

بیشتر تعاملات کاربر با وب‌سایت معمولا از طریق فرم‌ها صورت میگیرد.

 

نکته ۱ : با توجه به اینکه تمام عملیات و کارهایی که انجام میدهیم نیاز به فایل actions دارند پس میتوانیم در قسمت head پروژه فایل actions  را include_once نمود و فایلهای config و functions  را در بالاترین  قسمت این فایل، به صورت include_once فراخوانی کنیم.

نکته ۲ : با توجه به موارد موفق تا به اینجای کار اگر بخواهیم مقایسه ای با ساختار MVC داشته باشیم، فایل functions.php که تعریف کردیم در واقع همان Model برای کار با دیتابیس، فایل actions.php همان Controller هستند و بخش View هم همانطور که می‌دانید بخش UI پروژه است.

نکته ۳ : با توجه به اینکه ما در پروژه خود از SESSION معمولا استفاده می‌کنیم پس لازم است در بالاترین قسمت فایل function حتما session_start() را قرار دهیم.

نکته ۴: می‌توان برای درخواست‌هایی که به صورت ‌Ajax ایجاد می‌شوند فایلی متمایز از actions را در نظر گرفت.

لازم است اشاره کنم در این مقاله به ساختار یک پروژه ساده بدون شی‌گرایی پرداختم که قطعا در حالت شی گرایی میتوان تغییرات زیادی اعمال کرد. در مقاله بعدی این مورد را بررسی میکنم.

آرشیو اول : دستورات و نکات مهم لاراول

همانطور که در اولین مطلب وبلاگم اشاره کردم بسیاری از مطالبی که در وبلاگم منتشر میکنم برای آرشیو کردن آن ها برای خودم است و امیدوارم  برای  برخی از دوستان هم کاربرد داشته باشه.

( لاراول ۵.۴ )

در این مطلب در رابطه با مواردی که در لاراول لازم میشه اشاره میکنم :

۱- ایجاد ارتباط بین فیلدهای جداول دیتابیس در migration :

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

پس در migration مربوط به مقالات که نام مقاله و slug ، …. وجود داره یک فیلد به نام user_id وجود داره که به فیلد id موجود در جدول users اشاره میکنه. ( جدول users مشخصات کاربران را ذخیره میکند )

پس داخل فایل migration مربوط به مقالات به این صورت می نویسیم :

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

۲ –  گروه بندی مسیریابی Rout در فایل web.php

همانطور که میدونید برای اینکه مثلا لیست مقالات مربوط به وبسایت رو نمایش بدیم باید در فایل web.php که در فولدر rout است مسیردهی مورد نظر و کنترلر و تابع اون رو مشخص کنیم، برای مثال اگر قرار باشه با مسیر mekaeil.me/admin/articles لیست تمام مقالات را نمایش دهیم مسیردهی در فایل web.php به صورت زیر خواهد بود :

Route::get('/admin/articles', 'Admin\[email protected]')->name('admin.article.list');

که در اینجا با فراخوانی آدرس /admin/articles بعد از نام دامنه، کنترلر ArticlesController که در مسیر Http > Controllers > Admin > ArticlesController وجود دارد فراخوانی میشود و تابع list موجود در این فایل مدیریت نمایش لیست مقالات و ارسال اطلاعات به view را انجام خواهد داد.

نکته اینجاست که ما اگر کلی مسیردهی داشته باشیم برای آدرس های مختلف باید به تعداد آنها مسیریابی را داخل فایل web.php ایجاد کنیم، برای راحتی کار و خلاصه شدن کار میتوانیم از حالت گروه بندی استفاده کنیم به صورت زیر :

Route::namespace('Admin')->prefix('admin')->group(function(){

$this->get('/articles', '[email protected]')->name('admin.article.list');

// Another rout here ...
});

۳ – ایجاد کنترلرها و متدهای مربوط به آن ( CRUD )

هنگام ایجاد اپلیکیشن ها و برنامه ها، متدهای Create , Read, Update, Delete , Store  در کنترلرهای مربوط به مدیریت برنامه استفاده میشود، برای ایجاد کنترلر و متدهای مربوط به آن، بعد از اینکه مدل مورد نظر را ایجاد کردیم میتوانیم با استفاده از دستور زیر به صورت Resource کنترلر موردنظر را ایجاد کنیم در حالتی که شامل متدهای مورد نظر هستند‌:

php artisan make:controller PhotoController -r

CRUD

در حالت فوق متدهای show , edit و … مقداری به نام $id را به عنوان ورودی متد دریافت میکنند تا عملیات مورد نظر انجام شود :‌

Rout model binding in laravel

حالا با تغییر دستور ترمینال به صورت زیر، میتوان با استفاده از rout model binding دسترسی و ارتباط میان کنترلرها و مدلها را برقرار کرد :

 php artisan make:controller ArticleController -r --model=Article

۴ –  insert داده های اولیه ( پیشفرض ) به جداول دیتابیس

من برای پروژه ای که داشتم باید هنگام راه اندازی پروژه یکسری داده ها به صورت پیشفرض به جداول دیتابیس اضافه میشد تا بتوانن هنگام برنامه نویسی هم از آنها استفاده کرد. برای مثال دسته بندی به نام “پیشفرض” به جداول دسته بندی ها اضافه کردم تا وقتی اگر یک مقاله ای آپلود و منتشر شد در صورتیکه دسته بندیی وجود نداشت و یا انتخاب نشد به صورت اتوماتیک این دسته بندی انتخاب شود و یا اگر یک دسته بندی حذف شد، تمام مقالات مربوط به آن دسته بندی به جای حذف به آن دسته بندی نسبت داده شوند.

برای ایجاد این داده های پیشفرض، من داخل فایل migration مربوط به جدول مورد نظر داده ها را اضافه کردم به صورت زیر :

    public function up()
    {
        Schema::create('articlecats', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('slug')->nullable();
            $table->timestamps();
        });

        // Insert Default Data
        DB::table('articlecats')->insert(
            array(
                'id'            => '1',
                'name'      => 'پیشفرض',
                'slug'          => 'default',
                'created_at'    => '1991-07-14',
                'updated_at'    => '1991-07-14'
            )
        );    
    }

۵ – افزودن کاربر به دیتابیس به صورت دستی

گاهی وقت ها هنگام ایجاد پروژه در بخش هایی که هنوز به بخش سطوح دسترسی و احزارهویت کاربران نرسیدیم و لازم است یکسری دیتا را ایجاد کنیم، برای ایجاد این دیتاها از سمت برنامه باید کاربر لاگین کرده باشد و برای لاگین بودن کاربر باید کاربری وجود داشته باشد! پس به صورت دستی یا از سمت phpmyadmin کاربری را ایجاد میکنیم و یا با استفاده از کدنویسی و قراردادن در یکی از فانکشن های کنترلر کاربر را ایجاد میکنیم و سپس کد را حذف میکنیم، که من شخصا راه دوم رو با استفاده از کد زیر انجام میدم.

return User::create([
'name' => 'Mekaeil Andisheh',
'level' => 'admin',
'email'=> '[email protected]',
'password'  => bcrypt('123456')
 ]);  

۶ – دریافت رکوردهای یک جدول به صورت آرایه

برای برخی بخش‌‌ها که اطلاعات کلی نمایش داده می‌شود برای مثال تنظیمات کلی یک بخش یا متن‌های استاتیک یک صفحه میتوان راهکارهای مختلفی را پیش گرفت که بهترین این راهکارها ایجاد بخشی به نام settings است که مدل خود را داشته باشد و حتی بعدا بتوان تابعی را داخل Helper آن نوشت که به راحتی برای بخش های مختلف آن به آن دسترسی داشت.

برای اینکار می‌توانید متن این لینک را مطالعه نمائید : Save laravel app settings in database

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

برای دریافت مقادیر از دستور زیر میتوان استفاده کرد.

$homeItems = Home::where('status', 1)->get();

که دیتاها به صورت زیر دریافت می‌شوند :

که با تغییر کد فوق به صورت زیر با استفاده از key مورد نظرم دیتاها را به صورت یک لیستی از آرایه دریافت می‌کنم.

$homeItems = Home::where('status', 1)->get()->keyBy('section');

که با این تغییر داده ها را به صورت زیر دریافت میکنم :

برای استفاده از این داده ها در جاهای مختلف قالب به صورت زیر عمل میکنم.

{{ $sections['section-1']['title'] }}

۷ – قراردادن url اصلی پروژه در قالب blade

وقتی که قالب اصلی پروژه را روی لاراول پیاده سازی می‌کنیم بعضی وقتها مثلا داخل فوتر یا یک جاهایی که لوگو قرار دارد میخواهیم که به صفحه اصلی لینک شود، میتوانیم به صورت کاستوم آدرس url پروژه را داخل href بذاریم اما شیوه درستتر این ست که Route قرار دهیم که با تغییر دامنه این بخش نیز تغییر پیدا کند.

$url = URL::to("/");
print_r($url);

$url2 = url('/');
print_r($url2);

۸ –  دریافت مقدار Route Name

در برخی قسمتهای برنامه لازم است Route فعلی صفحه جاری را چک کنیم، در صورتیکه به این کار نیاز شد با استفاده از دستور زیر میتوانید Route  صفحه جاری را دریافت نمائید :

Route::currentRouteName()

در صورتیکه نیاز به دریافت نام اکشن شد میتوانیم به صورت زیر اقدام کنیم :

Route::getCurrentRoute()->getActionName();

در صورتیکه نیاز به دریافت url کامل شد به صورت زیر اقدام کنیم :

$url = $request->url();