學習Slim Framework for PHP v3 (一)

来源:http://www.cnblogs.com/lmenglliren89php/archive/2016/01/21/5149741.html
-Advertisement-
Play Games

因為公司的項目用到是slim 框架,所以想把它學習一下。在公司用到是Slim2版本,現在官網已經到達 Slim3的版本了。官網地址:http://www.cnblogs.com/lmenglliren89php/。 首先按照官網的教程,安裝Slim: 1.curl -sS https:/...


  因為公司的項目用到是slim 框架,所以想把它學習一下。在公司用到是Slim2版本,現在官網已經到達 Slim3的版本了。官網地址:http://www.cnblogs.com/lmenglliren89php/

  首先按照官網的教程,安裝Slim:

    1.curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

    2.composer require slim/slim "^3.0"

  這樣一個Slim就安裝好了。還有Apache的DirectDocumentroot設置:AllowOverride All。

  同時它自帶的Example的例子也是可以運行的,需要調整下文件夾的位置就好。

  

  如何才能理解一個框架呢?是很順利的使用嗎?還是從一步步去跟進去它的流程?

 

  我的思路是這樣的,我把這個Example改成自己的項目,然後在不知道如何去的時候去深挖一下,不知道這樣的邏輯是否正確,暫且就這樣做吧。

  項目邏輯要求是這樣的,頁面提交數據--->>接收數據--->>存入資料庫--->>記入日誌--->>返回寫入成功

  接收數據的route:

    
$app->get('/replace/', function ($request, $response, $args) {
         Example\Module\Replace::instance()->setBody($request, $response);

    });

  

    要說的是Slim就是基於route概念的,它將所有的request都轉給不同的route,然後每個route完成功能,最後設定response,請求完畢。   get方法就是去設定一個route,以後的‘replace’就會匹配到那個閉包函數中。      而這個route是放在哪裡呢?在APP.php中有個contianer。這個container是個什麼東西呢,來看代碼:   
public function __construct($container = [])
{
    if (is_array($container)) {
        $container = new Container($container);
    }
    if (!$container instanceof ContainerInterface) {
        throw new InvalidArgumentException('Expected a ContainerInterface');
    }
    $this->container = $container;
}

  來看Container怎麼做的:

public function __construct(array $values = [])
{
    parent::__construct($values);

    $userSettings = isset($values['settings']) ? $values['settings'] : [];
    $this->registerDefaultServices($userSettings);
}

private function registerDefaultServices($userSettings)
{
    $defaultSettings = $this->defaultSettings;

    /**
     * This service MUST return an array or an
     * instance of \ArrayAccess.
     *
     * @return array|\ArrayAccess
     */
    $this['settings'] = function () use ($userSettings, $defaultSettings) {
        return new Collection(array_merge($defaultSettings, $userSettings));
    };

    if (!isset($this['environment'])) {
        /**
         * This service MUST return a shared instance
         * of \Slim\Interfaces\Http\EnvironmentInterface.
         *
         * @return EnvironmentInterface
         */
        $this['environment'] = function () {
            return new Environment($_SERVER);
        };
    }

    if (!isset($this['request'])) {
        /**
         * PSR-7 Request object
         *
         * @param Container $c
         *
         * @return ServerRequestInterface
         */
        $this['request'] = function ($c) {
            return Request::createFromEnvironment($c->get('environment'));
        };
    }

    if (!isset($this['response'])) {
        /**
         * PSR-7 Response object
         *
         * @param Container $c
         *
         * @return ResponseInterface
         */
        $this['response'] = function ($c) {
            $headers = new Headers(['Content-Type' => 'text/html; charset=UTF-8']);
            $response = new Response(200, $headers);

            return $response->withProtocolVersion($c->get('settings')['httpVersion']);
        };
    }

    if (!isset($this['router'])) {
        /**
         * This service MUST return a SHARED instance
         * of \Slim\Interfaces\RouterInterface.
         *
         * @return RouterInterface
         */
        $this['router'] = function () {
            return new Router;
        };
    }

    if (!isset($this['foundHandler'])) {
        /**
         * This service MUST return a SHARED instance
         * of \Slim\Interfaces\InvocationStrategyInterface.
         *
         * @return InvocationStrategyInterface
         */
        $this['foundHandler'] = function () {
            return new RequestResponse;
        };
    }

    if (!isset($this['errorHandler'])) {
        /**
         * This service MUST return a callable
         * that accepts three arguments:
         *
         * 1. Instance of \Psr\Http\Message\ServerRequestInterface
         * 2. Instance of \Psr\Http\Message\ResponseInterface
         * 3. Instance of \Exception
         *
         * The callable MUST return an instance of
         * \Psr\Http\Message\ResponseInterface.
         *
         * @param Container $c
         *
         * @return callable
         */
        $this['errorHandler'] = function ($c) {
            return new Error($c->get('settings')['displayErrorDetails']);
        };
    }

    if (!isset($this['notFoundHandler'])) {
        /**
         * This service MUST return a callable
         * that accepts two arguments:
         *
         * 1. Instance of \Psr\Http\Message\ServerRequestInterface
         * 2. Instance of \Psr\Http\Message\ResponseInterface
         *
         * The callable MUST return an instance of
         * \Psr\Http\Message\ResponseInterface.
         *
         * @return callable
         */
        $this['notFoundHandler'] = function () {
            return new NotFound;
        };
    }

    if (!isset($this['notAllowedHandler'])) {
        /**
         * This service MUST return a callable
         * that accepts three arguments:
         *
         * 1. Instance of \Psr\Http\Message\ServerRequestInterface
         * 2. Instance of \Psr\Http\Message\ResponseInterface
         * 3. Array of allowed HTTP methods
         *
         * The callable MUST return an instance of
         * \Psr\Http\Message\ResponseInterface.
         *
         * @return callable
         */
        $this['notAllowedHandler'] = function () {
            return new NotAllowed;
        };
    }

    if (!isset($this['callableResolver'])) {
        /**
         * Instance of \Slim\Interfaces\CallableResolverInterface
         *
         * @param Container $c
         *
         * @return CallableResolverInterface
         */
        $this['callableResolver'] = function ($c) {
            return new CallableResolver($c);
        };
    }
}

  會看到這段代碼就是初始化container中的router key,以後的route都加到這個裡面就好了。

 $this['router'] = function () {
   return new Router;
 };
 
 
只是能不加入自己的Key呢?
  第一次寫,就先這樣吧。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • zend studio是一款很棒的PHP語言編譯器,強大的功能讓很多程式員愛不釋手,而快捷鍵更是程式員加快編寫代碼的利器,那麼一起來看看有哪些好用的快捷鍵吧。 複製當前行:ctrl+alt+↓ 刪除當前行:Ctrl+d 上下行互換:alt+↑/↓ 行註釋:Ctrl+/ 快註釋(先選中要註釋的代碼):...
  • 引言 做web開發相關的經常會用到hosts修改的功能,各個平臺好像都有hosts 配置GUI(據我所知windows有、MAC OX也有),但是命令行配置hosts的好像還沒有,命令行配置的話有幾個有點——簡潔,快速,非圖形化界面也可以使用,本文是實現了一個命令行hosts配置工具 。 介紹...
  • 你的程式要讀入一行文本,其中以空格分隔為若幹個單詞,以‘.’結束。你要輸出這行文本中每個單詞的長度。這裡的單詞與語言無關,可以包括各種符號,比如“it's”算一個單詞,長度為4。註意,行中可能出現連續的空格。輸入格式:輸入在一行中給出一行文本,以‘.’結束,結尾的句號不能計算在最後一個單詞的長度內。...
  • 獲取【下載地址】 QQ: 313596790 【免費支持更新】A 代碼生成器(開發利器);全部是源碼 增刪改查的處理類,service層,mybatis的xml,SQL( mysql 和oracle)腳本, jsp頁面 都生成 就不用寫搬磚的代碼了,生成的放到項目里,可以直接運行B 阿裡巴巴資料庫連...
  • 之前一篇文章寫過REST服務介紹, 今天再次來自回顧一下. REST是一種架構風格. 首次出現在2000年Roy Fielding的博士論文中,Roy Fielding是 HTTP 規範的主要編寫者之一。 論文中提到:“我這篇文章的寫作目的,就是想在符合架構原理的前提下,理解和評估以網路為基礎的應用...
  • 以三層為例子:在Bll層中創建Dal層的某個對象IUserDal userDal = DalAbstractFactory.CreateUserDal();即層之間的關聯降到最低,這樣我們很容易想到引用一個第三方來作為中間介質。這就引出了介面,在層中要創建其他層的某個對象時,用介面來接收這個對象,(...
  • 我們頭開始,從簡單的單項目解決方案,逐步添加業務邏輯的約束,從應用邏輯和領域邏輯兩方面考慮,從簡單的單個項目逐步搭建一個多項目的解決方案。主要內容:(1)搭建應用邏輯和領域邏輯都簡單的單項目(2)為應用邏輯複雜的單項目添加應用服務(3)為領域邏輯複雜的單項目添加領域行為(4)Application膨...
  • APP全棧式開發概要
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...