mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-11 18:46:59 +01:00
225 lines
8.4 KiB
Plaintext
225 lines
8.4 KiB
Plaintext
Aplikacje konsolowe
|
|
====================
|
|
|
|
Aplikacje konsolowe używane są głównie przez aplikacje webowe do wykonywania zadań
|
|
w trybie online, takich jak generowanie kodu, kompilacja indeksu wyszukiwania,
|
|
wysyłanie maili, itp. Yii dostarcza frameworku do pisania aplikacji konsolowych
|
|
w sposób systematyczny i obiektowo zorientowany. Yii udostępnia aplikacji konsolowej
|
|
zasoby (np. połączenia z bazą danych), które używane są przez aplikację sieciową
|
|
w trybie online.
|
|
|
|
Przegląd
|
|
====================
|
|
|
|
Yii reprezentuje każde zadanie konsolowe pod pojęciem [polecenia|CConsoleCommand].
|
|
Polecenia konsolowe zostały napisane klasy dziedziczące z [CConsoleCommand].
|
|
|
|
Jeśli używamy narzędzia `yiic webapp` w celu utworzenia początkowego szkieletu aplikacji Yii,
|
|
znajdujemy dwa następujące pliki w katalogu `protected`:
|
|
|
|
* `yiic`: jest skrypt wykonywalny na systemie Linux/Unix;
|
|
* `yiic.bat`: jest to wykonywalny plik wsadowy używany w systemie Windows.
|
|
|
|
W oknie konsoli, możemy wprowadzić następujące polecenia:
|
|
|
|
~~~
|
|
cd protected
|
|
yiic help
|
|
~~~
|
|
|
|
Spowoduje to wyświetlenie listy dostępnych poleceń konsolowych. Domyślnie, dostepne polecenia
|
|
zawierają te dostarczone przez framework Yii (nazywane **poleceniami systemowymi**)
|
|
oraz te utworzone przez użytkownika dla poszczególnych aplikacji (nazywanych **poleceniami użytkownika**).
|
|
|
|
Aby zobaczyć jak używać poleceń, możemy wywołać
|
|
|
|
~~~
|
|
yiic help <nazwa-polecenia>
|
|
~~~
|
|
|
|
Aby wywołać polecenie, używamy następującego formatu poleceń:
|
|
|
|
~~~
|
|
yiic <nazwa-polecenia> [parametry...]
|
|
~~~
|
|
|
|
Tworzenie poleceń
|
|
---------------
|
|
|
|
Polecenia konsolowe zapisane są w plikach, z klasami, w katalogu określonym
|
|
poprzez parametr [CConsoleApplication::commandPath]. Domyślnie wskazuje on
|
|
na `protected/commands`.
|
|
|
|
Klasa polecenia konsolowego musi dziedziczyć po [CConsoleCommand]. Nazwa klasy
|
|
powinna posiadać format `XyzCommand`, gdzie `Xyz` oznacza nazwę polecenia,
|
|
którego nazwa rozpoczyna się dużą literą. Np, polecenie `sitemap` musi używać klasy
|
|
o nazwie `SitemapCommand`. Wielkość liter poleceń konsolowych ma znaczenie.
|
|
|
|
|
|
> Tip|Wskazówka: Poprzez skonfigurowanie [CConsoleApplication::commandMap] można posiadać również
|
|
> klasy poleceń spełniające inne konwencje nazewnictwa oraz znajdujące się w innych katalogach.
|
|
|
|
Aby utworzyć nowe polecenie, nierzadko trzeba nadpisać metodę [CConsoleCommand::run()]
|
|
lub też stworzyć jedną bądź też kilka akcji poleceń (zostanie to wyjaśnione w dalszej części).
|
|
|
|
Podczas wykonywania polecenia konsolowego, metoda [CConsoleCommand::run()] zostanie wywołana
|
|
przez aplikację konsolową. Każdy parametr konsoli poleceń zostanie przekazany do metody,
|
|
zgodnie z następującą sygnaturą metody:
|
|
|
|
~~~
|
|
[php]
|
|
public function run($args) { ... }
|
|
~~~
|
|
|
|
gdzie `$args` wskazuje na dodatkowe parametry podane w linii poleceń.
|
|
|
|
W konsoli poleceń możemy używać `Yii::app()` w celu dostępu do instancji
|
|
aplikacji konsolowej za pomocą której możemy również uzyskać dostęp do połączeń
|
|
bazodanowych (np. `Yii::app()->db`). Można powiedzieć, że użyteczność jest bardzo
|
|
podobna do tego, co możemy zrobić w aplikacji sieciowej.
|
|
|
|
> Info|Info: Poczynając od wersji 1.1.1, możemy również tworzyć globalne polecenia,
|
|
które są współdzielone przez **wszystkie** aplikacje Yii znajdujące się na tej samej
|
|
maszynie. W tym celu zdefiniuj gobalną zmienną o nazwie `YII_CONSOLE_COMMANDS`,
|
|
wskazującą na istniejący katalog. Możemy umieścić nasze globalne polecenia w tym katalogu.
|
|
|
|
|
|
Akcje poleceń konsolowych
|
|
----------------------
|
|
|
|
> Note|Uwaga: Funkcjonalność poleceń konsolowych został udostępniona od wersji 1.1.5.
|
|
|
|
|
|
Polecenie konsolowe często potrzebuje operować różnymi parametrami linii poleceń, zarówno
|
|
wymaganymi jak i opcjonalnymi. Polecenie konsolowe może również dostarczać kilku pod-poleceń
|
|
do obsługi różnych podzadań. Czynność może zostać uproszczona poprzez używanie akcji konsoli poleceń.
|
|
|
|
Akcja poleceń konsolowych jest metodą w klasie polecenia konsolowego.
|
|
Nazwa metody musi posiadać format `actionXyz`, gdzie `Xyz` określa nazwę akcji,
|
|
której pierwsza litera nazwy zapisana jest za pomocą dużej litery. Na przykład,
|
|
metoda `actionIndex` określa akcję o nazwie `index`.
|
|
|
|
W celu wywołania określonej akcji, używamy następującego formatu dla polecenia konsolowego
|
|
|
|
~~~
|
|
yiic <nazwa-polecenia> <nazwa-akcji> --opcja1=wartość --opcja2=wartość2 ...
|
|
~~~
|
|
|
|
Dodatkowe pary opcja-wartość zostaną przekazane jako nazwane parametry do metody akcji.
|
|
Wasrtośc opcji `xyz` zostanie prezkazana do parametru `$xyz` metody akcji.
|
|
Na przykład, jeśli zdefiniujemy następująco klasę poleceń:
|
|
|
|
~~~
|
|
[php]
|
|
class SitemapCommand extends CConsoleCommand
|
|
{
|
|
public function actionIndex($type, $limit=5) { ... }
|
|
public function actionInit() { ... }
|
|
}
|
|
~~~
|
|
|
|
W następstwie, wynikiem wszystkich kolejnych poleceń konsolowych będzie wywołanie `actionIndex('News', 5)`:
|
|
|
|
~~~
|
|
yiic sitemap index --type=News --limit=5
|
|
|
|
// $limit przyjmuje wartość domyślną
|
|
yiic sitemap index --type=News
|
|
|
|
// $limit przyjmuje wartość domyślną
|
|
// ponieważ 'index' jest akcją domyślną, możemy pominąć nazwę akcji
|
|
yiic sitemap --type=News
|
|
|
|
// kolejność opcji nie ma znaczenia
|
|
yiic sitemap index --limit=5 --type=News
|
|
~~~
|
|
|
|
Jeśli opcja podana została bez wartości (np. `--type` zamiast `--type=News`),
|
|
to odpowiadająca mu wartość parametru akcji zostanie przyjęta jako `true`.
|
|
|
|
> Note|Uwaga: Nie wspieramy alternatywnego formatpu opcji, takich jak:
|
|
> `--type News`, `-t News`.
|
|
|
|
Parametr może przyjmować wartości tablicowe jeśli zadeklarujemy go poprzez podpowiadanie typów:
|
|
|
|
~~~
|
|
[php]
|
|
public function actionIndex(array $types) { ... }
|
|
~~~
|
|
|
|
Aby wypełnić tablicę wartościami, po prostu powtarzamy tę samą opcje kilka razy w linii poleceń:
|
|
|
|
~~~
|
|
yiic sitemap index --types=News --types=Article
|
|
~~~
|
|
|
|
Powyższe polecenie wywoła ostatecznie `actionIndex(array('News', 'Article'))`.
|
|
|
|
|
|
Poczynając od wersji 1.1.6, Yii wspiera używanie anonimowych parametrów akcji oraz opcji globalnych.
|
|
|
|
Anonimowe parametry odnoszą się do tych parametrów linii poleceń, które nie są podawane w formie opcji.
|
|
Na przykład, w poleceniu `yiic sitemap index --limit=5 News`, mamy anonimowy parametr, którego wartością
|
|
jest `News`, gdy zaś nazwany parametr `limit` przyjmuje wartość 5.
|
|
|
|
Aby móc używać anonimowych parametrów, akcja polecenia musi deklarować parametr o nazwie `$args`. Na przykład:
|
|
|
|
~~~
|
|
[php]
|
|
public function actionIndex($limit=10, $args=array()) {...}
|
|
~~~
|
|
|
|
Tablica `$args` będzie przechowywać wszystkie wartości dostępnych anonimowych parametrów.
|
|
|
|
Globalne opcje odnoszą się do tych opcji linii polecań, które są dzielone przez wszystkie akcje w poleceniu.
|
|
Na przykład, w poceneiu, które dostarcza kilka akcji, możemy chcieć aby każda akcja rozpoznawała
|
|
opcje nazwaną `verbose` (z ang. gadatliwy, wielomówny). Chociaż możemy zadeklarować parametr `$verbose`
|
|
w każdej metodzie akcji, lepszym sposobem jest zadelarować ją jako **publiczną zmienną** klasy polecenia,
|
|
która zamieni `verbose` w globalną opcję:
|
|
|
|
~~~
|
|
[php]
|
|
class SitemapCommand extends CConsoleCommand
|
|
{
|
|
public $verbose=false;
|
|
public function actionIndex($type) {...}
|
|
}
|
|
~~~
|
|
|
|
Powyższy kod pozwoli wykonać nam polecenie z opcją `verbose`:
|
|
|
|
~~~
|
|
yiic sitemap index --verbose=1 --type=News
|
|
~~~
|
|
|
|
|
|
Dostosowywanie aplikacji konsolowej
|
|
--------------------------------
|
|
|
|
Jeśli aplikacja została utworzona za pomocą narzędzia `yiic webapp`, domyślnie,
|
|
konfiguracja aplikacji konsolowej będzie się znajdować w `protected/config/console.php`.
|
|
Tak jak i plik konfiguracyjny aplikacji sieciowej, plik ten jest skryptem PHP, który zwraca
|
|
tablicę reprezentującą inicjalne wartości właściwości instancji aplikacji konsolowej.
|
|
W rezultacie, każda publiczna właściwość [CConsoleApplication] może zostać skonfigurowana w tym pliku.
|
|
|
|
Ponieważ polecenia konsoli często służą aplikacji sieciowej, potrzebuję dostępu do używanych
|
|
przez nią zasobów (takich jak połączenie z bazą danych). Możemy go zagwarantować w następujący sposób
|
|
poprzez plik konfiguracji aplikacji:
|
|
|
|
~~~
|
|
[php]
|
|
return array(
|
|
......
|
|
'components'=>array(
|
|
'db'=>array(
|
|
......
|
|
),
|
|
),
|
|
);
|
|
~~~
|
|
|
|
Jak widzimy, format konfiguracji jest bardzo podobny do tego z aplikacji sieciowej. Dzieje się tak
|
|
gdyż zarówno [CConsoleApplication] jak i [CWebApplication] dziedziczą po tej samej klasie bazowej.
|
|
|
|
|
|
<div class="revision">$Id: topics.console.txt 2867 2011-01-15 10:22:03Z haertl.mike $</div> |