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..dac658d 100644 --- a/guide/en/runtime/cookies.md +++ b/guide/en/runtime/cookies.md @@ -17,6 +17,33 @@ 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\RequestCookieProvider`. This approach can simplify your code and improve readability. + +Here’s an example of how to work with cookies using the `\Yiisoft\RequestProvider\RequestCookieProvider`: + +```php +final class MyService +{ + public function __construct( + private \Yiisoft\RequestProvider\RequestCookieProvider $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..9cf9710 --- /dev/null +++ b/guide/en/views/view-injections.md @@ -0,0 +1,104 @@ +# View injections + +The view injections are 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 your new Injection 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 your new injection to `params.php` under specific layout name. In the following example, it is `@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 injection + + new CartViewInjection($cart) + ); + }), + ], + ], +```