zoukankan      html  css  js  c++  java
  • PHP开发笔记(2)CakePHP

    安装 PHP 开发环境

    PHP开发笔记(1)开发环境

    安装使用 CakePHP

    官方示例 CMS(内容管理)

    # 创建新的应用程序
    $ composer create-project --prefer-dist cakephp/app:4.* cms
    $ cd cms
    # 启动服务器
    $ bin/cake server
    # http://localhost:8765/
    

    创建数据库

    USE cake_cms;
    
    CREATE TABLE users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        email VARCHAR(255) NOT NULL,
        password VARCHAR(255) NOT NULL,
        created DATETIME,
        modified DATETIME
    );
    
    CREATE TABLE articles (
        id INT AUTO_INCREMENT PRIMARY KEY,
        user_id INT NOT NULL,
        title VARCHAR(255) NOT NULL,
        slug VARCHAR(191) NOT NULL,
        body TEXT,
        published BOOLEAN DEFAULT FALSE,
        created DATETIME,
        modified DATETIME,
        UNIQUE KEY (slug),
        FOREIGN KEY user_key (user_id) REFERENCES users(id)
    ) CHARSET=utf8mb4;
    
    CREATE TABLE tags (
        id INT AUTO_INCREMENT PRIMARY KEY,
        title VARCHAR(191),
        created DATETIME,
        modified DATETIME,
        UNIQUE KEY (title)
    ) CHARSET=utf8mb4;
    
    CREATE TABLE articles_tags (
        article_id INT NOT NULL,
        tag_id INT NOT NULL,
        PRIMARY KEY (article_id, tag_id),
        FOREIGN KEY tag_key(tag_id) REFERENCES tags(id),
        FOREIGN KEY article_key(article_id) REFERENCES articles(id)
    );
    
    INSERT INTO users (email, password, created, modified)
    VALUES
    ('cakephp@example.com', 'secret', NOW(), NOW());
    
    INSERT INTO articles (user_id, title, slug, body, published, created, modified)
    VALUES
    (1, 'First Post', 'first-post', 'This is the first post.', 1, NOW(), NOW());
    

    配置数据库

    修改 config/app_local.php

        'Datasources' => [
            'default' => [
                'className' => 'CakeDatabaseConnection',
                'driver' => 'CakeDatabaseDriverMysql',
                'persistent' => false,
                'host' => 'localhost',
                'database' => 'cake_cms',
                'encoding' => 'utf8mb4',
                'timezone' => 'UTC',
                'cacheMetadata' => true,
            ],
    

    模型类代码

    <?php
    // in src/Model/Table/ArticlesTable.php
    namespace AppModelTable;
    
    use CakeORMTable;
    // the Text class
    use CakeUtilityText;
    // the EventInterface class
    use CakeEventEventInterface;
    // the Validator class
    use CakeValidationValidator;
    
    class ArticlesTable extends Table
    {
        public function initialize(array $config): void
        {
            $this->addBehavior('Timestamp');
        }
        public function beforeSave(EventInterface $event, $entity, $options)
        {
            if ($entity->isNew() && !$entity->slug) {
                $sluggedTitle = Text::slug($entity->title);
                // trim slug to maximum length defined in schema
                $entity->slug = substr($sluggedTitle, 0, 191);
            }
        }
        public function validationDefault(Validator $validator): Validator
        {
            $validator
                ->allowEmptyString('title', false)
                ->minLength('title', 10)
                ->maxLength('title', 255)
        
                ->allowEmptyString('body', false)
                ->minLength('body', 10);
        
            return $validator;
        }    
    }
    
    <?php
    // src/Model/Entity/Article.php
    namespace AppModelEntity;
    
    use CakeORMEntity;
    
    class Article extends Entity
    {
        protected $_accessible = [
            '*' => true,
            'id' => false,
            'slug' => false,
        ];
    }
    

    控制器类代码

    <?php
    // src/Controller/ArticlesController.php
    namespace AppController;
    
    use AppControllerAppController;
    
    class ArticlesController extends AppController
    {
        public function initialize(): void
        {
            parent::initialize();
    
            $this->loadComponent('Paginator');
            $this->loadComponent('Flash'); // Include the FlashComponent
        }
        public function index()
        {
            $articles = $this->Paginator->paginate($this->Articles->find());
            $this->set(compact('articles'));
        }
        public function view($slug)
        {
            $article = $this->Articles->findBySlug($slug)->firstOrFail();
            $this->set(compact('article'));
        }
        public function add()
        {
            $article = $this->Articles->newEmptyEntity();
            if ($this->request->is('post')) {
                $article = $this->Articles->patchEntity($article, $this->request->getData());
    
                // Hardcoding the user_id is temporary, and will be removed later
                // when we build authentication out.
                $article->user_id = 1;
    
                if ($this->Articles->save($article)) {
                    $this->Flash->success(__('Your article has been saved.'));
                    return $this->redirect(['action' => 'index']);
                }
                $this->Flash->error(__('Unable to add your article.'));
            }
            $this->set('article', $article);
        }
        public function edit($slug)
        {
            $article = $this->Articles
                ->findBySlug($slug)
                ->firstOrFail();
        
            if ($this->request->is(['post', 'put'])) {
                $this->Articles->patchEntity($article, $this->request->getData());
                if ($this->Articles->save($article)) {
                    $this->Flash->success(__('Your article has been updated.'));
                    return $this->redirect(['action' => 'index']);
                }
                $this->Flash->error(__('Unable to update your article.'));
            }
        
            $this->set('article', $article);
        }
        public function delete($slug)
        {
            $this->request->allowMethod(['post', 'delete']);
        
            $article = $this->Articles->findBySlug($slug)->firstOrFail();
            if ($this->Articles->delete($article)) {
                $this->Flash->success(__('The {0} article has been deleted.', $article->title));
                return $this->redirect(['action' => 'index']);
            }
        }    
    }
    

    视图代码

    <!-- File: templates/Articles/add.php -->
    
    <h1>Add Article</h1>
    <?php
        echo $this->Form->create($article);
        // Hard code the user for now.
        echo $this->Form->control('user_id', ['type' => 'hidden', 'value' => 1]);
        echo $this->Form->control('title');
        echo $this->Form->control('body', ['rows' => '3']);
        echo $this->Form->button(__('Save Article'));
        echo $this->Form->end();
    ?>
    
    <!-- File: templates/Articles/edit.php -->
    
    <h1>Edit Article</h1>
    <?php
        echo $this->Form->create($article);
        echo $this->Form->control('user_id', ['type' => 'hidden']);
        echo $this->Form->control('title');
        echo $this->Form->control('body', ['rows' => '3']);
        echo $this->Form->button(__('Save Article'));
        echo $this->Form->end();
    ?>
    
    <!-- File: templates/Articles/index.php -->
    
    <h1>Articles</h1>
    <p><?= $this->Html->link("Add Article", ['action' => 'add']) ?></p>
    <table>
        <tr>
            <th>Title</th>
            <th>Created</th>
            <th>Action</th>
        </tr>
    
    <!-- Here's where we iterate through our $articles query object, printing out article info -->
    
    <?php foreach ($articles as $article): ?>
        <tr>
            <td>
                <?= $this->Html->link($article->title, ['action' => 'view', $article->slug]) ?>
            </td>
            <td>
                <?= $article->created->format(DATE_RFC850) ?>
            </td>
            <td>
                <?= $this->Html->link('Edit', ['action' => 'edit', $article->slug]) ?>
                <?= $this->Form->postLink(
                    'Delete',
                    ['action' => 'delete', $article->slug],
                    ['confirm' => 'Are you sure?'])
                ?>
            </td>
        </tr>
    <?php endforeach; ?>
    
    </table>
    
    <!-- File: templates/Articles/view.php -->
    
    <h1><?= h($article->title) ?></h1>
    <p><?= h($article->body) ?></p>
    <p><small>Created: <?= $article->created->format(DATE_RFC850) ?></small></p>
    <p><?= $this->Html->link('Edit', ['action' => 'edit', $article->slug]) ?></p>
    
  • 相关阅读:
    POJ 2449 Remmarguts' Date(第k短路のA*算法)
    UESTC 1717 Journey(DFS+LCA)(Sichuan State Programming Contest 2012)
    HRBUST 1211 火车上的人数【数论解方程/模拟之枚举+递推】
    洛谷 P1372 又是毕业季I[数论/神坑规律题]
    洛谷 P1865 A % B Problem[筛素数/前缀和思想/区间质数个数]
    CCCC L2-003. 月饼[贪心/类似hdu贪心老鼠]
    二项式定理与杨辉三角
    Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]
    洛谷 P1784 数独[DFS/回溯]
    Wannafly交流赛1 B 硬币[数学思维/贪心]
  • 原文地址:https://www.cnblogs.com/zwvista/p/12835983.html
Copyright © 2011-2022 走看看