2015-12-07 143 views
0

我在嘗試在Lumen中使用自定義名稱空間類時遇到了問題,Laravel提供了微觀框架。嘗試實例化類時出現Class not found錯誤。Laravel/Lumen自定義類未找到

相對目錄:

|--- app 
| |---Classes 
| | |--- GetImages.php < My custom, namespaced class 
|--- Http 
|--- |--- routes.php < Using the class here works 
| |--- Processors 
| | |--- get.php < Using the class here does not work, generates the error (listed below) 

GetImages.php文件,減少爲了簡潔:

namespace App\Classes; 

class GetImages 
{ 
    public $name = 'Class instantiated'; 
} 

get.php文件,其中的錯誤發生:

use App\Classes\GetImages; 

$n = new GetImages; 
return $n->name; 

如果我做一個0123主頁像$.get('http://www.example.com/app/Http/Processors/get.php')內請求我收到以下錯誤:

Fatal error: Class 'App\Classes\GetImages' not found in http://www.example.com/app/Http/Processors/get.php on line 5. 

然而,如上所述,如果我實例化routes.php文件中這一類,它工作正常。

composer.json自動加載部分:

"autoload": { 
    "psr-4": { 
     "App\\": "app/" 
    }, 
    "classmap": [ 
     "database/" 
    ], 
    "files": [ 
     "app/Http/helpers.php" 
    ] 
} 

我覺得這是一個自動加載的問題,但我已經做了composer dumpautoload -ocomposer update,其次PSR-4標準,沒有任何變化。任何想法我失蹤?

+0

您未能向我們展示'composer.json'的自動加載部分。 – Sven

+0

@Sven我已經更新,包括現在。你覺得有一個更合適的方式來處理這個問題,而不是下面提供的答案嗎? – camelCase

回答

1

如果運行http://www.example.com/app/Http/Processors/get.php和你的整個get.php文件內容是這樣的:

use App\Classes\GetImages; 

$n = new GetImages; 
return $n->name; 

因爲類文件尚未加載它不會工作。實際上這個文件與Laravel/Lumen沒有什麼共同之處,它只是簡單的PHP文件。當您使用框架時,它使用Composer自動加載器加載有效文件,並且當您使用簡單文件時,您需要包含自動加載器或手動包含必要的文件。

你有3種選擇:

  • 這一行動創造途徑,並在文件的開頭你想要做什麼在控制
  • 添加require '/vendor/autoload.php';(與有效的路徑自動加載文件
  • 手動要求GetImages class require 'app/Classes/GetImages.php';

最好的選擇將可能是第一個,當你使用框架,你不使用stand單獨的PHP文件來完成這項工作。

+0

謝謝你的解釋。需要'自動加載。實際上php確實解決了這個問題。我會用第一個選項來修正它,因爲我確實看到你的意思是更好。再次感謝! – camelCase

1

你讓一個AJAX請求到這個網址:$.get('http://www.example.com/app/Http/Processors/get.php')

如果這真的讓你從PHP的答案,那麼你就繞過你的整個框架,並設置它的時候犯了大錯。

每個靜態資產應該屬於public文件夾中您選擇的適當的子目錄(圖像可能會進入public/img等)。

還應該有一個文件public/index.php,它應該會讓每個請求都不在public中的某個現有文件中。這需要對Web服務器進行正確的配置,即Apache Web服務器通常會得到一個.htaccess文件(如果您無法將內容添加到虛擬主機中),那麼將進行URL重寫。

index.php將引導Composer的自動加載,然後初始化框架並將當前請求傳遞給它進行處理。路由將找到關聯的控制器,它將執行一些奇妙的數據處理,並返回結果(呈現模板,JSON數據或其他任何形式)。

這意味着您應該使用的URL將永遠不會與實際存在的文件的路徑名相同。但這是你所做的:直接訪問app/Http/Processors/get.php。這是一個巨大的安全漏洞,因爲所有框架都假定唯一可公開訪問的文件夾是public文件夾。您將公開一個更高的目錄級別,並且每個人都可以訪問任何文件(如果他知道它是名稱,或者您的Web服務器創建了目錄列表)。這可能會暴露具有敏感密碼的配置文件。

而且它會在Ajax請求中破壞您的腳本,因爲現在您必須再次執行所有初始化工作。

創建控制器是不夠的,您還必須修復一般配置。

+0

這非常有幫助,謝謝。我只是爲了更多地瞭解如何使用框架而安裝它,似乎你認爲除公共內部以外的文件是正確的。我會回顧一下我安裝它的方式並使用你的解釋,我想我可以理解爲什麼這是如此危險。再次感謝您的幫助。 – camelCase

0

我知道了通過添加對我的自定義類的命名空間的PS4條目和目錄,他們是要在composer.json文件中發現,像這樣的工作:

"autoload": { 
    "psr-4": { 
     "App\\": "app/", 
     "MyCompany\\MyCodeLibrary\\": "MyCodeLibrary/" 
    }, 
    "classmap": [ 
     "database/" 
    ] 
}, 

然後內項目根目錄(包含app目錄的同一目錄)創建我的MyCodeLibrary目錄。

然後,我只需要運行:

$ composer dump-autoload -o

而現在,MyCodeLibrary目錄中我添加我想要的任何類。比方說,我添加了一個類呼叫Calculator.php。我在MyCodeLibrary內創建它。

文件MyCodeLibrary/Calculator.php看起來像這裏面的(請注意,我可以使用流明app()config()輔助方法來加載我的自定義配置文件(或做其他事情喜歡做的數據庫查詢)。

<?php 
namespace MyCompany\MyCodeLibrary; 

class Calculator { 

    public $app_settings; 

    public __construct() { 
    // load custom config files 
    app()->configure('my-app-settings'); 
    $this->app_settings = config('my-app-settings'); 
    } 

    ... 
    // other custom class methods 
    ... 
} 

如果我需要用我的類流明控制器,我可以這樣使用它:

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

use MyCompany\MyCodeLibrary\Calculator; 


class TestController extends Controller 
{ 
    public $calculator; 
    public function __construct() { 
    $this->calculator = new Calculator(); 
    } 

    public function doSomething() { 
    $this->calculator->something(); 
    } 

    ... 

} 

我知道這不是手動創建你自己的情況下,最有趣的事情,但它的作品我真的不知道。有一個 聰明的Laravel式的方式來創建您的自定義類的新實例與Lumen的服務提供商和/或外牆自動創建,因爲我沒有試圖尋找它。主要是因爲我試圖保持光線。否則我會使用Laravel。