四、演示应用

现在我们已经完成了对 FuelPHP 框架的介绍,是时候构建一些东西了。我们将运行 Oil 命令行工具迁移,并将其全部放在示例应用程序中。在本章中,我们将创建一个类似 WordPress 的简单博客应用程序。

用他们自己的话说,WordPress 正在成为网络的操作系统。根据创始人马特·穆伦韦格的说法:

“WordPress 现在拥有 18.9%的网络,下载量超过 4600 万”

有关文章的更多信息,请访问以下链接:

http://thenextweb.com/insider/2013/07/27/wordpress-now-powers-18-9-of-the-web-has-over-46m-downloads-according-to-founder-matt-mullenweg/

现在,WordPress 的关注点远大于博客或简单的期刊。尽管只是一个简单的应用程序或网站,但创建一个简单的博客将展示 FuelPHP 的许多功能,包括数据库迁移、数据透视思想,以及存储日志条目修订的完整时态模型的代码。

在开始编写代码之前,让我们首先考虑要构建什么以及最低可行的产品是什么。

在本章中,我们将介绍以下主题:

  • 创建和运行数据库迁移
  • 使用油创建模型
  • 使用油创建控制器
  • 安装和使用 HTML5 样板文件
  • 将所有这些放在一起,创建一个带有脚手架的管理系统
  • 使用 Oil 命令行控制台

开始

就像 WordPress 一样,我们将从小事做起,展示一些 FuelPHP 工具,这些工具在使用 FuelPHP 开发项目时可以让您的生活更轻松。

在创建项目之前,首先创建源代码管理存储库。在本例中,我们将使用 GitHub(https://github.com ),但可选择比特桶等 https://bitbucket.org豆茎http://beanstalkapp.com 可能更适合您。

  1. 首先,登录到您的帐户,然后创建一个新的项目/存储库。对于这个应用程序,我们可以选择公共选项,因为它是免费的 GitHub。在本例中,我们将我们的项目称为journal。确保从页面右侧记录存储库 URL,您很快就会需要它。
  2. 现在,让我们在开发机器上创建项目,但首先需要使用以下命令行导航到您的home文件夹:

    php $ cd ~/

  3. 然后,使用以下命令导航到Sites文件夹:

    php $ cd ~/Sites

  4. 如果您没有Sites文件夹,让我们创建一个:

    php $ mkdir ~/Sites

  5. 进入站点文件夹后,运行以下 Oil 命令:

    php $ php oil create journal

请注意,在这些示例中,$表示终端中新行的开始。在运行命令时,您应该只需要在$后面的文本,例如php oil create journal

如果您在本地开发机器上使用 Apache,下一步将是为新站点创建虚拟主机(vhosts),然后修改主机文件。您需要有一个带有sites-available文件夹和sites-enabled文件夹的 Apache 配置。然后,一个朋友的小脚本将被证明是无价的。可以使用以下命令安装它:

$ sudo cd /usr/local/bin && sudo git clone git://github.com/maartenJacobs/quickhost.git quickhost files && sudo mv quickhost files/* . && sudo rm -Rf quickhost_files

此脚本是一组 PHP 函数,用于在计算机上设置 Apache vhosts 和主机文件。所有操作都很简单,但它们可以让您更快地设置。可通过以下链接公开查看代码:

https://github.com/maartenJacobs/quickhost

或者可以在找到更多信息 https://github.com/digitales/quickhost

一旦安装了脚本,我们将能够运行以下命令集来设置 Apache,以便我们可以使用本地域http://journal.dev

$ cd ~/Sites/journal/public
$ sudo quickhost journal.dev

使用sudo的原因是允许 Apache 正常重启并修改主机文件。这将把域名映射到本地主机 IP 地址(127.0.0.1。在本例中,我们选择了.dev顶级域TLD),以将其与生产和暂存环境区分开来。我们本可以选择.local,但这可能会导致与 Active Directory(冲突 http://en.wikipedia.org/wiki/Active_Directory )在某些操作系统上,尤其是在 Mac OS X 上。

这已经在 Mac OS X 上测试过,应该可以在*nix 上使用,但如果不更改脚本,可能无法在 Windows 环境下使用。

我们需要一个数据存储来存储日记账分录,现在就配置它。加载在fuel/app/config/development/db.php找到的db.php配置。

如前所述,FuelPHP 具有环境的概念,因此我们可以将开发数据库配置添加到源代码管理中,而不会影响其他环境。因此,您的db.php文件应该如下所示:

<?php
return array(
    'default' => array(
        'connection' => array(
            'dsn' => 'mysql:host=localhost;dbname=fue_dev',
            'username' => 'root',
            'password' => 'root',
        ),
        'profiling' => true,
    ),
);

我倾向于为每个项目设置单独的数据库用户。这确保了任何项目都不能触及另一个项目的数据库。在我的 db.php 中,我使用了 journal_dev 的 dbname、用户名和密码,因此欢迎您更改 db.php 文件的版本。

虽然不建议在实时环境中启用profiling,但在开发项目时启用profiling会有所帮助。示例配置已启用它。

我们有了代码和存储库,现在让我们将它们链接起来:

$ cd ~/Sites/journal
$ git remote rm origin
$ git remote add origin <repository url>
$ git pull origin
$ git add ./
$ git commit -m 'Initial commit'
$ git push origin master

将上面的<repository URL>替换为您的存储库 URL。现在也是为不同的环境设立几个分支机构的好时机:developstagingproduction

$ git checkout -b develop
$ git push origin develop
$ git checkout -b staging
$ git push origin staging
$ git checkout -b production
$ git push origin production
$ git checkout develop

继续设置主题,让我们设置数据库表。

创建数据库表

在数据库中创建表之前,让我们首先详细说明将存储哪些数据以及表中将包含哪些初始字段。

对于博客,我们将有博客文章或条目,这些文章或条目将有一个发布日期。它们将被分类,以便对类似主题进行分组。每篇文章都将与作者(用户)关联,并包含内容和摘录。我们可以稍后添加自由形式的标记。

参赛作品

Entries表中存在以下字段:

  • id(int):这将是主要标识符
  • name(瓦尔查尔)
  • slug(瓦尔查尔)
  • excerpt(文本)
  • content(文本)
  • published_at(国际)
  • created_at(时间戳):这将是记录创建时间的时间戳
  • updated_at(时间戳)-这将是记录上次更新的时间戳

类别

Categories表中存在以下字段:

  • id(int):这将是主要标识符
  • name(瓦尔查尔)
  • slug(瓦尔查尔)
  • created_at(时间戳):这将是记录创建时间的时间戳
  • updated_at(时间戳):这将是记录上次更新的时间戳

用户

Users表中存在以下字段:

  • id(int):这将是主要标识符
  • name(瓦尔查尔)
  • username(瓦尔查尔)
  • password(瓦尔查尔)
  • email(瓦尔查尔)
  • last_login(时间戳)
  • login_hash(文本)
  • profile_fields(文本)
  • created_at(时间戳):这将是记录创建时间的时间戳
  • updated_at(时间戳):这将是记录上次更新的时间戳

我们还需要一个链接表,以便多个条目可以在相同的类别中进行分类。

类别\u 条目

categories_entries表中存在以下字段:

  • id(int):这将是主要标识符
  • category_id(int):这将是类别的主要标识符
  • entry_id(int):这将是条目的主要标识符
  • created_at(时间戳):这将是记录创建时间的时间戳
  • updated_at(时间戳):这将是记录上次更新的时间戳

您可能已经注意到每个表都有一个id、一个created_at表和一个updated_at字段。它们由 FuelPHP Oil 工具自动添加,在链接或形成数据对象之间的关系时非常有用。它们确实增加了最小的开销,但这在这个阶段不应该引起关注,因为所需的额外存储是最小的。

让我们使用 FuelPHP Oil 工具创建一些迁移:

$ php oil generate migration create_entries name:string slug:string excerpt:text content:text published_at:timestamp

这将创建迁移以组装 posts 数据库表。无需详细说明idcreated_atupdated_at字段,因为这些字段将自动生成。如果不需要这些额外的基于时间的字段,可以在generate命令末尾追加--no-timestamp

提示

我们正在这里运行迁移示例,在本章后面生成模型时,我们将使用适当的 entries 表。

迁移与石油

当快速创建项目并将基本内容整合在一起时,FuelPHP Oil 工具可以为您处理一些重复性更高的任务,让您能够专注于项目的其他方面。这包括从设置数据库表(如前所示)到创建模型和控制器。FuelPHPOil 工具还可用于构建一个管理系统,该系统可用于使用完整的用户身份验证系统管理内容。它将提供起点;虽然结果并不总是美好的,但它将是功能性的。

这允许您快速测试想法并迭代到完美的代码。我们将详细介绍 Oil 的各个功能,以创建模型、控制器和数据库迁移。这将给我们更多的时间来调整和创建一个更完善的项目/日志。

Oil 最有用的特性之一是迁移数据库结构的能力。这些可用于确保环境之间的一致性。部署代码时,也可以在数据库上运行迁移。

迁移可用于重命名表、添加和删除字段甚至表。石油具有神奇迁移的概念。它们以关键字前缀开头,便于查看它们将要执行的操作:

$ php oil generate migration create_users name:text
$ php oil generate migration rename_table_users_to_people
$ php oil generate migration add_profile_to_people profile:text
$ php oil generate migration delete_profile_from_people profile:text
$ php oil generate migration drop_people

提示

创建迁移时,您需要了解关键字。关键词包括create_rename_add_delete_rename_drop_

迁移在fuel/app/migrations中存储在中,已执行迁移的列表存储在fuel/app/config/<environment>/migrations.php中。

此外,迁移的数据库表记录项目的当前状态。运行迁移非常简单,只需键入以下命令:

$ oil refine migrate

提示

您只需键入rg即可运行精炼和生成油操作。

如果要向上或向下迁移,请运行以下命令:

$ oil r migrate:up
$ oil r migrate:down

这些命令可以用于部署脚本中,以便在将新代码添加到不同环境时自动运行迁移。这对于避免生产环境中的错误特别有用。

在继续生成模型及其数据库表之前,让我们先删除之前创建的 posts 表:

$ php oil g migration drop_posts
$ php oil r migrate

型号

现在我们对迁移和石油有了一个简单的了解,让我们来利用石油。我们将使用以下命令创建一个模型及其相应的数据库表详细信息:

$ php oil generate model entry name:string slug:string excerpt:text content:text published_at:timestamp

这将创建模型和迁移。让我们打开位于fuel/app/classes/model/的新创建的entry.php模型:

<?php
class Model_Entry extends \Orm\Model
{
    protected static $_properties = array(
        'id',
        'name',
        'slug',
        'excerpt',
        'content',
        'published_at',
        'created_at',
        'updated_at',
    );

    protected static $_observers = array(
        'Orm\Observer_CreatedAt' => array(
            'events' => array('before_insert'),
            'mysql_timestamp' => false,
        ),
        'Orm\Observer_UpdatedAt' => array(
            'events' => array('before_save'),
            'mysql_timestamp' => false,
        ),
    );

    protected static $_table_name = 'entries'
}

在新生成的模型中,您会注意到它正在扩展 ORM 模型。为了让它工作,我们需要在自动加载器中包含 ORM 包。这是介绍 FuelPHP 自动加载器配置的好机会。加载位于fuel/app/config/config.php的配置文件。查找'always load'部分并取消对'always_load'数组的注释,如下所示:

'always_load' => array(
    'packages' => array(
        'orm',
    )
),

当您安装新软件包时,只需将它们添加到always_load阵列中即可自动加载它们。有时,只有在某个方法或类中才需要包。但是,在本例中,我们只能在需要时加载包。有关这方面的更多信息,请访问以下链接:

http://fuelphp.com/docs/classes/package.html#method_load

现在,让我们回到entry模型。您会注意到$_properties数组,这将使从模型层调用变量变得更容易。如果添加新的数据库字段,则需要将其添加到properties数组中。ORM 包包含观察者的概念,这些是可以在不同时间执行方法或函数的操作。模型中使用的是before_insertbefore_update。这些当前用于在添加或更新条目时创建时间戳。

文件中列出了其他观察员;一个有用的是Observer_Slug。该观察者将处理将条目标题转换为 URL 安全的问题,并避免重写预先存在的功能。让我们通过将以下代码片段添加到observers数组中,将这个观察者添加到我们的入口模型中:

'Orm\Observer_Slug' => array(
    'events' => array( 'before_insert', 'before_update'),
    'source' => 'name',
    'property' => 'slug',

),

现在,当我们保存一个条目时,slug 将自动更新。

我们还需要创建其他一些数据库表。让我们现在就这样做,然后我们可以在他们的模型之间建立关系,让我们的生活更轻松:

$ php oil generate model category name:varchar slug:varchar
$ php oil generate model categories_entries category_id:int entry_id:int

对于entry模型,在新类别模型中添加Observer_Slug

对于user表,我们将使用 Auth 包,因为它包含用户身份验证功能。为此,我们需要将默认的 Auth 包配置复制到应用程序配置中。

$ cp ~/Sites/journal/fuel/packages/auth/config/auth.php ~/Sites/journal/fuel/app/config/auth.php

在这个阶段,我们应该更改auth.php配置文件中的 salt 值。完成后,我们必须运行以下命令来创建必要的auth表:

$ php oil refine migrate --packages=auth

让我们运行迁移工具以确保数据库已更新:

$ php oil r migrate

现在我们已经建立了数据库结构,我们可以将模型相互关联起来。这是通过 ORM 模型实现的,ORM 模型本机支持以下关系:

  • belongs_to:此模型具有关系的主键,属于单个相关对象。
  • has_one:其主键存储在属于该模型的另一个表中。它只有一个关系。
  • has_many:主键保存在另一个模型的多个结果中。每个模型都需要属于这个模型。它可以有很多关系。
  • many_to_many:使用链接表跟踪多对多关系。此表保存来自链接表的主键对的记录。它可以有,也可以属于许多型号。例如,一篇博客文章可以有许多类别,一个类别可以链接到许多博客文章。

对于日志,我们将使用belongs_tohas_onemany_to_many关系。充分利用这些关系只需快速添加到已创建的模型中即可。在您喜爱的文本编辑器中加载条目模型。该模型可在fuel/app/classes/model/entry.php找到。

<?php

class Model_Entry extends \Orm\Model
{
    protected static $_properties = array(
        'id',
        'name',
        'slug',
        'excerpt',
        'content',
        'published_at',
        'created_at',
        'updated_at',
    );

    protected static $_observers = array(
        'Orm\Observer_CreatedAt' => array(
            'events' => array('before_insert'),
            'mysql_timestamp' => false,
        ),
        'Orm\Observer_UpdatedAt' => array(
            'events' => array('before_update'),
            'mysql_timestamp' => false,
        ),
        'Orm\Observer_Slug' => array(
            'events' => array('before_insert'),
            'source' => 'name',
            'property' => 'slug',
        ),
    );
    protected static $_table_name = 'entries';
}

在关闭花括号之前,将以下代码添加到模型中:

 protected static $_belongs_to = array(
            'category' => array(
                'key_from' => 'id',
                'model_to' => 'Model_Category_Entry',
                'key_to' => 'entry_id',
                'cascade_save' => false,
                'cascade_delete' => false,
            ),
        );

    protected static $_has_many = array(
        'categories' => array(
            'key_from' => 'id',
            'model_to' => 'Model_Category_Entry',
            'key_to' => 'entry_id',
            'cascade_save' => false,
            'cascade_delete' => false,
        )
    );

我们并不总是需要包含完整的$_belongs_to声明。在大多数情况下,我们可以简单地使用以下方法:

protected static $_belongs_to = array('post');

通过这些添加,我们正在配置 ORM 模型,以将条目和类别之间的关系视为多对多关系。我们使用的是category_entry链接表,而不是将类别直接链接到条目。该表使用单数形式的表命名,以字母顺序链接;在本例中,categoriesentries的连接为我们提供了一个表名category_entry。我们希望使用链接表的原因是,我们希望能够为每个条目分配多个类别,以便在不需要重复的情况下重用这些类别。例如,如果我们检索一个条目,类别列表将通过以下方式获得:

$entry = Model_Entry::find(1)

$categories =$entry->categories;

在本例中,我们正在查找 ID 设置为1的条目。如果找到,将返回完整条目对象,否则将返回 false。

除了多对多关系之外,让我们将用户链接到他们编写的条目。

首先,我们需要将user_id添加到 entries 表中:

$ php oil g migration add_user_id_to_entry user_id:int
$ php oil r migrate

我们需要在进入模型$_properties中增加user_id

protected static $_properties = array(
        'id',
        'name',
        'slug',
        'excerpt',
        'content',
        'published_at',
        'created_at',
        'updated_at',
    );

由于关系从user_id映射到user表中的主id键,因此我们可以将用户定义为$_belongs_to数组的一部分。在Model_User模型中添加互惠关系后,其他所有内容都将到位:

$_belongs_to = array( 
    'user',
    'category' => ...
);

说到Model_User,需要创建:

$ php oil g model user username:string password:string group:string email:string last_login:int profile_fields:text --no-migration

尽管大部分用户功能都是在 Auth 包中完成的,但是添加用户模型对于Model_Entry与用户数据的关系是必要的。因此,加载位于fuel/app/classes/model/user型号user.php并添加以下阵列:

protected static $_has_many = array('entry');

categorycategory_entry模型也需要创建关系。要执行此操作,请导航到位于fuel/app/class/mode/category.php文件:

<?php

class Model_Category extends \Orm\Model
{
    protected static $_properties = array(
        'id',
        'name',
        'slug',
        'created_at',
        'updated_at',
    );

    protected static $_observers = array(
        'Orm\Observer_CreatedAt' => array(
            'events' => array('before_insert'),
            'mysql_timestamp' => false,
        ),
        'Orm\Observer_UpdatedAt' => array(
            'events' => array('before_update'),
            'mysql_timestamp' => false,
        ),
    );
    protected static $_table_name = 'categories';

    protected static $_belongs_to = array(
            'entry' => array(
                'key_from' => 'id',
                'model_to' => 'Model_Category_Entry',
                'key_to' => 'category_id',
                'cascade_save' => false,
                'cascade_delete' => false,
            ),
        );

    protected static $_has_many = array(
        'entries' => array(
            'key_from' => 'id',
            'model_to' => 'Model_Category_Entry',
            'key_to' => 'category_id',
            'cascade_save' => false,
            'cascade_delete' => false,
        )
    );
}

以下是位于fuel/app/classes/model/category/entry.php文件的列表:

<?php

class Model_Category_Entry extends \Orm\Model
{
    protected static $_properties = array(
        'id',
        'category_id',
        'entry_id',
        'created_at',
        'updated_at',
    );

    protected static $_observers = array(
        'Orm\Observer_CreatedAt' => array(
            'events' => array('before_insert'),
            'mysql_timestamp' => false,
        ),
        'Orm\Observer_UpdatedAt' => array(
            'events' => array('before_update'),
            'mysql_timestamp' => false,
        ),
    );
    protected static $_table_name = 'category_entries';

    protected static $_belongs_to = array(
        'category',
        'entry',
    );
}

既然我们已经有了模型和迁移,那么在源代码管理中添加它们将是一个好主意。完成后,让我们开始创建控制器,以利用模型和视图(包括表单)。

控制器

控制器与模型一样,可以使用机油创建。主控制器将用于管理条目和类别。这些将有两种风格,公开可见的站点控制器和条目和类别表的管理系统。

我们的控制器可能不需要处理 RESTful 请求,至少一开始。因此,我们应该扩展Controller_Template,幸运的是,这就是设置油工具运行的方式。当我们使用 Oil 创建控制器时,将创建它以扩展模板控制器。我们只需要考虑我们需要采取什么行动和方法来实现这一点。由于我们将主要显示博客的条目和类别信息,让我们从indexview操作开始:

$ php oil g controller entry index view

这将创建控制器、模板文件和方法所需的视图-indexview

我们来看看entry.php,它位于fuel/app/classes/controller/

<?php

class Controller_Entry extends Controller_Template { 
    public function action_index()
    {
        $data['entries'] = Model_Entry::find('all');
        $this->template->title = "Entries";
        $this->template->content = View::forge('entry/index', $data);

    }

    public function action_view($id = null)
    {
        is_null($id) and Response::redirect('entry');

        if ( ! $data['entry'] = Model_Entry::find($id))
        {
            Session::set_flash('error', 'Could not find entry #'.$id);
            Response::redirect('entry');
        }
        $this->template->title = "Entry";
        $this->template->content = View::forge('entry/view', $data);

    }
}

在生成的控制器中有一些有趣的事情需要注意。首先是每个与 URL 直接相关的方法都以action_作为前缀。这使得查看哪些方法与 URL 直接相关以及哪些方法覆盖控制器内的其他功能变得更容易

您还将注意到活动视图正在传递给$data数组中的视图。这用于将变量传递给视图,从而允许在视图渲染之前执行逻辑。这使得视图完全用于表示,因为它们应该是这样的。data数组中的键将被转换为视图中的变量,例如,$data['subnav']可以通过视图中的$subnav变量调用。

Controller_Template类还有两个其他方法-before()after(),它们特别有用。before()方法可用于管理系统的用户身份验证,本章稍后将对此进行演示。我们将在管理系统中使用它,以确保只有经过身份验证的用户才能访问管理系统。在控制器中使用before()方法时,确保调用parent::before()方法,例如:

class Controller_Entry extends Controller_Template
{
    // Essential, don't forget this method.
    public function before()
    {
        parent::before();

        // Your code
    }    
    .....
}

观点

使用 Oil 工具创建控制器时,也会创建一个模板和视图。让我们看看其中一个视图,加载fuel/app/views/entry/index.php

您将注意到视图中缺少打开和关闭 HTML 主体。表示元素的测试由视图文件夹根目录中的template.php文件处理。在查看template.php之前,让我们先讨论一下index.php文件的一些部分:

Arr::get( $subnav, "index");

如前一行代码所示,它使用的是核心 FuelPHPArr类,这是一组用于处理数组的辅助函数。在本例中,使用了get方法。这允许您检查数组中的给定键,如果找不到该键,则返回 false。视图正在使用此功能输出活动页面/视图的'active'样式类。

使用的第二个核心类是Html::anchor()。此类提供了大量 HTML 标记选择,并确保使用的所有标记在Doctype声明中有效。我们正在使用anchor方法输出一个指向视图的链接。第一个值是链接,第二个值是显示标题(位于a标记之间的位)。使用此帮助器方法的一个原因是,无论环境的 URL 是什么,或者应用程序是否安装在子文件夹或子域中,都可以确保链接正常工作。现在,让我们快速查看一下在fuel/app/views/template.php找到的template.php文件。

默认情况下,模板使用 Twitter 引导为项目提供一个快速的起点。FuelPHP 希望在项目的公用文件夹中有一个 CSS 和 JS 文件夹。加载 CSS 和 JavaScript 文件与在模板中使用以下代码一样简单:

<?php echo Asset::css('bootstrap.css');?>
<?php echo Asset::js('bootstrap.js'); ?>

与 RubyonRails 等框架一样,FuelPHP 实现了一个 flash 会话,用于在页面加载之间传递变量和值。默认情况下,FuelPHP 有两个 flash 会话,默认名称为successerror。当然,您可以根据需要向 FuelPHP 添加任意数量的 flash 会话。以下是一个例子:

<?php Session::set_flash('warning', 'Warning Message') ?>

以下示例是在模板中输出 flash 会话的两种方式:

<?php if (Session::get_flash('success')): ?>
    <div class="alert alert-success">
        <strong>Success</strong>
        <p>
            <?php echo implode('</p><p>', e((array) Session::get_flash('success'))); ?>
        </p>
    </div>
<?php endif; ?>

template.php的其余部分是一个相当简单的 HTML。事实证明,创建符合访问者屏幕大小的网站是支持移动设备的一种非常流行的方式。因此,在为桌面添加布局之前,我们应该首先考虑手机大小的屏幕。为了帮助实现这一点,我们将使用 HTML5 样板文件(http://html5boilerplate.com 。我们将定制样板文件的版本,这可以通过完成 http://www.initializr.com/ 伴生部位。为此,请执行以下步骤:

  1. 在 Initializer 网站上,应该有 3 个选项:经典 H5BP、响应型和引导型。选择经典 H5BP选项(灰色按钮),然后选择响应引导2.3.2 模板选项。最后点击下载!
  2. 将生成的下载文件复制到日志应用程序的公用文件夹中。将jscssimg文件夹复制到您的资产文件夹中。
  3. Now, open the index.html file in your text editor and edit it. The next step is a case of taking elements from the index.html file and adding them to your template.php file.

    下面是一个您将得到的示例:

    ```php <!DOCTYPE html> <!--[if gt IE 8]><!-->

    content="IE=edge,chrome=1"> <?php echo $title; ?> <?php body { padding-top: 60px; padding-bottom: 40px; } <?php echo Asset::css('bootstrap-responsive.min.css'); ?> <?php echo Asset::css('main.css'); ?> <?php Asset::add_path('assets/js/vendor/', 'js'); ?> <?php echo Asset::js('modernizr-2.6.2.min.js'); ?>

    <?php echo $title; ?>

    <?php if (Session::get_flash('success')): ?>
    Success

    <?php echo implode('

    ', e((array) Session::get_flash('success'))); ?>

    <?php endif; ?> <?php if (Session::get_flash('error')): ?>
    Error

    <?php echo implode('

    ', e((array) Session::get_flash('error'))); ?>

    <?php endif; ?>
    <?php echo $content; ?>
            <footer>
                <p>&copy; Journal <?php echo date( 'Y' ); ?></p>
            </footer>
    
        </div> <!-- /container -->
    
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
        <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.1.min.js"><\/script>')</script>
        <?php echo Asset::js('bootstrap.min.js'); ?>
        <?php echo Asset::js('plugins.js'); ?>
        <?php echo Asset::js('main.js'); ?>
    </body>
    

    ```

    提示

    完成index.html文件后,请确保将其从公用文件夹中删除;否则,您可能无法加载日志网站。

    Asset::set_path()之外,前面提到了template.php文件的大部分。HTML5 样板包括modernizrJavaScript 文件的供应商文件夹。默认情况下,资产加载器将查看位于public/assetscssjs文件夹,但不会查看这些目录中的文件夹。我们正在使用set_path()方法将供应商文件夹包括在 JavaScript 加载中。set_path()中的第二个变量让资产加载器知道新路径是一个 JavaScript 文件夹。

    现在,我们有机会在浏览器中查看站点,例如,http://journal.dev/entryhttp://localhost/Site/journal/entryhttp://127.0.0.1/Site/journal/entry,具体取决于您的开发机器配置。

    目前,访问者将看到的第一个网页是 FuelPHP 欢迎页面。我们应该改变这一点,使条目列表页面是访问者看到的第一个页面。这样做很快,而且在 FuelPHP 中使用 routes 可以轻松完成。加载位于fuel/app/config/routes.php配置文件。

    <?php
    
    return array(
        '_root_'  => 'welcome/index',  // The default route
        '_404_'   => 'welcome/404',    // The main 404 route
        'hello(/:name)?' => array('welcome/hello', 'name' => 'hello'),
    );
    

    您可以通过将'welcome/index'更改为'entry/index'将欢迎页面更改为条目列表页面。

    回到浏览器,导航到期刊网站的顶层,例如,http://journal.devhttp://localhost/Site/journalhttp://127.0.0.1/Site/journal。您会注意到您的条目索引页面正在显示。

    到目前为止,我们已经介绍了控制器和视图的基本部分,并安装了 HTML5 样板。现在,我们应该看看条目和类别的管理。

    在查看管理系统之前,公共站点类别还有一件事要做。让我们生成类别索引和查看控制器:

    $ php oil g controller category index view
    

    您可能会认为,能够显示条目和类别是很好的,但是我们实际上如何处理管理系统呢?下一节将教我们如何做到这一点。

    使用机油生成管理系统

    我们将使用 Oil 工具快速构建条目和类别的管理系统。

    除了创建迁移和控制器外,还可以使用 Oil 为您构建功能。这有两种风格:一种是前端,正如我们已经看到的,另一种是完全控制的管理系统。

    在继续之前,我们需要重命名categoryentry模型。这是因为它们将作为管理系统脚手架的一部分重新创建。我们将其重命名,以便获得在这些模型中设置的以前关系的副本:

    $ mv ~/Sites/journal/fuel/app/classes/model/entry.php ~/Sites/journal/fuel/app/classes/model/entry.bak.php
    $ mv ~/Sites/journal/fuel/app/classes/model/category.php ~/Sites/journal/fuel/app/classes/model/category.php
    

    现在,让我们运行管理命令:

    $ php oil g admin entry name:varchar slug:varchar excerpt:text content:text published_at:int user_id:int
    $ php oil g admin category name:varchar slug:varchar -force
    

    需要使用-force元素在管理系统中重新运行共享文件,以便创建类别文件。

    Oil 已经为您创建了一些文件,但不幸的是,它不知道类别和条目关系或Observer_Slug属性。因此,我们需要重新关联到Entry and Category模型,我们还需要重新添加Observer_Slug。对于最近重命名的条目和类别模型,此过程将非常简单。

    编辑模型时,我们需要删除或注释以下内容:

    $val->add_field( 'slug', 'Slug', 'required|max_length[255]');
    

    我们还需要对管理条目和类别控制器中的引用执行相同的操作。模型中定义的Observer_Slug将处理段塞。

    因此,您需要检查位于fuel/app/classes/controller/admin/;category.php的第 32、66、86 行,同时检查位于同一文件夹的entry.php的第 32、69、92 行。

    作为搭建过程的一部分,创建了两个表单,并在条目视图和类别视图的创建和编辑之间共享。加载fuel/app/views/admin/category/_form.phpfuel/app/views/admin/entry/_form.php。在这两种形式中,注释掉对 slug 的引用,因为它不是必需的。

    在浏览器中,导航到http://journal.dev/adminhttp://localhost/Site/journal/adminhttp://127.0.0.1/Site/journal/admin,您将被重定向到登录表单。我们还没有建立一个用户帐户,但石油起了作用。

    加载您的终端并运行:

    $ php oil console
    

    这将启动一个交互式控制台,它可以使用核心的 FuelPHP 和包代码。在本例中,我们需要调用 Auth 包来创建新用户。

    >>> Auth::create_user('admin', 'password', 'email@domain.com', 100 );
    1
    >>> exit;
    

    此命令将输出新创建的账户的user_id100代表身份验证包中的最高默认用户权限和角色。要退出控制台会话,只需键入exit并运行它。

    现在,您将能够登录到新创建的管理系统。从那里,您将能够添加新的类别和条目。

    总结

    本章简要介绍了项目结构以及 FuelPHP Oil 命令行工具如何帮助您快速设置。

    石油作为脚手架结构,但你仍然需要填补空白。例如,可以从博客中检索链接的条目和类别,但我们仍然需要构建必要的管理控件来设置关系。

    在下一章中,我们将更详细地查看包,然后创建我们自己的包,该包可以与社区共享。