позвольте мне сначала объяснить, что я сделал, чтобы достичь этой точки. На github есть учебник, который называется no-framework. https://github.com/PatrickLouys/no-framework-tutorial очень хороший урок! Я завершил его и теперь хочу добавить больше библиотек. У меня есть настройка композитора с автозагрузкой, и файл выглядит следующим образом.
{
"name": "xxx/no-framework",
"description": "no framework",
"authors": [
{
"name": "xxx",
"email": "[email protected]"}
],
"require": {
"php": ">=5.5.0",
"filp/whoops": ">=1.1.2",
"patricklouys/http": ">=1.1.0",
"nikic/fast-route": "^0.7.0",
"rdlowrey/auryn": "^1.1",
"twig/twig": "~1.0",
"illuminate/database": "*"},
"autoload": {
"psr-4": {
"App\\": "src/"}
}
}
и в моем src
папка я сделал папку с именем Models
и там Books.php
и в Books.php
у меня есть это
<?php
class Book extends \Illuminate\Database\Eloquent\Model{
protected $table = 'books';
}
и в моем Bootstrap.php
Файл, который я включил в эту строку после необходимости автозагрузчика композитора
include('Database.php');
Database.php
Файл также находится в src
и выглядит так
<?php
use \Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule;
$capsule->addConnection(array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'test',
'username' => 'test',
'password' => 'l4m3p455w0rd!',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => ''
));
$capsule->bootEloquent();
А теперь ошибка. Когда я пытаюсь использовать для Book
класс, пытаясь use
это в одном из моего контроллера, как это
<?php
namespace App\Controllers;
use Http\Request;
use Http\Response;
use App\Template\Renderer;
use App\Models\Book as Book;class Pages{
private $request;
private $response;
private $renderer;
public function __construct(Request $request, Response $response, Renderer $renderer){
$this->request = $request;
$this->response = $response;
$this->renderer = $renderer;
}
public function index(){
$book = new Book;
$book->title = 'test';
$book->save();
$html = $this->renderer->render('index');
$this->response->setContent($html);
}
}
Я получаю сообщение об ошибке: «Класс ‘App \ Models \ Book’ not found» Я предполагаю, что я не загружаю что-то правильно, но псевдоним есть в composer.json
или может быть что-то еще не так idk. Помогите?
В учебнике используется библиотека инжекторов зависимостей под названием Auryn, может, я что-то там упустил? ИДК сомневаюсь, хотя.
РЕДАКТИРОВАТЬ: Если я изменю use
заявление к include
вот так
include('../src/Models/Book.php');
и положить \
перед экземпляром класса, как так
$book = new \Book;
и тогда это работает, НО это явно не правильный путь.
Я полагаю, что карта классов Composer просто сообщает системе, где искать файлы для данного класса. PHP по-прежнему должен знать пространства имен. Pages
находится в App\Controllers
Пространство имен. Book
не задан, поэтому он будет существовать в глобальном пространстве имен на \Book
, Ваш Books.php
(имена файлов обычно соответствуют классу, который они содержат, поэтому Book.php
) должен включать объявление пространства имен. Я предлагаю namepsace App\Models;
, Вы также можете изменить свой use
заявление к use \Book
,
Обратите внимание, что вы не необходимость чтобы псевдоним это. Это единственный Book
класс вы используете так же, как вы сделали с Request
на класс может ссылаться последний сегмент его полностью именованного обозначения.
Других решений пока нет …