Instalace Nextras ORM s migracemi

BaruCepa
Člen | 33
+
0
-

Zdravím, snažím se rozjet si u sebe toto demo https://github.com/…m-demo-nette, stáhla Nextras ORM, migration, Contributte/Console dle dokumentace a zde právě narazila. Při pokusu o rozjetí konzole se objeví fatal error

Fatal error: Uncaught Error: Call to a member function getByType() on int in C:\Users\START\www\nette-LPregister\bin\console on line 5

Soubor bin/console:

#!/usr/bin/env php
<?php

declare(strict_types = 1);

/** @var \Nette\DI\Container $container */
$container = require __DIR__ . '/../app/bootstrap.php';
$console = $container->getByType(Contributte\Console\Application::class);
exit($console->run());

composer.json:

{
	"name": "nette/web-project",
	"description": "Nette: Standard Web Project",
	"keywords": ["nette"],
	"type": "project",
	"license": ["MIT", "BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
	"require": {
		"php": ">= 8.0",
		"nette/application": "^3.1",
		"nette/bootstrap": "^3.2",
		"nette/caching": "^3.2",
		"nette/database": "^3.1",
		"nette/di": "^3.1",
		"nette/forms": "^3.1",
		"nette/http": "^3.2",
		"nette/mail": "^4.0",
		"nette/robot-loader": "^4.0",
		"nette/security": "^3.1",
		"nette/utils": "^4.0",
		"latte/latte": "^3.0",
		"tracy/tracy": "^2.9",
		"nextras/orm": "^4.0",
		"nextras/migrations": "^3.2",
		"contributte/console": "^0.9.3"
	},
	"require-dev": {
		"nette/tester": "^2.4",
		"symfony/thanks": "^1"
	},
	"autoload": {
		"psr-4": {
			"App\\": "app"
		}
	},
	"minimum-stability": "stable",
	"config": {
		"allow-plugins": {
			"symfony/thanks": true
		}
	}
}

common.neon:

extensions:
	dbal: Nextras\Dbal\Bridges\NetteDI\DbalExtension
	orm: Nextras\Orm\Bridges\NetteDI\OrmExtension
	migrations: Nextras\Migrations\Bridges\NetteDI\MigrationsExtension
	console: Contributte\Console\DI\ConsoleExtension(%consoleMode%)


php:
	date.timezone: Europe/Prague


orm:
	model: App\Orm\Orm


migrations:
	dir: %appDir%/../migrations
	driver: mysql
	dbal: nextras
	withDummyData: true

Projela jsem zdejší příspěvky právě s problémy ohledně rozjetí konzole, zkusila si projet kontroly, které jste radili, ale s touto chybou se nikdo nepochlubil, tak už nevím.

nightfish
Člen | 474
+
0
-

@BaruCepa Chybová hláška říká, že se pokoušíš volat getByType() na hodnotě typu int. Jediné volání getByType() v bin/console je na proměnné $container, která vzniká jako $container = require __DIR__ . '/../app/bootstrap.php';. V $container by měl být sestavený DI kontejner, nikoliv int, takže se podívej, co se děje v app/bootstrap.php.

Tipnul bych si, že chceš spíš v bin/console vytáhnout kontejner stejným způsobem, jako ve www/index.php, tzn.:

require __DIR__ . '/../vendor/autoload.php';

$configurator = App\Bootstrap::boot();
$container = $configurator->createContainer();
BaruCepa
Člen | 33
+
0
-

@nightfish Rozumím, upravila jsem soubor console dle následujícího:

#!/usr/bin/env php
<?php

declare(strict_types = 1);

require __DIR__ . '/../vendor/autoload.php';

$configurator = App\Bootstrap::boot();
$container = $configurator->createContainer();

$console = $container->getByType(Contributte\Console\Application::class);
exit($console->run());

provolala jsem ve složce bin příkaz php console, Fatal error už nenastal, takže částečný úspěch. Objevil se výčet:

Xdebug: [Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port).
Console Tool

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display help for the given command. When no command is given display help for the list command
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi|--no-ansi  Force (or disable --no-ansi) ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug


In MysqliDriver.php line 445:

  php_network_getaddresses: getaddrinfo for database failed: Nen znm dn takov hostitel.


list [--raw] [--format FORMAT] [--short] [--] [<namespace>]

Xdebug: [Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port).
Xdebug: [Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port).
Xdebug: [Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port).
Xdebug: [Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port).
nightfish
Člen | 474
+
0
-

@BaruCepa Možná ti chybí nastavení pro dbal – v podstatě obsah tohoto souboru https://github.com/…example.neon by měl být někde, kde se na něj dostane Bootstrap::boot() – pokud máš aplikaci založenou na nette/web-project, tak nejspíš v app/config/local.neon. Samozřejmě si v něm nastav adresu serveru, název databáze, jméno uživatele a jeho heslo podle toho, jak máš nastavenou databázi. (Tzn. pokud na projektu používáš např. nette/database, tak budeš mít v database: a dbal: ± stejné hodnoty.)

BaruCepa
Člen | 33
+
0
-

@nightfish Svůj local.neon mám takto:

parameters:


database:
	dsn: 'mysql:host=database;dbname=example'
	user: example
	password: example

dbal:
	driver: mysqli
	host: database
	database: example
	username: example
	password: example

Na projektu chci mít i Docker a asi se mi je nedaří úplně provázat.

nightfish
Člen | 474
+
0
-

@BaruCepa
Ten konzolový command předpokládám spouštíš mimo Docker, takže tvé PHP ve Windows nevidí Docker host database.

Řešení mě napadají dvě – ale musím přiznat, že mé zkušenosti v této oblasti jsou omezené:

  1. spouštět konzolový příkaz uvnitř docker kontejneru – tím zajistíš, že PHP bude schopno správně resolvnout hostname database (pravděpodobně něco v duchu docker container run --rm -v %cd%:/app/ php:8.3-cli php /app/bin/console ..., kde místo ... napíšeš argumenty konzolového commandu; v php:8.3-cli si pak uprav verzi PHP podle toho, co reálně používáš; kód jsem vzal z https://stackoverflow.com/a/59511091; možná bude potřeba zajistit, aby se CLI kontejner připojit do stejné sítě, jako ostatní kontejnery)
  2. zpřístupnit si mysql i pro přístup z Windows PHP (exposnout port 3306 kontejneru database) + použít pro bin/console jiný config, který nastaví dbal.host na localhost (+ možná ve firewallu Windows povolit přístup na port 3306 z lokálního PC).
BaruCepa
Člen | 33
+
0
-

Tak jsem spustila příkaz přímo v kontejneru PHP v Docker Desktopu. Spustila jsem dle návodu migrations:reset, tváří se to dobře:

# php bin/console migrations:reset
Nextras Migrations
RESET
3 migrations need to be executed.
- structures/basic-structure.sql; 4 queries; 0.072 s
- dummy-data/basic-testdata.sql; 4 queries; 0.018 s
- structures/comments-deleted.sql; 1 queries; 0.026 s
OK
#

Zkusila jsem pustit localhost v očekávání, že snad už by se měl zobrazit demo projekt s nějakými články z migračních dat. Nette vypsalo toto:

RuntimeException

Unable to create file ‚/var/www/html/temp/cache/nette.search/b3cf2350c17121ad6dc0aac07af71da0.php.lock‘. fopen(/var/www/html/temp/cache/nette.search/b3cf2350c17121ad6dc0aac07af71da0.php.lock): Failed to open stream: Permission denied

Předpokládám problém s právy, no nevím, jak na to.