백엔드 개발 PHP 튜토리얼 [PHP] Yii2 프레임워크의 함정

[PHP] Yii2 프레임워크의 함정

Jul 30, 2016 pm 01:31 PM
body color font markdown

Yii2框架의 几个隐蔽적坑


摘要:Yii2是一款优秀의 통용 웹后端框架,结构简单优雅, 实用功能丰富, 扩展性强, 性能搞是他最突aturate优点.赘述。而这些隐蔽的小瑕疵,显得更有必要告诉대가족。


  • 블로그: http://www.cnblogs.com/jhzhu
  • 이메일: jhzhuustc@gmail.com
  • 저자: Zhimingso
  • 시간: 2015-08-17

목차

  • Yii2 프레임워크의 숨겨진 함정
    • 목차 목차
    • 가십 얘기
    • ActiveRecord가 설명할 수 없이 작성되었다고요?
      • 지식 준비
      • 코드 장면
      • 문제 요약
      • 해결 방법
    • 거래가 적용되었나요? ?
      • 코드씬
      • 문제요약
      • 해결방법
    • 'Y-m-d'가 인식되지 않나요?
      • 코드 장면
      • 문제 요약

가십 이야기

거리 마지막으로 블로그를 운영한지 3개월이 지났습니다. 글을 쓰기 전에는 늘 깊은 죄책감을 느낍니다. 나는 오랫동안 이것에 시달린 끝에 마침내 조치를 취했습니다.

축하할 만한 일 중 하나: 최근에는 매일 아침 8시 30분에 일어나 운동을 시작했습니다. 매우 유용하고 단 8분밖에 걸리지 않는 두 개의 비디오가 있습니다. 그냥 따라하시면 ​​여러분이 행복해지겠지만 폭발하지는 않을 것이라고 장담합니다. (8분 복근 운동 레벨 2 - 다운로드, 8분 가슴 근육 운동 레벨 2 - 다운로드)

생각해 볼 만한 한 가지: 최근에 "쇼펜하우어의 미학에 관한 에세이"를 읽었고 그것이 제 인생을 바꿔 놓았습니다. 독서에 대한 견해. 나는 독서가 발전의 원천이라고 생각했는데, 이 책을 읽고 뺨을 크게 맞았습니다. 자, 한 단락을 공유하겠습니다.

우리가 보는 외부 환경은 독서 자료처럼 우리 마음에 특정 의견을 강요하지 않는 한, 우리에게 자료와 기회만 제공할 뿐입니다. 우리의 정신적 능력에 비례하고 현재의 감정과 일치하는 것을 생각하는 것입니다. 그러므로 너무 많이 읽으면 용수철에 무거운 물건을 계속 눌렀을 때 용수철이 탄력을 잃게 되는 것처럼 우리의 정신은 탄력성을 잃게 됩니다. 자유로운 순간, 바로 책을 집으세요.

생각이 발전의 원천입니다!

자, 말도 안되는 소리는 그만하고 본론으로 들어가겠습니다.

ActiveRecord가 설명할 수 없이 작성되었나요?

지식의 기본 사용법을 준비하세요

  1. ActiveRecord. 이해가 안 되시면 여기를 참고하시면 됩니다.

코드 장면

<span>/**</span><span> * @property integer $id</span><span> * @property string $name</span><span> * @property string $detail</span><span> * @property double $price</span><span> * @property integer $area</span><span> **/</span><span>class OcRoom extends ActivieRecord</span><span>{</span><span>    ...</span><span>}</span><span>$room = OcRoom::find()      //先取出一个对象。</span><span>    ->select(['id'])        //只取出'id'列</span><span>    ->where(['id'=>20])</span><span>    ->one();</span><span>$room->save();              //保存,会发现此行的其它字段都被写成默认值了。</span>
로그인 후 복사

문제 요약

이 예제의 문제점은 다음과 같습니다.

  1. I 데이터베이스에서 한 행을 꺼냈는데, 이는 코드의 $room인데 id 필드만 빼고 나머지 필드는 당연히 기본값입니다.
  2. $room->save()할 때 기본값이 있는 해당 필드도 데이터베이스에 저장되었습니다. 뭐!?
  3. 즉, 리소스를 저장하고 모든 필드를 제거하지 않으려는 경우 저장하지 않도록 주의해야 합니다. 그렇지 않으면 많은 데이터가 설명할 수 없을 정도로 기본값으로 수정됩니다.

해결책

그런데 우리가 가지고 있는 해결책은 무엇입니까? 여러 가지 아이디어 제공:

  1. 완전히 꺼내지 않은 ActiveRecord을 저장하지 않도록 항상 주의하세요.
  2. ActiveRecord을 수정하거나 상속하므로 이 객체가 find()에 의해 생성되고 필드가 완전히 제거되지 않은 경우 save() 메서드가 호출되고 예외가 발생합니다.
  3. ActiveRecord에 의해 이 객체가 생성되고 필드가 완전히 추출되지 않은 경우 find() 메서드 호출 시 추출된 필드만 저장되고 다른 필드는 추출되도록 save()을 수정하거나 상속합니다. 무시되었습니다.

거래가 적용되었나요?

코드 장면

<span>/**</span><span> * @property integer $id</span><span> * @property string $name</span><span> **/</span><span>class OcRoom extends ActiveRecord</span><span>{</span><span>    public function rules()</span><span>    {</span><span>        return [['name','string','min'=>2,'max'=>10]];</span><span>    }</span><span>    ...</span><span>}</span><span>class OcHouse extends ActiveRecord</span><span>{</span><span>    public function rules()</span><span>    {</span><span>        return [['name','string','max'=>10]];</span><span>    }</span><span>    ...</span><span>}</span><span>$a = new OcRoom();</span><span>$a->name = '';                //name为空字符串,不满足rules()条件。</span><span>$b = new OcHouse();</span><span>$b->name = '我的房间';         //name合法,可以保存。</span><span>$transaction = Yii::$app->db->beginTransaction();</span><span>try{</span><span>    $a->save();               //name字段不合法,无法验证通过,在validate()阶段已经返回false,不会进行数据库存储的步骤,所以也不会抛出异常。</span><span>    $b->save();               //name字段合法,可以正常保存。</span><span>    $transaction->commit();   //提交后,发现$a保存失败,而$b保存成功。</span><span>}</span><span>catch (Exception $e) </span><span>{</span><span>    Yii::error($e->getTraceAsString(),__METHOD__);</span><span>    $transaction->rollBack();</span><span>}</span>
로그인 후 복사

문제 요약

이 코드의 문제는 다음과 같습니다.

  1. 모두가 알고 있습니다$transaction의 목적은 전체 데이터베이스 저장 코드가 성공하거나 실패하는지 확인하는 것입니다.
  2. 분명히 이 예에서 transaction는 우리가 원하는 효과를 얻지 못합니다. $avalidate()이 전달되지 않았기 때문에 $transation->commit()이 전달되면 오류가 보고되지 않습니다.

해결 방법

$transation 블록에서는 모든 save()이 반환 값을 결정해야 합니다. false이면 예외가 직접 발생합니다.

'Y-m-d'가 인식되지 않나요?

코드 장면

<span>OcRenterBill extends ActiveRecord</span><span>{</span><span>    public function rules()</span><span>    {</span><span>        return [</span><span>            ['start_time','date','format'=>'Y-m-d'],</span><span>        ];</span><span>    }</span><span>}</span><span>$a = new OcRenterBill();</span><span>$a = '2015-09-12';</span><span>$a->save();                 //会报错,说格式不对。</span>
로그인 후 복사

문제 요약

Yii 프레임워크가 처음에 오류를 보고하는 경우 이는 함정으로 간주되지 않습니다. 문제는 Mac에서 개발할 때는 완전히 정상적으로 작동하는데, 온라인 환경(Ubuntu)에 퍼블리시하고 나면 "start_time 속성 형식이 잘못되었습니다."라는 오류가 뜹니다. 공식 문서를 참고해 보니 공식 문서에서는 이 형식이 허용되는 것으로 나타났습니다.

아아아. 여러 시행착오 끝에 php:Y-m-d로 바꾸면 세상이 더 깨끗해질 것이라는 걸 깨달았습니다. 따라서 이 문제가 발생하면 저에게 감사드립니다.

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Vue3가 마크다운을 구문 분석하고 코드 강조 표시를 구현하는 방법 Vue3가 마크다운을 구문 분석하고 코드 강조 표시를 구현하는 방법 May 20, 2023 pm 04:16 PM

Vue로 블로그 프론트엔드를 구현하려면 마크다운 파싱을 구현해야 합니다. 코드가 있는 경우 코드 하이라이팅을 구현해야 합니다. markdown-it, vue-markdown-loader,marked,vue-markdown 등과 같은 Vue용 마크다운 구문 분석 라이브러리가 많이 있습니다. 이 라이브러리는 모두 매우 유사합니다. 여기서는 Marked가 사용되었고, 코드 하이라이팅 라이브러리로 하이라이트.js가 사용되었습니다. 구체적인 구현 단계는 다음과 같습니다. 1. 종속 라이브러리를 설치합니다. vue 프로젝트에서 명령 창을 열고 다음 명령 npminstallmarked-save//marked를 입력하여 markdown을 htmlnpmins로 변환합니다.

Python에서 Markdown 편집기를 구축하는 방법 Python에서 Markdown 편집기를 구축하는 방법 May 13, 2023 am 09:58 AM

먼저 Python3과 Tkinter가 설치되어 있는지 확인하세요. 우리에게 필요한 다른 것들은 tkhtmlview와 markdown2입니다. pipinstalltkhtmlviewmarkdown2 또는 pip3installtkhtmlviewmarkdown2(Python 버전이 여러 개인 경우)를 실행하여 설치할 수 있습니다. 이제 즐겨 사용하는 편집기나 IDE를 실행하고 새 파일을 만듭니다(예: www.linuxidc.com.py(저는 linuxidc.com editor로 이름 지정)). 필요한 라이브러리를 가져오는 것부터 시작하겠습니다. fromtkinterimport*fro

Python의 Pygame 글꼴 모듈 - 텍스트와 글꼴을 사용하는 방법은 무엇입니까? Python의 Pygame 글꼴 모듈 - 텍스트와 글꼴을 사용하는 방법은 무엇입니까? Apr 23, 2023 pm 11:19 PM

Pygame의 글꼴 텍스트와 글꼴 Pygame은 텍스트 그리기 목적을 달성하기 위해 pygame.font 모듈을 사용하여 글꼴 개체를 만듭니다. 이 모듈의 일반적으로 사용되는 메서드는 다음과 같습니다: 이름 설명 pygame.font.init() 글꼴 모듈 초기화 pygame.font.quit() 글꼴 모듈 초기화 해제 pygame.font.get_init() 글꼴 모듈이 초기화되었는지 확인하고 부울 값을 반환합니다. pygame.font.get_default_font()는 기본 글꼴의 파일 이름을 가져옵니다. 시스템에서 글꼴의 파일 이름을 반환합니다. pygame.font.get_fonts()는 모두 가져옵니다.

VScode에서 Markdown을 구성하는 방법(기본 구문 사용)에 대해 이야기해 보겠습니다. VScode에서 Markdown을 구성하는 방법(기본 구문 사용)에 대해 이야기해 보겠습니다. Dec 07, 2022 pm 03:40 PM

VScode에서 마크다운을 사용하는 방법은 무엇입니까? 다음 글에서는 VScode에서 Markdown을 구성하는 방법을 소개하고 Markdown의 기본 구문에 대해 설명하겠습니다.

PHP를 사용하여 마크다운 변환을 구현하는 방법 PHP를 사용하여 마크다운 변환을 구현하는 방법 Mar 24, 2023 pm 02:30 PM

사람들이 계속해서 기술을 추구함에 따라 복잡한 작업을 단순화하는 데 도움이 되는 도구와 애플리케이션이 점점 더 많이 개발되고 있습니다. 그 중 하나가 일반 텍스트를 HTML 형식의 텍스트로 변환하는 경량 마크업 언어인 Markdown입니다. 이 기사에서는 PHP를 사용하여 Markdown 변환을 구현하는 방법을 소개합니다.

ThinkPHP6에서 마크다운을 사용하는 방법 ThinkPHP6에서 마크다운을 사용하는 방법 Jun 20, 2023 pm 11:00 PM

현대 인터넷 시대의 발전 속에서 문서 작성은 번거로운 HTML 태그에서 점점 더 간단하고 읽고 쓰기 쉬운 마크다운 구문으로 바뀌었습니다. ThinkPHP6은 매우 유연한 템플릿 엔진을 사용하고 편리한 Markdown 확장 기능을 제공하므로 프로젝트에서 Markdown 파일을 매우 쉽게 작성하고 표시할 수 있습니다. 마크다운이란 무엇입니까? 마크다운은 일반 텍스트로 작성된 문서를 HTML로 빠르게 변환하여 사용할 수 있는 경량 마크업 언어입니다.

이 리눅스 명령어를 사용한 후, 상사는 급여 인상 목록에 직접 내 이름을 올렸습니다. 이 리눅스 명령어를 사용한 후, 상사는 급여 인상 목록에 직접 내 이름을 올렸습니다. Feb 27, 2024 pm 08:49 PM

개요 Linux 시스템에서는 파일과 디렉터리를 처리하기 위해 명령줄을 자주 사용합니다. 마크다운은 문서를 빠르게 생성하고 서식을 지정하기 위한 간결한 마크업 언어입니다. 그러나 Markdown 파일을 읽고 관리하려면 많은 수의 명령과 매개변수가 필요할 수 있으므로 초보자에게는 다소 복잡할 수 있습니다. 이때 글로우 명령을 이용하면 작업을 단순화할 수 있습니다. Glow는 Linux 터미널에서 Markdown 파일 렌더링을 단순화하도록 설계된 명령줄 도구입니다. 주요 목표는 사용자에게 보다 직관적이고 관리하기 쉬운 Markdown 파일 읽기 환경을 제공하는 것입니다. Glow에는 Markdown 파일을 보다 쉽게 ​​보고 관리할 수 있는 사용자 친화적인 그래픽 인터페이스가 함께 제공됩니다. 이 인터페이스를 사용하면 기억할 필요가 없습니다.

프로그래머를 위한 필수 마크다운 치트 시트! 프로그래머를 위한 필수 마크다운 치트 시트! Feb 16, 2023 am 11:22 AM

이 글의 주요 내용은 Markdown 치트 시트를 요약하고 공유하는 것입니다. 관심 있는 친구들은 아래에서 이 내용을 살펴보는 것이 모든 사람에게 도움이 되기를 바랍니다.

See all articles