創(chuàng)建 Phalcon7 項(xiàng)目

2018-10-21 07:13 更新

文件結(jié)構(gòu)

Phalcon不會(huì)強(qiáng)制要求應(yīng)用程序的開發(fā)遵循特定的文件結(jié)構(gòu)。因?yàn)樗撬缮Ⅰ詈系模憧梢詫?shí)現(xiàn)Phalcon驅(qū)動(dòng)的應(yīng)用程序,以及使用對(duì)你來說最舒服的文件結(jié)構(gòu)。

本教程的目的以此為起點(diǎn),我們建議使用以下結(jié)構(gòu):

tutorial/
  app/
    controllers/
    models/
    views/
  public/
    css/
    img/
    js/

優(yōu)美的 URL(Beautiful URLs)?

在本教程中,我們將使用相當(dāng)(友好)URL。友好的URL不但利于SEO而且便于用戶記憶。Phalcon支持一些最流行的Web服務(wù)器提供重寫模塊。讓你的應(yīng)用程序的URL友好不是必要的,沒有它們你可以同樣輕松地開發(fā)。

在這個(gè)例子中,我們將使用Apache的重寫模塊。 讓我們在 /tutorial/.htaccess 文件中創(chuàng)建幾個(gè)重寫規(guī)則:

#/tutorial/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule  ^$ public/    [L]
    RewriteRule  ((?s).*) public/$1 [L]
</IfModule>

對(duì)該項(xiàng)目的所有請求都將被重定向到為public/文檔根目錄。此步驟可確保內(nèi)部項(xiàng)目的文件夾仍然對(duì)公共訪客隱藏,從而消除了一些安全威脅。

第二組規(guī)則將檢查是否存在所請求的文件,如果存在所要請求的文件,就不需要Web服務(wù)器模塊來重寫:

#/tutorial/public/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^((?s).*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

引導(dǎo)程序(Bootstrap)?

你需要?jiǎng)?chuàng)建的第一個(gè)文件是引導(dǎo)文件。這個(gè)文件很重要; 因?yàn)樗鳛槟愕膽?yīng)用程序的基礎(chǔ),用它來控制應(yīng)用程序的各個(gè)方面。 在這個(gè)文件中,你可以實(shí)現(xiàn)組件的初始化和應(yīng)用程序的行為。

這個(gè)引導(dǎo)文件 tutorial/public/index.php 文件基本內(nèi)容如下:

<?php

try {
    // Register an autoloader
    $loader = new Phalcon\Loader();
    $loader->registerDirs(array(
        '../app/controllers/',
        '../app/models/'
    ))->register();

    // Create a DI
    $di = new Phalcon\DIFactoryDefault();

    // Setup the view component
    $di->set('view', function () {
        $view = new Phalcon\Mvc\View();
        $view->setViewsDir('../app/views/');
        return $view;
    });

    // Setup a base URI so that all generated URIs include the "tutorial" folder
    $di->set('url', function () {
        $url = new Phalcon\Mvc\Url();
        $url->setBaseUri('/tutorial/');
        return $url;
    });

    // Handle the request
    $application = new Phalcon\Mvc\Application($di);

    echo $application->handle()->getContent();

} catch (\Exception $e) {
     echo "Exception: ", $e->getMessage();
}

自動(dòng)加載

我們可以看出,引導(dǎo)程序的第一部分是注冊一個(gè)自動(dòng)加載器。在這個(gè)應(yīng)用程序里,它將用于加載控制器和模型類。例如,我們可以為控制器注冊一個(gè)或多個(gè)目錄來增加應(yīng)用程序的靈活性的。在我們的例子中,我們使用了 Phalcon\Loader 組件。

有了它,我們可以加載使用各種策略類,但在這個(gè)例子中,我們選擇了在預(yù)定義的目錄中查找類:

<?php

use Phalcon\Loader;

// ...

$loader = new Loader();
$loader->registerDirs(
    array(
        '../app/controllers/',
        '../app/models/'
    )
)->register();

依賴管理

在使用Phalcon時(shí)必須理解的一個(gè)非常重要的概念是 依賴注入容器(dependency injection container). 這聽起來復(fù)雜,但實(shí)際上非常簡單實(shí)用。

服務(wù)容器是一個(gè)全局存儲(chǔ)的將要被使用的應(yīng)用程序功能包。每次框架需要的一個(gè)組件時(shí),會(huì)請求這個(gè)使用協(xié)定好名稱的服務(wù)容器。因?yàn)镻halcon是一個(gè)高度解耦的框架, Phalcon\Di 作為黏合劑,促使不同組件的集成,以一個(gè)透明的方式實(shí)現(xiàn)他們一起進(jìn)行工作。

<?php

use Phalcon\DI\FactoryDefault;

// ...

// Create a DI
$di = new FactoryDefault();

Phalcon\Di\FactoryDefault 是 Phalcon\Di 的一個(gè)變體。為了讓事情變得更容易,它已注冊了Phalcon的大多數(shù)組件。 因此,我們不需要一個(gè)一個(gè)注冊這些組件。在以后更換工廠服務(wù)的時(shí)候也不會(huì)有什么問題。

在接下來的部分,我們注冊了“視圖(view)”服務(wù),指示框架將去指定的目錄尋找視圖文件。由于視圖并非PHP類,它們不能被自動(dòng)加載器加載。

服務(wù)可以通過多種方式進(jìn)行登記,但在我們的教程中,我們將使用一個(gè)匿名函數(shù) anonymous function:

<?php

use Phalcon\Mvc\View;

// ...

// Setup the view component
$di->set('view', function () {
    $view = new View();
    $view->setViewsDir('../app/views/');
    return $view;
});

接下來,我們注冊一個(gè)基礎(chǔ)URI,這樣通過Phalcon生成包括我們之前設(shè)置的“tutorial”文件夾在內(nèi)的所有的URI。 我們使用類 Phalcon\Tag 生成超鏈接,這將在本教程后續(xù)部分很重要。

<?php

use Phalcon\Mvc\Url as UrlProvider;

// ...

// Setup a base URI so that all generated URIs include the "tutorial" folder
$di->set('url', function () {
    $url = new UrlProvider();
    $url->setBaseUri('/tutorial/');
    return $url;
});

在這個(gè)文件的最后部分,我們發(fā)現(xiàn) Phalcon\Mvc\Application。其目的是初始化請求環(huán)境,并接收路由到來的請求,接著分發(fā)任何發(fā)現(xiàn)的動(dòng)作;收集所有的響應(yīng),并在過程完成后返回它們。

<?php

use Phalcon\Mvc\Application;

// ...

$application = new Application($di);

echo $application->handle()->getContent();

正如你所看到的,引導(dǎo)文件很短,我們并不需要引入任何其他文件。在不到30行的代碼里,我們已經(jīng)為自己設(shè)定一個(gè)靈活的MVC應(yīng)用程序。

創(chuàng)建控制器

默認(rèn)情況下Phalcon會(huì)尋找一個(gè)名為“Index”的控制器。當(dāng)請求中沒有控制器或動(dòng)作時(shí),則使用“Index”控制器作為起點(diǎn)。這個(gè)“Index”控制器 (app/controllers/IndexController.php) 看起來類似:

<?php

use Phalcon\Mvc\Controller;

class IndexController extends Controller
{

    public function indexAction()
    {
        echo "<h1>Hello!</h1>";
    }
}

該控制器類必須有“Controller”后綴,且控制器動(dòng)作必須有“Action”后綴。

輸出到視圖

從控制器發(fā)送輸出到屏幕上有時(shí)是必要的,但是在MVC社區(qū),大多數(shù)純粹主義者證明這樣做不可取。一切必須傳遞給視圖,視圖負(fù)責(zé)在屏幕上輸出數(shù)據(jù)。Phalcon將在最后執(zhí)行的控制器的同名目錄中,查找最后執(zhí)行的動(dòng)作的同名的視圖。在我們的例子 (app/views/index/index.phtml) :

<?php echo "<h1>Hello!</h1>";

我們的控制器 (app/controllers/IndexController.php) 現(xiàn)在定義了一個(gè)空的動(dòng)作:

<?php

use Phalcon\Mvc\Controller;

class IndexController extends Controller
{

    public function indexAction()
    {

    }
}

瀏覽器輸出應(yīng)該保持不變。當(dāng)這個(gè)動(dòng)作已經(jīng)執(zhí)行結(jié)束 Phalcon\Mvc\View 靜態(tài)組件會(huì)自動(dòng)創(chuàng)建。

學(xué)習(xí)更多關(guān)于 視圖使用教程 。

設(shè)計(jì)注冊表單

現(xiàn)在我們將改變index.phtml視圖文件,添加一個(gè)鏈接到一個(gè)名為“signup”的新控制器。我們的目標(biāo)是在應(yīng)用程序中允許用戶注冊。

<?php

echo "<h1>Hello!</h1>";

echo $this->tag->linkTo("signup", "Sign Up Here!");

生成的HTML代碼顯示一個(gè)錨 (“a”) HTML標(biāo)簽鏈接到一個(gè)新的控制器:

<h1>Hello!</h1> <a href="/tutorial/signup">Sign Up Here!</a>

我們使用類 Phalcon\Tag 去生成標(biāo)記。 這是一個(gè)讓我們構(gòu)建HTML標(biāo)記的實(shí)用類。 關(guān)于生成HTML更詳細(xì)的文章可以查看 視圖助手


這是一個(gè)注冊控制器 (app/controllers/SignupController.php):

<?php

use Phalcon\Mvc\Controller;

class SignupController extends Controller
{

    public function indexAction()
    {

    }
}

這個(gè)空index動(dòng)作整潔的傳遞了表單定義給一個(gè)視圖 (app/views/signup/index.phtml):

<h2>Sign up using this form</h2>

<?php echo $this->tag->form("signup/register"); ?>

 <p>
    <label for="name">Name</label>
    <?php echo $this->tag->textField("name") ?>
 </p>

 <p>
    <label for="email">E-Mail</label>
    <?php echo $this->tag->textField("email") ?>
 </p>

 <p>
    <?php echo $this->tag->submitButton("Register") ?>
 </p>

</form>


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)