Skip to content

Commit

Permalink
add RequestCookies information. Add view injection docs
Browse files Browse the repository at this point in the history
  • Loading branch information
hacan359 committed Jan 3, 2025
1 parent 01f32eb commit abc6475
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 0 deletions.
1 change: 1 addition & 0 deletions guide/en/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 +-
Expand Down
30 changes: 30 additions & 0 deletions guide/en/runtime/cookies.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
100 changes: 100 additions & 0 deletions guide/en/views/view-injections.md
Original file line number Diff line number Diff line change
@@ -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)
);
}),
],
],
```

0 comments on commit abc6475

Please sign in to comment.