گاهی کاربران url های سایت شما رو در شبکه های اجتماعی به اشتراک میذارن. مثلا به طور پیشفرض آدرس صفحه "درباره من" چیزی مثل http://webproject.ru/index.php?r=site%2Fabout هست.
اکثر کاربران هیچ تصوری از index.php یا 2% ندارن و به اون اعتماد نمیکنن در نتیجه کمتر روی لینک کلیک میشه. آدرس هایی مثل http://webproject.ru/about بهتر به نظر میرسه. در واقع کاربران به راحتی میتونن متوجه بشن که قراره چه چیزی رو ببینن. برای تبدیل آدرس ها به نمونه بالا کافیه سه مرحله زیرُ انجام بدین.
یک فایل htaccess بسازید یا اگر از قبل وجود داره موارد زیرُ بهش اضافه کنید(به عنوان مثال محل فایل در نسخه advanced میتونه frontend/web باشه).
RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php
urlManager رو پیکره بندی کنید.
'components' => [
// ...
'urlManager' => [
'class' => 'yii\web\UrlManager',
// Hide index.php
'showScriptName' => false,
// Use pretty URLs
'enablePrettyUrl' => true,
'rules' => [
],
],
// ...
],
حالا آدرس ها چیزی مثل http://webproject.ru/site/about شدن. هیچ دلیلی برای وجود پارامتر site داخل url نیست پس با ضافه کردن rule زیر در پیکره بندی بالا اون رو حذف میکنیم.
'rules' => [
'<alias:\w+>' => 'site/<alias>',
],
در قسمت rules کارهای بیشتری هم میتونیم انجام بدیم، مثلا اینکه به انتهای url پسوند html. اضافه کنیم. این مورد هم در SEO تاثیرگذار هست. پسوند url رو میتونیم در قسمت suffix مثل نمونه زیر تعریف کنیم.
'rules' => [
[
'pattern' => 'user/about/<username:\w+>',
'route' => 'user/about',
'suffix' => '.html',
],
]
Bootstrapping به فرایندی از آماده کردن محیط قبل از شروع application برای مدیریت یک درخواست اشاره میکنه. به عنوان مثال، اگر تصمیم دارید قبل از اجرای application یکسری تنظیمات خاص برای کاربران تعریف بشه Bootstrapping گزینه ی مناسبی برای این کار هست. backend/components/bootstrap محل خوبی برای نوشتن یک کلاس از این نوع میتونه باشه.
namespace backend\components\bootstrap;
use Yii;
use yii\base\Application;
use yii\base\BootstrapInterface;
class Setting implements BootstrapInterface
{
public function bootstrap($app)
{
$settingModel = \dashboard\modules\setting\models\Setting::find()->one();
Yii::$app->language = $settingModel->language;
Yii::$app->timeZone = $settingModel->time_zone;
}
}
کلاس باید از BootstrapInterface مشتق بشه و به دلیل اینکه کلاس پدر interface هست تعریف متد bootstrap اجباریه.
app به Application جاری که در حال اجراست اشاره میکنه و با استفاده از اون به همه چیز دسترسی دارید. مثلا تعریف عنوان Application:
$app->view->title = 'my title';
یا اضافه کردن یک فایل css به صفحه و...
$app->view->registerCssFile(Yii::$app->homeUrl . 'web/css/index.css');
در کلاس Setting که به عنوان نمونه کدش رو دیدیم زبان و منطقه زمانی از دیتابیس دریافت و برای کاربر ست میشه. حالا باید مشخص کنیم که این کلاس در مرحله bootstrap اجرا بشه. این یک مرحله قبل از شروع Application هست و در اون متد bootstrap که در کلاس Setting داریم صدا زده خواهد شد. برای این کار به backend/config/main.php مراجعه کنید. در پیکره بندی Application شما یک کلید به نام bootstrap وجود داره، کلاس Setting رو بهش اضافه کنید تا این کار انجام بشه.
'bootstrap' => ['log', 'backend\components\bootstrap\Setting'],
elasticsearch با جاوا توسعه داده شده و برای اجرا حداقل به نسخه ی 8 جاوا نیاز داره. پیشنهاد شده از نسخه ی 131_1.8.0 یا بالاتر استفاده کنید، elasticsearch با نسخه ی های پایین تر اجرا نخواهد شد.
- آخرین نسخه elasticsearch رو دانلود و در محلی از حالت فشرده خارج کنید.
- cmd رو باز و bin/elasticsearch.bat رو اجرا کنید.
C:\elasticsearch-5.5.1\bin>elasticsearch.bat
هنگام اجرای یک خطای معمول وجود داره و همونطور که خودش توضیح داده برای حلش میتونید JRE یا JDK رو نصب کنید.
Error: missing `server' JVM at `C:\Program Files (x86)\Java\jre1.8.0_101\bin\server\jvm.dll'.Please install or use the JRE or JDK that contains these missing components.
- IP:Port مخصوص به elasticsearch رو امتحان کنید(http://localhost:9200). اگر همه چیز درست پیش رفته باشه خروجی زیر بهتون نمایش داده خواهد شد.
{
"name" : "JlngwG8",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "H7KFhzdBTYmkAwxb7XDvfw",
"version" : {
"number" : "5.5.1",
"build_hash" : "19c13d0",
"build_date" : "2017-07-18T20:44:24.823Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
در ادامه مطلب قبلی. با استفاده از rule ها این امکان وجود داره تا به عنوان مثال بتونیم مجوز بروزرسانی یک بخش به شرطی که کاربر جاری مالک(ایجاد کننده) اون باشه رو بررسی کنیم. سیستم مدیریت وبلاگ رو در نظر بگیرید. کاربران(نویسنده ها) وبلاگ فقط باید امکان بروزرسانی یا حذف مطالب خودشون رو داشته باشن. در مرحله ی اول، برای بررسی مالک هر مطلب نیاز به ایجاد یک کلاس جدید داریم. backend\components\rbac میتونه جای خوبی برای ایجاد این کلاس باشه.
<?php
namespace backend\components\rbac;
use yii\rbac\Rule;
class AuthorRule extends Rule
{
public $name = 'AuthorRule';
public function execute($user, $item, $params)
{
}
}
لازم هست کلاسمون از yii\rbac\Rule مشتق(extends) بشه. و همچنین تعریف متد execute اجباریه. در این متد user شناسه کاربر جاری، item اطلاعات مربوط به مجوز و params پارامتر هایی که ما براش تعریف میکنیم رو برمیگردونه.
ادامه...بهتره اینطور عمل نکنید اما گاهی نیاز هست extension در دسترس عموم قرار نگیره. مثلا زمانی که برای شرکت کار انجام میدین.
وارد بخش Extension Generator در ابزار gii بشید. هر بخش رو مختر توضیح میدم.
Vendor Name، به اسم نویسنده اشاره میکنه، username گیت هابتون میتونه گزینه ی خوبی باشه اما اجباری برای نام گذاری وجود نداره من از developit استفاده میکنم به جای نام کاربری گیت هابم.
Package Name، نام extension شماست. بهتره yii2 اولش باشه هر چند اینجا هم اجباری وجود نداره.
Type، عنوان که میتونه extension یا library باشه. ما هم که معلومه داریم چی درست میکنیم.
Keywords، کلمات کلیدی رو با کاما از هم جدا کنید. برای جستجو، دسته بندی و اینطور مسائل مفید هست.
License، مجوز مورد نظر رو انتخاب کنید. هر چند ما قرار نیست چیزی رو به گیت هاب انتقال بدیم اما انتخاب مجوز اجباریه. من GPL-3.0 رو خیلی دوست دارم.
Title, Description, Author Name, Author Email، عنوان، توضیحات، نام و ایمیل خودتون رو بنویسید.
Output Path، مسیری که extension در اونجا قرار میگیره هست. پیشفرض داخل یه temp dir قرارش داده تا بعد از اینکه کارمون روی extension تموم شد اون رو به گیت هاب ببریم و بعدش با composer نصبش کنیم. از اونجایی که قرار نیست ما این روند درست رو طی کنیم این مسیرُ تغییر میدیم. من به جاش vendor/developit@ گذاشتم. دقت کنید در مسیری که میذارید حتما دایرکتوری ها وجود داشته باشن.
Preview رو بزنید و تیک مورد اول یعنی composer.json رو بردارید و روی گزینه ی Generate کیک کنید.
ادامه...دیدن عنوان دایرکتوری web داخل url برای من خیلی آزار دهنده بود. دلیلش این هست که index.php داخل این پوشه قرار گرفته. برای حذف کردن web از آدرس ها فقط کافیه سه مرحله زیرُ دنبال کنید.
- index.php رو به یک پوشه بالاتر مثلا backend/index.php انتقال بدین.
- بازش کنید و مسیر های داخلش رو تغییر بدین. چون جا به جا شده لازمه از هر مسیر یک /.. حذف بشه:
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../common/config/bootstrap.php');
require(__DIR__ . '/config/bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(require(__DIR__ . '/../common/config/main.php'), require(__DIR__ . '/../common/config/main-local.php'), require(__DIR__ . '/config/main.php'), require(__DIR__ . '/config/main-local.php'));
$application = new yii\web\Application($config);
$application->run();
ادامه...
برای کار با تقویم فارسی در yii2 نیازی به نصب extension ندارید و فقط کافیه formatter رو در محل config/main.php(اگر مثل من از yii2 advanced استفاده میکنید) پیکره بندی کنید. چیزی مثل این نمونه:
'components' => [
'formatter' => [
'class' => 'yii\i18n\Formatter',
'locale' => 'fa_IR@calendar=persian',
'calendar' => \IntlDateFormatter::TRADITIONAL,
'dateFormat' => 'php:Y-m-d',
'datetimeFormat' => 'php:Y-m-d H:i',
'timeFormat' => 'php:H:i',
],
],
میتونید برای نمایش تاریخ و زمان از متد های خود formatter استفاده کنید. توجه داشته باشید قالب نمایش تاریخ زمان همونیه که ما در پیکره بندی formatter تعریف کردیم.
$formatter = \Yii::$app->formatter;// output: ۱۳۹۶-۰۴-۰۵ ۱۸:۳۵
echo $formatter->asDatetime('now');// output: ۱۳۹۶-۰۴-۰۵
echo $formatter->asDate('now');// output: ۱۴:۰۵
echo $formatter->asTime('now');
یا اینکه خودتون قالب نمایش رو براش تعریف کنید.
// ICU format
echo Yii::$app->formatter->asDate('now', 'yyyy-MM-dd'); // ۱۳۹۶-۰۴-۰۵
// PHP date()-format
echo Yii::$app->formatter->asDate('now', 'php:Y-m-d'); // ۱۳۹۶-۰۴-۰۵
برای مطالعه بیشتر اینجا رو ببینید. همچنین برای تبدیل تاریخ هم کتابخانه های زیادی وجود داره مثل این نمونه که میشه ازش استفاده کرد.
Role Based Access Control یا به طور خلاصه RBAC یک سیستم مدیریت دسترسی هاست که در yii2 گنجانده شده. هر نقش(role) در RBAC شامل مجموعه ای از مجوز هاست یک نقش میتونه به یک یا چند کاربر اختصاص داده بشه. به عنوان مثال نقش manage user(مدیریت کاربران) میتونه شامل مجوز های add user, edit user و delete user باشه. به منظور کنترل سطح دسترسی باید مشخص بشه آیا به کاربر جاری نقش یا مجوز لازم اختصاص داده شده یا خیر.
نقش ها و یا مجوز ها میتونن سازمان یافته و سلسله مراتبی باشن یعنی یک نقش میتونه شامل نقش های دیگه ای باشه، مجوز ها هم همینطور.
به عنوان مثال فرض کنید یک سیستم مدیریت مقالات داریم. کاربران این سیستم شامل سه گروه میشن:
در این مثال برای گروه اول نیازی نیست سطح دسترسی تعریف کنیم و یا اینکه مجوزی مورد بررسی قرار بگیره! چون تمام کاربران باید بتونن مقالات رو بخونن و یا مقاله ارسال کنن.
برای گروه دوم میشه یک نقش تعریف کرد با عنوان managing articles و برای گروه سوم هم که قراره کاربران رو مدیریت کنن نقش managing users رو داریم. نقش ها و مجوز ها باید به صورت سلسله مراتبی تعریف بشن چون گروه سوم یا مدیران ما علاوه بر مدیریت کاربران باید بتونن مقالات رو هم ویرایش، تایید و یا حذف کنن یعنی نقش های گروه دوم رو هم باید داشته باشن پس طرح سلسله مراتبی ما چیزی مثل تصویر زیر خواهد شد:
ادامه...برای کار با postman نکته ی خاصی وجود نداره اما زیاد داخل وبلاگم جستجو میشه.
برنامه رو نصب و اجرا کنید. در قسمت بالا و سمت چپ:
دو tab وجود داره، history تاریخچه درخواست هایی که ارسال کردینُ نشون میده و اگر بخواهید اونها save کنید در tab دوم یعنی قسمت collection قرار میگیره. collection مجموعه ای از درخواست های شماست که در واقع اونها رو علاوه بر ذخیره کردن دسته بندی هم میکنه. از collection میتونید export بگیرید و به عنوان یک backup نگهداریش کنید.
در بالای همین قسمت دو بخش دیگه هم قابل مشاهده است، runner تمام درخواست های یک مجموعه(collection) رو به صورت گروهی اجرا میکنه. امکان import درخواست ها و همچنین export نتایج وجود داره. هدف این بخش اجرا و تست یک مجموعه است.
بخش import همونطور که از نامش پیداست امکان اضافه کردن اطلاعات رو بهتون میده. این اطلاعات میتونه collection, environment, data dump, curl command یا یک RAML / WADL / suagger(v1/v2) / runscope باشه.
ادامه...در ادامه مطلب قبلی.
- داخل packagist عنوان مورد نظرمون(yii2 swagger) رو جستجو میکنیم. مثل همیشه package های زیادی رو مشاهده میکنید. اولین گزینه پر استفاده ترین و محبوب ترین package هست و ما هم اونُ انتخاب میکنیم(light/yii2-swagger).
- برای نصب از طریق composer توضیحات لازم رو داده. من از همون روش اولی که گفته نصب رو انجام میدم یعنی اجرای دستور زیر:
composer require --prefer-dist light/yii2-swagger "~1.0.4" --dev
- داخل یک controller به عنوان مثال SiteController و در متد actions پیکره بندی swagger رو انجام میدیم:
public function actions()
{
return [
//The document preview addesss:http://api.yourhost.com/site/doc
'doc' => [
'class' => 'light\swagger\SwaggerAction',
'restUrl' => \yii\helpers\Url::to(['/site/api'], true),
],
//The resultUrl action.
'api' => [
'class' => 'light\swagger\SwaggerApiAction',
//The scan directories, you should use real path there.
'scanDir' => [
Yii::getAlias('@api/modules/v1/swagger'),
Yii::getAlias('@api/modules/v1/controllers'),
Yii::getAlias('@api/modules/v1/models'),
Yii::getAlias('@api/models'),
],
//The security key
'api_key' => 'balbalbal',
],
];
}
این پیکره بندی شامل موارد زیر میشه:
doc: آدرس صفحه ی مستندات رو مشخص میکنه. با توجه به این نامی که انتخاب کردیم آدرس چیزی شبیه به http://api.yourhost.com/site/doc خواهد شد.
restUrl: آدرس پایه restful api رو تعریف میکنه. به عنوان مثال اگر یک api برای login آماده کنیم درخواست به آدرس http://api.yourhost.com/site/api/login ارسال میشه.
scanDir: مسیر هایی هست که swagger اونها رو برای پیدا کردن api جستجو(scan) میکنه.
api_key: ممکنه api شما نیاز به احراز هویت داشته باشه. در بالای صفحه ی مستندات swagger جایی برای وارد کردن کلید امنیتی وجود داره تا دسترسی ها محدود و امنیت برقرار بشه. به طور پیشفرض اینجا میتونید یک کد امنیتی تعریف و استفاده کنید اما بهتر اینه که کاربران در سیستم login کنن، سپس یک token دریافت و از اون به عنوان کلید امنیتی استفاده کنن. یعنی هر کاربر یک کلید امنیتی منحصر به فرد که با هر بار login تغییر میکنه. بعدا این قسمت رو جدی تر بررسی میکنیم.
swagger اجازه میده یک ساختار توصیفی از API خودتون بسازید. چرا مفید، عالی و کاربردی به نظر میرسه؟ چون میتونیم به طور خودکار برای API خودمون مستندات زیبا و یک محیط تعاملی ایجاد کنیم، همچنین امکان تست API رو هم برامون فراهم میکنه. swagger این کارُ با خواندن به اصطلاح حاشیه ها/یادداشت ها یا کامنت های داخل سورس انجام میده.
/**
* @SWG\Get(
* path="/customer/{customerId}/rate",
* summary="List customer rates",
* operationId="getCustomerRates",
* @SWG\Parameter(
* name="customerId",
* in="path",
* description="Target customer.",
* required=true,
* type="integer"
* ),
* @SWG\Parameter(
* name="filter",
* in="query",
* description="Filter results based on query string value.",
* required=false,
* enum={"active", "expired", "scheduled"},
* type="string"
* ),
* @SWG\Response(response=200, description="successful operation"),
* @SWG\Response(response=406, description="not acceptable"),
* @SWG\Response(response=500, description="internal server error")
* )
*
*/
ادامه...
HTTP و JSON دو نیاز اصلی برای کار با elasticsearch هستن، شاخص گذاری، جستجو و هر چیز دیگه ای که فکرشُ میکنید با این دو انجام میشن.
به عنوان مثال برای کار با elasticsearch میشه از Curl استفاده کرد. یک ابزار خط فرمان بسیار قدرتمند اما به خاطر داشته باشید انجام پیش پا افتاده ترین کارها در elasticsearch با استفاده از Curl وقت گیر هست.
اولین پیشنهادم postman هست. یک ابزار توسعه API که قبلا هم در موردش نوشتم. افزونه ی chrome یا application های مجزا برای linux، windows و mac داره. صرفا مختص کار با elasticsearch نیست اما میشه به این منظور هم ازش استفاده کرد.
مورد دوم، sense. فقط افزونه ی chrome داره، به سادگی، زیبایی و قدرت postman نیست اما مزیتش اینه که چون تنها برای elasticsearch نوشته شده autocomplete داره و خب کارُ آسونتر و سریعتر میکنه. اول داخل kibana و قسمت Dev Tools بود که الان هم هستش.
اگر هم سن و سال من باشید، به احتمال زیاد پدر و مادر هاتون در مورد تجربه خوردن موز دوران کودکی و اینکه هر کسی موز نمیخورد برای شما خاطراتی تعریف کردن. حقیقتش زمان اونها موز میوه گرون قیمتی بود و فقط خانواده هایی با سطح درآمد بالا موز میخوردن :)) در نتیجه این میوه رو بیشتر در میهمانی های اعیان و اشراف میشد دید.
اما با گذشت زمان و اینکه موز الان جزو میوه های معمول/متوسط/در دسترس حساب میشه باز در میمهانی های رسمی، عروسی ها و... وجود داره. به این دلیل که ارزش موز تغییر کرده اما طرز فکر مردم در موردش نه.
دانشگاه هم مثل موز میمونه! زمان قبولی دانشگاه بسیار سخت بود، توی این رقابت سنگین برای ادامه تحصیل افراد کم و شاخصی موفق میشدن از سد کنکور بگذرن. کسی که حتی مدرک کاردانی میگرفت جایگاه خاصی بین خانواده، اقوام و دوستانش پیدا میکرد، کار بهتری بهش میدادن چون مدرک معیار مهمی بود و... .
دانشگاه ها زیاد شدن...، آزاد، غیر انتفاعی، پیام نور و...، ظرفیت ها/صندلی ها افزایش پیدا کرد، قبولی در دانشگاه آسون شد و حتی شیوه ی پذیرش دانشگاه تغییر کرد مثل پذیرش بدون کنکور با ضمانت قبولی!
در نتیجه اشتغال ایجاد شد و بعضی ها که جایی راهشون نمیدادن شدن استاد و بچه های مردم رو برای خانه نشینی تعلیم دادن...
چیزی که الان براش محتوای زیادی توی اینترنت پیدا میشه توضیحات و راه کارهای مفصلی درباره SEO و بهینه کردنش هست. جالبتر اینکه بیشتر از تعداد این محتواها متخصص SEO پیدا خواهید کرد!
به عنوان انجام یک گام کوچیک در جهت بهبود SEO بهتره صفحات متفاوت meta tag های متفاوت و مربوط به خودشون رو داشته باشن.
میدونیم که برای تعریف عنوان یک صفحه(در controller) اینطور باید عمل کرد:
\Yii::$app->view->title = 'my title';
یا بیاییمُ داخل خود view این کارُ انجام بدیم که من این حالتُ بیشتر میپسندم:
$this->title = 'my title';
ولی برای keyword ها یا description مثل title یک پارامتر اختصاصی نداریم و از اونجایی که هر دو meta tag به حساب میان باید از متد registerMetaTag برای ست کردنشون استفاده کنیم.
مثلا داخل controller:
\Yii::$app->view->registerMetaTag([
'name' => 'description',
'content' => 'my description',]);\Yii::$app->view->registerMetaTag([
'name' => 'keywords',
'content' => 'my keywords',
]);
یا در view:
$this->registerMetaTag([
'name' => 'description',
'content' => 'my description',]);$this->registerMetaTag([
'name' => 'keywords',
'content' => 'my keywords',
]);
سبک کدنویسی که در فریمورک و extension های رسمی استفاده میشه دارای اصول، قواعد و قانون های خودش هست. پس اگر تصمیم دارید چیزی به هسته اضافه کنید باید این قواعد رو در نظر بگیرید حتی در غیر این صورت هم رعایت این موارد خالی از لطف نیست و توصیه میکنم این کارُ انجام بدین. در حالی که میتونید راحت باشید، شما مجبور به رعایت این سبک در application خودتون نیستید...
به طور کلی ما از سبک PSR-2 استفاده میکنیم و هر چیزی که در این سبک وجود داره اینجا هم هست.
- در فایل ها باید از برچسب های php?> و =?> استفاده شود.
- در پایان هر فایل باید یک خط جدید(newline) داشته باشید.
- encoding فایل برای کد های php باید UTF-8 without BOM باشد.
- به جای tab از 4 فضای خالی(space) استفاده کنید.
- نام کلاس ها باید به صورت StudlyCaps تعریف شوند.
- ثابت های داخل کلاس تماما باید با حروف بزرگ و گاهی با جداکننده "_" تعریف شوند.
- نام متد ها و پراپرتی ها باید به صورت camelCase تعریف شوند.
- پراپرتی های خصوصی(private) باید با "_" شروع شوند.
- همیشه از elseif جای else if استفاده کنید.
ادامه...
کنترل سطح دسترسی با احراز هویت framework ادغام شده تا اجازه یا محدود کردن دسترسی ها به امکانات و صفحات یک وبسایت را فراهم کند.
اگر تا کنون از access control استفاده نکرده اید، کد شما به همه اجازه دسترسی را خواهد داد حتی کاربرانی که login نشده اند!
با استفاده از access control در yii2 میتوان مطمئن شد کاربران قبل از دسترسی به امکانات یا صفحات وبسایت login کرده اند.
همچنین yii2 امکان مدیریت پیشرفته تر و پیچیده تری هم با عنوان RBAC ارائه میکند که بعدا بیشتر در مورد آن خواهم نوشت... . با استفاده از RBAC میتوان سلسله مراتب پیچیده ای از مجوز ها تعریف کرد مانند مجوز برای فعالیت هایی که ممکن است در application شما انجام شود.
به طور پیشفرض access control در yii2 دارای دو نقش(roles) میباشد. نقش مهمان یعنی کسی که هنوز login نکرده که با '?' نشان داده میشود و نقش احراز هویت شده یعنی کسی که در سایت login کرده و با '@' مشخص شده است.
با این دو نقش فقط میتوانیم دسترسی به صفحات یا action ها را محدود کنیم بر اساس اینکه کاربر login شده یا خیر و اگر login نبود میتوان آن را به صفحه ی ورود هدایت کرد.
ادامه...به منظور پیکره بندی nginx برای yii2 مراحل زیر را باید انجام دهید:
1) برای backend پیوند نمادین(symlink) ایجاد کنید.
cd /path/to/project/frontend/webln -s ../../backend/web backend
2) frontend/config/main.php نیاز به تغییر دارد.
....
'components' => [
....
'request'=>[
'baseUrl'=>'',
],
'urlManager'=>[
'scriptUrl'=>'/index.php',
],
....
],
ادامه...
در قالب advanced به طور پیشفرض frontend از backend جدا شده. با این وجود شاید برایتان کافی نباشد و مثلا نیاز به application دیگری با عنوان blog داشته باشید.
برای اضافه کردن application جدید مراحل زیر را انجام دهید:
1) از frontend کپی گرفته و نام آن را به blog تغییر دهید، این کار را برای environments/dev/frontend و environments/prod/frontend نیز انجام دهید(کپی و تغییر نام به blog).
2) در application جدیدی که ایجاد کردین تمام namespace های frontend را به blog تغییر دهید.
3) در common\config\bootstrap.php کد زیر را اضافه کنید:
Yii::setAlias('blog', dirname(dirname(__DIR__)) . '/blog');
4) در خط فرمان از دستور php init استفاده کنید و فقط توجه داشته باشید که اگر قبلا پروژه را init کرده اید نباید دوباره frontend و backend را initialize کنید(در هنگام init به شما اخطار داده میشود که میتوانید جلوی سوال پرسیده شده در خط فرمان no را تایپ کنید)
تعدادی اصطلاح در elasticsearch وجود دارد که دانستن آنها در ابتدا به فرایند یادگیری بسیار کمک میکند.
Near Realtime (NRT)
elasticsearch یک بستر جستجوی نزدیک به زمان واقعی است، به این معنی که از زمان شاخص گذاری یک سند تا قابلیت جستجو در آن تاخیر کمی وجود دارد(معمولا یک ثانیه).
cluster
یک cluster مجموعه ای از یک یا چند node است(server) که با هم تمام اطلاعات را نگه داشته و شاخص گذاری و قابلیت جستجو را در بین تمام node فراهم میکنند.
node
یک node یک server تکی و قسمتی از cluster میباشد. که در ذخیره سازی داده های خود و شاخص گذای و فراهم کردن قابلیت جستجو شرکت میکند.
index
یک index مجموعه ای از document است که تا حدودی دارای ویژگی های مشابهی هستند، به عنوان مثال شما میتوانید یک index برای اطلاعات مشتریان، یک index از فهرست محصولات و یک index از اطلاعات سفارشات داشته باشید.
index به وسیله ی نام خود شناخته میشود، که باید حروف لاتین کوچک باشد. این نام در زمان شاخص گذاری، جستجو، ویرایش و حذف مورد استفاده قرار میگیرد.
در یک cluster تکی شما میتوانید هر چقدر index نیاز دارید تعریف کنید.
ادامه...قبلا در مورد قالب های yii2، پیکره بندی پایگاه داده و database migration توضیحاتی داده ام که لازم است قبل از مطالعه این درس ابتدا به هر سه موضوع سَری بزنید.
اگر از قالب advanced استفاده میکنید و تصمیم دارید وارد قسمت backend فریم ورک شوید(قسمتی که به طور معمول جهت پیاده سازی بخش مدیریتی پروژه از آن استفاده میشود) متوجه خواهید شد که نیاز به لاگین دارید.
http://localhost/advanced/backend/web/index.php?r=site%2Flogin
در درجه اول شما تا کنون هیچ نام کاربری در پروژه نساختید و حتی اگر بخواهید این کار را انجام دهید(قسمت signup که لینک آن در بخش frontend، منوی بالای صفحه است) با خطای "جدول user وجود ندارد" مواجه خواهید شد.
http://localhost/advanced/frontend/web/index.php?r=site%2Fsignup
برای حل این موضوع و دسترسی به قسمت backend پروژه باید مراحل زیر را طی کنید:
- پیکره بندی پایگاه داده را انجام دهید.
- داخل پروژه ابزار خط فرمان را باز کرده و دستور yii migrate را اجرا کنید. با اجرای این دستور migration مقدار دهی اولیه شده و جدول user هم ساخته خواهد شد.
- روی لینک signup که در منوی بالای قسمت fronend وجود دارد کلیک کنید و یک کاربر جدید بسازید.
- بعد از ایجاد کاربر به طور خودکار login میشود، در همان منو لینک logout و login هم وجود دارد.
در مهندسی نرم افزار، design patterns(الگوهای طراحی) راه حلهای قابل استفاده برای مشکلاتی هستند که معمولاً در طراحی نرمافزار اتفاق می افتند.
طرح های از پیش ساخته شدهای که میتوانید برای حل مشکلات آنها را سفارشی کنید. شما نمیتوانید یک الگو را با جستجو در stackoverflow پیدا و در برنامه خود کپی کنید. الگو ها یک قطعه کد خاص نیستند، مفاهیم کلی برای حل مشکلات خاص هستند. شما باید با درک این مفاهیم آنها را در برنامه خود پیادهسازی کنید.
Refactoring مجموعهای از تکنیکهاست که به منظور اصلاح و بهبود کدهای قبلی بدون تغییر در عملکرد و رفتارشان جهت خوانایی، کارامدی و قابلیت نگهداری بیشتر انجام میشود.
در کتاب Refactoring اثر Martin Fowler نوشته شده: refactoring تکنیک مرتب/منظم سازی برای تجدید ساختار کد موجود است. تغییر ساختار داخلی کد بدون تغییر رفتار خارجی آن.
refactoring یک سرمایهگذاری و راه حلی برای مقابله با کد کثیف و بدهی فنی است که باعث کاهش هزینههای توسعه نرمافزار در آینده خواهد شد.