diff --git a/guide/en/README.md b/guide/en/README.md index 60d12df..ef87f24 100644 --- a/guide/en/README.md +++ b/guide/en/README.md @@ -63,6 +63,7 @@ Views - * [Working with client scripts](views/client-scripts.md) - * [Theming](views/theming.md) - * [Template engines](views/template-engines.md) - +* [View injections](views/view-injections.md) + Working with databases +- diff --git a/guide/en/runtime/cookies.md b/guide/en/runtime/cookies.md index f41d124..a180259 100644 --- a/guide/en/runtime/cookies.md +++ b/guide/en/runtime/cookies.md @@ -17,6 +17,36 @@ private function actionProfile(\Psr\Http\Message\ServerRequestInterface $request } ``` +In addition to obtaining cookie values directly from the server request, you can also utilize the [yiisoft/request-provider](https://github.com/yiisoft/request-provider) +package, which provides a more structured way to handle cookies through the `\Yiisoft\RequestProvider\RequestCookies`. This approach can simplify your code and improve readability. + +Here’s an example of how to work with cookies using the `\Yiisoft\RequestProvider\RequestCookies`: + +```php + +class MyClass +{ + public function __construct( + private \Yiisoft\RequestProvider\RequestCookies $cookies + ) {} + + public function go(): void + { + // Check if a specific cookie exists + if ($this->cookies->has('foo')) { + // Retrieve the value of the cookie + $fooValue = $this->cookies->get('foo'); + // Do something with the cookie value + } + + // Retrieve another cookie value + $barValue = $this->cookies->get('bar'); + // Do something with the bar cookie value + } +} + +``` + ## Sending cookies Since sending cookies is, in fact, sending a header but since forming the header isn't trivial, there is diff --git a/guide/en/views/view-injections.md b/guide/en/views/view-injections.md new file mode 100644 index 0000000..2b8a235 --- /dev/null +++ b/guide/en/views/view-injections.md @@ -0,0 +1,100 @@ +# View injections + +The view injections is designed to provide a standardized way to pass parameters to the common layer +of views in an application. Implementing this interface allows developers to manage the data that will be available +across various views, ensuring flexibility and reusability of code. + +## Configuration + +In config `params.php` + +```php +... +'yiisoft/yii-view' => [ + 'injections' => [ + Reference::to(ContentViewInjection::class), + Reference::to(CsrfViewInjection::class), + Reference::to(LayoutViewInjection::class), + ], + ], +``` + +## New injections + +Start by defining a class that will implement the `Yiisoft\Yii\View\Renderer\CommonParametersInjectionInterface`. This +class will be responsible for providing the parameters you want to inject into your view templates and layouts. + +```php +class MyCustomParametersInjection implements Yiisoft\Yii\View\Renderer\CommonParametersInjectionInterface +{ + // Class properties and methods will go here + public function __construct(UserService $userService) + { + $this->userService = $userService; + } + + public function getCommonParameters(): array + { + return [ + 'siteName' => 'My Awesome Site', + 'currentYear' => date('Y'), + 'user' => $this->userService->getCurrentUser(), + ]; + } +} +``` + +Add to config your new Injection in to `params.php` + +```php +'yiisoft/yii-view' => [ + 'injections' => [ + ..., + Reference::to(MyCustomParametersInjection::class), + ], + ], +``` + +## Using Separate Injections for Different Layouts + +If your application has multiple layouts, you can create separate parameter injections for each layout. This approach +allows you to tailor the parameters injected into each layout according to its specific needs, enhancing the flexibility +and maintainability of your application. + +Create your custom ViewInjection for specific layout + +```php +readonly final class CartViewInjection implements CommonParametersInjectionInterface +{ + public function __construct(private Cart $cart) + { + } + + public function getCommonParameters(): array + { + return [ + 'cart' => $this->cart, + ]; + } +} +``` + +Add to config your new injection in to `params.php` with name specific layout, in this example part for layout `@layout/cart` + +```php +'yiisoft/yii-view' => [ + 'injections' => [ + ..., + Reference::to(MyCustomParametersInjection::class), + DynamicReference::to(static function (ContainerInterface $container) { + $cart = $container + ->get(Cart::class); + + return new LayoutSpecificInjections( + '@layout/cart', // layout name for inject + new CartViewInjection($cart) + ); + }), + ], + ], +```