CRUD с литием и MySQL - PullRequest
       24

CRUD с литием и MySQL

0 голосов
/ 09 августа 2011

Я только начал играть с литий-фреймворком PHP (v 0.10).
Я следовал краткому руководству , в котором в качестве базы данных используется MongoDB.
Чтобы узнать немного больше о литии, я хотел переключить СУБД с MonogoDB на MySQL.

Проблема, с которой я сталкиваюсь, когда я открываю /posts/ в браузере, литий показывает только пустую страницу без сообщений об ошибках. Кроме того, когда я перехожу к /posts/add/, отображается правильная форма, но после отправки данных (которые правильно записаны в БД), литий также просто отображает пустую страницу. Что не так?

Кроме того, после прочтения документации по литию на литиевых моделях я все еще не совсем уверен, какая логика (в данном случае) принадлежит модели.

UPDATE 1:

Похоже, что есть проблема с кэшированием APC. После установки APC и переименования папки, содержащей литий, приложение работало без ошибок. Если оставить имя папки, содержащей литий, без изменений, я получил ошибку в кеше:

Warning: include(/var/www/web/frameworks/lithium/app/resources/tmp/cache/templates/template_views_layouts_default.html_886_1308416958_798.php) [function.include]: failed to open stream: No such file or directory in /var/www/web/frameworks/lithium/libraries/lithium/template/view/adapter/File.php on line 111

Warning: include() [function.include]: Failed opening '/var/www/web/frameworks/lithium/app/resources/tmp/cache/templates/template_views_layouts_default.html_886_1308416958_798.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/web/frameworks/lithium/libraries/lithium/template/view/adapter/File.php on line 111

END UPDATE 1

Я вручную настроил таблицу MySQL posts со строками id, title и body.

Моя Posts.php модель в /app/models:

<?php
namespace app\models;

class Posts extends \lithium\data\Model {

}
?>

Мой PostsController.php контроллер в /app/controllers:

<?php

namespace app\controllers;

use app\models\Posts;

class PostsController extends \lithium\action\Controller {


    public function index() {
        $posts = Posts::all();
        return compact('posts');
        var_dump($posts);
    }

    public function add() {
        if($this->request->data) {
            $post = Posts::create($this->request->data);
            $success = $post->save();
        }
        return compact('success');
    }
}
?>

И, наконец, мои взгляды index.html.php в /app/views/posts/:

<?php foreach($posts as $post): ?>
<article>
    <h1><?=$post->title ?></h1>
    <p><?=$post->body ?></p>
</article>
<?php endforeach; ?>

А также add.html.php в /app/views/posts/:

<?=$this->form->create(); ?>
    <?=$this->form->field('title');?>
    <?=$this->form->field('body', array('type' => 'textarea'));?>
    <?=$this->form->submit('Add Post'); ?>
<?=$this->form->end(); ?>

<?php if ($success): ?>
    <p>Post Successfully Saved</p>
<?php endif; ?>

1 Ответ

3 голосов
/ 12 августа 2011

Несколько советов ...

1) Вы уверены, что Lithium работает правильно в целом?Я запутался в том, каков ваш настоящий вопрос / проблема.

2) Нет необходимости вносить изменения в ваш PostsController, Posts::all(); это просто сокращение для Posts::find('all');

3) Вам может потребоваться изменить вашу модель для сообщений, Lithium (с MySQL) будет ожидать, что столбец id в вашей таблице будет использоваться в качестве ключа, если у вас нет столбца с именем id вам может понадобиться добавить один к вашей модели.

Например, если у вас есть таблица с такими столбцами, как postid , title , body, date ... добавьте это к вашей модели

<?php
 namespace app\models;

 class Posts extends \lithium\data\Model { 
   public $_meta = array('key' => 'postid');        
 }

?>

Обратите внимание на 'key' => 'postid', который сообщит литию использовать postid в качестве ключа для таблицы вместо поиска id

4) Вот как на самом деле построить запрос MySQL в вашем контроллере ...

public function locations($companyid,$state=null) {

 /* removes null or false values with array_filter() */
 $conditions = array_filter(array('companyid' => $companyid, 'state' => $state));

 /* pass $conditions array to the Locations model, find all, order by city */
 $locations = Locations::find('all', array( 
       'conditions' => $conditions,
       'order' => array('city' => 'ASC')
 ));

 return compact('locations');

}

Обратитесь к руководству по эксплуатации лития для получения дополнительной помощи: http://li3.me/docs/manual

Модели

http://li3.me/docs/manual/working-with-data/using-models.md

Контроллеры

http://li3.me/docs/manual/handling-http-requests/controllers.md

Просмотров

http://li3.me/docs/manual/handling-http-requests/views.md

...