19 рекомендуемых практик разработки yii2 (резюме Abei)

база данных PHP сервер Composer Yii

Хотя стиль программирования у всех разный, есть несколько советов, как сделать ваш код более стандартизированным и стабильным.На этот раз я подытожу следующие пункты для обновления моего веб-сайта, надеюсь, это поможет вам в изучении и использовании yii2.

Описание окружающей среды

  • Серверная среда: CentOS
  • Среда разработки и IDE: mac и phpstorm
  • Yii: базовая версия v2.0.15

Далее поговорим

До разработки

Давайте сначала поговорим о вещах перед разработкой, наточим нож, не рубя по ошибке дрова, и настроим yii2 в состояние, которое легче всего разрабатывать.

Composer

Это краеугольный камень разработки yii2. Если нет возможности использовать его, пожалуйста, не сдавайтесь. В дополнение к более простой установке yii2 и сторонних расширений, возможность использовать Composer означает, что ваш сервер может запускать php- cli, то вы можете использовать командную строку yii, и это приведет к бесконечному обходу вашей разработки.

Для композитора есть несколько ключевых слов, которым следует уделить особое внимание при установке, обновлении и требовании.

китайская культура

Когда yii2 установлен по умолчанию, соответствующая информация о программе на английском языке, на первом этапе нам нужно изменить его на китайский, что очень просто.

// config/web.php
'language'=>'zh-CN'

проблема со статическим кешем

При использовании yii2 мы привыкли помещать статические файлы (изображения, файлы css, файлы js и т. д.) в классы ресурсов для управления, но могут возникнуть проблемы с кэшированием браузера, которых можно избежать путем настройки на этапе разработки, особенно в разработка Особенно полезно для мобильных страниц.

// config/web.php
'assetManager'=>[
    'appendTimestamp' => true
],

Настроить БД

Хотя yii2 очень дружелюбен к базам данных, особенно к mysql, мы все же должны использовать более стабильную и более позднюю версию, не говоря уже о том, что ваша программа не будет иметь мобильного терминала в будущем. сторонние библиотеки для решения проблемы с ошибкой.

если это возможно

  • mysql5.3.3 +
  • charset=utf8mb4 в config/db.php

настроить отладку

Если возможно, настройте расширение PHP, похожее на xdebug, и интегрируйте его в свою среду IDE. Неизбежно столкновение с ошибками, которые нелегко отловить в процессе разработки, что требует от вас постоянного наблюдения за значением определенных переменных и путем назначения, конкретная конфигурация может относиться к моему предыдущему курсу,Использование xdebug для поддержки отладки yii2 — конфигурация PhpStorm

Конечно, собственное расширение отладки yii2 также чрезвычайно полезно, особенно при настройке urlManager.

В развитие

Этот абзац знакомит вас с некоторыми моими привычками и советами по разработке yii2, надеюсь, он будет вам полезен.

единственная ответственность

Класс и метод должны иметь только одну ответственность, например следующий код

function getFullName(){
    $isAdmin = Administrator::find()->where(['user_id'=>$this->id])->one();
    if($isAdmin && $this->xxx == 1){
        return $this->first_name . " " . $this->last_name;
    }
}

Например, в приведенной выше ситуации лучше всего отдельно извлекать суждение о том, является ли он администратором, следующим образом:

function getFullName(){
    
    if($this->isAdmin() && $this->xxx == 1){
        return $this->first_name . " " . $this->last_name;
    }
}

function isAdmin(){
    return Administrator::find()->one();
}

Каждый метод представляет собой минимальную единицу решения проблемы.Для соответствующих знаний можно прочитать книгу "Рефакторинг - улучшение существующего кода".Брат Бэй прочитал ее года три назад.Там много советов и пользы.

Важность моделей

Многие новички в yii2 любят вписывать в действие контроллера много логики, это неправильно, наше внимание должно быть сосредоточено на модели, а контроллер только на ввод и вывод.

Возьмем в качестве примера ассоциации, следующий код не годится.

// 某个控制器
public function actionIndex(){
    // 这里还有很多代码
    ....
        
    //	获得三天前的某个会员的订单集合
	$order = Order::find()->where(["user_id"=>$userId])->andWhere([">","created_at",strtotime(date("Y-m-d",time()))-86400*3])->all();    
}

Нам лучше поместить эту логику в модель члена

// User模型
public function recent3DaysOrders(){
    return Order::find()->where(["user_id"=>$this->id])->andWhere([">","created_at",strtotime(date("Y-m-d",time()))-86400*3])->all();
}

// 控制器中
public function actionIndex(){
    $order = $user->recent3DaysOrders();
}

Код контроллера стремится быть простым и выполняет только базовый выбор входных данных и визуализацию выходных данных.

правило

Правильно это или нет, не пишите это небрежно.

// 某个控制器的action中
public function actionCreate(){
    $model = new User();
    if(Yii::$app->request->isPost){
        $model->load(Yii::$app->request->post());
        if($model->xxx == xxxx){
            // todo
        }
        if($model->save()){
            //
        }
    }
}

Приведенный выше код знаком, это то, что мы ожидаем, но иногда ввод не настолько честный, нам нужно выполнить дополнительную проверку, пожалуйста, не записывайте проверку непосредственно в действие, например, если решение в приведенном выше коде.

**Оставьте работу по проверке правилам и сценариям модели. **все.

Подумайте о повторном использовании в любое время (маленький кулон)

Принцип кодирования заключается в том, чтобы сделать все возможное для повторного использования кода, особенно виджетов, которые позволяют повторно использовать слой представления, а использование виджетов очень просто.

1,Создайте папку компонентов в @app

2,Создайте класс виджета в компонентах(должен наследовать yii\base\Widget)

3.Визуализировать вид виджета (при необходимости в компонентах/представлениях)

4.используй это

Я не понимаю? Я привожу пример.

// components/Top10.php
<?php
namespace app\components;

use yii\base\Widget;
class Top10 extends Widget {


    public function init(){
        parent::init();
    }

    public function run(){
        parent::run();

        return $this->render('top10');
    }
}

написать мнение

// components/views/top10.php
<h1>Hello Top10</h1>

используй это

// 某个视图
<?= \app\components\Top10::widget();?>

Конечно, кулон может быть очень сложным, например ActiveForm, GridView и т. д., которые мы используем. Я также написал статью о маленьком кулоне раньше, и заинтересованные студенты могут ее прочитать.портал

Будьте осторожны с петлями, связанными с AR

у меня такая проблема раньшевидеоСказав это, это проблема ленивой загрузки и мгновенной загрузки, например, следующий код не годится.

$customers = Customer::find()->limit(100)->all();

foreach ($customers as $customer) {
    // SELECT * FROM `order` WHERE `customer_id` = ...
    $orders = $customer->orders;
}

Приведенный выше код выполняет 101 запрос, что, если данных больше? Мы решили вышеуказанную проблему так.

// SELECT * FROM `customer` LIMIT 100;
// SELECT * FROM `orders` WHERE `customer_id` IN (...)
$customers = Customer::find()
    ->with('orders')
    ->limit(100)
    ->all();

foreach ($customers as $customer) {
    // 没有任何的 SQL 执行
    $orders = $customer->orders;
}

Уменьшено со 101 запроса до 2.

Сделайте свой код более «чистым»

Упомянутая здесь краткость означает не количество кода, а смысл. Например следующий код

// 方式1
if($num > 100){
    return 1
}else{
    return 2
}

// 方式2
return $num > 100 ? 1 : 2;

Когда логика кода очень простая, нам всем нравится второй способ, но если логика посложнее, то я предпочитаю способ 1, хотя может и много строчек, но смысл лаконичен, его можно понять, а он может понимать это.

Зачем тратить Ню Джина на то, чтобы написать выражение, которое кажется таким потрясающим! ! !

Добавьте попытку в PHP-код представления

При написании методов действия или модели, чтобы обеспечить стабильность кода, мы обычно используем синтаксическую структуру try....catch, но мало кто использует ее в представлении yii2.Помните, используйте его тоже!Например следующий код.

// 视图内
<?= \app\components\WechatLangSideMenu::widget();?>

Что делать, если в приведенном выше коде есть ошибка, я рекомендую писать следующим образом

<?php
try {
    echo \app\components\WechatLangSideMenu::widget();
}catch(\Exception $e){
	//	可以不处理也可以写你自己的错误处理。
}
?>

Будьте осторожны, чтобы сделать десятитысячный корабль.

Не пишите много, используйте константы или конфигурацию.

Некоторые коды требуют некоторого суждения, и эталоном для суждения являются определенные значения, такие как следующий код

if($this->type === 1){
    return "文章";
}else if($this->type === 2){
    return "专栏";
}

Я рекомендую написать это

if($this->type === Item::ARTICLE_TYPE){
    return "文章";
}else if($this->type === Item::TOPIC_TYPE){
    return "专栏";
}

ARTICLE_TYPE и TOPIC_TYPE — две константы модели Item.

Использование сценариев миграции

Я говорил это много раз, и я повторю это снова в этой статье: Для части базы данных программы yii2, пожалуйста, используйте миграцию для управления ею.

И эти сценарии должны быть собраны вместе в вашем контроле версий, имейте в виду, что сценарии миграции обычно состоят из двух частей.

  • скрипт структуры
  • Импорт исходных данных

Многие люди игнорируют вторую категорию. Кроме того, при выполнении скрипта миграции, если ваша таблица имеет префикс, то скрипт пишется следующим образом

{{%user}}// discuz_user

вопрос времени

При использовании yii2 для разработки веб-приложений mysql нам нравится использовать метки времени для полей времени таблиц данных.Как правило, в таблице есть поля времени создания записи и времени обновления.

Для их обновления используйте встроенный класс поведения TimestampBehavior yii2, тогда нам не нужно беспокоиться о заполнении данных поля, следующий код

namespace app\models;

use Yii;
use yii\behaviors\TimestampBehavior;

class Article extends \yii\db\ActiveRecord {
    
    public function behaviors(){
        return [
            [
                'class' => TimestampBehavior::className(),
            ]
        ];
    }    
}

Итак, в таблице данных я рекомендую правила именования полей времени следующим образом.

  • Создано в created_at
  • время обновления updated_at

Таким образом, приведенного выше кода вполне достаточно, и нет необходимости указывать поля.

Помните: снимите необходимые ограничения для полей created_at и updated_at в правилах.

Это родительский класс или поведение

На самом деле я никого не исключаю, у каждого есть свои преимущества и недостатки, родительский класс прост в использовании, но увеличивает связь, связь поведения низкая, но конфигурация сложнее, чем у прямого родительского класса.

Конечно, концепция немного другая

  • Поведение Некоторые свойства, присоединенные к классу
  • Родительский класс Общие свойства некоторых классов

Мое использование (не обязательно правильное), особенно в модулях. Мне нравится добавлять родительский класс к контроллеру.

развитый

После того, как программа будет разработана, вам еще нужно настроить некоторые программы yii2, многие из которых вы должны уже знать.

входной файл

Сначала нам нужно изменить режим работы yii2 с режима разработки на режим производства.Общий код выглядит следующим образом.

// index.php
defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_ENV') or define('YII_ENV', 'prod');

страница ошибки

Для стабильной программы не имеет значения, сообщается ли об ошибке.Важна обработка после сообщения об ошибке.Поскольку пользователи считают, что это хорошо и полезно для разработчиков, я уже писал статью, вы можете ее прочитать"Использование yii2 для реализации страницы обработки ошибок в стиле YouTube"

urlManager

Строго говоря, это нужно делать на этапе разработки, для того, чтобы быть лучше для поисковых систем и повысить безопасность программы, мы должны украсить url, например

/index.php?r=admin/user/index // 写成 /admin/user-index.html

Конкретную конфигурацию urlManager и общую конфигурацию веб-сервера см. в том, что я писал ранее.Шпаргалка, с готовым кодом.

резюме

Случайно так много написал, конечно, при разработке yii2 следует уделить внимание большему, чем этим, и я расскажу об этом позже.