Skip to content
Permalink
Browse files

Booting.php

  • Loading branch information...
dg committed Feb 20, 2019
1 parent 83e7217 commit daa4a6d17ce88d0eafd07a21434659f04b97e6f4
@@ -10,7 +10,7 @@ Bootstrap je zaváděcí soubor, který inicializuje prostředí a vytvoří Dep
\--


Nastavení prostředí a vytvoření Dependency Injection (DI) kontejneru má v Nette na starosti třída [Configurator |api:Nette\Configurator]. Používá se v zaváděcím souboru `bootstrap.php` umístěném ve složce `app/`.
Nastavení prostředí a vytvoření Dependency Injection (DI) kontejneru má v Nette na starosti třída [Configurator |api:Nette\Configurator]. Používá se v zaváděcím souboru `Booting.php` umístěném ve složce `app/`.


Vývojářský režim
@@ -58,7 +58,7 @@ $configurator->setTempDirectory(__DIR__ . '/../temp');
RobotLoader
===========

Zpravidla budeme chtít automaticky načítat třídy pomocí [RobotLoaderu |robotloader], musíme ho tedy nastartovat a necháme jej načítat třídy z adresáře, kde je umístěný `bootstrap.php`, a všech podadresářů (tj. `__DIR__`):
Zpravidla budeme chtít automaticky načítat třídy pomocí [RobotLoaderu |robotloader], musíme ho tedy nastartovat a necháme jej načítat třídy z adresáře, kde je umístěný `Booting.php`, a všech podadresářů (tj. `__DIR__`):

/--php
$configurator->createRobotLoader()
@@ -174,7 +174,6 @@ Vytvoření kontejneru
Třídu kontejneru vygeneruje a jeho instanci vrátí `createContainer()`:

/--php
/** @var Nette\DI\Container $container */
$container = $configurator->createContainer();
\--

@@ -184,12 +183,13 @@ Ve vývojářském režimu se kontejner automaticky aktualizuje při každé zm
index.php
=========

Pokud vytváříme webovou aplikaci, všechny požadavky jdou přes jediný PHP soubor, který se nachází ve veřejném adresáři `www/`, a tím je soubor `index.php`. Ten předává řízení do aplikace (tj. do adresáře `app/`) zaváděcímu souboru `bootstrap.php`. Následně `index.php` získá z kontejneru DI službu, kterou spustí webovou aplikaci:
Pokud vytváříme webovou aplikaci, všechny požadavky jdou přes jediný PHP soubor, který se nachází ve veřejném adresáři `www/`, a tím je soubor `index.php`. Ten si nechá od třídy Booting vrátit `$configurator`, který vyrobí DI kontejner. Následně `index.php` získá z kontejneru DI službu, kterou spustí webovou aplikaci:

/--php
$container = require __DIR__ . '/../app/bootstrap.php';
$container->getByType(Nette\Application\Application::class)
->run();
$configurator = App\Booting::boot();
$container = $configurator->createContainer();
$application = $container->getByType(Nette\Application\Application::class);
$application->run();
\--


@@ -260,7 +260,7 @@ Lze si také napsat vlastní úložiště, jediný požadavek je, aby implemento
Služba úložiště
---------------

Abychom si nemuseli všude vytvářet objekt `$storage`, lze si ho vyžádat pomocí [Dependency Injection |dependency-injection]. Pokud neurčíte jinak, Nette poskytuje výchozí úložiště FileStorage, ukládající data do adresáře určeného parametrem `tempDir` nastaveným v `bootstrap.php` pomocí `$configurator->setTempDirectory()`.
Abychom si nemuseli všude vytvářet objekt `$storage`, lze si ho vyžádat pomocí [Dependency Injection |dependency-injection]. Pokud neurčíte jinak, Nette poskytuje výchozí úložiště FileStorage, ukládající data do adresáře určeného parametrem `tempDir` nastaveným v `Booting.php` pomocí `$configurator->setTempDirectory()`.

/--php
use Nette;
@@ -317,7 +317,7 @@ Na sdílených hostinzích je vhodné zvolit vlastní adresář, kam se mají uk
savePath: "%tempDir%/sessions"
\--

V tomto příkladě se `%tempDir%` nahradí hodnotou, kterou jste nastavili v `$configurator->setTempDirectory()` v `bootstrap.php`.
V tomto příkladě se `%tempDir%` nahradí hodnotou, kterou jste nastavili v `$configurator->setTempDirectory()` v `Booting.php`.

Pokud chceme platnost session (nebo autentizace) rozšířit na subdomémy, nastavíme ještě parametry cookie:

@@ -4,7 +4,7 @@ MVC aplikace & presentery
/--div .[perex]
Seznámíme se s tím, jak se vlastně v Nette Framework tvoří aplikace. Po přečtení budete znát:

- MVC, adresářovou strukturu a soubor `bootstrap.php`
- MVC, adresářovou strukturu a soubor `Booting.php`
- co jsou to presentery a akce
- jak se používají šablony
- co jsou persistentní parametry
@@ -58,7 +58,7 @@ Když se po stažení distribuce Nette Framework podíváte do adresáře `sandb
│ │ └── <b>default.latte</b> ← šablona akce default
│ ├── <b>router/</b> ← třídy routerů
│ │
│ └── <b>bootstrap.php</b> ← zaváděcí soubor aplikace
│ └── <b>Booting.php</b> ← zaváděcí soubor aplikace
├── <b>log/</b> ← obsahuje logy, error logy atd.
├── <b>temp/</b> ← pro dočasné soubory, cache, ...
@@ -81,15 +81,15 @@ Krom toho se v některých složkách nacházejí soubory `.htaccess` resp. `web
.[note]
Adresářům `log/` a `temp/` nezapomeňte nastavit práva pro zápis (`chmod 0777`).

Všechny požadavky posílá prohlížeč přes jediný PHP soubor, který se nachází ve veřejném adresáři `www/`, a tím je soubor `index.php`. Ten předává řízení do aplikace (tj. do adresáře `app/`) zaváděcímu souboru `bootstrap.php`, kde se [konfiguruje prostředí a vytváří DI kontejner |bootstrap].
Všechny požadavky posílá prohlížeč přes jediný PHP soubor, který se nachází ve veřejném adresáři `www/`, a tím je soubor `index.php`. Ten předává řízení do aplikace (tj. do adresáře `app/`) zaváděcímu souboru `Booting.php`, kde se [konfiguruje prostředí a DI kontejner |bootstrap].

Výše uvedená adresářová struktura je tak skutečně jen doporučená, protože ji můžeme snadno jakkoliv změnit nebo složky přejmenovat a bude stačit pouze přenastavit cesty v souboru `bootstrap.php`.
Výše uvedená adresářová struktura je tak skutečně jen doporučená, protože ji můžeme snadno jakkoliv změnit nebo složky přejmenovat a bude stačit pouze přenastavit cesty v souboru `Booting.php`.


Zpracování akce presenteru
==========================

Nyní prosím zbystřete. Každý požadavek na naši aplikaci se dostane přes soubory `index.php` a `bootstrap.php` do objektu `$application`. Ten ale HTTP požadavkům nerozumí, proto požádá [router |routing], aby mu ho přeložil do řeči, které už rozumí. Tedy aby mu řekl, pro který **presenter** je požadavek určen a kterou **akci** s ním chce vykonat. Router kupříkladu odpoví, že uživatel chce akci `show` presenteru `Product` (je dobrý zvykem to zapisovat jako `Product:show`) a dále předává parametr `id = 123`. Česky by se řeklo: uživatele chce zobrazit produkt s id=123.
Nyní prosím zbystřete. Každý požadavek na naši aplikaci se dostane přes soubory `index.php` a `Booting.php` do objektu `$application`. Ten ale HTTP požadavkům nerozumí, proto požádá [router |routing], aby mu ho přeložil do řeči, které už rozumí. Tedy aby mu řekl, pro který **presenter** je požadavek určen a kterou **akci** s ním chce vykonat. Router kupříkladu odpoví, že uživatel chce akci `show` presenteru `Product` (je dobrý zvykem to zapisovat jako `Product:show`) a dále předává parametr `id = 123`. Česky by se řeklo: uživatele chce zobrazit produkt s id=123.

Tomu už `$application` rozumí a přistoupí k plnění přání. Vyrobí objekt třídy `ProductPresenter`, která reprezentuje presenter `Product`. (Abychom byli zcela přesní, o výrobu objektu presenteru požádá službu `presenterFactory`). A pak bude presenter požádán o provedení akce (`show` s parametrem `id`).

@@ -57,7 +57,7 @@ Web Project má následující strukturu:
│ ├── <b>presenters/</b> ← třídy presenterů
│ │ └── <b>templates/</b>← šablony
│ ├── <b>router/</b> ← konfigurace URL adres
│ └── <b>bootstrap.php</b> ← spouštěcí soubor
│ └── <b>Booting.php</b> ← spouštěcí soubor
├── <b>log/</b> ← zde naleznete chybové logy
├── <b>temp/</b> ← místo pro dočasné soubory (cache, sessiony, atd.)
@@ -70,7 +70,7 @@ Web Project má následující strukturu:

Adresář `www` je určen pro ukládání obrázků, JavaScript souborů, CSS stylů a dalších veřejně přístupných souborů. Pouze tento adresář je přístupný z internetu, takže nastavte kořenový adresář vaší aplikace tak, aby směřoval právě sem (to můžete nastavit v konfiguraci Apache, ale pojďme to udělat později, teď to není důležité).

Nejdůležitější složka je pro nás `app/`. Zde nalezneme soubor `bootstrap.php`, který slouží k načtení celého frameworku a nastavení aplikace. Aktivuje se zde [autoloading |/robotloader], nastaví se zde [debugger |tracy:homepage] a [routy |/routing].
Nejdůležitější složka je pro nás `app/`. Zde nalezneme soubor `Booting.php`, ve kterém je třída slouží k načtení celého frameworku a nastavení aplikace. Aktivuje se zde [autoloading |/robotloader], nastaví se zde [debugger |tracy:homepage] a [routy |/routing].



@@ -94,7 +94,7 @@ Tracy nám ohromně pomůže, až budeme hledat chyby v aplikaci. Také si všim

[* qs-tracybar.png *]

V produkčním módu je Tracy samozřejmě vypnuta a nezobrazuje žádné citlivé informace. Všechny chyby jsou v tomto případě uloženy ve složce `log/`. Pojďme si to vyzkoušet, v souboru `app/bootstrap.php` odkomentujeme následující řádek a změníme parametr volání na `false`, aby kód vypadal takto:
V produkčním módu je Tracy samozřejmě vypnuta a nezobrazuje žádné citlivé informace. Všechny chyby jsou v tomto případě uloženy ve složce `log/`. Pojďme si to vyzkoušet, v souboru `app/Booting.php` odkomentujeme následující řádek a změníme parametr volání na `false`, aby kód vypadal takto:

/--php
$configurator->setDebugMode(false);
@@ -114,7 +114,7 @@ Co se stane, když někdo změní ID v URL a vloží nějaké neexistující `po
}
\--

Pokud nemůže být příspěvek nalezen, zavoláním `$this->error(...)` zobrazíme chybovou stránku 404 se srozumitelnou hláškou. Pozor na to, že v debug módu (localhost) tuto chybovou stránku neuvidíte. Místo toho se ukáže Tracy s detaily o výjimce, což je docela výhodné pro vývoj. Můžeme si nechat zobrazit oba módy, stačí pouze změnit argument metody `setDebugMode` v souboru `bootstrap.php`.
Pokud nemůže být příspěvek nalezen, zavoláním `$this->error(...)` zobrazíme chybovou stránku 404 se srozumitelnou hláškou. Pozor na to, že v debug módu (localhost) tuto chybovou stránku neuvidíte. Místo toho se ukáže Tracy s detaily o výjimce, což je docela výhodné pro vývoj. Můžeme si nechat zobrazit oba módy, stačí pouze změnit argument metody `setDebugMode` v souboru `Booting.php`.


Shrnutí
@@ -50,7 +50,7 @@ Pokud chcete, aby RobotLoader přeskočil nějaký adresář, použijte `$loader
Nette aplikace
--------------

Uvnitř Nette aplikace, kde se používá v zaváděcím souboru `bootstrap.php` objekt `$configurator`, lze zápis zjednodušit:
Uvnitř Nette aplikace, kde se používá v zaváděcím souboru `Booting.php` objekt `$configurator`, lze zápis zjednodušit:

/--php
$configurator = new Nette\Configurator;
@@ -9,7 +9,7 @@ Nette application is easily configured using NEON files. We'll talk about:
- how to create the DI container
\--

In charge of setting up the environment and creating a Dependency Injection (DI) container in Nette is the [Configurator |api:Nette\Configurator] class. It is used in the bootstrap file `bootstrap.php` located in the `app/` folder.
In charge of setting up the environment and creating a Dependency Injection (DI) container in Nette is the [Configurator |api:Nette\Configurator] class. It is used in the bootstrap file `Booting.php` located in the `app/` folder.

Development Mode
================
@@ -56,7 +56,7 @@ $configurator->setTempDirectory(__DIR__ . '/../temp');
RobotLoader
===========

Usually we will want to automatically load the classes using [RobotLoader |robotloader], so we have to start it up and let it load classes from the directory where `bootstrap.php` is located and all its subdirectories (i.e. `__DIR__`):
Usually we will want to automatically load the classes using [RobotLoader |robotloader], so we have to start it up and let it load classes from the directory where `Booting.php` is located and all its subdirectories (i.e. `__DIR__`):

/--php
$configurator->createRobotLoader()
@@ -172,7 +172,6 @@ Creating a Container
The method `createContainer()` generates the container class and returns its instance:

/--php
/** @var Nette\DI\Container $container */
$container = $configurator->createContainer();
\--

@@ -182,12 +181,13 @@ In the development mode, the container is automatically updated each time you ch
index.php
=========

If we are creating a web application, all requests are handled by one file located in the public `www/` directory, and that is `index.php`. It just passes the control to the application (that is the `app/` directory), to the bootstrap file `bootstrap.php`. Subsequently, `index.php` retrieves from the DI container the service that runs the web application:
If we are creating a web application, all requests are handled by one file located in the public `www/` directory, and that is `index.php`. It lets the `Booting` class to return `$configurator` which creates DI container. Subsequently, `index.php` retrieves from the DI container the service that runs the web application:

/--php
$container = require __DIR__ . '/../app/bootstrap.php';
$container->getByType(Nette\Application\Application::class)
->run();
$configurator = App\Booting::boot();
$container = $configurator->createContainer();
$application = $container->getByType(Nette\Application\Application::class);
$application->run();
\--


@@ -254,7 +254,7 @@ Of course, it's possible to create your own storage. The only requirement is to
Storage Service
---------------

We can use the [Dependency Injection |dependency-injection] so we do not have to create the `$storage` object everywhere. Nette framework provides a service implementing IStorage interface. If you don't specify a concrete implementation in configuration, `FileStorage` is used by default and it saves data to the directory you specified by `$configurator->setTempDirectory()` in `bootstrap.php`.
We can use the [Dependency Injection |dependency-injection] so we do not have to create the `$storage` object everywhere. Nette framework provides a service implementing IStorage interface. If you don't specify a concrete implementation in configuration, `FileStorage` is used by default and it saves data to the directory you specified by `$configurator->setTempDirectory()` in `Booting.php`.

/--php
use Nette;
@@ -312,7 +312,7 @@ If you're using a shared hosting, it's suitable to use a custom directory for st
savePath: "%tempDir%/sessions"
\--

In this case, `%tempDir%` will be replaced by value you set in `$configurator->setTempDirectory()` in `bootstrap.php`.
In this case, `%tempDir%` will be replaced by value you set in `$configurator->setTempDirectory()` in `Booting.php`.

If you want to extend the validity of a session (or authentication) for subdomains, let's set just another cookie parameters:

@@ -4,7 +4,7 @@ MVC Applications & Presenters
/--div .[perex]
We will learn how to create applications in Nette Framework. After this chapter you will know:

- MVC, directory structure and `bootstrap.php` file
- MVC, directory structure and `Booting.php` file
- what are presenters and actions
- how to use templates
- what are persistent parameters
@@ -58,7 +58,7 @@ When you look at `sandbox` after downloading the Nette Framework package you wil
│ │ └── <b>default.latte</b> ← template for default action
│ ├── <b>router/</b> ← router classes
│ │
│ └── <b>bootstrap.php</b> ← application boot file
│ └── <b>Booting.php</b> ← application boot file
├── <b>log/</b> ← contains logs, errors, etc.
├── <b>temp/</b> ← for temporary files, cache, ...
@@ -81,15 +81,15 @@ Moreover in some directories, there are `.htaccess` and `web.config` files, whic
.[note]
Don't forget to grant write privilege (`chmod 0777`) to directories `log/` and `temp/`.

The browser is sending all requests through one file located in public directory `www/` and that is `index.php`. It passes the control to the application (that is the `app/` directory), to a boot file `bootstrap.php`, where [configures the environment and creates an DI container |bootstrap].
The browser is sending all requests through one file located in public directory `www/` and that is `index.php`. It passes the control to the application (that is the `app/` directory), to a boot file `Booting.php`, where [configures the environment and DI container |bootstrap].

The described directory structure is only a recommendation. You can easily change it to whatever you want. All you have to do is rename directories and change paths in `bootstrap.php`.
The described directory structure is only a recommendation. You can easily change it to whatever you want. All you have to do is rename directories and change paths in `Booting.php`.


Processing Presenter Action
===========================

So how are requests handled? Every request to our application will pass via `index.php` and `bootstrap.php` to the `$application` object. But this object does not understand http requests, so it will ask the [router |routing] to translate the request. The router will look at the request, and tells what **presenter** is needed, and what **action** it should execute. For example, the router answers, that the user wants action `show` of presenter `Product` (it's a good habit to write it like `Product:show`) and pass it parameter `id = 123`. You can read it like: user wants to show product with id 123.
So how are requests handled? Every request to our application will pass via `index.php` and `Booting.php` to the `$application` object. But this object does not understand http requests, so it will ask the [router |routing] to translate the request. The router will look at the request, and tells what **presenter** is needed, and what **action** it should execute. For example, the router answers, that the user wants action `show` of presenter `Product` (it's a good habit to write it like `Product:show`) and pass it parameter `id = 123`. You can read it like: user wants to show product with id 123.

This is finally understandable to the `$application` and it will proceed to fulfill the request. It will create an object of class `ProductPresenter`, that represents presenter `Product`. (To be completely accurate, the application asks the `presenterFactory` service for creation of a presenter). This new presenter will be asked for execution of action (`show` with parameter `id`).

Oops, something went wrong.

0 comments on commit daa4a6d

Please sign in to comment.
You can’t perform that action at this time.