>  기사  >  백엔드 개발  >  [PHP] Yii2 프레임워크의 함정

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

WBOY
WBOY원래의
2016-07-30 13:31:041060검색

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으로 문의하세요.
이전 기사:ELB 측 계몽다음 기사:ELB 측 계몽