最近剛好在用Slim框架,看文檔的時(shí)候,中文文檔中缺了這一篇沒(méi)有翻譯,于是我就把它翻譯過(guò)來(lái)了。本人英語(yǔ)水平有限,如有錯(cuò)誤請(qǐng)告知。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、雨城網(wǎng)絡(luò)推廣、成都微信小程序、雨城網(wǎng)絡(luò)營(yíng)銷、雨城企業(yè)策劃、雨城品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供雨城建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com如果你在尋找創(chuàng)建一款非常簡(jiǎn)單的Slim應(yīng)用程序的流程,來(lái)這里算是找對(duì)地方了(在這個(gè)應(yīng)用程序中,沒(méi)有用到Twig,但用到了MonoLog和一款PDO數(shù)據(jù)庫(kù)連接器)。你可以在此教程中學(xué)習(xí)如何構(gòu)建這個(gè)示例應(yīng)用程序,也可以按自己的需要去改寫(xiě)某個(gè)步驟。
在你開(kāi)始之前:這里有一個(gè)skeleton項(xiàng)目可以幫助你快速創(chuàng)建一個(gè)應(yīng)用程序樣板,你可以使用它直接開(kāi)始創(chuàng)建你的應(yīng)用程序,而不用再糾結(jié)應(yīng)用程序的組織結(jié)構(gòu)了。
此教程貫穿構(gòu)建示例應(yīng)用程序的全流程。如果有需求,可以在Github上瀏覽它的項(xiàng)目源代碼。
開(kāi)始
首先我們?yōu)轫?xiàng)目創(chuàng)建一個(gè)文件夾,就叫它project好了(因?yàn)槠鹈诌@種事實(shí)在是太難了,我們偷下懶)。我喜歡將那些不是代碼的文件放在項(xiàng)目的頂層目錄中,然后將源代碼單獨(dú)放在一個(gè)目錄里,然后在將webroot目錄放置在代碼目錄中,所以我的初始結(jié)構(gòu)如下:
. ├──project │└──src │└──public 安裝Slim框架
Composer是安裝Slim框架的最好方式。如果你還沒(méi)有安裝Composer,你可參照這個(gè)文檔來(lái)安裝Composer,在我的項(xiàng)目中,我剛將composer.phar文件下載到/src目錄中,所以我的地一個(gè)命令如下:
phpcomposer.pharrequireslim/slim
這里做了兩件事:
添加Slim框架依賴到composer.json(在我目前的情況下,它會(huì)自動(dòng)為我創(chuàng)建composer.json文件,因?yàn)槲夷夸浿兄安](méi)有這個(gè)文件,如果你已經(jīng)有了這個(gè)文件,它會(huì)將依賴追加到文件中) 執(zhí)行composerinstall操作,將依賴的下載到項(xiàng)目中如果現(xiàn)在你查看project目錄,你會(huì)發(fā)現(xiàn)在src目錄中出現(xiàn)vendor/目錄。同時(shí)還有兩個(gè)新的文件composer.json和composer.lock。這也是設(shè)置版本控制系統(tǒng)的最好時(shí)機(jī):在使用composer時(shí),我們總是將vendor/目錄排除,但是composer.json和composer.lock應(yīng)該包含在版本管理中。由于我使用了composer.phar,因此我把它也加入到版本管理中,這樣可以在所有需要它的電腦上安裝composer命令。
創(chuàng)建一個(gè)名為src/.gitignore文件并把下面的內(nèi)容放在文件中:
vendor/*
現(xiàn)在git不會(huì)再提示你將vendor/目錄添加到版本控制系統(tǒng)中了(我們只需要使用composer來(lái)管理這些依賴項(xiàng)即可,不需要添加到版本管理中)。
創(chuàng)建應(yīng)用程序Slim主頁(yè)上的代碼是一個(gè)優(yōu)秀的例子,所以我們使用它來(lái)做我們的起點(diǎn)。將下面這些代碼添加到src/public/index.php文件中:
get(\'/hello/{name}\',function(Request$request,Response$response){ $name=$request->getAttribute(\'name\'); $response->getBody()->write("Hello,$name"); return$response; }); $app->run();
我們只是粘貼了一段代碼,讓我們看看它的功能。
頂部的use語(yǔ)句將ServerRequestInterface和ResponseInterface引入我們的代碼中,并為它們起了一個(gè)更短的別名。Slim框架支持PSR-7,它是HTTP消息傳遞的PHP標(biāo)準(zhǔn),所以在構(gòu)建應(yīng)用程序時(shí)注意到Request和Response對(duì)象是你經(jīng)??吹降臇|西。只是編寫(xiě)Web應(yīng)用程序的一種現(xiàn)代的、優(yōu)秀的方法。
接下來(lái)我們引入了vendor/autoload.php文件,這個(gè)文件是Composer創(chuàng)建的,并允許我們引用先前安裝的Slim和其它相關(guān)依賴項(xiàng)。如果你使用和我一樣的文件結(jié)構(gòu),那么vendor/目錄比index.php高一級(jí)別,所以需要像上面一樣調(diào)整路徑。
最后,我們創(chuàng)建了$app對(duì)象作為Slim良好的開(kāi)始。$app->get()調(diào)用的是我們的第一個(gè)路由-當(dāng)我們向/hello/someone發(fā)出GET請(qǐng)求時(shí),代碼會(huì)對(duì)其作出響應(yīng)。不要忘記最后的$app->run()來(lái)告訴Slim我們已經(jīng)完成了配置,現(xiàn)在是時(shí)候開(kāi)始做主要事情了。
現(xiàn)在我們已經(jīng)有一個(gè)應(yīng)用程序了,我們需要運(yùn)行它。我將介紹兩個(gè)方法:PHP內(nèi)置服務(wù)器和Apache。
使用PHP內(nèi)置服務(wù)器運(yùn)行你的應(yīng)用程序這是我選擇的"快速啟動(dòng)"選項(xiàng),因?yàn)樗灰蕾嚻渌娜魏螙|西(當(dāng)然,你必須安裝了PHP)。進(jìn)入src/public目錄執(zhí)行下面的命令:
php-Slocalhost:8000
上面的命令使你可以通過(guò)http://localhost:8000訪問(wèn)你的應(yīng)用程序(如果你已經(jīng)使用了8000端口,會(huì)收到一個(gè)警告,只需要換一個(gè)未被使用的端口就好,PHP并不關(guān)注你將8000端口給了什么應(yīng)用)。
注意,你訪問(wèn)上面的URL會(huì)得到一個(gè)"PageNotFound"的錯(cuò)誤,但是這個(gè)錯(cuò)誤是Slim發(fā)出的,因此這是可預(yù)期的錯(cuò)誤。試試http://localhost:8000/hello/collin
通過(guò)Apache運(yùn)行你的項(xiàng)目為了在標(biāo)準(zhǔn)的LAMP上運(yùn)行項(xiàng)目,還需要一些其它的東西:一些虛擬主機(jī)的配置和一個(gè)重寫(xiě)規(guī)則。
虛擬機(jī)配置應(yīng)當(dāng)相當(dāng)簡(jiǎn)單,我們不需要任何特別的配置。復(fù)制你現(xiàn)有的默認(rèn)虛擬機(jī)配置,并將ServerName設(shè)置為訪問(wèn)的地址就好了。例如下面這種形式:
ServerNameslimproject.dev
然后,再將DocumentRoot設(shè)置為項(xiàng)目的public/目錄即可,如下所示(編輯現(xiàn)有的行):
DocumentRoot/home/collin/projects/slim/project/src/public/
修改配置后,一定要重啟Apache來(lái)重新載入配置文件。
我的src/public目錄下有個(gè).htaccess文件,需要啟用Apache的重寫(xiě)模塊,見(jiàn)打的將所有的web請(qǐng)求轉(zhuǎn)到index.php文件上,以便Slim為我們處理所有的路由。下面就是.htaccess文件的內(nèi)容:
RewriteEngineon RewriteCond%{REQUEST_FILENAME}%!-d RewriteCond%{REQUEST_FILENAEE}%!-f RewriteRule.index.php[L]
需要記住的是,我們需要使用http://slimproject.dev來(lái)代替http://localhost:8000。當(dāng)然,如果你直接訪問(wèn)http://slimproject.dev你還是會(huì)得到一個(gè)Slim的錯(cuò)誤頁(yè)面,你使用http://slimproject.dev/hello/collin會(huì)有好的事情發(fā)生。
配置和自動(dòng)加載器現(xiàn)在我們已經(jīng)建立了平臺(tái),我們可以開(kāi)始在應(yīng)用程序本身中獲取所需要的一切了。
添加配置到你的應(yīng)用程序中最初的例子使用了Slim所有的默認(rèn)值,但是我們創(chuàng)建它時(shí),我們可以輕松的將配置添加到我們的應(yīng)用程序。有幾種配置的方式,但是在這里,我們使用配置數(shù)組來(lái)告訴Slim。
首先是配置本身:
$config[\'displayErrorDetails\']=true; $config[\'db\'][\'host\']=\'localhost\'; $config[\'db\'][\'user\']=\'user\'; $config[\'db\'][\'pass\']=\'password\'; $config[\'db\'][\'dbname\']=\'exampleapp\';
第一行配置是非常重要的!在開(kāi)發(fā)模式下打開(kāi)此項(xiàng)獲取有關(guān)錯(cuò)誤的詳細(xì)信息(沒(méi)有開(kāi)啟的話,Slim只會(huì)記錄最少的錯(cuò)誤信息,如果你使用的是php內(nèi)置的web服務(wù)器,那么將在控制臺(tái)看到這些錯(cuò)誤信息,這個(gè)功能對(duì)于調(diào)試來(lái)說(shuō)很有用)。這里其它配置不是特定的鍵/值對(duì),只是我們稍后能訪問(wèn)的一些數(shù)據(jù)。
現(xiàn)在將他們加入到Slim中,我們需要改變我們創(chuàng)建Slim/App對(duì)象的代碼,看起來(lái)像這樣:
$app=newSlimApp([\'settings\'=>$config]);
稍后我們?cè)趹?yīng)用程序的任何位置都能夠訪問(wèn)$config數(shù)組中的任何值。
為自己的類設(shè)置自動(dòng)加載我們已經(jīng)添加了Composer的自動(dòng)加載文件,但是我們編寫(xiě)的其它代碼并不在Composer中呢?一種很好的解決辦法是使用Composer的自動(dòng)加載規(guī)則,但是如果你愿意的話,也可以添加自己的自動(dòng)加載器。
我的設(shè)置很簡(jiǎn)單,因?yàn)槲抑挥幸恍╊~外的類,它們都在全局命名空間中,并且它們都在src/classes/目錄中。所以為了添加自動(dòng)加載器,我在引入vendor/autoload.php后面添加了下面這些代碼:
spl_autoload_register(function($classname){ require(\'../classes/\'.$classname.\'.php\'); });
sql_autoload_register中的回調(diào)方法中,會(huì)將還沒(méi)有引入的類引入到代碼中。
添加依賴很多應(yīng)用程序都有一些依賴,而Slim使用建立在Pimple上的DIC(依賴注入容器)很好的處理它們。這個(gè)例子將同時(shí)使用Monolog和一個(gè)到MySQL的PDO連接。依賴注入容器的想法是,你將容器配置為在需要時(shí)加載應(yīng)用程序需要的依賴項(xiàng)。一旦DIC創(chuàng)建/組裝了依賴關(guān)系,它就會(huì)存儲(chǔ)它們并在需要時(shí)再次提供它們。
為了獲得容器,我們可以添加下面的代碼到我們創(chuàng)建$app對(duì)象后,注冊(cè)路由前:
$container=$app->getContainer();
現(xiàn)在我們有了SlimContainer對(duì)象,我們可以添加我們的服務(wù)到容器中。
在你的應(yīng)用中使用Monolog如果你對(duì)Monolog不熟悉,這是一個(gè)優(yōu)秀的php應(yīng)用程序日志框架,這也是我為什么使用它的原因。首先,通過(guò)Composer獲得Monolog庫(kù):
phpcomposer.pharrequiremonolog/monolog
依賴項(xiàng)被命名為logger,添加它的代碼如下所示:
$container[\'logger\']=function($c){ $logger=newMonologLogger(\'my_logger\'); $file_handler=newMonologHandlerStreamHandler(\'../logs/app.log\'); $logger->pushHandler($file_handler); return$logger; };
我們添加一個(gè)元素到容器中,它本身是一個(gè)匿名函數(shù)(傳入的$c是容器本身,因此如果需要可以訪問(wèn)其它依賴項(xiàng))。這將在我們第一次嘗試訪問(wèn)這個(gè)依賴時(shí)被調(diào)用。這里的代碼完成依賴關(guān)系的設(shè)置。下次我們嘗試訪問(wèn)相同的依賴項(xiàng)時(shí),會(huì)使用第一次創(chuàng)建的對(duì)象。
我的Monolog配置是相當(dāng)簡(jiǎn)單的,僅僅只是設(shè)置應(yīng)用程序?qū)⑺械腻e(cuò)誤信息存儲(chǔ)在/logs/app.log文件中(記住這個(gè)路徑是從腳本運(yùn)行的角度來(lái)看的,即index.php)。有了這個(gè)記錄器,我可以在我的路由代碼中使用這樣一行代碼。
$this->logger->addInfo("Somethinginterestinghappend");
對(duì)于所有應(yīng)用程序來(lái)說(shuō),擁有一個(gè)優(yōu)秀的日志組建是個(gè)重要的基礎(chǔ),所以我總是建議將這樣的東西放在適當(dāng)?shù)奈恢?。這使您可以根據(jù)需要添加盡可能多的或者盡可能少的調(diào)試信息,并通過(guò)對(duì)每條消息使用適當(dāng)?shù)娜罩炯?jí)別,你可以盡可能多或盡可能少的細(xì)節(jié),以適應(yīng)你在任何時(shí)候所做的事情。
添加數(shù)據(jù)庫(kù)連接php有很多可用的數(shù)據(jù)庫(kù),但是這個(gè)例子使用PDO-這在php中是可用的,因此它可能在每個(gè)項(xiàng)目中都很有用,或者可以通過(guò)調(diào)整下面的示例來(lái)使用自己i的庫(kù)。
就像我們向DIC添加Monolog一樣,我們是使用匿名函數(shù)來(lái)添加依賴,在這里叫做db:
$container[\'db\']=function($c){ $db=$c[\'settings\'][\'db\']; $pdo=newPDO("mysql:host=".$db[\'host\'].";dbname=".$db[\'dbname\'],$db[\'user\'],$db[\'pass\']); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTr_DEFAULT_FETCH_MODE,PDO_FETCH_ASSOC); return$pdo; }
還記得我們之前添加到應(yīng)用程序中的配置嗎?那么,這里就是使用它的地方,容器知道如何訪問(wèn)我們的設(shè)置,所以我們可以很容易的從這里獲得我們的配置。通過(guò)配置,我們創(chuàng)建了PDO對(duì)象(記住,如果它失敗,將拋出一個(gè)PDOException,并且你可能想在此處理它們),以便我們可以鏈接到數(shù)據(jù)庫(kù)。我使用了兩個(gè)非必要的setAttribute()調(diào)用,但是我發(fā)現(xiàn)這兩個(gè)設(shè)置使得PDO本身更容易使用,所以我將他們留在了案例中,你也可以使用它們。最后,我們返回我們的連接對(duì)象。
我們可以通過(guò)$this->來(lái)訪問(wèn)我們的依賴。然后我們想要的依賴名稱是$this->db,所以我的代碼看起來(lái)像這樣:
$mapper=newTicketMapper($this->db);
這將從DIC中獲取數(shù)據(jù)庫(kù)依賴,并且在必要時(shí)創(chuàng)建數(shù)據(jù)庫(kù)依賴項(xiàng),并且在此實(shí)例中允許我將PDO對(duì)象直接傳入我的映射器類。
創(chuàng)建路由“路由”是我們將描述并附加功能的URL模式。Slim不使用任何自動(dòng)映射或URL公式,所以你可以將任何喜歡的URL映射到任何你喜歡的功能上,這非常的靈活。路由可以連接到特定的HTTP請(qǐng)求方式上(如GET或者POST)或多個(gè)請(qǐng)求方式上。
作為第一個(gè)案例,下面是在我的bug跟蹤應(yīng)用程序中用GET請(qǐng)求/tickets獲取票據(jù)列表的代碼。它只是輸出變量,因?yàn)槲覀兩形聪驊?yīng)用程序添加任何視圖:
$app->get(\'/tickets\',function(Request$request,Response$response){ $this->logger()->addInfo(\'Ticketlist\'); $mapper=newTicketMapper($this->db); $tickets=$mapper->getTickets(); $response->getBody()->write(var_export($tickets,true)); return$response; });
這里使用$app->get()的意思是這個(gè)路由只處理GET請(qǐng)求。相當(dāng)于$app->post()路由,它采用POST請(qǐng)求。這里還有其它的請(qǐng)求方式-還有map()函數(shù)用多個(gè)請(qǐng)求方式同一段代碼。
Slim路由按照他們的聲明順序進(jìn)行匹配,所以如果你有一個(gè)路由與其他路由重疊,則需要首先聲明最具體的那個(gè)。如果出現(xiàn)問(wèn)題,Slim將拋出異常,例如在此應(yīng)用中,我同時(shí)擁有/ticket/new和ticket/{id}兩個(gè)路由,并按照順序進(jìn)行聲明,否則路由會(huì)認(rèn)為"new"也是一個(gè)ID!
在這個(gè)實(shí)例應(yīng)用程序中,所有的路由都放置在index.php文件中,實(shí)際上可能會(huì)造成index.php文件過(guò)于龐大和臃腫的。重構(gòu)應(yīng)用程序?qū)⒙酚煞湃氩煌奈募?,或僅注冊(cè)一組實(shí)際在其它地方聲明回調(diào)的路由即可。
所有的路由回調(diào)函數(shù)接受三個(gè)參數(shù)(第三個(gè)參數(shù)是可選參數(shù)):
Request:包含傳入的請(qǐng)求頭、請(qǐng)求參數(shù)等的所有信息 Response:我們可以為此添加請(qǐng)求體和請(qǐng)求頭,一旦完成,它就會(huì)變成客戶端收到的HTTP響應(yīng)。 Arguments:URL中的占位符,這是可選的,如果沒(méi)有,通常會(huì)被忽略。對(duì)于Request和Response的強(qiáng)調(diào)說(shuō)明了Slim3基于PSR-7HTTP消息傳遞標(biāo)準(zhǔn)。使用Request和Response對(duì)象也使得應(yīng)用程序更具可測(cè)性,因?yàn)椴恍枰鞒鰧?shí)際的請(qǐng)求和響應(yīng),我們可以根據(jù)需要設(shè)置對(duì)象。
帶占位符的路由有時(shí)候,我們的應(yīng)用程序需要使用URL中的變量。在我的BUG跟蹤示例程序中,我希望可以使用/ticket/42這樣的URL來(lái)引用ticket-而Slim可以輕易的解析出"42",并使其在代碼中易于使用。下面的路由就是這樣:
$app->get(\'/ticket/{id}\',function(Request$request,Response$response,$args){ $ticket_id=(int)$args[\'id\']; $mapper=newTicketMapper($this->db); $ticket=$mapper->getTicketById($ticket_id); $response->getBody()->write(var_export($ticket,true)); return$response; })
看看路由本身的定義:我們把它寫(xiě)成/ticket/{id},當(dāng)我們這樣做時(shí),路由將從聲明{id}的地方獲取URL的部分,并在回調(diào)中作為$args[\'id\']提供。
使用GET參數(shù)由于GET和POST以不同的方式發(fā)送數(shù)據(jù),那么我們從Request對(duì)象獲取數(shù)據(jù)的方式在Slim中有很大的不同。
可以通過(guò)執(zhí)行$request->getQueryParams()來(lái)獲取請(qǐng)求中所有查詢參數(shù),這將返回一個(gè)關(guān)聯(lián)數(shù)組。所以從/tickets?sort=date&order=desc我們可以得到一個(gè)如下所示的關(guān)聯(lián)數(shù)組:
["sort"=>"date","order"=>"desc"]
這些可以在回調(diào)中使用。
使用POST數(shù)據(jù)處理傳入數(shù)據(jù)時(shí),我們可以在請(qǐng)求正文中找到它們。我們已經(jīng)知道了可以通過(guò)執(zhí)行$request->getQueryParams()來(lái)解析URL中的數(shù)據(jù)以及如何獲取GET變量,但POST數(shù)據(jù)又如何處理呢?POST請(qǐng)求數(shù)據(jù)可以在請(qǐng)求的正文中找到,并且Slim有一些很好的helpers幫助我們更容易的獲取到請(qǐng)求數(shù)據(jù)。
對(duì)于來(lái)自Web表單的數(shù)據(jù),Slim會(huì)將其轉(zhuǎn)換為數(shù)組。我的票據(jù)實(shí)例程序有一個(gè)創(chuàng)建新的票據(jù)的Form表單,它只有兩個(gè)字段:"title"和"description"。只是接收這些數(shù)據(jù)的路由的第一部分,請(qǐng)注意,對(duì)于POST路由,使用$app->post()而不是$app->get():
$app->post(\'/ticket/new\',function(Request$request,Response$response){ $data=$request->getParsedBody(); $ticket_data=[]; $ticket_data[\'title\']=filter_var($data[\'title\'],FILTER_SANITIZE_string); $ticket_data[\'description\']=filter_var($data[\'description\'],FILTER_SANITIZE_STRING); ... });
對(duì)$request->getParsedBody()的調(diào)用要求Slim查看該請(qǐng)求的Content-Type標(biāo)頭,然后在body中做一些聰明而有用的事情。在這個(gè)例子中,它只是一個(gè)簡(jiǎn)單的表單,所以得到的$data數(shù)組看起來(lái)與我們期望的$_POST非常相似-并且我們可以使用過(guò)濾器擴(kuò)展來(lái)在使用它之前檢查值是否可用。使用內(nèi)置的Slim方法的一個(gè)巨大優(yōu)勢(shì)是我們可以通過(guò)注入不同的請(qǐng)求對(duì)象來(lái)測(cè)試這件事情-如果我們直接使用$_POST,我們無(wú)法做到這一點(diǎn)。
例如,如果你正在構(gòu)建API或者編寫(xiě)AJAX,那么使用POST數(shù)據(jù)格式非常容易,但它們不是Web表單。只要Content-Type頭設(shè)置正確,Slim就會(huì)將Json有效解析為一個(gè)數(shù)組,并且可以用完全相同的方式訪問(wèn)它:通過(guò)使用$request->getParsedBody()。
視圖和模板Slim對(duì)你使用視圖沒(méi)啥看法,盡管它已經(jīng)準(zhǔn)備好了一些選項(xiàng)。你最好的選擇是Twig或者老的PHP.這兩個(gè)選項(xiàng)都有優(yōu)點(diǎn)和缺點(diǎn):如果你已經(jīng)熟悉Twig,那么它提供了很多優(yōu)秀的給你功能,比如布局-但是如果你還沒(méi)有使用過(guò)Twig,那么它可能會(huì)認(rèn)為它的學(xué)習(xí)曲線有點(diǎn)麻煩。如果你正在尋找一些簡(jiǎn)單的東西,那么PHP視圖可能適合你!我為這個(gè)項(xiàng)目選擇了PHP視圖,如果你熟悉Twig,那么使用它也是一樣的。
由于我們使用php視圖,所以我們需要使用composer為我們的項(xiàng)目添加依賴。執(zhí)行下面的命令:
phpcomposer.pharrequireslim/php-view
為了能夠呈現(xiàn)視圖,我們首先需要?jiǎng)?chuàng)建一個(gè)視圖并將其提供給我們的應(yīng)用程序;我們通過(guò)將其添加到DIC中來(lái)實(shí)現(xiàn)這一點(diǎn)。
$container[\'view\']=newSlimViewsPhpRenderer("../templates/");
現(xiàn)在我們有一個(gè)view元素在DIC中,默認(rèn)情況下它會(huì)在src/templates目錄中查找它的模板。我們可以使用它來(lái)在我們的action中呈現(xiàn)模板-這里是票據(jù)的列表路由,包括將數(shù)據(jù)傳遞到模板并將其呈現(xiàn)的調(diào)用:
$app->get(\'/tickets\',function(Request$request,Response$response){ $this->logger()->addInfo("Ticketlist"); $mapper=newTicketMapper($this->db); $tickets=$mapper->getTickets(); $response=$this->view->render($response,"tickets.phtml",["tickets"=>$tickets]); return$response; });
這里唯一不一樣的地方是我們?cè)O(shè)置$response變量的倒數(shù)第二行。現(xiàn)在該視圖位于DIC中,我們可以將其視為$this->view。調(diào)用render()需要我們提供三個(gè)參數(shù):$response對(duì)象,模板文件,以及要傳入的數(shù)據(jù)。$response對(duì)象是不可變的,這意味著對(duì)render()的調(diào)用并不會(huì)更新$response對(duì)象。但是它會(huì)給我們返回一個(gè)新的對(duì)象,所以我們需要給$response重新賦值。
將數(shù)據(jù)傳遞給模板時(shí),你可以添加盡可能多的元素到數(shù)組中,以便在模板中使用。數(shù)組的key在模板中就是變量名。
作為一個(gè)例子,下面是模板中的一個(gè)片段,它顯示了票據(jù)列表(即來(lái)自src/templates/tickets.phtml的代碼-它使用Pure.css幫我解決前臺(tái)技能的缺乏):
在這種情況下,$tickets實(shí)際上是一個(gè)帶getter和setter的TicketEntity類,但是如果你傳入一個(gè)數(shù)組,你可以在這里使用數(shù)組而不是對(duì)象表示法來(lái)訪問(wèn)它。
你是否注意到在示例結(jié)尾的$router->pathFor()右邊有啥好玩的東西?下面我們來(lái)聊聊命名路由:)
使用命名路由輕松構(gòu)建URL當(dāng)我們創(chuàng)建一個(gè)路由時(shí),我們可以通過(guò)在路由對(duì)象上調(diào)用->setName()來(lái)給它命名。在這個(gè)案例中,我將名字添加到允許我查看單個(gè)票據(jù)的路由中,以便通過(guò)路由名稱快速創(chuàng)建正確的URL,所以我的代碼看起來(lái)像這樣:
$app->get(\'/ticket/{id}\',function(Request$request,Response$response,$args){ //... })->setName("ticket-detail");
要在我的模板中使用它,我需要在要?jiǎng)?chuàng)建此URL的模板中使路由器可用,因此我修改了tickets/路由以將路由器傳遞到模板:
$response=$this->view->render($response,"tickets.phtml",["tickets"=>$tickets,"router"=>$this->router]);
通過(guò)具有友好名稱的/tickets/{id}路由以及我們的模板現(xiàn)在可用的路由器,這就是我們模板中pathFor()調(diào)用的作用。通過(guò)提供這個(gè)id,它將被用作URL模式中的一個(gè)命名占位符,并創(chuàng)建鏈接到具有這些值的該路由的正確URL。此功能對(duì)于可讀的模板URL非常有用,如果您因任何原因需要更改URL格式,則此功能會(huì)更好-無(wú)需使用grep模板查看其使用位置。這種方法絕對(duì)是推薦的,特別是對(duì)于你會(huì)使用很多的鏈接。
下一步本文介紹了如何使用自己的簡(jiǎn)單應(yīng)用程序進(jìn)行設(shè)置,希望能夠讓您快速啟動(dòng),查看一些正在運(yùn)行的示例,并構(gòu)建出令人敬畏的內(nèi)容。從這里,我建議你看一下項(xiàng)目文檔的其他部分,以了解您尚未涉及的任何內(nèi)容,或者您??想查看其他示例。接下來(lái)的一個(gè)好的步驟是查看中間件部分-這種技術(shù)是我們?nèi)绾螌?duì)應(yīng)用程序進(jìn)行分層并添加可應(yīng)用于多個(gè)路由的身份驗(yàn)證等功能。