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