Maison >développement back-end >tutoriel php >Résumé des points de connaissance de cakephp

Résumé des points de connaissance de cakephp

高洛峰
高洛峰original
2017-02-25 16:20:511268parcourir

Les exemples de cet article résument les points de connaissances courants de cakephp. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

1. Appelez le modèle d'autres contrôleurs et redirigez

Méthode 1 :

Appelez le modèle hello.ctp sous /views/tasks/tasks ici

$this -> viewPath = 'tasks';
$this -> render('hello');

Méthode 2 (avec paramètres) :

$this->redirect(array('controller'=>'users','action'=>'welcome',urlencode($this->data['name'].'haha')) );

2. Pour interroger

utilisez directement les paramètres de sql :

$this->PostContent->query("select * from user");
find():
$clue = $this->clue->find('all',
  array(
    'fields' =>array(
      'id',
      'title',
      'content'
    ),
    'order' => 'id ASC',
    'conditions' => array('id' => '1'),
  )
);

find, le premier peut être all, first et count, et le deuxième paramètre est un tableau. La clé du tableau peut être : conditions, champs, ordre, limite, décalage et jointures.

Ajouté :

$this->clue->create();
$this->clue->save($this->data);

Modifié :

$this->clue->create();
$this->clue->save($this->data);

Supprimer :

$this->clue->delete($id)

3. Lorsque les styles publics ne sont pas nécessaires

$this->layout = false;

Pas besoin de restituer une vue

$this->autoRender = false;

Définir des méthodes/classes publiques

Méthode 1 :

Vous pouvez définir une méthode publique dans /app/Controller/AppController.php

Appeler

$this->test();

Méthode 2 :

Créer UtillComponent.php dans /app/controllers/components

<?php
  class UtillComponent extends Object
  {
   function juanstr ($str) {
     return $str.&#39;+juanstr&#39;;
   }
  }
?>

Appeler :

var $components = array(&#39;Utill&#39;);
$digit1 = $this->Utill->juanstr($digit1);

5. Définir le message d'invite

$this->Session->setFlash(__(&#39;The user has been saved&#39;));

<p class="wrong"><?php echo $this->Session->flash();?></p>

ou

$this->Session->write(&#39;Message.auth&#39;,array(&#39;message&#39;=>__(&#39;The user has been saved.&#39;,true),&#39;element&#39;=>&#39;&#39;,&#39;params&#39;=>array()));

<p class="wrong"><?php echo $this->Session->flash(&#39;auth&#39;);?></p>

6. Les paramètres de session

sont disponibles sur : http:/ /www.php.cn/

check(string $name);

Vérifiez s'il existe déjà un élément de données avec $name comme valeur clé dans la session.

del(string $name); <p>delete(string $name);</p>del(string $name);<br>delete(string $name);Supprime la variable de session spécifiée par $name.

valid renvoie true lorsque la session est valide. Il est préférable de l'utiliser avant l'opération read() pour déterminer si la session à laquelle vous souhaitez accéder est effectivement valide.

read(string $name);

Renvoie la valeur de la variable $name.

renouveler

Mettez à jour les informations de la session d'origine vers la nouvelle session en créant un nouvel ID de session, en supprimant l'ID d'origine.

write(string $name, mixed $value);

Écrivez les variables $name, $value dans la session

error

Renvoie l'erreur la plus récente générée par Cake Session Component, couramment utilisé pour le débogage.

7. Formulaire

<?php echo $this->Form->create(&#39;Subject&#39;,array(
  &#39;type&#39; => &#39;post&#39;,
  &#39;inputDefaults&#39;=>array(
    &#39;p&#39;=>false,
    &#39;label&#39;=>false
    ),
  &#39;url&#39;=>array(
      &#39;controller&#39;=>&#39;subjects&#39;,
      &#39;action&#39;=>&#39;edit&#39;
    ),
  &#39;onsubmit&#39;=>&#39;return validateCallback(this, dialogAjaxDone);&#39; //提交前验证
  )
);
echo $this->Form->input(&#39;id&#39;,array(&#39;type&#39;=>&#39;hidden&#39;));
echo $this->Form->input(&#39;uid&#39;,array(&#39;type&#39;=>&#39;hidden&#39;));
?>
<ul class="usr_info_basic">
<li>
  <p class="ti">下拉单选(编辑页面会自动判断选中)</p>
  <p class="ce">
<?php echo $this->Form->input(&#39;type&#39;,array(&#39;type&#39;=>&#39;select&#39; ,&#39;class&#39;=>&#39;ipt&#39;,&#39;options&#39; => array(0=>&#39;文章&#39;,1=>&#39;专题&#39;, 2=>&#39;图组&#39;)));?>
  </p>
</li>
<li>
  <p class="ti">多选</p>
  <p class="ce">
<?php
  echo $this->Form->input(&#39;pushtype&#39;, array(&#39;type&#39;=>&#39;select&#39;,
    &#39;options&#39; => $pushtype,//所有选项
    &#39;multiple&#39;=>&#39;checkbox&#39;,
    &#39;selected&#39; => $pushtypes,//选中的项
));
?>
  </p>
</li>
</ul>
<p class="btns_3">
  <button class="btn3" type="submit"><span>保存</span></button>
  <button class="btn3 btn3_1 close"><span>取消</span></button>
</p>
<?php echo $this->Form->end();?>

8. ;

Appeler directement dans le contrôleur :

$this->log(&#39;Something brok2&#39;,LOG_DEBUG);

ou appeler dans la vue :

Les types de journaux sont à peu près les suivants :

$levels = array(
  LOG_WARNING=> &#39;warning&#39;,
  LOG_NOTICE=> &#39;notice&#39;,
  LOG_INFO=> &#39;info&#39;,
  LOG_DEBUG=> &#39;debug&#39;,
  LOG_ERR=> &#39;error&#39;,
  LOG_ERROR=> &#39;error&#39;
);

Les fichiers journaux sont enregistrés dans / répertoire app/tmp/logs.

Il existe des options de configuration des journaux dans le fichier /app/config/core.php :

define(&#39;LOG_ERROR&#39;, 2);

9. Rendu Chemin

echo APP . &#39;webroot&#39; . DS;
//D:\wamp\www\cakephp\app\webroot\
echo APP . &#39;webroot&#39; ;
D:\wamp\www\cakephp\app\webroot

Pièce jointe : 21 conseils à connaître sur CakePHP

Cet article peut le est considéré comme le plus classique parmi les tutoriels CakePHP. Bien qu'il ne s'agisse pas d'une série complète, étape par étape, l'auteur a résumé sa propre expérience dans l'utilisation de CakePHP en 21 éléments, qui sont très utiles, notamment pour les novices.

Lors de la traduction, certains mots propres à CakePHP ont été intentionnellement laissés non traduits, comme contrôleur, modèle, etc. Je crois que les personnes qui ont appris CakePHP devraient être capables de comprendre leur signification immédiatement.

De plus, le wiki de CakePHP a expiré et a été remplacé par un site Web appelé bakery. Les liens vers le wiki cités dans l'article original ont également été mis à jour vers la boulangerie.

Créer rapidement des pages statiques

Je souhaite créer plusieurs pages, qui contiennent uniquement des données statiques, utilisent la mise en page par défaut et ne nécessitent aucun modèle. Au départ, j'ai essayé de créer un contrôleur et de définir une action pour chaque page statique. Mais cette méthode est lourde et ne convient pas pour créer rapidement des pages statiques.

En fait, vous pouvez le faire en utilisant le contrôleur de pages - créez simplement une vue sous le dossier vues/pages et accédez-y via /pages. Par exemple, j'ai créé /views/pages/matt.thtml, accessible via http://www.php.cn/.

Changer le titre de la page statique

Si vous souhaitez modifier le titre de la page lors de l'utilisation du contrôleur de pages, ajoutez simplement le code suivant à la vue :

<? $this->pageTitle = &#39;Title of your page.&#39;; ?>

Envoyer des données à la mise en page dans une page statique

Si vous devez transmettre des données à la mise en page (par exemple , indiquant quelle partie de la barre de navigation doit être mise en surbrillance (Variables affichées), vous pouvez ajouter le code suivant à la vue :

<? $this->_viewVars[&#39;somedata&#39;] = array(&#39;some&#39;,&#39;data&#39;); ?>

Ce tableau peut être accessible via $somedata dans la mise en page.

Créez rapidement une gestion en arrière-plan

Si vous devez créer un programme de gestion en arrière-plan et souhaitez que toutes les actions de gestion soient situées dans un dossier spécifique, ouvrez config/core. php et supprimez le commentaire de la ligne suivante :

define(&#39;CAKE_ADMIN&#39;, &#39;admin&#39;);

这样所有以"admin_"开头的action都可以通过 /admin/yourcontroller/youraction 来访问。例如,如果在posts controller中创建了名为"admin_add"的action,那么可以通过 www.example.com/admin/posts/add 访问这个action。这样就可以方便地为admin目录设置密码以避免他人随意访问。

查看后台执行的SQL语句

只需改变config/core.php中的DEBUG常量,即可看到后台执行的SQL语句。0为产品级,1为开发级,2为完整调试SQL,3为完整调试SQL并显示对象数据。我通常将DEBUG设置为2,这样每页的底部会显示出一个包含SQL调试信息的表格。

如果页面底部添加的表格会破坏页面布局(特别是使用Ajax获取页面并显示到页面中间而不是底部时),你可以在CSS中添加以下代码以隐藏调试信息:

#cakeSqlLog { display: none; }

这样既能保持页面布局,又可以通过查看源代码来看到调试信息。当然最后发布网站时别忘了将调试级别改回0。

获取丰富的开发文档

别总是盯着手册。wiki和API也是无价之宝。wiki中的开发指南十分有用,而API文档初看起来比较难,但你很快就会发现这里的信息对你创建CakePHP网站十分重要。

使用bake.php

Bake是个命令行PHP脚本,可以根据数据库自动生成model、controller和view。在开发的最初阶段,我强烈推荐使用scaffolding让你的原型程序跑起来。但如果你清楚地知道scaffolding不合适,我推荐你使用bake。bake会生成所有的文件并保存到磁盘上,以便你随意修改。这样能节省创建关联、view、基本的CRUD crollder操作的重复工作。

(译者注:CRUD - Create, Read, Update, Delete,数据库应用的四种基本操作,即"增删查改"。)

bake很方便。你只需在数据库中建立一个表,然后到 /cake/scripts/ 目录下执行php bake.php 即可。

如果你通过交互方式来运行bake,它会分几步提示你创建model、controller和view。创建结束之后,我通常会阅读所有生成的代码并做必要的修改。

发布程序时注意权限

有一次我在发布程序时,将整个cake目录打包然后用scp上传到了服务器上。只要一关闭调试信息,就会出现错误——数据库调用无法返回任何数据。我一筹莫展,因为我必须通过调试信息才能调试问题。后来有人告诉我,/app/tmp应当对apache可写。将权限改为777之后问题就解决了。

复杂model验证

我需要进行更复杂的验证,而不仅仅是验证输入框非空或者符合某个正则表达式这样的简单验证。例如,我要验证用户注册时使用的邮件地址是否已被使用。在wiki中我找到了这篇关于高级验证的文章,其中提到了一些十分有用的高级验证方法。

记录错误日志

$this->log(&#39;Something broke&#39;);

这样可以将错误记录到 /tmp/logs/ 中(我最初以为会记录到apache的错误日志中)。

让controller使用其他model

如果你的controller需要调用来自不同model的数据,只要在controller开头使用如下代码:

class yourController extends AppController {
 var $uses = array(&#39;Post&#39;,&#39;User&#39;);
}

这样controller就能访问Post和User model了。

创建不使用数据库表的model

我需要创建一个不使用任何表的model。例如,我想通过$validate数组方便底验证输入数据,保持model逻辑的正确性。但创建model时对应的表不存在,CakePHP就会报错。通过在model中加入以下代码可以解决这个问题:

var $useTable = false;

你也可以通过这种方法改变model对应的表名。

var $useTable = &#39;some_table&#39;;

重定向之后记得exit()

对于有经验的人来说这应当是理所当然的事儿,调用 $this->redirect() 之后,剩下的代码如果不想运行要exit()。我也这样做,但以前曾经认为 $this->redirect() 会为我调用exit(实际上不会)。

高级model函数

翻翻API就能发现很多你不知道的非常有用的函数。我强烈推荐至少阅读一遍 Model 类的参考手册。下面是以前我没注意到的几个重要函数:

generateList() - 主要用于生成选择框(ca43c4a4e4e9a57ee85d2406306544fb)所需的数据
query() - 自己写SQL语句来查询
findCount() - 返回满足指定条件的行数
hasAny() - 当有记录满足条件时返回真

再次强烈推荐阅读整个model类参考,你会为你学到的东西赞叹的。

如何正确插入多行

我需要遍历一个列表,并将其中的每个元素都插入到数据库中。我发现如果在一次插入完成后立即进行下一次插入,那么第二次插入的内容完全不会被插入,而是会被更新到第一次插入的行中。例如:

$items = array(&#39;Item 1&#39;,&#39;Item 2&#39;,&#39;Item 3&#39;);
foreach ($items as $item) {
 $this->Post->save(array(&#39;Post&#39; => array(&#39;title&#39; => $item)));
}

这段代码将在posts表中插入仅一行:“Item 3”。CakePHP首先插入“Item 1”,但马上将其更新为“Item 2”,再更新为“Item 3”,因为$this->Post->id保存的是上一次插入成功的行的id。通常这个特性很有用,但在这个例子中反而帮了倒忙。其实只要在每次插入之后设置 $this->Post->id = false 就可以解决这个问题。

更新:有人发邮件告诉我,正确的做法是调用create()初始化model,再set/save新数据。

在controller函数之前或之后插入逻辑

假设你需要在controller渲染的每个view中都设置一个颜色数组,但你不希望在每个action中都定义它。可以通过 beforeRender() 回调函数来实现:

function beforeRender() {
 $this->set(&#39;colors&#39;,array(&#39;red&#39;,&#39;blue&#39;,&#39;green&#39;);
}

这样该controller渲染的所有view都可以访问$colors变量。beforeRender()函数在controller逻辑结束后、view被渲染之前执行。同样,beforeFilter()和afterFilter()函数会在每个controller action执行的前后执行。更多信息请阅读手册的models一节。

为CakePHP添加所见即所得编辑器

这里有一篇非常好的教程教你如何在CakePHP中使用TinyMCE。基本上你只需在页面上链接tiny_mce.js文件,然后添加一些初始化代码以设置将哪个textarea变成TinyMCE编辑器即可。

自定义HABTM关系的SQL语句

我曾试图在自定义的SQL语句上定义一个HABTM关系(has-and-belongs-to-many),却遇到了问题。根据本文撰稿时的文档,应当先在自己的model中设置finderSql,但从CakePHP的源代码来看,应该设置finderQuery。这只是文档中的一个小问题,但指出问题却能为他人节约时间。Trac ticket在这里。

发送邮件

我在wiki中找到两篇教程:发送邮件和通过PHPMailer发送邮件。强烈推荐后者,通过PHPMailer发送邮件更安全,而且不需要自己处理邮件头,减少许多麻烦。

自定义Helper生成的HTML

我需要修改调用$html->selectTag()时生成的5a07473c87748fb1bf73f23d45547ab8,使其生成“请选择”选项来代替默认的空白选项。我也希望单选按钮能带有标签,这样用户就无需精确地点击单选按钮本身,而只需单击到关联的文字上即可。

建立 /app/config/tags.ini.php,然后添加以下的内容:

; Tag template for a input type=&#39;radio&#39; tag.
radio = "<input type="radio" name="data[%s][%s]" id="%s" %s /><label for="%3$s">%s</label>"
; Tag template for an empty select option tag.
selectempty = "<option value="" %s>-- Please Select --</option>"

你可以从/cake/config/tags.ini.php中获得完整的标签列表。但我不建议修改该文件,否则升级CakePHP时可能会让你的修改丢失。

自定义404页面

如果你需要自定义404页面,只需创建 /app/views/errors/error404.thtml。

更多cakephp知识点汇总相关文章请关注PHP中文网!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn