この記事の例では、symfony コマンドを使用してプロジェクトを作成する方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
概要
この章では、Symfony プロジェクトの合理的な構造フレームワークについて説明し、symfony コマンドを使用してプロジェクト構造を初期化します。
はじめに
symfony では、プロジェクトは、指定されたドメイン名の下で同じプロジェクトモデルを共有する一連のサービスと有効なオペレーションです。
プロジェクトでは、アプリケーション内の操作は一連のロジックです。各アプリケーションは、同じプロジェクト内の他のアプリケーションに干渉することなく、通常どおり独立して実行できます。
ほとんどの場合、プロジェクトには 2 つのアプリケーションが含まれており、1 つはフォアグラウンド表示を担当し、もう 1 つはバックグラウンド処理を担当し、同じデータベースを使用します。もちろん、1 つのプロジェクトに多数の小規模サイトを含めて、各サイトを異なるアプリケーションにすることもできます。異なるアプリケーション間で使用されるハイパーリンクには絶対パスを使用する必要があることに注意してください。
各アプリケーションはモジュールのセットであり、各モジュールは特別な機能を担当します。通常、モジュールは同様の機能のために 1 つのページまたはページのグループを使用します。たとえば、モジュールには、ホーム、記事、ヘルプ、ショッピングカート、アカウントなどが含まれます。
モジュールの機能: 各モジュールには独自の機能があります。たとえば、shoppingCart モジュールには追加、表示、更新の機能が必要です。機能的な動作は、典型的な Web アプリケーションにおけるページの動作と考えることができます。
新しいプロジェクトのレベルが多すぎる場合は、ファイル構造をシンプルに保つために、モジュール内のすべての関数をグループ化するのが簡単です。アプリケーションがより複雑になると、機能を論理モジュールに編成できます。
各アプリケーションは、異なる構成やデータベースなど、異なる環境で実行できます。通常、すべての新しいアプリケーションは 3 つの環境 (開発、テスト、最終運用) で実行されます。各アプリケーションは、必要に応じてさらに多くの環境で実行でき、異なる環境で構成アクセサリを変更するだけで済みます。
たとえば、テスト環境では警告とエラーをログに記録する必要がありますが、最終的な運用環境ではエラーのみをログに記録する必要があります。キャッシュ アクセラレーションは通常、開発環境ではオンになりませんが、テスト環境や最終的な運用環境ではオンにする必要があります。開発およびテスト環境では、テスト データを最終製品のリモート データベースに保存する必要がある場合があります。すべての環境は 1 台のマシン上に共存でき、通常は最終的な運用環境のみが運用サーバー上に存在します。
注: サンドボックス経由で symfony を使用している場合、「sf_sandbox」という名前のプロジェクトと「frontend」という名前のアプリケーションをサンドボックス内に準備する必要はありません。 Web サーバーをセットアップする必要もありません。プログラムを web/ ルート ディレクトリに置くだけです。
パケ
SymFony は、プロジェクト、アプリケーション、モジュールを管理するために特殊なツール Pake を使用します。 Pake は、Rake コマンド (make コマンドを Ruby に変換するツール) に似た php ツールです。 pakefile.php と呼ばれる特別な構成ファイルに基づいて、いくつかの管理タスクを自動化します。 symfony コマンドラインの代わりに pake ツールを使用すると、すべてが非常に簡単になります。
すべての有効な管理操作コマンドのリストを取得するには、プロジェクト ディレクトリを入力するだけです:
リーリーCLI (コマンド ライン操作) タスク スケジューリングは、プロジェクトの初期段階で使用されます。 CLI タスクのスケジューリングの詳細については、CLI の章を参照してください。
プロジェクト設定
すべてを開始する前に、プロジェクトを保存するための新しいディレクトリを作成する必要があります:
リーリー次に、プロジェクトの初期化を開始して元のファイルとディレクトリを生成します。単に次のように入力します。
リーリー新しく作成されたファイル システムのツリー構造の概要を次に示します:
アプリ/
バッチ/
キャッシュ/
構成/
データ/
ドキュメント/
ライブラリ/
ログ/
テスト/
ウェブ/
symfony コマンドは、現在のプロジェクトの利用可能なディレクトリでいつでも呼び出すことができます。
アプリ設定
プロジェクトはまだ完了していません。まだ少なくとも 1 つの申請が必要です。まず symfony init-app コマンドを使用してアプリケーションを初期化し、コマンドに続くパラメーターを使用してアプリケーションに名前を付けます:
リーリーこれにより、プロジェクトのルート ディレクトリの apps/ フォルダーに myapp ディレクトリが作成されます。このディレクトリには、デフォルトのアプリケーション構成とサイトのディレクトリ ファイルのセットが含まれます。
アプリ/
マイアプリ/
構成/
i18n/
ライブラリ/
モジュール/
テンプレート/
ウェブ/
インデックス.php
myapp_dev.php
index.php是production新应用程序的前端控制器。因为你创建这个项目中的第一个应用程序时,Symfony创建了一个调用 index.php的文件,例如 myapp.php (如果你现在添加一个名为 mynewapp 的新应用程序,新产品的前端控制器将被命名为mynewapp.php)。在 开发环境中运行程序时,调用前端控制器 myapp_dev.php。
注意:你如果仔细阅读了介绍,你可能会对myapp_test.php文件的位置感到意外。事实上,测试 环境是用于对你的应用程序的构件进行单元测试,它不需要前端控制器。可以参考单元测试章节去了解更多详细内容。
从现在开始,/home/steve/myproject/ 目录将会作为项目的根目录。根目录的路径已经被保存为 SF_ROOT_DIR 常量,定义在 index.php 文件中,并且我们将会用这个常量名代替实际路径以避免把不叫Steve的读者搞糊涂了(译者注:因为作者将项目放在/home/steve /myprojetc的目录下,这个路径每个人可能都不尽相同,所以使用常量SF_ROOT_DIR来代替了实际路径)。
Web服务器设置
为了访问和测试新的应用程序,需要配置web服务器。这有一个Apache的例子,在 httpd.conf 配置文件中加入一个新的虚拟主机:
<Directory "/$data_dir/symfony/web/sf"> AllowOverride All Allow from All </Directory> <VirtualHost *:80> ServerName myapp.example.com DocumentRoot "/home/steve/myproject/web" DirectoryIndex index.php Alias /sf /$data_dir/symfony/web/sf <Directory "/home/steve/myproject/web"> AllowOverride All Allow from All </Directory> </VirtualHost>
注意:上面的配置中的 $data_dir 变量需要替换成你的PEAR库目录。例如:在*nix系统中,你可以输入:
<code> Alias /sf /usr/local/lib/php/data/symfony/web/sf</code>
你可以在安装章节找到更多关于PEAR目录的信息。
重启Apache服务之后,就可以看到调用新创建的应用程序的页面,只需要在一个标准的web浏览器的地址栏输入下列路径:
http://myapp.example.com/index.php/
或者,在调试模式下使用这个路径:
http://myapp.example.com/myapp_dev.php/
注意:Symfony显示‘简短漂亮的(smart)'路径时用到了 mod_rewrite 模块。如果你的Apache版本没有将 mod_rewrite 模块编译进去,那么需要在 httpd.conf 中检查模块mod_rewrite是否是动态模块方式(DSO)安装的,并且确认是否已经打开(译者注:关于Apache的mod_rewrite模块安 装和使用方法请参考Apache相关文档,这里假设读者已经具备这方面知识而不作过多说明):
AddModule mod_rewrite.c LoadModule rewrite_module modules/mod_rewrite.so
你可以在路由(routing)章节了解更多关于简短路径(smart urls)的信息。
Symfony 兼容其它服务器配置方式。你也可以,例如,用别名(alias)代替虚拟主机访问symfony应用程序。若需要了解更多关于web服务器配置信息,请查阅相关章节。
模块设置
你这个新的应用程序并不出众,它缺乏吸引人的功能。如果你想增加功能性,你需要在在其中用到模块。这里再一次用到了 symfony 命令,参数为 init-module ,后面跟着应用程序名称和新模块的名称:
$ symfony init-module myapp mymodule
创建以后的树结构如下:
modules/
mymodule/
actions/
config/
lib/
templates/
validate/
新模块直接可以被使用:
http://myapp.example.com/index.php/mymodule
然后你需要让它正常的工作,编辑文件 myapp/modules/mymodule/templates/indexSuccess.php 输入:
Hello, world !
保存它,刷新刚才的页面就可以看到内容!
源文件版本控制(Source versioning)
应用程序设置完成之后,建议开始进行源文件版本控制。Symfony从一开始就支持CVS(译者注:版本控制系统),建议使用Subversion(译者注:一个版本控制系统软件,采用CVS 的运作模型, 并以取代CVS 为目标)。下面的例子列出了一些Subversion的命令,用于从在一个安装了Subversion的服务器上创建一个新项目的"仓库"(译者注:repository,源代码储存的地方)。对于Windows用户,建议客户端使用TortoiseSVN。关于源文件版本控制的更多信息和命令用法,请参考Subversion文档。
下面的例子假设$SVNREP_DIR是一个已经定义的环境变量。如果你还没有定义它,你需要用"仓库"的实际路径代替$SVNREP_DIR变量。
现在让我们开始创建myproject项目的新"仓库":
$ svnadmin create $SVNREP_DIR/myproject
然后用下面这串命令创建新"仓库"的基本组织结构(规划),其中包含 trunk, tags 和 branches 三个目录:
[code]$ svn mkdir -m "layout creation" file:///$SVNREP_DIR/myproject/trunk file:///$SVNREP_DIR/myproject/tags file:///$SVNREP_DIR/myproject/branches[/code]
这将是你第一个版本。现在你必须导入项目的文件,但不包括缓存和日志等临时文件:
$ cd /home/steve/myproject $ rm -rf cache/* $ rm -rf log/* $ svn import -m "initial import" . file:///$SVNREP_DIR/myproject/trunk
检查提交的文件:
$ svn ls file:///$SVNREP_DIR/myproject/trunk/
看上去很不错。现在SVN"仓库"已经记录了所有项目文件的版本(和更改历史)。就是说实际路径为 /home/steve/myproject 的目录中所有的文件都已经被"仓库"记录。要做到这一点,首先重命名 myproject 目录名,当一切运行正常的时候可以删除它,并且在新目录中向"仓库"提交一个checkout:
$ cd /home/steve $ mv myproject myproject.origin $ svn co file:///$SVNREP_DIR/myproject/trunk myproject $ ls myproject
现在你可以在 /home/steve/myproject/ 目录下的文件中工作,并且提交修改到"仓库"中。不要忘记作一些清理和删除myproject.origin目录,它现在没有用了。
还有一些另外的设置。当你向"仓库"中提交工作目录时,会复制一些多余的文件,像项目中 cache 和 log 目录下的文件。因此你需要针对这个项目在svn中指定一个忽略列表。你也需要重新将 cache/ 和 log/ 目录的权限设置为完全控制,在访问时产生的文件SVN将不会储存:
$ cd /home/steve/myproject $ svn propedit svn:ignore . $ chmod 777 cache $ chmod 777 log
这将调用在SVN中设置的默认的文本编辑器。如果没有生效,就像下面这样设置subversion首选的编辑器:
$ export SVN_EDITOR=<name of editor> $ svn propedit svn:ignore .
直接在SVN中的忽略列表中加入myproject子目录,这样提交的时候就忽略了:
cache log
保存然后退出,这样就完成了。
希望本文所述对大家基于Symfony框架的PHP程序设计有所帮助。